From 36de971256eb25495110c41442b27afdba7331bf Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 12 Mar 2025 14:13:12 +0330 Subject: [PATCH 001/256] clean up project --- lib/main.dart | 103 +------------------------------------------------- 1 file changed, 1 insertion(+), 102 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 7b7f5b6..c6dff8d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,116 +7,15 @@ void main() { class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); } } -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text('You have pushed the button this many times:'), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} From f58e4735c4dec866226c656dfe7eda2c18fd1360 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 12 Mar 2025 14:43:56 +0330 Subject: [PATCH 002/256] chore : add dependency --- pubspec.lock | 594 ++++++++++++++++++++++++++++++++++++++++++++++++++- pubspec.yaml | 66 +++--- 2 files changed, 623 insertions(+), 37 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index c2c57f7..626daa6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,30 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + url: "https://pub.dev" + source: hosted + version: "80.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" async: dependency: transitive description: @@ -17,6 +41,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.dev" + source: hosted + version: "4.0.4" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + url: "https://pub.dev" + source: hosted + version: "2.4.15" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + url: "https://pub.dev" + source: hosted + version: "8.9.5" characters: dependency: transitive description: @@ -25,6 +113,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" clock: dependency: transitive description: @@ -33,6 +129,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" collection: dependency: transitive description: @@ -41,6 +145,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -49,6 +169,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + dartx: + dependency: "direct main" + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" fake_async: dependency: transitive description: @@ -57,6 +193,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -70,11 +230,139 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + url: "https://pub.dev" + source: hosted + version: "2.0.17" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + freezed: + dependency: "direct dev" + description: + name: freezed + sha256: a6274c34d61b3d68082f2b0e9a641a3ec197e525d269f35b82f62d5b2c6d9f75 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + freezed_annotation: + dependency: "direct main" + description: + name: freezed_annotation + sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + url: "https://pub.dev" + source: hosted + version: "3.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hive_ce: + dependency: "direct main" + description: + name: hive_ce + sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f + url: "https://pub.dev" + source: hosted + version: "2.10.1" + hive_ce_flutter: + dependency: "direct main" + description: + name: hive_ce_flutter + sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + hive_ce_generator: + dependency: "direct dev" + description: + name: hive_ce_generator + sha256: "0b1c750e2d10c55a14cde16d479ada42704be6cef43c54b728ed0e4e02f7d808" + url: "https://pub.dev" + source: hosted + version: "1.8.2" + http: + dependency: transitive + description: + name: http + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + url: "https://pub.dev" + source: hosted + version: "1.3.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a" + url: "https://pub.dev" + source: hosted + version: "6.9.4" leak_tracker: dependency: transitive description: @@ -107,6 +395,22 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.1" + logger: + dependency: "direct main" + description: + name: logger + sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + url: "https://pub.dev" + source: hosted + version: "2.5.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" matcher: dependency: transitive description: @@ -131,6 +435,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mocktail: + dependency: "direct dev" + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" path: dependency: transitive description: @@ -139,11 +467,155 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" + url: "https://pub.dev" + source: hosted + version: "2.2.16" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + rxdart: + dependency: "direct main" + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + url: "https://pub.dev" + source: hosted + version: "1.3.5" source_span: dependency: transitive description: @@ -168,6 +640,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: @@ -192,6 +672,54 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.4" + time: + dependency: transitive + description: + name: time + sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + url: "https://pub.dev" + source: hosted + version: "1.1.18" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" vector_math: dependency: transitive description: @@ -208,6 +736,70 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.1" + watcher: + dependency: transitive + description: + name: watcher + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" + yaml_writer: + dependency: transitive + description: + name: yaml_writer + sha256: "69651cd7238411179ac32079937d4aa9a2970150d6b2ae2c6fe6de09402a5dc5" + url: "https://pub.dev" + source: hosted + version: "2.1.0" sdks: dart: ">=3.7.0 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 2ee5c3c..b8c5fdb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,60 +1,54 @@ name: rasadyar_app description: "A new Flutter project." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter 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 is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. version: 1.0.0+1 environment: sdk: ^3.7.0 -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + ##Log + logger: ^2.5.0 + + ## reactive + dartx: ^1.2.0 + rxdart: ^0.28.0 + + ## local storage + hive_ce: ^2.10.1 + hive_ce_flutter: ^2.2.0 + + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 + + + #SVG + flutter_svg: ^2.0.17 + dev_dependencies: flutter_test: sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^5.0.0 + ##code generation + build_runner: ^2.4.15 + hive_ce_generator: ^1.8.2 + freezed: ^3.0.3 + json_serializable: ^6.9.4 + + ##test + mocktail: ^1.0.4 + + -# 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 packages. 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: From e783834ecb588b686f5f2c34e86d933a1dd99f7a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 12 Mar 2025 14:59:20 +0330 Subject: [PATCH 003/256] chore : add dependency --- pubspec.lock | 8 ++++++++ pubspec.yaml | 3 +++ 2 files changed, 11 insertions(+) diff --git a/pubspec.lock b/pubspec.lock index 626daa6..ad5bf69 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -267,6 +267,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 + url: "https://pub.dev" + source: hosted + version: "4.7.2" glob: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b8c5fdb..cfeda50 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,9 @@ dependencies: #SVG flutter_svg: ^2.0.17 + ##state manger + get: ^4.7.2 + dev_dependencies: flutter_test: sdk: flutter From 551d1841c0f5f52a39e64068bfc62e2881e63d58 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 12 Mar 2025 15:03:02 +0330 Subject: [PATCH 004/256] chore : add dependency --- pubspec.lock | 24 ++++++++++++++++++++++++ pubspec.yaml | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/pubspec.lock b/pubspec.lock index ad5bf69..454e494 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -275,6 +275,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.7.2" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 + url: "https://pub.dev" + source: hosted + version: "8.0.3" + get_test: + dependency: "direct dev" + description: + name: get_test + sha256: "558c39cb35fb37bd501f337dc143de60a4314d5ef3b75f4b0551d6741634995b" + url: "https://pub.dev" + source: hosted + version: "4.0.1" glob: dependency: transitive description: @@ -451,6 +467,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6 + url: "https://pub.dev" + source: hosted + version: "5.4.5" mocktail: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index cfeda50..1bda181 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,9 @@ dependencies: ##state manger get: ^4.7.2 + ##Di + get_it: ^8.0.3 + dev_dependencies: flutter_test: sdk: flutter @@ -47,6 +50,7 @@ dev_dependencies: ##test mocktail: ^1.0.4 + get_test: ^4.0.1 From 822e22d541f91e80c37cebf5164ff7931700dc52 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 5 Apr 2025 11:20:39 +0330 Subject: [PATCH 005/256] chore : add some const --- assets/images/inner_splash.webp | Bin 0 -> 86258 bytes assets/images/outter_splash.webp | Bin 0 -> 55196 bytes lib/main.dart | 1 - lib/presentation/common/app_color.dart | 368 +++++++++++++++++++++++++ pubspec.yaml | 7 +- 5 files changed, 372 insertions(+), 4 deletions(-) create mode 100644 assets/images/inner_splash.webp create mode 100644 assets/images/outter_splash.webp create mode 100644 lib/presentation/common/app_color.dart diff --git a/assets/images/inner_splash.webp b/assets/images/inner_splash.webp new file mode 100644 index 0000000000000000000000000000000000000000..2744801cc424e5f81aec2c475471c693ecf16217 GIT binary patch literal 86258 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�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 BDhB`n literal 0 HcmV?d00001 diff --git a/assets/images/outter_splash.webp b/assets/images/outter_splash.webp new file mode 100644 index 0000000000000000000000000000000000000000..214227ce1241786af81dde568dfd54a26941acfd GIT binary patch literal 55196 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 literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index c6dff8d..616f2cc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,7 +14,6 @@ class MyApp extends StatelessWidget { theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), - ); } } diff --git a/lib/presentation/common/app_color.dart b/lib/presentation/common/app_color.dart new file mode 100644 index 0000000..6505e83 --- /dev/null +++ b/lib/presentation/common/app_color.dart @@ -0,0 +1,368 @@ +import 'package:flutter/material.dart'; + +class AppColor { + AppColor._(); + + //region --- Blue Colors --- + static const Color blueLight = Color( + 0xFFeaefff, + ); // #eaefff rgb(234, 239, 255) + static const Color blueLightHover = Color( + 0xFFe0e7ff, + ); // #e0e7ff rgb(224, 231, 255) + static const Color blueLightActive = Color( + 0xFFbecdff, + ); // #becdff rgb(190, 205, 255) + static const Color blueNormal = Color(0xFF2d5fff); // #2d5fff rgb(45, 95, 255) + static const Color blueNormalHover = Color( + 0xFF2956e6, + ); // #2956e6 rgb(41, 86, 230) + static const Color blueNormalActive = Color( + 0xFF244ccc, + ); // #244ccc rgb(36, 76, 204) + static const Color blueDark = Color(0xFF2247bf); // #2247bf rgb(34, 71, 191) + static const Color blueDarkHover = Color( + 0xFF1b3999, + ); // #1b3999 rgb(27, 57, 153) + static const Color blueDarkActive = Color( + 0xFF142b73, + ); // #142b73 rgb(20, 43, 115) + static const Color blueDarker = Color(0xFF102159); // #102159 rgb(16, 33, 89) + //endregion + + //region --- Green Colors --- + static const Color greenLight = Color( + 0xFFe6faf5, + ); // #e6faf5 rgb(230, 250, 245) + static const Color greenLightHover = Color( + 0xFFd9f7f0, + ); // #d9f7f0 rgb(217, 247, 240) + static const Color greenLightActive = Color( + 0xFFb0efdf, + ); // #b0efdf rgb(176, 239, 223) + static const Color greenNormal = Color( + 0xFF00cc99, + ); // #00cc99 rgb(0, 204, 153) + static const Color greenNormalHover = Color( + 0xFF00b88a, + ); // #00b88a rgb(0, 184, 138) + static const Color greenNormalActive = Color( + 0xFF00a37a, + ); // #00a37a rgb(0, 163, 122) + static const Color greenDark = Color(0xFF009973); // #009973 rgb(0, 153, 115) + static const Color greenDarkHover = Color( + 0xFF007a5c, + ); // #007a5c rgb(0, 122, 92) + static const Color greenDarkActive = Color( + 0xFF005c45, + ); // #005c45 rgb(0, 92, 69) + static const Color greenDarker = Color(0xFF004736); // #004736 rgb(0, 71, 54) + //endregion + + //region --- Black Colors --- + static const Color blackLight = Color( + 0xFFe6e6e6, + ); // #e6e6e6 rgb(230, 230, 230) + static const Color blackLightHover = Color( + 0xFFd9d9d9, + ); // #d9d9d9 rgb(217, 217, 217) + static const Color blackLightActive = Color( + 0xFFb0b0b0, + ); // #b0b0b0 rgb(176, 176, 176) + static const Color blackNormal = Color(0xFF000000); // #000000 rgb(0, 0, 0) + static const Color blackNormalHover = Color( + 0xFF000000, + ); // #000000 rgb(0, 0, 0) + static const Color blackNormalActive = Color( + 0xFF000000, + ); // #000000 rgb(0, 0, 0) + static const Color blackDark = Color(0xFF000000); // #000000 rgb(0, 0, 0) + static const Color blackDarkHover = Color(0xFF000000); // #000000 rgb(0, 0, 0) + static const Color blackDarkActive = Color( + 0xFF000000, + ); // #000000 rgb(0, 0, 0) + static const Color blackDarker = Color(0xFF000000); // #000000 rgb(0, 0, 0) + //endregion + + //region ---Dark Grey Colors --- + static const Color darkGreyLight = Color( + 0xFFeaeaea, + ); // #eaeaea rgb(234, 234, 234) + static const Color darkGreyLightHover = Color( + 0xFFdfdfdf, + ); // #dfdfdf rgb(223, 223, 223) + static const Color darkGreyLightActive = Color( + 0xFFbdbdbd, + ); // #bdbdbd rgb(189, 189, 189) + static const Color darkGreyNormal = Color( + 0xFF2a2a2a, + ); // #2a2a2a rgb(42, 42, 42) + static const Color darkGreyNormalHover = Color( + 0xFF262626, + ); // #262626 rgb(38, 38, 38) + static const Color darkGreyNormalActive = Color( + 0xFF222222, + ); // #222222 rgb(34, 34, 34) + static const Color darkGreyDark = Color( + 0xFF202020, + ); // #202020 rgb(32, 32, 32) + static const Color darkGreyDarkHover = Color( + 0xFF191919, + ); // #191919 rgb(25, 25, 25) + static const Color darkGreyDarkActive = Color( + 0xFF131313, + ); // #131313 rgb(19, 19, 19) + static const Color darkGreyDarker = Color( + 0xFF0f0f0f, + ); // #0f0f0f rgb(15, 15, 15) + //endregion + + //region ---Medium Grey Colors --- + static const Color mediumGreyLight = Color( + 0xFFf4f4f4, + ); // #f4f4f4 rgb(244, 244, 244) + static const Color mediumGreyLightHover = Color( + 0xFFeeeeee, + ); // #eeeeee rgb(238, 238, 238) + static const Color mediumGreyLightActive = Color( + 0xFFdcdcdc, + ); // #dcdcdc rgb(220, 220, 220) + static const Color mediumGreyNormal = Color( + 0xFF8f8f8f, + ); // #8f8f8f rgb(143, 143, 143) + static const Color mediumGreyNormalHover = Color( + 0xFF818181, + ); // #818181 rgb(129, 129, 129) + static const Color mediumGreyNormalActive = Color( + 0xFF727272, + ); // #727272 rgb(114, 114, 114) + static const Color mediumGreyDark = Color( + 0xFF6b6b6b, + ); // #6b6b6b rgb(107, 107, 107) + static const Color mediumGreyDarkHover = Color( + 0xFF565656, + ); // #565656 rgb(86, 86, 86) + static const Color mediumGreyDarkActive = Color( + 0xFF404040, + ); // #404040 rgb(64, 64, 64) + static const Color mediumGreyDarker = Color( + 0xFF323232, + ); // #323232 rgb(50, 50, 50) + //endregion + + //region ---Light Grey Colors --- + static const Color lightGreyLight = Color( + 0xFFfdfdfd, + ); // #fdfdfd rgb(253, 253, 253) + static const Color lightGreyLightHover = Color( + 0xFFfcfcfc, + ); // #fcfcfc rgb(252, 252, 252) + static const Color lightGreyLightActive = Color( + 0xFFfafafa, + ); // #fafafa rgb(250, 250, 250) + static const Color lightGreyNormal = Color( + 0xFFeeeeee, + ); // #eeeeee rgb(238, 238, 238) + static const Color lightGreyNormalHover = Color( + 0xFFd6d6d6, + ); // #d6d6d6 rgb(214, 214, 214) + static const Color lightGreyNormalActive = Color( + 0xFFbebebe, + ); // #bebebe rgb(190, 190, 190) + static const Color lightGreyDark = Color( + 0xFFb3b3b3, + ); // #b3b3b3 rgb(179, 179, 179) + static const Color lightGreyDarkHover = Color( + 0xFF8f8f8f, + ); // #8f8f8f rgb(143, 143, 143) + static const Color lightGreyDarkActive = Color( + 0xFF6b6b6b, + ); // #6b6b6b rgb(107, 107, 107) + static const Color lightGreyDarker = Color( + 0xFF535353, + ); // #535353 rgb(83, 83, 83) + //endregion + + //region ---WhiteGrey Colors --- + static const Color whiteGreyLight = Color( + 0xFFfefefe, + ); // #fefefe rgb(254, 254, 254) + static const Color whiteGreyLightHover = Color( + 0xFFfefefe, + ); // #fefefe rgb(254, 254, 254) + static const Color whiteGreyLightActive = Color( + 0xFFfdfdfd, + ); // #fdfdfd rgb(253, 253, 253) + static const Color whiteGreyNormal = Color( + 0xFFf9f9f9, + ); // #f9f9f9 rgb(249, 249, 249) + static const Color whiteGreyNormalHover = Color( + 0xFFe0e0e0, + ); // #e0e0e0 rgb(224, 224, 224) + static const Color whiteGreyNormalActive = Color( + 0xFFc7c7c7, + ); // #c7c7c7 rgb(199, 199, 199) + static const Color whiteGreyDark = Color( + 0xFFbbbbbb, + ); // #bbbbbb rgb(187, 187, 187) + static const Color whiteGreyDarkHover = Color( + 0xFF959595, + ); // #959595 rgb(149, 149, 149) + static const Color whiteGreyDarkActive = Color( + 0xFF707070, + ); // #707070 rgb(112, 112, 112) + static const Color whiteGreyDarker = Color( + 0xFF575757, + ); // #575757 rgb(87, 87, 87) + //endregion + + //region ---White Colors --- + static const Color whiteLight = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteLightHover = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteLightActive = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteNormal = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteNormalHover = Color( + 0xFFe6e6e6, + ); // #e6e6e6 rgb(230, 230, 230) + static const Color whiteNormalActive = Color( + 0xFFcccccc, + ); // #cccccc rgb(204, 204, 204) + static const Color whiteDark = Color( + 0xFFbfbfbf, + ); // #bfbfbf rgb(191, 191, 191) + static const Color whiteDarkHover = Color( + 0xFF999999, + ); // #999999 rgb(153, 153, 153) + static const Color whiteDarkActive = Color( + 0xFF737373, + ); // #737373 rgb(115, 115, 115) + static const Color whiteDarker = Color(0xFF595959); // #595959 rgb(89, 89, 89) + //endregion + + //region --- green1 Colors --- + static const Color green1Light = Color( + 0xFFe6f6f4, + ); // #e6f6f4 rgb(230, 246, 244) + static const Color green1LightHover = Color( + 0xFFd9f2ef, + ); // #d9f2ef rgb(217, 242, 239) + static const Color green1LightActive = Color( + 0xFFb0e4dd, + ); // #b0e4dd rgb(176, 228, 221) + static const Color green1Normal = Color( + 0xFF00a991, + ); // #00a991 rgb(0, 169, 145) + static const Color green1NormalHover = Color( + 0xFF009883, + ); // #009883 rgb(0, 152, 131) + static const Color green1NormalActive = Color( + 0xFF008774, + ); // #008774 rgb(0, 135, 116) + static const Color green1Dark = Color(0xFF007f6d); // #007f6d rgb(0, 127, 109) + static const Color green1DarkHover = Color( + 0xFF006557, + ); // #006557 rgb(0, 101, 87) + static const Color green1DarkActive = Color( + 0xFF004c41, + ); // #004c41 rgb(0, 76, 65) + static const Color green1Darker = Color(0xFF003b33); // #003b33 rgb(0, 59, 51) + //endregion + + //region --- Yellow Colors --- + static const Color yellowLight = Color( + 0xFFfff9e6, + ); // #fff9e6 rgb(255, 249, 230) + static const Color yellowLightHover = Color( + 0xFFfff6da, + ); // #fff6da rgb(255, 246, 218) + static const Color yellowLightActive = Color( + 0xFFffecb2, + ); // #ffecb2 rgb(255, 236, 178) + static const Color yellowNormal = Color( + 0xFFffc107, + ); // #ffc107 rgb(255, 193, 7) + static const Color yellowNormalHover = Color( + 0xFFe6ae06, + ); // #e6ae06 rgb(230, 174, 6) + static const Color yellowNormalActive = Color( + 0xFFcc9a06, + ); // #cc9a06 rgb(204, 154, 6) + static const Color yellowDark = Color(0xFFbf9105); // #bf9105 rgb(191, 145, 5) + static const Color yellowDarkHover = Color( + 0xFF997404, + ); // #997404 rgb(153, 116, 4) + static const Color yellowDarkActive = Color( + 0xFF735703, + ); // #735703 rgb(115, 87, 3) + static const Color yellowDarker = Color(0xFF594402); // #594402 rgb(89, 68, 2) + //endregion + + //region --- red Colors --- + static const Color redLight = Color(0xFFfdeeee); // #fdeeee rgb(253, 238, 238) + static const Color redLightHover = Color( + 0xFFfce6e6, + ); // #fce6e6 rgb(252, 230, 230) + static const Color redLightActive = Color( + 0xFFf9cbcb, + ); // #f9cbcb rgb(249, 203, 203) + static const Color redNormal = Color(0xFFeb5757); // #eb5757 rgb(235, 87, 87) + static const Color redNormalHover = Color( + 0xFFd44e4e, + ); // #d44e4e rgb(212, 78, 78) + static const Color redNormalActive = Color( + 0xFFbc4646, + ); // #bc4646 rgb(188, 70, 70) + static const Color redDark = Color(0xFFb04141); // #b04141 rgb(176, 65, 65) + static const Color redDarkHover = Color( + 0xFF8d3434, + ); // #8d3434 rgb(141, 52, 52) + static const Color redDarkActive = Color( + 0xFF6a2727, + ); // #6a2727 rgb(106, 39, 39) + static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30) + //endregion + + //region --- Teal Colors --- + static const Color tealLight = Color( + 0xFFe8f6f8, + ); // #e8f6f8 rgb(232, 246, 248) + static const Color tealLightHover = Color( + 0xFFdcf1f4, + ); // #dcf1f4 rgb(220, 241, 244) + static const Color tealLightActive = Color( + 0xFFb7e2e9, + ); // #b7e2e9 rgb(183, 226, 233) + static const Color tealNormal = Color( + 0xFF17a2b8, + ); // #17a2b8 rgb(23, 162, 184) + static const Color tealNormalHover = Color( + 0xFF1592a6, + ); // #1592a6 rgb(21, 146, 166) + static const Color tealNormalActive = Color( + 0xFF128293, + ); // #128293 rgb(18, 130, 147) + static const Color tealDark = Color(0xFF117a8a); // #117a8a rgb(17, 122, 138) + static const Color tealDarkHover = Color( + 0xFF0e616e, + ); // #0e616e rgb(14, 97, 110) + static const Color tealDarkActive = Color( + 0xFF0a4953, + ); // #0a4953 rgb(10, 73, 83) + static const Color tealDarker = Color(0xFF083940); // #083940 rgb(8, 57, 64) + //endregion + + //region --- category Colors --- + static const Color confirm = greenNormalActive; + static const Color warning =yellowNormal; + static const Color error =redNormal; + static const Color info = tealNormal; + //endregion +} diff --git a/pubspec.yaml b/pubspec.yaml index 1bda181..bb74dfd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,9 +59,10 @@ flutter: 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 + assets: + - assets/icons/ + - assets/images/ + - assets/logos/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/to/resolution-aware-images From 50cc84461e8e46d228a9c6906d0dc75b0eb97867 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 6 Apr 2025 15:39:00 +0330 Subject: [PATCH 006/256] feat : button , outlined button fab button , fab outlined button , input , pagination widget's --- assets/icons/add.svg | 8 + assets/icons/arrow_left.svg | 7 + assets/icons/arrow_right.svg | 7 + assets/icons/download.svg | 10 + assets/icons/edit.svg | 9 + assets/icons/filter.svg | 8 + assets/icons/scan.svg | 14 + assets/icons/trash.svg | 11 + assets/vec/add.svg.vec | Bin 0 -> 367 bytes assets/vec/arrow_left.svg.vec | Bin 0 -> 84 bytes assets/vec/arrow_right.svg.vec | Bin 0 -> 84 bytes assets/vec/download.svg.vec | Bin 0 -> 1181 bytes assets/vec/edit.svg.vec | Bin 0 -> 1054 bytes assets/vec/filter.svg.vec | Bin 0 -> 1063 bytes assets/vec/scan.svg.vec | Bin 0 -> 2129 bytes assets/vec/trash.svg.vec | Bin 0 -> 1324 bytes fonts/iranyekanregularfanum.ttf | Bin 0 -> 60268 bytes lib/main.dart | 267 +++++- lib/presentation/common/app_fonts.dart | 155 ++++ lib/presentation/common/assets.dart | 24 + lib/presentation/utils/color_utils.dart | 24 + lib/presentation/widget/buttons/elevated.dart | 58 ++ lib/presentation/widget/buttons/fab.dart | 232 ++++++ .../widget/buttons/fab_outlined.dart | 605 ++++++++++++++ .../widget/buttons/outline_elevated.dart | 101 +++ .../widget/buttons/text_button.dart | 77 ++ lib/presentation/widget/inputs/r_input.dart | 216 +++++ .../pagination/pagination_from_until.dart | 255 ++++++ .../widget/pagination/show_more.dart | 78 ++ lib/presentation/widget/tabs/new_tab.dart | 784 ++++++++++++++++++ lib/presentation/widget/tabs/tab.dart | 115 +++ lib/presentation/widget/vec_widget.dart | 47 ++ pubspec.yaml | 32 +- vecGeneratoe.sh | 33 + 34 files changed, 3150 insertions(+), 27 deletions(-) create mode 100644 assets/icons/add.svg create mode 100644 assets/icons/arrow_left.svg create mode 100644 assets/icons/arrow_right.svg create mode 100644 assets/icons/download.svg create mode 100644 assets/icons/edit.svg create mode 100644 assets/icons/filter.svg create mode 100644 assets/icons/scan.svg create mode 100644 assets/icons/trash.svg create mode 100644 assets/vec/add.svg.vec create mode 100644 assets/vec/arrow_left.svg.vec create mode 100644 assets/vec/arrow_right.svg.vec create mode 100644 assets/vec/download.svg.vec create mode 100644 assets/vec/edit.svg.vec create mode 100644 assets/vec/filter.svg.vec create mode 100644 assets/vec/scan.svg.vec create mode 100644 assets/vec/trash.svg.vec create mode 100644 fonts/iranyekanregularfanum.ttf create mode 100644 lib/presentation/common/app_fonts.dart create mode 100644 lib/presentation/common/assets.dart create mode 100644 lib/presentation/utils/color_utils.dart create mode 100644 lib/presentation/widget/buttons/elevated.dart create mode 100644 lib/presentation/widget/buttons/fab.dart create mode 100644 lib/presentation/widget/buttons/fab_outlined.dart create mode 100644 lib/presentation/widget/buttons/outline_elevated.dart create mode 100644 lib/presentation/widget/buttons/text_button.dart create mode 100644 lib/presentation/widget/inputs/r_input.dart create mode 100644 lib/presentation/widget/pagination/pagination_from_until.dart create mode 100644 lib/presentation/widget/pagination/show_more.dart create mode 100644 lib/presentation/widget/tabs/new_tab.dart create mode 100644 lib/presentation/widget/tabs/tab.dart create mode 100644 lib/presentation/widget/vec_widget.dart create mode 100644 vecGeneratoe.sh diff --git a/assets/icons/add.svg b/assets/icons/add.svg new file mode 100644 index 0000000..2d74577 --- /dev/null +++ b/assets/icons/add.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/arrow_left.svg b/assets/icons/arrow_left.svg new file mode 100644 index 0000000..2db56f6 --- /dev/null +++ b/assets/icons/arrow_left.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/arrow_right.svg b/assets/icons/arrow_right.svg new file mode 100644 index 0000000..dfc8100 --- /dev/null +++ b/assets/icons/arrow_right.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/download.svg b/assets/icons/download.svg new file mode 100644 index 0000000..0e8dd4d --- /dev/null +++ b/assets/icons/download.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/edit.svg b/assets/icons/edit.svg new file mode 100644 index 0000000..632a118 --- /dev/null +++ b/assets/icons/edit.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/icons/filter.svg b/assets/icons/filter.svg new file mode 100644 index 0000000..52500e7 --- /dev/null +++ b/assets/icons/filter.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/scan.svg b/assets/icons/scan.svg new file mode 100644 index 0000000..071b59b --- /dev/null +++ b/assets/icons/scan.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/icons/trash.svg b/assets/icons/trash.svg new file mode 100644 index 0000000..6c9b5a1 --- /dev/null +++ b/assets/icons/trash.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/vec/add.svg.vec b/assets/vec/add.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..0e0727a28446e5c03034c4f15b492d77f466d17e GIT binary patch literal 367 zcmZutIS#@w5S+CeiU^4!RZx@?3M9T@om!$O=B@er~bnSr6ffq{Vmi2whW1~PyG3=E8nY#<5*IDo1bI503& T0BHvx2JvS&8pwg<{{II60;3RD literal 0 HcmV?d00001 diff --git a/assets/vec/download.svg.vec b/assets/vec/download.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..cf531fa94ea4db87634334b26797fbef959d3616 GIT binary patch literal 1181 zcma)6T}YE*6n?)g(v5yZMTeWyK*)i@NC~ONx937IytPB35N?U1Z7z(qS!iECk|xpL zot4xbWOLEpLBjqHcql$Ew3Va}$T)>JDzv{0@Sg4LJbgpcmm>ZbYH%rtl84`D8W=Z?M&MRM8@^am`Cq8<) z?h{pSCC*r0Ntx6++hoDbuZ$AO0j!`OH?2Lp}>N+xr0pe%w5^;>8zVMIp?;P0NIxwz2W z{D@+UNFF3{d=2vR$7!bhQh0CV!tw-HLpX&I26#i!eYV>#u?!~6m#Nj4vijJu- zo;T2Q1}XkX68X$QH6CoF^O;|}H*7|JgDUsb@Z&zSEdskRi!?!tN5WsefQn)+W$t&6 zddRm3lfGjTId|VQ-<299^e0}%ztv=o)}yzoSDjyJ#3A1h<=Tqj!pCa6X9}62YWmw0R`g55KO&15m;giQ7* zQhp24{(0K_2gT0AW}f7!=@Cfja;~^S2(R6#+;Km^a&~*AHCTrVZ#7T3qvTTom)yfG zN)`ORHnJNK+im4u?=1veZXTCH*bUTiYcN81o6q=$p!3++^-#WN+?;Bmm?rL#AHn4; z=hxHS8hX6}4TG65Z1Ed>#~sBt^(o&>PC#&VIL09RzEgdJ#L)z=uNS2QIr!BU#?_xW z@U-{gq&*j%9sMwSa#8Sp0BJQBebzyEGx?a@j1uPpl(j_Rk&AG5BLaux0{Qi6_}RXX zTlLSOw4cYVHk#<`sj&dm{FdFMe${i;yqjXM- zq(>Cf(kz{a42x%yxDFr~ixGziX+6xHX5l|Ve!WQBX1LHs_RSLKCd88qgbk1!D>PpZ zUws+=UirdHloE7SZ}8I}9f(Z5<81H}?oo_$>>?IvFDa)KYql5MKU;z7Oqi!GSK*Ty z;*B*m2<%3=xwRG*mI;1psTRwxr}&@4b+}nF%dg$9gKKq8t3jMkp25J5(*0xNZc;PZ zgu$4ukFJ-lpRT8_udcVQzkVLd)uUD^M=cDt}`C2N=k#rw| zxwRP`&LZe_slF=lIF`J{8xJsRKfpVfyL&mb`9<9)P7THT0HpUkY*5?oW r1&a82D6TgeGN#a*TA;B)UBoH0wsNp8^6cj;){?8LWS|lVj2ip{NTPFo literal 0 HcmV?d00001 diff --git a/assets/vec/filter.svg.vec b/assets/vec/filter.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..6c190a39e80c61de99b27f3d6782a329436382ed GIT binary patch literal 1063 zcmbW%OH30%7zgkvB&O7Z25Nj@T1jeg!6%E)*zEidw)KP{CZ-f425OAaz{Lj`F92QgL8uL|rX>`IgdIg6&y(o(IQosFBykV5bD-pG{Nf`@B zRrR1W;wnSB`3UYLiYY!p`2|Qbb)e3ij*{3#jCUFli1)&+PI6&?a75}>Yo+6s<-9S` zj;zOhS|Hve?PqJH_Pgs)phmR4r&N?b9?%-B>+$vNP0e;=3*M)VYJ)Xf5lk3)Q*smZ z5-Z=iXFbmPHt>wGCTX58G#j^~#o?j$RvJgG^p0ypI#+qaD}pUJYfe%ez*IHEHrFAV zuY)Y3`ncdp?56s7q+;G87IhH1$3i$(T}*jxXx0nh^|vECwi)I~7}sgsp|@Me~|KX==vpI6t%;7qKhl46}9!3xj(oV z@2aA_TbqZ5#t<(u>HJ(pBQG8M%x4~*;?~jE(gp0Pw8mF2U8Z;`?>ravo_W+Kov$pG z_3r7i!5Mt1v1@jGD88*Z7v>kePsoX$NRKTb!+f_sP&)k>%Z1Nj#tXy_b6(q$#iGoqN9bd(QculhT(@PON%t_Pychto+k9TdnHK z?5_Ez)vEl5U+t&(HtU&fIeOMRI=kOIeE-w^j{DZfzS(~etXa2D94kEbmp|S9*^dw5 zQA}qElkb#V;wG2kxdw60di!@?IXCCC-e@$6?{EuSSJi*|nR|`&GjHHNy#DO(^z$Xy ztAlURUxc{X!hP^q_!kZNu6I7UPp;Ew$H88XUq^o!wHmrlKf|Dv;$8Q_W4VuZ7txM-!|&=*yHql9Cg5-H^h}6 zJo({9uZ!@MXW}gHlw9H_mpG|KHPlr*^^+DZ_9Kmx=9)kEIaD9ayJ!AkKK!&TzEtgJoZIid*`DLK{Mqxm z9|imGyJ89Z{Lfe43vlOtmlzhF^FA^8<-1}D%U$8foANIs$I^HBCOl^OOm~<4%kj3~ z;k@HJbrY;O(4Sg5KGW^+==-CygvobGE-=bfSL?UvHFhj@p9Fh#@G<(+sNK|k_^|Xg z4ZRA7PTa%7bMF1Ti2fjIGKlxE@C*X4aO6$-*#-EAL5HKWk^A&O97~>M|L~gK!k8?@Q;?@iK9TBhFURk*By zYA!V@wWHRoExg*VJcCjjdeRL%yZ^ROTIgQyppfWd+p1dMR`EMcTE=Ovf8g_#Ck;mA|wAIABkNBPcu&cF`+Z}e%z w(Kj(Hu}O%@FW(hQSmvSq%bbc0o9>SJXSLd?WLh%*zX6A9GV3xMGMmBt1y-uh8~^|S literal 0 HcmV?d00001 diff --git a/assets/vec/trash.svg.vec b/assets/vec/trash.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..7d8c954215a2274c2b22cffe6564c2359ec3c392 GIT binary patch literal 1324 zcmZWpT})eL82(Nfj4~D+#ULv(NydUM>J($p6@A`Br5AGpx~}y{C2sUTDC>;_w~1l zY6tM}(GxVhKMvo{AYERV!h|b8^{Ht*-`PfA-Av(^=MM9<=dro&5LH#hu%WG$e*LQ- zi*N0wt%*JqMINE`+xk$wSVYZhXHc@_BJb)j_FgUII+KXbZls#L85Ef7HC8uR*ff)) z?cQ{@?$?lOVwL9(7v6$WaX9zfMpe}S_P=u*T}A}xT)~my0hIP$MEf6S5&bNR@XaAy z{rO4Aey>OGgY4^R-H7?hDfItS0O8}t2ZeCuU4gUu0rvldJtfa_{4!qpA;$UN;+6gi zS~4#Iytl{q4Q!s>hM_hI@s<*-h{(cvJR^rn*>l@_*n8P~+I!nP*t|T{Sxk*RN6?!t zp-A`%9QSOd<=751J-S`vwR>OGIN|bX40Zcx%ey=A@7zJ=zwM3=wl20#wr;sKL0Xuf z!qLD9TC0nrlyw#!KdcNg9>9h4n|xl0(=7qkb?E6oZ@i%KkaN4n=xnye;~od4$|_L1 z&qQNS^Bp~GeQdpK9^8gQ-6h26Z?DCb(Df7_`A74)<}}T}+@`TLa$4io&-<8*F=~yR zp<_i6`eb2{ym>Av*l?C^)#cNLV-adh$Q>6aj@e}ej7U4opa%YTH#%?*AB$uqB9gw*k@d;zKJ96t}~ z)AD!>(l=S$2bsgO(uK7^KF6Pg%sDssDP-<+`6zQV#`Xl)pU(7~CbyBLa(RFGUGqDu zj32-5*~hbmsMuSfaV%A)(cvxO9o{2Br8+g%r-EepJ2LSdWaW2I`IaV*6WhnXpP)v` z6I<$7{!k`9L~gb2f3qlckZXwk_h=kp4lFyLb=l3&qMKLah@Y5S@q74|ctOecaO`Ut myPac*pWFGCymnp3@=G79-wq*y|M$ua3mg{kf1w<%)9@eD7Q{sW literal 0 HcmV?d00001 diff --git a/fonts/iranyekanregularfanum.ttf b/fonts/iranyekanregularfanum.ttf new file mode 100644 index 0000000000000000000000000000000000000000..72d58080514c4f4e2faf5e9ac2b163ad6f7bcd7c GIT binary patch literal 60268 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 literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index 616f2cc..787cc7e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,20 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; +import 'package:rasadyar_app/presentation/utils/color_utils.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/fab_outlined.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/outline_elevated.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/text_button.dart'; +import 'package:rasadyar_app/presentation/widget/inputs/r_input.dart'; +import 'package:rasadyar_app/presentation/widget/pagination/pagination_from_until.dart'; +import 'package:rasadyar_app/presentation/widget/pagination/show_more.dart'; +import 'package:rasadyar_app/presentation/widget/tabs/tab.dart'; + +import 'presentation/widget/buttons/fab.dart'; void main() { - runApp(const MyApp()); + runApp(MyApp()); } class MyApp extends StatelessWidget { @@ -14,7 +27,259 @@ class MyApp extends StatelessWidget { theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), + home: Home(), ); } } +class Home extends StatefulWidget { + const Home({super.key}); + + @override + State createState() => _HomeState(); +} + +class _HomeState extends State { + List _isOpen = [false, false, false, false, false, false]; + + void _handleAdd() { + print("Add FAB pressed"); + } + + void _handleEdit() { + print("Edit FAB pressed"); + } + + void _handleDelete() { + print("Delete FAB pressed"); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("System design"), centerTitle: true), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: ExpansionPanelList( + expansionCallback: (panelIndex, isExpanded) { + setState(() { + _isOpen[panelIndex] = isExpanded; + }); + }, + children: [ + buttonWidget(), + fabWidget(), + outlinedFabWidget(), + paginationWidget(), + tabWidget(), + inputsWidget(), + ], + ), + ), + ), + ); + } + + ExpansionPanel inputsWidget() { + return ExpansionPanel( + isExpanded: _isOpen[5], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "inputs", + style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + ), + ); + }, + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + spacing: 14, + children: [ + RTextField( + hintText: 'حجم کشتار را در روز به قطعه وارد کنید', + hintStyle: AppFonts.yekan13Regular, + ), + RTextField( + label: 'تلفن مرغداری', + labelStyle: AppFonts.yekan10Regular, + ), + ], + ), + ), + ); + } + + ExpansionPanel tabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[4], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "tab", + style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + CupertinoSegmentedControlDemo(), + CupertinoSegmentedControlDemo2(), + ], + ), + ); + } + + ExpansionPanel paginationWidget() { + return ExpansionPanel( + isExpanded: _isOpen[3], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "پیجینیشن", + style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + ), + ); + }, + body: Column(spacing: 14, children: [RShowMore(), PaginationFromUntil()]), + ); + } + + ExpansionPanel outlinedFabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[2], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "Outlined Fab ", + style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + RFabOutlined.smallAdd(onPressed: () {}), + RFabOutlined.smallAdd(onPressed: null), + + RFabOutlined.smallAddNoBorder(onPressed: () {}), + RFabOutlined.smallAddNoBorder(onPressed: null), + + RFabOutlined.add(onPressed: () {}), + RFabOutlined.add(onPressed: null), + + RFabOutlined.addNoBorder(onPressed: () {}), + RFabOutlined.addNoBorder(onPressed: null), + ], + ), + ); + } + + ExpansionPanel fabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[1], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "Fab", + style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + RFab.smallAdd(onPressed: () {}), + RFab.smallAdd(onPressed: null), + + RFab.add(onPressed: () {}), + RFab.add(onPressed: null), + + RFab.smallEdit(onPressed: null), + RFab.smallEdit(onPressed: () {}), + + RFab.edit(onPressed: () {}), + RFab.edit(onPressed: null), + + RFab.smallDelete(onPressed: () {}), + RFab.smallDelete(onPressed: null), + + RFab.delete(onPressed: () {}), + RFab.delete(onPressed: null), + + RFab.smallAction(onPressed: () {}), + RFab.smallAction(onPressed: null), + + RFab.action(onPressed: () {}), + RFab.action(onPressed: null), + + RFab.smallFilter(onPressed: () {}), + RFab.smallFilter(onPressed: null), + + RFab.filter(onPressed: () {}), + RFab.filter(onPressed: null), + + RFab.smallDownload(onPressed: () {}), + RFab.smallDownload(onPressed: null), + + RFab.download(onPressed: () {}), + RFab.download(onPressed: null), + + RFab.smallExcel(onPressed: () {}), + RFab.smallExcel(onPressed: null), + + RFab.excel(onPressed: () {}), + RFab.excel(onPressed: null), + + RFab.smallBack(onPressed: () {}), + RFab.smallBack(onPressed: null), + + RFab.back(onPressed: () {}), + RFab.back(onPressed: null), + ], + ), + ); + } + + ExpansionPanel buttonWidget() { + return ExpansionPanel( + isExpanded: _isOpen[0], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "دکمه ها", + style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + RElevated(text: 'ثبت', onPressed: () {}), + + RElevated(text: 'ثبت', onPressed: null), + + ROutlinedElevated(text: 'ثبت', onPressed: () {}), + ROutlinedElevated( + text: 'ثبتwwww', + onPressed: () {}, + backgroundColor: AppColor.blueNormal.disabledColor, + pressedBackgroundColor: AppColor.blueNormal, + ), + ROutlinedElevated(text: 'ثبت', onPressed: null), + + RTextButton(text: 'ثبت', onPressed: () {}), + RTextButton(text: 'ثبت', onPressed: null), + ], + ), + ); + } +} diff --git a/lib/presentation/common/app_fonts.dart b/lib/presentation/common/app_fonts.dart new file mode 100644 index 0000000..70b06fe --- /dev/null +++ b/lib/presentation/common/app_fonts.dart @@ -0,0 +1,155 @@ +import 'package:flutter/material.dart'; + +class AppFonts { + AppFonts._(); // Private constructor to prevent instantiation + + // --- Font Families --- + static const String yekan = 'yekan'; + + // --- Font Weights --- + static const FontWeight regular = FontWeight.w400; + static const FontWeight bold = FontWeight.w600; + static const double _height = 1.20; + + static const TextStyle yekan61Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 61, + height: _height, + ); + + static const TextStyle yekan49Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 48, + height: _height, + ); + + static const TextStyle yekan39Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 39, + height: _height, + ); + + static const TextStyle yekan31Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 31, + height: _height, + ); + + static const TextStyle yekan25Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 25, + height: _height, + ); + + static const TextStyle yekan24Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 24, + height: _height, + ); + + static const TextStyle yekan20Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 20, + height: _height, + ); + + static const TextStyle yekan16Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 16, + height: _height, + ); + + static const TextStyle yekan13Regular = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 13, + height: _height, + ); + + static const TextStyle yekan10Regular = TextStyle( + // Rounded from 10.24 + fontFamily: yekan, + fontWeight: regular, + fontSize: 10, + height: _height, + ); + + static const TextStyle yekan61Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 61, + height: _height, + ); + + static const TextStyle yekan49Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 48, + height: _height, + ); + + static const TextStyle yekan39Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 39, + height: _height, + ); + + static const TextStyle yekan31Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 31, + height: _height, + ); + + static const TextStyle yekan25Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 25, + height: _height, + ); + + static const TextStyle yekan24Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 24, + height: _height, + ); + + static const TextStyle yekan20Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 20, + height: _height, + ); + + static const TextStyle yekan16Bold = TextStyle( + // Base size bold + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 16, + height: _height, + ); + + static const TextStyle yekan13Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 13, + height: _height, + ); + + static const TextStyle yekan10Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 10, + height: _height, + ); +} diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart new file mode 100644 index 0000000..185d647 --- /dev/null +++ b/lib/presentation/common/assets.dart @@ -0,0 +1,24 @@ +///This file is automatically generated. DO NOT EDIT, all your changes would be lost. +class Assets { + Assets._(); + + static const String iconsAdd = 'assets/icons/add.svg'; + static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; + static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsDownload = 'assets/icons/download.svg'; + static const String iconsEdit = 'assets/icons/edit.svg'; + static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsTrash = 'assets/icons/trash.svg'; + static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; + static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; + static const String vecAddSvg = 'assets/vec/add.svg.vec'; + static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; + static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; + static const String vecEditSvg = 'assets/vec/edit.svg.vec'; + static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; + +} diff --git a/lib/presentation/utils/color_utils.dart b/lib/presentation/utils/color_utils.dart new file mode 100644 index 0000000..46f9bb8 --- /dev/null +++ b/lib/presentation/utils/color_utils.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +extension ColorUtils on Color { + Color _darken([double amount = 0.1]) { + assert(amount >= 0 && amount <= 1, 'مقدار تیرگی باید بین 0 و 1 باشد'); + final hslColor = HSLColor.fromColor(this); + final newLightness = (hslColor.lightness - amount).clamp(0.0, 1.0); + final hslDarkerColor = hslColor.withLightness(newLightness); + return hslDarkerColor.toColor(); + } + + get disabledColor{ + return withAlpha(38); + } + + get hoverColor{ + return _darken(0.5); + } + + get pressedColor{ + return _darken(0.10); + } + +} diff --git a/lib/presentation/widget/buttons/elevated.dart b/lib/presentation/widget/buttons/elevated.dart new file mode 100644 index 0000000..c03bc2e --- /dev/null +++ b/lib/presentation/widget/buttons/elevated.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; + +class RElevated extends StatefulWidget { + RElevated({ + super.key, + required this.text, + required this.onPressed, + foregroundColor, + backgroundColor, + disabledBackgroundColor, + disabledForegroundColor, + radius, + textStyle, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + Color? disabledForegroundColor; + Color? disabledBackgroundColor; + double? radius; + TextStyle? textStyle; + + @override + State createState() => _RElevatedState(); +} + +class _RElevatedState extends State { + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: () { + setState(() {}); + }, + style: ElevatedButton.styleFrom( + backgroundColor: widget.backgroundColor ?? AppColor.blueNormal, + foregroundColor: widget.foregroundColor ?? Colors.white, + disabledBackgroundColor: + widget.disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38), + disabledForegroundColor: widget.disabledForegroundColor ?? Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + fixedSize: Size(widget.width, widget.height), + padding: EdgeInsets.zero, + textStyle: widget.textStyle ?? AppFonts.yekan24Regular, + ), + child: Text(widget.text), + ); + } +} diff --git a/lib/presentation/widget/buttons/fab.dart b/lib/presentation/widget/buttons/fab.dart new file mode 100644 index 0000000..84a4e8b --- /dev/null +++ b/lib/presentation/widget/buttons/fab.dart @@ -0,0 +1,232 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/assets.dart'; +import 'package:rasadyar_app/presentation/utils/color_utils.dart'; +import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; + +class RFab extends StatefulWidget { + + + final VoidCallback? onPressed; + Color? foregroundColor; + Color? backgroundColor; + Color? disabledForegroundColor; + Color? disabledBackgroundColor; + double? radius; + ShapeBorder? shapeBorder; + Widget? icon; + + @override + State createState() => _RFabState(); + + //region Add + RFab.smallAdd({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecAddSvg), + backgroundColor: AppColor.greenNormal, + key: key, + ); + + RFab.add({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecAddSvg), + backgroundColor: AppColor.greenNormal, + key: key, + ); + + //endregion + + //region Edit + RFab.smallEdit({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecEditSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.edit({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecEditSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region delete + RFab.smallDelete({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecTrashSvg), + backgroundColor: AppColor.redNormal, + key: key, + ); + + RFab.delete({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecTrashSvg), + backgroundColor: AppColor.redNormal, + key: key, + ); + + //endregion + + //region action + RFab.smallAction({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecScanSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.action({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecScanSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region filter + RFab.smallFilter({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecFilterSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.filter({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecFilterSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region download + RFab.smallDownload({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.download({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region Excel + RFab.smallExcel({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.greenDark, + key: key, + ); + + RFab.excel({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.greenDark, + key: key, + ); + + //endregion + + //region Back + RFab.smallBack({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecArrowLeftSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.back({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecArrowLeftSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region General + RFab.small({ + required this.onPressed, + required this.icon, + required this.backgroundColor, + super.key, + }) : radius = 40.0, + foregroundColor = Colors.white; + + RFab({ + required this.onPressed, + required this.icon, + required this.backgroundColor, + super.key, + }) : radius = 56.0, + foregroundColor = Colors.white; + + //endregion +} + +class _RFabState extends State { + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: widget.onPressed, + style: ButtonStyle( + side: WidgetStateProperty.all(BorderSide.none), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return widget.backgroundColor?.pressedColor ?? + AppColor.blueNormalActive; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.hoverColor ?? + AppColor.blueNormalHover; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor?.disabledColor ?? + AppColor.blueNormal.disabledColor; + } + return widget.backgroundColor ?? AppColor.blueNormal; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return widget.foregroundColor?.disabledColor; + } + return widget.foregroundColor; + }), + + shape: WidgetStatePropertyAll( + CircleBorder(side: BorderSide(width: 1, color: Colors.transparent)), + ), + fixedSize: WidgetStatePropertyAll( + Size(widget.radius ?? 56, widget.radius ?? 56), + ), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + ), + child: widget.icon, + ); + } +} diff --git a/lib/presentation/widget/buttons/fab_outlined.dart b/lib/presentation/widget/buttons/fab_outlined.dart new file mode 100644 index 0000000..ecd9ea1 --- /dev/null +++ b/lib/presentation/widget/buttons/fab_outlined.dart @@ -0,0 +1,605 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/assets.dart'; +import 'package:rasadyar_app/presentation/utils/color_utils.dart'; +import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; + +class RFabOutlined extends StatefulWidget { + final Widget icon; + VoidCallback? onPressed; + final Color backgroundColor; + final Color? borderColor; + final double? radius; + OutlinedBorder? shapeBorder; + + @override + State createState() => _RFabOutlinedState(); + + //region General + RFabOutlined({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + required this.borderColor, + this.radius = 56.0, + super.key, + }) : shapeBorder = CircleBorder( + side: BorderSide(color: borderColor ?? Colors.transparent), + ); + + RFabOutlined.noBorder({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + super.key, + }) : borderColor = Colors.transparent, + radius = 56.0, + shapeBorder = CircleBorder( + side: BorderSide(color: Colors.transparent, width: 1), + ); + + RFabOutlined.small({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + required this.borderColor, + super.key, + }) : radius = 40.0, + shapeBorder = CircleBorder( + side: BorderSide(color: borderColor ?? Colors.transparent, width: 1), + ); + + RFabOutlined.smallNoBorder({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + super.key, + }) : borderColor = Colors.transparent, + radius = 40.0, + shapeBorder = CircleBorder( + side: BorderSide(color: Colors.transparent, width: 1), + ); + + //endregion + + //region Add + RFabOutlined.smallAdd({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + borderColor: AppColor.greenNormal, + icon: vecWidget2( + Assets.vecAddSvg, + + color: AppColor.greenNormal, + ), + ); + + RFabOutlined.smallAddNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + icon: vecWidget( + Assets.vecAddSvg, + color: + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + ), + ); + + RFabOutlined.add({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + borderColor: AppColor.greenNormal, + icon: vecWidget( + Assets.vecAddSvg, + color: + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + ), + ); + + RFabOutlined.addNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + icon: vecWidget( + Assets.vecAddSvg, + color: + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + ), + ); + + //endregion + + //region Edit + RFabOutlined.smallEdit({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallEditNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.edit({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.editNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion + + //region Delete + RFabOutlined.smallDelete({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + borderColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + RFabOutlined.smallDeleteNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + RFabOutlined.delete({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + borderColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + RFabOutlined.deleteNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + //endregion + + //region Action + RFabOutlined.smallAction({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallActionNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.action({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.actionNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion + + //region Filter + RFabOutlined.smallFilter({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallFilterNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.filter({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.filterNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion + + //region Download + RFabOutlined.smallDownload({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.smallDownloadNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.download({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.downloadNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + //endregion + + //region Excel + RFabOutlined.smallExcel({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + borderColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.smallExcelNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.excel({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + borderColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.excelNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + //endregion + + //region Back + RFabOutlined.smallBack({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallBackNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.back({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.backNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion +} + +class _RFabOutlinedState extends State { + bool isOnPressed =false; + @override + Widget build(BuildContext context) { + return OutlinedButton( + onPressed:widget.onPressed , + style: ButtonStyle( + side: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return BorderSide( + color: + widget.borderColor?.disabledColor ?? + AppColor.blueNormal.disabledColor, + width: 2, + ); + } + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return widget.backgroundColor; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor.hoverColor ?? + AppColor.blueNormal.hoverColor; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor.disabledColor ?? + AppColor.blueNormal.disabledColor; + } + return Colors.transparent; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor.disabledColor ?? + AppColor.blueNormal.disabledColor; + } + return widget.backgroundColor; + }), + + shape: WidgetStatePropertyAll(widget.shapeBorder), + fixedSize: WidgetStatePropertyAll( + Size(widget.radius ?? 56, widget.radius ?? 56), + ), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + ), + child: widget.icon + ); + } +} + diff --git a/lib/presentation/widget/buttons/outline_elevated.dart b/lib/presentation/widget/buttons/outline_elevated.dart new file mode 100644 index 0000000..23272bf --- /dev/null +++ b/lib/presentation/widget/buttons/outline_elevated.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; +import 'package:rasadyar_app/presentation/utils/color_utils.dart'; + +class ROutlinedElevated extends StatefulWidget { + ROutlinedElevated({ + super.key, + required this.text, + required this.onPressed, + this.foregroundColor, + this.backgroundColor, + this.borderColor, + this.disabledBackgroundColor, + this.pressedBackgroundColor, + this.radius, + this.textStyle, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + + Color? borderColor; + + Color? disabledBackgroundColor; + Color? pressedBackgroundColor; + double? radius; + TextStyle? textStyle; + + @override + State createState() => _ROutlinedElevatedState(); +} + +class _ROutlinedElevatedState extends State { + @override + Widget build(BuildContext context) { + return OutlinedButton( + onPressed: widget.onPressed, + style: ButtonStyle( + side: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + } else if (states.contains(WidgetState.disabled)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), + width: 2, + ); + } + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + if (widget.pressedBackgroundColor != null) { + return widget.pressedBackgroundColor; + } + return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.hoverColor ?? + AppColor.blueNormal.hoverColor; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor?.disabledColor ?? Colors.transparent; + } + return widget.backgroundColor; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return AppColor.blueNormal.withAlpha(38); + } + return AppColor.blueNormal; + }), + + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + ), + fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + textStyle: WidgetStatePropertyAll( + widget.textStyle ?? + AppFonts.yekan24Regular.copyWith(color: AppColor.blueNormal), + ), + ), + child: Text(widget.text), + ); + } +} diff --git a/lib/presentation/widget/buttons/text_button.dart b/lib/presentation/widget/buttons/text_button.dart new file mode 100644 index 0000000..40fb3a4 --- /dev/null +++ b/lib/presentation/widget/buttons/text_button.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; + +class RTextButton extends StatefulWidget { + RTextButton({ + super.key, + required this.text, + required this.onPressed, + foregroundColor, + backgroundColor, + borderColor, + disabledBackgroundColor, + radius, + textStyle, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + Color? borderColor; + + Color? disabledBackgroundColor; + double? radius; + TextStyle? textStyle; + + @override + State createState() => _RTextButtonState(); +} + +class _RTextButtonState extends State { + @override + Widget build(BuildContext context) { + return TextButton( + style: ButtonStyle( + side: WidgetStatePropertyAll(BorderSide.none), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return widget.backgroundColor ?? AppColor.blueNormal; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.withAlpha(38) ?? AppColor.blueNormal.withAlpha(38); + } else if (states.contains(WidgetState.disabled)) { + return widget.disabledBackgroundColor ?? Colors.transparent; + } + return Colors.transparent; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return AppColor.blueNormal.withAlpha(38); + } + return AppColor.blueNormal; + }), + + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + ), + fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + textStyle: WidgetStatePropertyAll( + widget.textStyle ?? + AppFonts.yekan24Regular.copyWith(color: AppColor.blueNormal), + ), + ), + onPressed:widget.onPressed, + child: Text(widget.text), + ); + } +} diff --git a/lib/presentation/widget/inputs/r_input.dart b/lib/presentation/widget/inputs/r_input.dart new file mode 100644 index 0000000..07edc2b --- /dev/null +++ b/lib/presentation/widget/inputs/r_input.dart @@ -0,0 +1,216 @@ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +@immutable +class RTextField extends StatefulWidget { + RTextField( + {super.key, + this.maxLines, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.isForNumber = false, + this.style, + this.hintStyle, + this.suffixIcon, + this.prefixIcon, + this.validator, + this.readonly = false, + this.boxConstraints, + this.minLines, + this.radius, + this.filled, + this.enabled, + this.errorStyle, + this.labelStyle, + this.label}) { + filled = filled ?? false; + obscure = false; + _inputBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(radius ?? 16)); + } + + RTextField.noBorder( + {super.key, + this.maxLines, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.style, + this.hintStyle, + this.suffixIcon, + this.radius, + this.validator, + this.boxConstraints, + this.minLines, + this.isForNumber = false, + this.readonly = false, + this.label, + this.filled, + this.errorStyle, + this.labelStyle, + this.enabled}) { + _inputBorder = OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(radius ?? 16)); + obscure = false; + filled = filled ?? true; + } + + RTextField.password( + {super.key, + this.maxLines = 1, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.style, + this.hintStyle, + this.suffixIcon, + this.prefixIcon, + this.radius, + this.validator, + this.boxConstraints, + this.minLines, + this.isForNumber = false, + this.readonly = false, + this.label, + this.filled, + this.errorStyle, + this.labelStyle, + this.enabled}) { + _inputBorder = OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(radius ?? 16)); + filled = filled ?? true; + obscure = true; + _isPassword = true; + prefixIcon = prefixIcon ?? const Icon(CupertinoIcons.person); + } + + final int? maxLines; + final int? minLines; + final int? maxLength; + final String? hintText; + final String? label; + final EdgeInsets? padding; + final TextStyle? style; + final TextStyle? errorStyle; + final TextStyle? hintStyle; + final TextStyle? labelStyle; + final bool showCounter; + final bool? isDense; + final bool? isForNumber; + final bool readonly; + bool? obscure; + final bool? enabled; + final double? radius; + final TextInputType? keyboardType; + final Function(String)? onChanged; + final Function(String)? onSubmitted; + final FormFieldValidator? validator; + final String? initText; + Widget? suffixIcon; + Widget? prefixIcon; + bool? filled; + bool _isPassword = false; + + final BoxConstraints? boxConstraints; + late final InputBorder? _inputBorder; + + @override + State createState() => _RTextFieldState(); +} + +class _RTextFieldState extends State { + final TextEditingController _controller = TextEditingController(); + bool? obscure; + + @override + void initState() { + super.initState(); + if (widget.initText != null) { + _controller.text = widget.initText!; + } + obscure = widget.obscure; + } + + @override + void didUpdateWidget(covariant RTextField oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.initText != oldWidget.initText) { + _controller.text = widget.initText ?? ''; + } + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 6.0), + child: TextFormField( + controller: _controller, + readOnly: widget.readonly, + minLines: widget.minLines, + maxLines: widget.maxLines, + onChanged: widget.onChanged, + validator: widget.validator, + enabled: widget.enabled, + obscureText: obscure ?? false, + onTapOutside: (event) { + FocusScope.of(context).unfocus(); + }, + onFieldSubmitted: widget.onSubmitted, + maxLength: widget.maxLength, + textDirection: TextDirection.rtl, + style: widget.style , + keyboardType: widget.keyboardType, + decoration: InputDecoration( + errorStyle: widget.errorStyle, + errorMaxLines: 1, + isDense: widget.isDense, + suffixIcon: widget.suffixIcon ?? + (widget._isPassword + ? IconButton( + onPressed: () { + setState(() { + obscure = !obscure!; + }); + }, + icon: Icon(!obscure! + ? CupertinoIcons.eye_slash + : CupertinoIcons.eye)) + : null), + suffixIconConstraints: widget.boxConstraints, + prefixIcon: widget.prefixIcon, + prefixIconConstraints: widget.boxConstraints, + hintText: widget.hintText, + labelText: widget.label, + labelStyle: widget.labelStyle, + filled: widget.filled, + counter: widget.showCounter ? null : const SizedBox(), + hintStyle: widget.hintStyle, + enabledBorder: widget._inputBorder, + focusedBorder: widget._inputBorder, + border: widget._inputBorder), + )); + } +} \ No newline at end of file diff --git a/lib/presentation/widget/pagination/pagination_from_until.dart b/lib/presentation/widget/pagination/pagination_from_until.dart new file mode 100644 index 0000000..53f1203 --- /dev/null +++ b/lib/presentation/widget/pagination/pagination_from_until.dart @@ -0,0 +1,255 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; + +class PaginationFromUntil extends StatefulWidget { + const PaginationFromUntil({super.key}); + + @override + State createState() => _PaginationFromUntilState(); +} + +class _PaginationFromUntilState extends State { + int current = 1; + int total = 10; + + @override + Widget build(BuildContext context) { + return Container( + width: 164, + height: 47, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color(0xFFEAEFFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)), + ), + child: Row( + children: [ + FloatingActionButton.small( + onPressed: () { + if(current>1){ + setState(() { + current--; + }); + } + + }, + shape: CircleBorder(), + elevation: 0, + backgroundColor: Colors.white, + child: Icon(CupertinoIcons.arrow_left, color: AppColor.blueNormal), + ), + Expanded( + child: Text( + '$current از $total', + textAlign: TextAlign.center, + textDirection: TextDirection.rtl, + style: AppFonts.yekan16Regular.copyWith( + color: AppColor.blueNormal, + ), + ), + ), + FloatingActionButton.small( + + onPressed:() { + if (current < total) { + setState(() { + current++; + }); + } + }, + shape: CircleBorder(), + elevation: 0, + backgroundColor: AppColor.blueNormal, + child: Icon(CupertinoIcons.arrow_right, color: Colors.white), + ), + ], + ), + ); + } + + Stack buildStack() { + return Stack( + children: [ + Positioned( + left: 4, + top: 4, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 40, + top: 40, + child: Container( + transform: + Matrix4.identity() + ..translate(0.0, 0.0) + ..rotateZ(-3.14), + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: + Colors.white /* Secondary */, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + Colors + .white /* Secondary */, + ), + borderRadius: + BorderRadius.circular(50), + ), + ), + child: Stack(), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + Positioned( + left: 8, + top: 8, + child: Container(width: 24, height: 24, child: Stack()), + ), + ], + ), + ), + ), + Positioned( + left: 120, + top: 3, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 40, + top: 40, + child: Container( + transform: + Matrix4.identity() + ..translate(0.0, 0.0) + ..rotateZ(-3.14), + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color( + 0xFF2D5FFF, + ) /* Primary */, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: const Color( + 0xFF2D5FFF, + ) /* Primary */, + ), + borderRadius: + BorderRadius.circular(50), + ), + ), + child: Stack(), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + Positioned( + left: 8, + top: 8, + child: Container(width: 24, height: 24, child: Stack()), + ), + ], + ), + ), + ), + Positioned( + left: 63, + top: 9, + child: Text( + '1 از 17', + style: TextStyle( + color: const Color(0xFF2D5FFF) /* Primary */, + fontSize: 16, + fontFamily: 'IRANYekanFN', + fontWeight: FontWeight.w400, + height: 1.75, + ), + ), + ), + ], + ); + } +} diff --git a/lib/presentation/widget/pagination/show_more.dart b/lib/presentation/widget/pagination/show_more.dart new file mode 100644 index 0000000..36fb207 --- /dev/null +++ b/lib/presentation/widget/pagination/show_more.dart @@ -0,0 +1,78 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; + +class RShowMore extends StatefulWidget { + const RShowMore({super.key}); + + @override + State createState() => _RShowMoreState(); +} + +class _RShowMoreState extends State + with SingleTickerProviderStateMixin { + bool _toggled = false; + late final AnimationController _controller; + late final Animation _iconRotation; + + @override + void initState() { + super.initState(); + + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 500), + ); + _iconRotation = Tween( + begin: 0, + end: 0.50, + ) // 90 degrees (quarter turn) + .animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut)); + } + + void _toggle() { + setState(() => _toggled = !_toggled); + _toggled ? _controller.forward() : _controller.reverse(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: _toggle, + behavior: HitTestBehavior.opaque, + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 8, + children: [ + RotationTransition( + turns: _iconRotation, + child: const Icon(CupertinoIcons.chevron_down, size: 12,color:AppColor.blueNormal ,), + ), + + AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + transitionBuilder: + (child, animation) => + FadeTransition(opacity: animation, child: child), + child: Text( + _toggled ? 'کمتر' : 'مشاهده بیشتر', + key: ValueKey(_toggled), + style: AppFonts.yekan10Regular.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(height: 50,) + ], + + + + ), + ); + } +} diff --git a/lib/presentation/widget/tabs/new_tab.dart b/lib/presentation/widget/tabs/new_tab.dart new file mode 100644 index 0000000..c6e73c4 --- /dev/null +++ b/lib/presentation/widget/tabs/new_tab.dart @@ -0,0 +1,784 @@ +// 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. + +/// @docImport 'switch.dart'; +library; + +import 'dart:collection'; +import 'dart:math' as math; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; + +// Minimum padding from edges of the segmented control to edges of +// encompassing widget. +const EdgeInsetsGeometry _kHorizontalItemPadding = EdgeInsets.symmetric( + horizontal: 16.0, +); + +// Minimum height of the segmented control. +const double _kMinSegmentedControlHeight = 28.0; + +// The default color used for the text of the disabled segment. +const Color _kDisableTextColor = Color.fromARGB(115, 122, 122, 122); + +// The duration of the fade animation used to transition when a new widget +// is selected. +const Duration _kFadeDuration = Duration(milliseconds: 165); + +class NewCupertinoSegmentedControl extends StatefulWidget { + /// Creates an iOS-style segmented control bar. + /// + /// The [children] argument must be an ordered [Map] such as a + /// [LinkedHashMap]. Further, the length of the [children] list must be + /// greater than one. + /// + /// Each widget value in the map of [children] must have an associated key + /// that uniquely identifies this widget. This key is what will be returned + /// in the [onValueChanged] callback when a new value from the [children] map + /// is selected. + /// + /// The [groupValue] is the currently selected value for the segmented control. + /// If no [groupValue] is provided, or the [groupValue] is null, no widget will + /// appear as selected. The [groupValue] must be either null or one of the keys + /// in the [children] map. + NewCupertinoSegmentedControl({ + super.key, + required this.children, + required this.onValueChanged, + this.groupValue, + this.unselectedColor, + this.selectedColor, + this.borderColor, + this.pressedColor, + this.disabledColor, + this.disabledTextColor, + this.padding, + this.disabledChildren = const {}, + }) : assert(children.length >= 2), + assert( + groupValue == null || + children.keys.any((T child) => child == groupValue), + 'The groupValue must be either null or one of the keys in the children map.', + ); + + /// The identifying keys and corresponding widget values in the + /// segmented control. + /// + /// The map must have more than one entry. + /// This attribute must be an ordered [Map] such as a [LinkedHashMap]. + final Map children; + + /// The identifier of the widget that is currently selected. + /// + /// This must be one of the keys in the [Map] of [children]. + /// If this attribute is null, no widget will be initially selected. + final T? groupValue; + + /// The callback that is called when a new option is tapped. + /// + /// The segmented control passes the newly selected widget's associated key + /// to the callback but does not actually change state until the parent + /// widget rebuilds the segmented control with the new [groupValue]. + final ValueChanged onValueChanged; + + /// The color used to fill the backgrounds of unselected widgets and as the + /// text color of the selected widget. + /// + /// Defaults to [CupertinoTheme]'s `primaryContrastingColor` if null. + final Color? unselectedColor; + + /// The color used to fill the background of the selected widget and as the text + /// color of unselected widgets. + /// + /// Defaults to [CupertinoTheme]'s `primaryColor` if null. + final Color? selectedColor; + + /// The color used as the border around each widget. + /// + /// Defaults to [CupertinoTheme]'s `primaryColor` if null. + final Color? borderColor; + + /// The color used to fill the background of the widget the user is + /// temporarily interacting with through a long press or drag. + /// + /// Defaults to the selectedColor at 20% opacity if null. + final Color? pressedColor; + + /// The color used to fill the background of the segment when it is disabled. + /// + /// If null, this color will be 50% opacity of the [selectedColor] when + /// the segment is selected. If the segment is unselected, this color will be + /// set to [unselectedColor]. + final Color? disabledColor; + + /// The color used for the text of the segment when it is disabled. + final Color? disabledTextColor; + + /// The CupertinoSegmentedControl will be placed inside this padding. + /// + /// Defaults to EdgeInsets.symmetric(horizontal: 16.0) + final EdgeInsetsGeometry? padding; + + /// The set of identifying keys that correspond to the segments that should be disabled. + /// + /// All segments are enabled by default. + final Set disabledChildren; + + @override + State> createState() => + _SegmentedControlState(); +} + +class _SegmentedControlState + extends State> + with TickerProviderStateMixin> { + T? _pressedKey; + + final List _selectionControllers = + []; + final List _childTweens = []; + + late ColorTween _forwardBackgroundColorTween; + late ColorTween _reverseBackgroundColorTween; + late ColorTween _textColorTween; + + Color? _selectedColor; + Color? _unselectedColor; + Color? _borderColor; + Color? _pressedColor; + Color? _selectedDisabledColor; + Color? _unselectedDisabledColor; + Color? _disabledTextColor; + + AnimationController createAnimationController() { + return AnimationController(duration: _kFadeDuration, vsync: this) + ..addListener(() { + setState(() { + // State of background/text colors has changed + }); + }); + } + + bool _updateColors() { + assert(mounted, 'This should only be called after didUpdateDependencies'); + bool changed = false; + final Color disabledTextColor = + widget.disabledTextColor ?? _kDisableTextColor; + if (_disabledTextColor != disabledTextColor) { + changed = true; + _disabledTextColor = disabledTextColor; + } + final Color selectedColor = + widget.selectedColor ?? CupertinoTheme.of(context).primaryColor; + if (_selectedColor != selectedColor) { + changed = true; + _selectedColor = selectedColor; + } + final Color unselectedColor = + widget.unselectedColor ?? + CupertinoTheme.of(context).primaryContrastingColor; + if (_unselectedColor != unselectedColor) { + changed = true; + _unselectedColor = unselectedColor; + } + final Color selectedDisabledColor = + widget.disabledColor ?? selectedColor.withOpacity(0.5); + final Color unselectedDisabledColor = + widget.disabledColor ?? unselectedColor; + if (_selectedDisabledColor != selectedDisabledColor || + _unselectedDisabledColor != unselectedDisabledColor) { + changed = true; + _selectedDisabledColor = selectedDisabledColor; + _unselectedDisabledColor = unselectedDisabledColor; + } + final Color borderColor = + widget.borderColor ?? CupertinoTheme.of(context).primaryColor; + if (_borderColor != borderColor) { + changed = true; + _borderColor = borderColor; + } + final Color pressedColor = + widget.pressedColor ?? + CupertinoTheme.of(context).primaryColor.withOpacity(0.2); + if (_pressedColor != pressedColor) { + changed = true; + _pressedColor = pressedColor; + } + + _forwardBackgroundColorTween = ColorTween( + begin: _pressedColor, + end: _selectedColor, + ); + _reverseBackgroundColorTween = ColorTween( + begin: _unselectedColor, + end: _selectedColor, + ); + _textColorTween = ColorTween(begin: _selectedColor, end: _unselectedColor); + return changed; + } + + void _updateAnimationControllers() { + assert(mounted, 'This should only be called after didUpdateDependencies'); + for (final AnimationController controller in _selectionControllers) { + controller.dispose(); + } + _selectionControllers.clear(); + _childTweens.clear(); + + for (final T key in widget.children.keys) { + final AnimationController animationController = + createAnimationController(); + if (widget.groupValue == key) { + _childTweens.add(_reverseBackgroundColorTween); + animationController.value = 1.0; + } else { + _childTweens.add(_forwardBackgroundColorTween); + } + _selectionControllers.add(animationController); + } + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + if (_updateColors()) { + _updateAnimationControllers(); + } + } + + @override + void didUpdateWidget(NewCupertinoSegmentedControl oldWidget) { + super.didUpdateWidget(oldWidget); + + if (_updateColors() || + oldWidget.children.length != widget.children.length) { + _updateAnimationControllers(); + } + + if (oldWidget.groupValue != widget.groupValue) { + int index = 0; + for (final T key in widget.children.keys) { + if (widget.groupValue == key) { + _childTweens[index] = _forwardBackgroundColorTween; + _selectionControllers[index].forward(); + } else { + _childTweens[index] = _reverseBackgroundColorTween; + _selectionControllers[index].reverse(); + } + index += 1; + } + } + } + + @override + void dispose() { + for (final AnimationController animationController + in _selectionControllers) { + animationController.dispose(); + } + super.dispose(); + } + + void _onTapDown(T currentKey) { + if (_pressedKey == null && currentKey != widget.groupValue) { + setState(() { + _pressedKey = currentKey; + }); + } + } + + void _onTapCancel() { + setState(() { + _pressedKey = null; + }); + } + + void _onTap(T currentKey) { + if (currentKey != _pressedKey) { + return; + } + if (!widget.disabledChildren.contains(currentKey)) { + if (currentKey != widget.groupValue) { + widget.onValueChanged(currentKey); + } + } + _pressedKey = null; + } + + Color? getTextColor(int index, T currentKey) { + if (widget.disabledChildren.contains(currentKey)) { + return _disabledTextColor; + } + if (_selectionControllers[index].isAnimating) { + return _textColorTween.evaluate(_selectionControllers[index]); + } + if (widget.groupValue == currentKey) { + return _unselectedColor; + } + return _selectedColor; + } + + Color? getBackgroundColor(int index, T currentKey) { + if (widget.disabledChildren.contains(currentKey)) { + return widget.groupValue == currentKey + ? _selectedDisabledColor + : _unselectedDisabledColor; + } + if (_selectionControllers[index].isAnimating) { + return _childTweens[index].evaluate(_selectionControllers[index]); + } + if (widget.groupValue == currentKey) { + return _selectedColor; + } + if (_pressedKey == currentKey) { + return _pressedColor; + } + return _unselectedColor; + } + + @override + Widget build(BuildContext context) { + final List gestureChildren = []; + final List backgroundColors = []; + int index = 0; + int? selectedIndex; + int? pressedIndex; + for (final T currentKey in widget.children.keys) { + selectedIndex = (widget.groupValue == currentKey) ? index : selectedIndex; + pressedIndex = (_pressedKey == currentKey) ? index : pressedIndex; + + final TextStyle textStyle = DefaultTextStyle.of( + context, + ).style.copyWith(color: getTextColor(index, currentKey)); + final IconThemeData iconTheme = IconThemeData( + color: getTextColor(index, currentKey), + ); + + Widget child = Center(child: widget.children[currentKey]); + + child = MouseRegion( + cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTapDown: + widget.disabledChildren.contains(currentKey) + ? null + : (TapDownDetails event) { + _onTapDown(currentKey); + }, + onTapCancel: + widget.disabledChildren.contains(currentKey) + ? null + : _onTapCancel, + onTap: () { + _onTap(currentKey); + }, + child: IconTheme( + data: iconTheme, + child: DefaultTextStyle( + style: textStyle, + child: Semantics( + button: true, + inMutuallyExclusiveGroup: true, + selected: widget.groupValue == currentKey, + child: child, + ), + ), + ), + ), + ); + + backgroundColors.add(getBackgroundColor(index, currentKey)!); + gestureChildren.add(child); + index += 1; + } + + final Widget box = _SegmentedControlRenderWidget( + selectedIndex: selectedIndex, + pressedIndex: pressedIndex, + backgroundColors: backgroundColors, + borderColor: _borderColor!, + children: gestureChildren, + ); + + return Padding( + padding: widget.padding ?? _kHorizontalItemPadding, + child: UnconstrainedBox(constrainedAxis: Axis.horizontal, child: box), + ); + } +} + +class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { + const _SegmentedControlRenderWidget({ + super.key, + super.children, + required this.selectedIndex, + required this.pressedIndex, + required this.backgroundColors, + required this.borderColor, + }); + + final int? selectedIndex; + final int? pressedIndex; + final List backgroundColors; + final Color borderColor; + + @override + RenderObject createRenderObject(BuildContext context) { + return _RenderSegmentedControl( + textDirection: Directionality.of(context), + selectedIndex: selectedIndex, + pressedIndex: pressedIndex, + backgroundColors: backgroundColors, + borderColor: borderColor, + ); + } + + @override + void updateRenderObject( + BuildContext context, + _RenderSegmentedControl renderObject, + ) { + renderObject + ..textDirection = Directionality.of(context) + ..selectedIndex = selectedIndex + ..pressedIndex = pressedIndex + ..backgroundColors = backgroundColors + ..borderColor = borderColor; + } +} + +class _SegmentedControlContainerBoxParentData + extends ContainerBoxParentData { + RRect? surroundingRect; +} + +typedef _NextChild = RenderBox? Function(RenderBox child); + +class _RenderSegmentedControl extends RenderBox + with + ContainerRenderObjectMixin< + RenderBox, + ContainerBoxParentData + >, + RenderBoxContainerDefaultsMixin< + RenderBox, + ContainerBoxParentData + > { + _RenderSegmentedControl({ + required int? selectedIndex, + required int? pressedIndex, + required TextDirection textDirection, + required List backgroundColors, + required Color borderColor, + }) : _textDirection = textDirection, + _selectedIndex = selectedIndex, + _pressedIndex = pressedIndex, + _backgroundColors = backgroundColors, + _borderColor = borderColor; + + int? get selectedIndex => _selectedIndex; + int? _selectedIndex; + + set selectedIndex(int? value) { + if (_selectedIndex == value) { + return; + } + _selectedIndex = value; + markNeedsPaint(); + } + + int? get pressedIndex => _pressedIndex; + int? _pressedIndex; + + set pressedIndex(int? value) { + if (_pressedIndex == value) { + return; + } + _pressedIndex = value; + markNeedsPaint(); + } + + TextDirection get textDirection => _textDirection; + TextDirection _textDirection; + + set textDirection(TextDirection value) { + if (_textDirection == value) { + return; + } + _textDirection = value; + markNeedsLayout(); + } + + List get backgroundColors => _backgroundColors; + List _backgroundColors; + + set backgroundColors(List value) { + if (_backgroundColors == value) { + return; + } + _backgroundColors = value; + markNeedsPaint(); + } + + Color get borderColor => _borderColor; + Color _borderColor; + + set borderColor(Color value) { + if (_borderColor == value) { + return; + } + _borderColor = value; + markNeedsPaint(); + } + + @override + double computeMinIntrinsicWidth(double height) { + RenderBox? child = firstChild; + double minWidth = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childWidth = child.getMinIntrinsicWidth(height); + minWidth = math.max(minWidth, childWidth); + child = childParentData.nextSibling; + } + return minWidth * childCount; + } + + @override + double computeMaxIntrinsicWidth(double height) { + RenderBox? child = firstChild; + double maxWidth = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childWidth = child.getMaxIntrinsicWidth(height); + maxWidth = math.max(maxWidth, childWidth); + child = childParentData.nextSibling; + } + return maxWidth * childCount; + } + + @override + double computeMinIntrinsicHeight(double width) { + RenderBox? child = firstChild; + double minHeight = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childHeight = child.getMinIntrinsicHeight(width); + minHeight = math.max(minHeight, childHeight); + child = childParentData.nextSibling; + } + return minHeight; + } + + @override + double computeMaxIntrinsicHeight(double width) { + RenderBox? child = firstChild; + double maxHeight = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childHeight = child.getMaxIntrinsicHeight(width); + maxHeight = math.max(maxHeight, childHeight); + child = childParentData.nextSibling; + } + return maxHeight; + } + + @override + double? computeDistanceToActualBaseline(TextBaseline baseline) { + return defaultComputeDistanceToHighestActualBaseline(baseline); + } + + @override + void setupParentData(RenderBox child) { + if (child.parentData is! _SegmentedControlContainerBoxParentData) { + child.parentData = _SegmentedControlContainerBoxParentData(); + } + } + + void _layoutRects( + _NextChild nextChild, + RenderBox? leftChild, + RenderBox? rightChild, + ) { + RenderBox? child = leftChild; + double start = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final Offset childOffset = Offset(start, 0.0); + childParentData.offset = childOffset; + final Rect childRect = Rect.fromLTWH( + start, + 0.0, + child.size.width, + child.size.height, + ); + final RRect rChildRect; + if (child == leftChild) { + rChildRect = RRect.fromRectAndCorners( + childRect, + topLeft: const Radius.circular(10.0), + bottomLeft: const Radius.circular(10.0), + ); + } else if (child == rightChild) { + rChildRect = RRect.fromRectAndCorners( + childRect, + topRight: const Radius.circular(10.0), + bottomRight: const Radius.circular(10.0), + ); + } else { + rChildRect = RRect.fromRectAndCorners(childRect); + } + childParentData.surroundingRect = rChildRect; + start += child.size.width; + child = nextChild(child); + } + } + + Size _calculateChildSize(BoxConstraints constraints) { + double maxHeight = _kMinSegmentedControlHeight; + double childWidth = constraints.minWidth / childCount; + RenderBox? child = firstChild; + while (child != null) { + childWidth = math.max( + childWidth, + child.getMaxIntrinsicWidth(double.infinity), + ); + child = childAfter(child); + } + childWidth = math.min(childWidth, constraints.maxWidth / childCount); + child = firstChild; + while (child != null) { + final double boxHeight = child.getMaxIntrinsicHeight(childWidth); + maxHeight = math.max(maxHeight, boxHeight); + child = childAfter(child); + } + return Size(childWidth, maxHeight); + } + + Size _computeOverallSizeFromChildSize(Size childSize) { + return constraints.constrain( + Size(childSize.width * childCount, childSize.height), + ); + } + + @override + double? computeDryBaseline( + covariant BoxConstraints constraints, + TextBaseline baseline, + ) { + final Size childSize = _calculateChildSize(constraints); + final BoxConstraints childConstraints = BoxConstraints.tight(childSize); + + BaselineOffset baselineOffset = BaselineOffset.noBaseline; + for ( + RenderBox? child = firstChild; + child != null; + child = childAfter(child) + ) { + baselineOffset = baselineOffset.minOf( + BaselineOffset(child.getDryBaseline(childConstraints, baseline)), + ); + } + return baselineOffset.offset; + } + + @override + Size computeDryLayout(BoxConstraints constraints) { + final Size childSize = _calculateChildSize(constraints); + return _computeOverallSizeFromChildSize(childSize); + } + + @override + void performLayout() { + final BoxConstraints constraints = this.constraints; + final Size childSize = _calculateChildSize(constraints); + + final BoxConstraints childConstraints = BoxConstraints.tightFor( + width: childSize.width, + height: childSize.height, + ); + + RenderBox? child = firstChild; + while (child != null) { + child.layout(childConstraints, parentUsesSize: true); + child = childAfter(child); + } + + switch (textDirection) { + case TextDirection.rtl: + _layoutRects(childBefore, lastChild, firstChild); + case TextDirection.ltr: + _layoutRects(childAfter, firstChild, lastChild); + } + + size = _computeOverallSizeFromChildSize(childSize); + } + + @override + void paint(PaintingContext context, Offset offset) { + RenderBox? child = firstChild; + int index = 0; + while (child != null) { + _paintChild(context, offset, child, index); + child = childAfter(child); + index += 1; + } + } + + void _paintChild( + PaintingContext context, + Offset offset, + RenderBox child, + int childIndex, + ) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + + context.canvas.drawRRect( + childParentData.surroundingRect!.shift(offset), + Paint() + ..color = backgroundColors[childIndex] + ..style = PaintingStyle.fill, + ); + context.canvas.drawRRect( + childParentData.surroundingRect!.shift(offset), + Paint() + ..color = borderColor + ..strokeWidth = 1.0 + ..style = PaintingStyle.stroke, + ); + + context.paintChild(child, childParentData.offset + offset); + } + + @override + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { + RenderBox? child = lastChild; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + if (childParentData.surroundingRect!.contains(position)) { + return result.addWithPaintOffset( + offset: childParentData.offset, + position: position, + hitTest: (BoxHitTestResult result, Offset localOffset) { + assert(localOffset == position - childParentData.offset); + return child!.hitTest(result, position: localOffset); + }, + ); + } + child = childParentData.previousSibling; + } + return false; + } +} diff --git a/lib/presentation/widget/tabs/tab.dart b/lib/presentation/widget/tabs/tab.dart new file mode 100644 index 0000000..ac2f735 --- /dev/null +++ b/lib/presentation/widget/tabs/tab.dart @@ -0,0 +1,115 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; + +import 'new_tab.dart'; + +class CupertinoSegmentedControlDemo extends StatefulWidget { + const CupertinoSegmentedControlDemo({super.key}); + + @override + State createState() => + _CupertinoSegmentedControlDemoState(); +} + +class _CupertinoSegmentedControlDemoState + extends State { + int _selectedSegment = 0; + + // The data for the segments + final Map _segments = const { + 0: Text('Segment 1'), + 1: Text('Segment 2'), + 2: Text('Segment 3'), + }; + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CupertinoSlidingSegmentedControl( + children: _segments, + groupValue: _selectedSegment, + + onValueChanged: (int? value) { + setState(() { + _selectedSegment = value!; + }); + }, + ), + const SizedBox(height: 20), + Text( + 'Selected Segment: ${_selectedSegment + 1}', + style: const TextStyle(fontSize: 24), + ), + ], + ), + ); + } +} + +class CupertinoSegmentedControlDemo2 extends StatefulWidget { + const CupertinoSegmentedControlDemo2({super.key}); + + @override + State createState() => + _CupertinoSegmentedControlDemoState2(); +} + +class _CupertinoSegmentedControlDemoState2 + extends State { + int _selectedSegment = 0; + + // The data for the segments + final Map _segments = { + 0:Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50) + ), + child: Text('لاشه', style: AppFonts.yekan13Regular), + ), + 1: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50) + ), + child: Text('زنده', style: AppFonts.yekan13Regular), + ), + }; + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + NewCupertinoSegmentedControl( + padding: EdgeInsetsDirectional.symmetric( + horizontal: 20, + vertical: 10, + ), + children: _segments, + groupValue: _selectedSegment, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + setState(() { + _selectedSegment = value; + }); + }, + ), + const SizedBox(height: 20), + Text( + 'Selected Segment: ${_selectedSegment + 1}', + style: const TextStyle(fontSize: 24), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/widget/vec_widget.dart b/lib/presentation/widget/vec_widget.dart new file mode 100644 index 0000000..8f76b40 --- /dev/null +++ b/lib/presentation/widget/vec_widget.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:vector_graphics/vector_graphics.dart'; + +SvgPicture vecWidget( + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, +}) { + return SvgPicture( + AssetBytesLoader(assets), + width: width, + height: height, + fit: fit ?? BoxFit.contain, + colorFilter: + color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, + ); +} +Widget vecWidget2( + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, + }) { + final resolvedColor = WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } + return color; + }).resolve({}); // You can pass actual states if needed + + return IconTheme( + data: IconThemeData(color: resolvedColor), + child: SvgPicture( + AssetBytesLoader(assets), + width: width, + height: height, + fit: fit ?? BoxFit.contain, + colorFilter: resolvedColor != null + ? ColorFilter.mode(resolvedColor, BlendMode.srcIn) + : null, + ), + ); +} diff --git a/pubspec.yaml b/pubspec.yaml index bb74dfd..52bb4ec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,34 +58,14 @@ dev_dependencies: flutter: uses-material-design: true - # To add assets to your application, add an assets section, like this: + assets: - assets/icons/ - assets/images/ - assets/logos/ + - assets/vec/ - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # 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/to/font-from-package + fonts: + - family: yekan + fonts: + - asset: fonts/iranyekanregularfanum.ttf diff --git a/vecGeneratoe.sh b/vecGeneratoe.sh new file mode 100644 index 0000000..4f92558 --- /dev/null +++ b/vecGeneratoe.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Directory to read files from +sourcePath="assets/icons" +targetPath="assets/vec" + + +if [ ! -e "$targetPath" ]; then + echo "📁 Directory does not exist. Creating: $targetPath" + mkdir -p "$targetPath" +fi + + +# Loop and delete old vec file +for file in "$targetPath"/* +do + if [ -f "$file" ]; then + + echo "Delete old ===> $file" + rm "$file" + fi +done +# Loop through all files in the directory +for file in "$sourcePath"/* +do + if [ -f "$file" ]; then + echo "Generate Vec file ===> $file" + fileName=$(basename -- "$file") + echo "Generate Vec file ===> $fileName" + dart run vector_graphics_compiler -i "$file" -o "$targetPath/$fileName.vec" + git add . + fi +done \ No newline at end of file From e83388670c7af96c050cbd5993f82edb7183d646 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 7 Apr 2025 16:49:15 +0330 Subject: [PATCH 007/256] fix : splash animation feat : auth with password chore : app Architecture --- assets/icons/call.svg | 8 + assets/icons/key.svg | 3 + assets/icons/user.svg | 1 + assets/vec/call.svg.vec | Bin 0 -> 1139 bytes assets/vec/key.svg.vec | Bin 0 -> 800 bytes .../local_storage/hive/hive_provider.dart | 12 + .../local_storage/hive/hive_types.dart | 1 + .../i_local_storage_provider.dart | 3 + .../user/user_local_storage.dart | 19 ++ lib/data/model/user/user_model.dart | 17 ++ lib/data/model/user/user_model.g.dart | 44 +++ lib/domain/entity/user/user_entity.dart | 6 + .../repository/user/user_repository.dart | 25 ++ lib/domain/service/user/user_service.dart | 17 ++ lib/infrastructure/di/di.dart | 35 +++ lib/main.dart | 284 +----------------- lib/presentation/common/assets.dart | 5 + .../pages/auth/auth_with_otp/logic.dart | 15 + .../pages/auth/auth_with_otp/view.dart | 15 + .../auth/auth_with_use_and_pass/logic.dart | 27 ++ .../auth/auth_with_use_and_pass/view.dart | 210 +++++++++++++ lib/presentation/pages/splash/logic.dart | 67 +++++ lib/presentation/pages/splash/view.dart | 48 +++ .../pages/system_design/system_design.dart | 265 ++++++++++++++++ lib/presentation/routes/app_pages.dart | 33 ++ lib/presentation/routes/app_paths.dart | 9 + lib/presentation/widget/buttons/elevated.dart | 4 +- .../widget/captcha/captcha_widget.dart | 266 ++++++++++++++++ lib/presentation/widget/vec_widget.dart | 19 ++ pubspec.lock | 8 +- pubspec.yaml | 1 - runner.sh | 1 + 32 files changed, 1192 insertions(+), 276 deletions(-) create mode 100644 assets/icons/call.svg create mode 100644 assets/icons/key.svg create mode 100644 assets/icons/user.svg create mode 100644 assets/vec/call.svg.vec create mode 100644 assets/vec/key.svg.vec create mode 100644 lib/data/data_provider/local_storage/hive/hive_provider.dart create mode 100644 lib/data/data_provider/local_storage/hive/hive_types.dart create mode 100644 lib/data/data_provider/local_storage/i_local_storage_provider.dart create mode 100644 lib/data/data_source/local_storage/user/user_local_storage.dart create mode 100644 lib/data/model/user/user_model.dart create mode 100644 lib/data/model/user/user_model.g.dart create mode 100644 lib/domain/entity/user/user_entity.dart create mode 100644 lib/domain/repository/user/user_repository.dart create mode 100644 lib/domain/service/user/user_service.dart create mode 100644 lib/infrastructure/di/di.dart create mode 100644 lib/presentation/pages/auth/auth_with_otp/logic.dart create mode 100644 lib/presentation/pages/auth/auth_with_otp/view.dart create mode 100644 lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart create mode 100644 lib/presentation/pages/auth/auth_with_use_and_pass/view.dart create mode 100644 lib/presentation/pages/splash/logic.dart create mode 100644 lib/presentation/pages/splash/view.dart create mode 100644 lib/presentation/pages/system_design/system_design.dart create mode 100644 lib/presentation/routes/app_pages.dart create mode 100644 lib/presentation/routes/app_paths.dart create mode 100644 lib/presentation/widget/captcha/captcha_widget.dart create mode 100644 runner.sh diff --git a/assets/icons/call.svg b/assets/icons/call.svg new file mode 100644 index 0000000..e7d1c11 --- /dev/null +++ b/assets/icons/call.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/key.svg b/assets/icons/key.svg new file mode 100644 index 0000000..fe524b4 --- /dev/null +++ b/assets/icons/key.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/user.svg b/assets/icons/user.svg new file mode 100644 index 0000000..fbe07ed --- /dev/null +++ b/assets/icons/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/vec/call.svg.vec b/assets/vec/call.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..d9b7763661609c34d74a44328e47e377479d465b GIT binary patch literal 1139 zcmYL|T}YEr7{}kaSu%?thpDq!nW30y>_UiMIj0+i3UZS4vC7ZoMU*Qn+aL;k&9qu& zR+|vQ#A4{HbTx=Tw2Lm3=%RL07mKb^f&>Mx)^A6x!Qua&=i~qUpXWSlsp!`%Wtui4 z)2DEHdOBs*v{cGz(X;}MpCx1cr*QLv$=a9pYHoLq^!fVa!hDrt5A`;Dd$C#NYUv(@bxD`PrTRj2*x)Td>lQfk z$k~Z6n|m&~S=7rX&xR%^evMkYsktW79LC}wg?{~)!qw8BBIt0D^IasOh4l4RxZO^A z_$1=4d^CL&emxhQ0e^@xZ>2~Ez6npjX<&x$(QxG-dg8x@vDm}xmeJbFTvkLRY~Wv`r#{}s%FOP| zxs`1SH}}D*S+qQj-^Ti6Wc*(szN`UUq1h?k06iag)T1pm_p4ugHy2ca*p{)Q(~w<4s=^KZ-pD*9bVlzOAEfA3^UVwunN%{+w?U z{}Xm#n)e=5IM&&-fnBP$Zf|8?G3uS9?l`B0yisBfQai1ygzuNqZWOTt!_o-nQ+tTL zIYIt4bb08f3v48=oA@)FTl9Gre*o?0_zuADMOTo#^VouLT!b%(y-8u2w^iX-XFKx< z;J<{9Zf0^FybRt1JFurY+L`HX>b3D!cd6G*pFN5z?lKf6qJ0YedOtDE#16pQLhK;@ zwlR-~^y&jciZ|$p5qA&Y1abY?C+TT`|BDGez&8axB0r6f6{g>}%9UP(RLW&h@E0LM Bq^bY_ literal 0 HcmV?d00001 diff --git a/assets/vec/key.svg.vec b/assets/vec/key.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..3252fd9bc52426fabe6078604f4bdfe41e5e684d GIT binary patch literal 800 zcmX|Q@wNTM+zM4~8&=tUaYi#|kij#(5J->6#_ndRjJ+`%9nCgXi z$wD0D%6L4kTZGVcyAYzmc!W8BEcrK6?wHNE_-`P{5;ek0JH{wX3Sa*dlYHfg(2W%n zry6h3;?G5jZM;m$*)%=Ug5=*mA(@#;Np=s!q<`J?eM0=gyFo&J;`JrU=>;jLAEe;$ zgrOg#_O5y9_Xe^uKDyt`$RE}eh8_rg5cS|keZ-?5X&xp&H-s7FL&=^*VkHx?&PwQQOCW>&8X{a+r#Js^A_d?Z)$by4a`Yq zyG{IfyoP)Bm9g)njel2eV9U}P_Agg+d9j60eX3<+PFh>iAsMIB-270HeJ%Bm)5U>7 z9@=8zGffX<--kaAaZ-yA@<8Z3c^V?YSh5O{nXsu^IcC!~c}uzd}WK!_w|; z=riuB=tFTk#X>%M5wD`XQvph93T1bOCGnkLPX@nBf9rz6i0}Pd&d86fu4d?A-oo5Y J2ezZ@{{YXaIaUAw literal 0 HcmV?d00001 diff --git a/lib/data/data_provider/local_storage/hive/hive_provider.dart b/lib/data/data_provider/local_storage/hive/hive_provider.dart new file mode 100644 index 0000000..c97f027 --- /dev/null +++ b/lib/data/data_provider/local_storage/hive/hive_provider.dart @@ -0,0 +1,12 @@ +import 'package:hive_ce_flutter/hive_flutter.dart'; +import 'package:rasadyar_app/data/data_provider/local_storage/i_local_storage_provider.dart'; + + +enum HiveBoxNames { user, settings, auth } + +class HiveProvider extends ILocalStorageProvider { + @override + Future init() async { + await Hive.initFlutter(); + } +} diff --git a/lib/data/data_provider/local_storage/hive/hive_types.dart b/lib/data/data_provider/local_storage/hive/hive_types.dart new file mode 100644 index 0000000..eff0bf2 --- /dev/null +++ b/lib/data/data_provider/local_storage/hive/hive_types.dart @@ -0,0 +1 @@ +const int userTypeId = 0; diff --git a/lib/data/data_provider/local_storage/i_local_storage_provider.dart b/lib/data/data_provider/local_storage/i_local_storage_provider.dart new file mode 100644 index 0000000..2ccacf8 --- /dev/null +++ b/lib/data/data_provider/local_storage/i_local_storage_provider.dart @@ -0,0 +1,3 @@ +abstract class ILocalStorageProvider { + Future init(); +} diff --git a/lib/data/data_source/local_storage/user/user_local_storage.dart b/lib/data/data_source/local_storage/user/user_local_storage.dart new file mode 100644 index 0000000..0648a2d --- /dev/null +++ b/lib/data/data_source/local_storage/user/user_local_storage.dart @@ -0,0 +1,19 @@ +import 'package:hive_ce_flutter/hive_flutter.dart'; +import 'package:rasadyar_app/data/data_provider/local_storage/hive/hive_provider.dart'; + +abstract class IUserLocalStorage { + Future userAuthed(); +} + +class UserLocalStorage extends IUserLocalStorage { + final user = Hive.box(HiveBoxNames.user.name); + + @override + Future userAuthed() async { + if (user.isNotEmpty ) { + return true; + } else { + return false; + } + } +} diff --git a/lib/data/model/user/user_model.dart b/lib/data/model/user/user_model.dart new file mode 100644 index 0000000..37f2b3b --- /dev/null +++ b/lib/data/model/user/user_model.dart @@ -0,0 +1,17 @@ +import 'package:hive_ce/hive.dart'; + +import '../../data_provider/local_storage/hive/hive_types.dart'; + + +part 'user_model.g.dart'; + +@HiveType(typeId: userTypeId) +class UserModel extends HiveObject{ + @HiveField(0) + String? token; + + @HiveField(1) + String? refreshToken; + + UserModel({this.token, this.refreshToken}); +} diff --git a/lib/data/model/user/user_model.g.dart b/lib/data/model/user/user_model.g.dart new file mode 100644 index 0000000..e786785 --- /dev/null +++ b/lib/data/model/user/user_model.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class UserModelAdapter extends TypeAdapter { + @override + final int typeId = 0; + + @override + UserModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return UserModel( + token: fields[0] as String?, + refreshToken: fields[1] as String?, + ); + } + + @override + void write(BinaryWriter writer, UserModel obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.token) + ..writeByte(1) + ..write(obj.refreshToken); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is UserModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/domain/entity/user/user_entity.dart b/lib/domain/entity/user/user_entity.dart new file mode 100644 index 0000000..1988ce3 --- /dev/null +++ b/lib/domain/entity/user/user_entity.dart @@ -0,0 +1,6 @@ +class UserEntity { + String? token; + String? refreshToken; + + UserEntity({this.token, this.refreshToken}); +} diff --git a/lib/domain/repository/user/user_repository.dart b/lib/domain/repository/user/user_repository.dart new file mode 100644 index 0000000..599c891 --- /dev/null +++ b/lib/domain/repository/user/user_repository.dart @@ -0,0 +1,25 @@ +import 'package:rasadyar_app/data/data_source/local_storage/user/user_local_storage.dart'; + +abstract class IUserRepository { + Future userAuthed(); + /*Future setUserAuthed(bool value); + Future setUserName(String name); + Future getUserName(); + Future setUserPhone(String phone); + Future getUserPhone(); + Future setUserEmail(String email); + Future getUserEmail(); + Future setUserPassword(String password); + Future getUserPassword();*/ +} + +class UserRepository implements IUserRepository { + final IUserLocalStorage _userLocalStorage; + + UserRepository(this._userLocalStorage); + + @override + Future userAuthed() async { + return await _userLocalStorage.userAuthed(); + } +} diff --git a/lib/domain/service/user/user_service.dart b/lib/domain/service/user/user_service.dart new file mode 100644 index 0000000..db8005c --- /dev/null +++ b/lib/domain/service/user/user_service.dart @@ -0,0 +1,17 @@ +import 'package:get/get.dart'; +import 'package:rasadyar_app/domain/repository/user/user_repository.dart'; +import 'package:rasadyar_app/infrastructure/di/di.dart'; + +class UserService extends GetxService { + late IUserRepository _userLocalStorage; + + @override + void onInit() { + return super.onInit(); + _userLocalStorage = di.get(); + } + + Future isUserAuthed() async { + return await _userLocalStorage.userAuthed(); + } +} diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart new file mode 100644 index 0000000..7b43cc5 --- /dev/null +++ b/lib/infrastructure/di/di.dart @@ -0,0 +1,35 @@ +import 'package:get_it/get_it.dart'; +import 'package:hive_ce_flutter/hive_flutter.dart'; +import 'package:logger/logger.dart'; +import 'package:rasadyar_app/data/data_provider/local_storage/hive/hive_provider.dart'; +import 'package:rasadyar_app/data/data_source/local_storage/user/user_local_storage.dart'; +import 'package:rasadyar_app/data/model/user/user_model.dart'; +import 'package:rasadyar_app/domain/repository/user/user_repository.dart'; + +final di = GetIt.instance; + +void setupInjection() { + di.registerLazySingleton(() => HiveProvider(), instanceName: 'HiveProvider'); + di.registerSingleton( Logger()); +} + +Future setupAllProvider() async { + await _setupLocalStorage(); + await di.allReady(); +} + +Future _setupLocalStorage() async { + final hiveProvider = di.get(instanceName: 'HiveProvider'); + await hiveProvider.init(); + Hive.registerAdapter(UserModelAdapter()); + + await Hive.openBox(HiveBoxNames.user.name); + + //user + di.registerLazySingleton(() => UserLocalStorage()); + di.registerLazySingleton( + () => UserRepository(di.get()), + ); + + // +} diff --git a/lib/main.dart b/lib/main.dart index 787cc7e..c62ccab 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,19 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_app/domain/service/user/user_service.dart'; +import 'package:rasadyar_app/infrastructure/di/di.dart'; import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; -import 'package:rasadyar_app/presentation/utils/color_utils.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/fab_outlined.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/outline_elevated.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/text_button.dart'; -import 'package:rasadyar_app/presentation/widget/inputs/r_input.dart'; -import 'package:rasadyar_app/presentation/widget/pagination/pagination_from_until.dart'; -import 'package:rasadyar_app/presentation/widget/pagination/show_more.dart'; -import 'package:rasadyar_app/presentation/widget/tabs/tab.dart'; +import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import 'presentation/widget/buttons/fab.dart'; +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + + setupInjection(); + await setupAllProvider(); -void main() { runApp(MyApp()); } @@ -22,264 +19,15 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', + return GetMaterialApp( + title: 'رصدیار', theme: ThemeData( - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - ), - home: Home(), - ); - } -} - -class Home extends StatefulWidget { - const Home({super.key}); - - @override - State createState() => _HomeState(); -} - -class _HomeState extends State { - List _isOpen = [false, false, false, false, false, false]; - - void _handleAdd() { - print("Add FAB pressed"); - } - - void _handleEdit() { - print("Edit FAB pressed"); - } - - void _handleDelete() { - print("Delete FAB pressed"); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text("System design"), centerTitle: true), - body: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: ExpansionPanelList( - expansionCallback: (panelIndex, isExpanded) { - setState(() { - _isOpen[panelIndex] = isExpanded; - }); - }, - children: [ - buttonWidget(), - fabWidget(), - outlinedFabWidget(), - paginationWidget(), - tabWidget(), - inputsWidget(), - ], - ), - ), - ), - ); - } - - ExpansionPanel inputsWidget() { - return ExpansionPanel( - isExpanded: _isOpen[5], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "inputs", - style: AppFonts.yekan20Regular.copyWith(color: Colors.red), - ), - ); - }, - body: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - spacing: 14, - children: [ - RTextField( - hintText: 'حجم کشتار را در روز به قطعه وارد کنید', - hintStyle: AppFonts.yekan13Regular, - ), - RTextField( - label: 'تلفن مرغداری', - labelStyle: AppFonts.yekan10Regular, - ), - ], - ), - ), - ); - } - - ExpansionPanel tabWidget() { - return ExpansionPanel( - isExpanded: _isOpen[4], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "tab", - style: AppFonts.yekan20Regular.copyWith(color: Colors.red), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - CupertinoSegmentedControlDemo(), - CupertinoSegmentedControlDemo2(), - ], - ), - ); - } - - ExpansionPanel paginationWidget() { - return ExpansionPanel( - isExpanded: _isOpen[3], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "پیجینیشن", - style: AppFonts.yekan20Regular.copyWith(color: Colors.red), - ), - ); - }, - body: Column(spacing: 14, children: [RShowMore(), PaginationFromUntil()]), - ); - } - - ExpansionPanel outlinedFabWidget() { - return ExpansionPanel( - isExpanded: _isOpen[2], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "Outlined Fab ", - style: AppFonts.yekan20Regular.copyWith(color: Colors.green), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - Row(), - - RFabOutlined.smallAdd(onPressed: () {}), - RFabOutlined.smallAdd(onPressed: null), - - RFabOutlined.smallAddNoBorder(onPressed: () {}), - RFabOutlined.smallAddNoBorder(onPressed: null), - - RFabOutlined.add(onPressed: () {}), - RFabOutlined.add(onPressed: null), - - RFabOutlined.addNoBorder(onPressed: () {}), - RFabOutlined.addNoBorder(onPressed: null), - ], - ), - ); - } - - ExpansionPanel fabWidget() { - return ExpansionPanel( - isExpanded: _isOpen[1], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "Fab", - style: AppFonts.yekan20Regular.copyWith(color: Colors.green), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - Row(), - - RFab.smallAdd(onPressed: () {}), - RFab.smallAdd(onPressed: null), - - RFab.add(onPressed: () {}), - RFab.add(onPressed: null), - - RFab.smallEdit(onPressed: null), - RFab.smallEdit(onPressed: () {}), - - RFab.edit(onPressed: () {}), - RFab.edit(onPressed: null), - - RFab.smallDelete(onPressed: () {}), - RFab.smallDelete(onPressed: null), - - RFab.delete(onPressed: () {}), - RFab.delete(onPressed: null), - - RFab.smallAction(onPressed: () {}), - RFab.smallAction(onPressed: null), - - RFab.action(onPressed: () {}), - RFab.action(onPressed: null), - - RFab.smallFilter(onPressed: () {}), - RFab.smallFilter(onPressed: null), - - RFab.filter(onPressed: () {}), - RFab.filter(onPressed: null), - - RFab.smallDownload(onPressed: () {}), - RFab.smallDownload(onPressed: null), - - RFab.download(onPressed: () {}), - RFab.download(onPressed: null), - - RFab.smallExcel(onPressed: () {}), - RFab.smallExcel(onPressed: null), - - RFab.excel(onPressed: () {}), - RFab.excel(onPressed: null), - - RFab.smallBack(onPressed: () {}), - RFab.smallBack(onPressed: null), - - RFab.back(onPressed: () {}), - RFab.back(onPressed: null), - ], - ), - ); - } - - ExpansionPanel buttonWidget() { - return ExpansionPanel( - isExpanded: _isOpen[0], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "دکمه ها", - style: AppFonts.yekan20Regular.copyWith(color: Colors.green), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - Row(), - - RElevated(text: 'ثبت', onPressed: () {}), - - RElevated(text: 'ثبت', onPressed: null), - - ROutlinedElevated(text: 'ثبت', onPressed: () {}), - ROutlinedElevated( - text: 'ثبتwwww', - onPressed: () {}, - backgroundColor: AppColor.blueNormal.disabledColor, - pressedBackgroundColor: AppColor.blueNormal, - ), - ROutlinedElevated(text: 'ثبت', onPressed: null), - - RTextButton(text: 'ثبت', onPressed: () {}), - RTextButton(text: 'ثبت', onPressed: null), - ], + colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal), ), + initialRoute: AppPages.initRoutes, + initialBinding: BindingsBuilder.put(() => UserService()), + getPages: AppPages.pages, + locale: Locale('fa'), ); } } diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index 185d647..41892cf 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -5,19 +5,24 @@ class Assets { static const String iconsAdd = 'assets/icons/add.svg'; static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsCall = 'assets/icons/call.svg'; static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsKey = 'assets/icons/key.svg'; static const String iconsScan = 'assets/icons/scan.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; + static const String iconsUser = 'assets/icons/user.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; static const String vecAddSvg = 'assets/vec/add.svg.vec'; static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecCallSvg = 'assets/vec/call.svg.vec'; static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; static const String vecEditSvg = 'assets/vec/edit.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecKeySvg = 'assets/vec/key.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; diff --git a/lib/presentation/pages/auth/auth_with_otp/logic.dart b/lib/presentation/pages/auth/auth_with_otp/logic.dart new file mode 100644 index 0000000..5412998 --- /dev/null +++ b/lib/presentation/pages/auth/auth_with_otp/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class AuthWithOtpLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/lib/presentation/pages/auth/auth_with_otp/view.dart b/lib/presentation/pages/auth/auth_with_otp/view.dart new file mode 100644 index 0000000..6a566f4 --- /dev/null +++ b/lib/presentation/pages/auth/auth_with_otp/view.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class AuthWithOtpPage extends StatelessWidget { + const AuthWithOtpPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final AuthWithOtpLogic logic = Get.put(AuthWithOtpLogic()); + + return Container(); + } +} diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart new file mode 100644 index 0000000..6de4422 --- /dev/null +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart'; + +class AuthWithUseAndPassLogic extends GetxController { + Rx> formKey = GlobalKey().obs; + Rx phoneNumberController = TextEditingController().obs; + Rx passwordController = TextEditingController().obs; + CaptchaController captchaController = CaptchaController(); + + RxnString phoneNumber = RxnString(null); + RxnString password = RxnString(null); + RxBool isOnError = false.obs; + RxBool hidePassword = true.obs; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart new file mode 100644 index 0000000..022543e --- /dev/null +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart @@ -0,0 +1,210 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:logger/logger.dart'; +import 'package:rasadyar_app/infrastructure/di/di.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; +import 'package:rasadyar_app/presentation/common/assets.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; +import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart'; +import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; + +import 'logic.dart'; + +class AuthWithUseAndPassPage extends GetView { + AuthWithUseAndPassPage({super.key}); + + @override + Widget build(BuildContext context) { + final AuthWithUseAndPassLogic logic = Get.put(AuthWithUseAndPassLogic()); + return Scaffold( + body: SingleChildScrollView( + child: Column( + children: [SizedBox(height: 80), logoWidget(), loginForm()], + ), + ), + ); + } + + Widget loginForm() { + return ObxValue((data) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Form( + key: data.value, + child: Column( + children: [ + ObxValue((phoneController) { + return TextFormField( + controller: controller.phoneNumberController.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'شماره موبایل', + labelStyle: AppFonts.yekan13Regular, + errorStyle: AppFonts.yekan13Regular.copyWith( + color: AppColor.redNormal, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffix: + phoneController.value.text.trim().isNotEmpty + ? clearButton(() { + phoneController.value.clear(); + phoneController.refresh(); + }) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + + maxLines: 1, + maxLength: 11, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + data.refresh(); + phoneController.value.text = value; + } + phoneController.refresh(); + }, + textInputAction: TextInputAction.next, + validator: (value) { + if (value == null) { + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + } + return null; + }, + style: AppFonts.yekan13Regular, + ); + }, controller.phoneNumberController), + + SizedBox(height: 26), + + ObxValue((passwordController) { + return TextFormField( + controller: passwordController.value, + obscureText: controller.hidePassword.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'رمز عبور', + labelStyle: AppFonts.yekan13Regular, + errorStyle: AppFonts.yekan13Regular.copyWith( + color: AppColor.redNormal, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + suffix: + passwordController.value.text.trim().isNotEmpty + ? GestureDetector( + onTap: () { + controller.hidePassword.value = + !controller.hidePassword.value; + }, + child: Icon( + controller.hidePassword.value + ? CupertinoIcons.eye + : CupertinoIcons.eye_slash, + ), + ) + : null, + counterText: '', + ), + textInputAction: TextInputAction.done, + keyboardType: TextInputType.visiblePassword, + maxLines: 1, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + passwordController.value.text = value; + } + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" + } + return null; + }, + style: AppFonts.yekan13Regular, + ); + }, controller.passwordController), + + SizedBox(height: 26), + + CaptchaWidget(controller: controller.captchaController), + + SizedBox(height: 23), + RElevated( + text: 'ورود', + onPressed: () { + di.get().t(data.value.currentState?.validate()); + di.get().t(controller.captchaController.validate()); + if (data.value.currentState?.validate() == true && + controller.captchaController.validate()) { + print("==============>ssakldjaskljdklasjd"); + } + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKey); + } + + Widget logoWidget() { + return Column( + children: [ + Row(), + Image.asset(Assets.imagesInnerSplash, width: 120, height: 120), + Text( + 'سامانه رصدیار', + style: AppFonts.yekan16Regular.copyWith( + color: AppColor.darkGreyNormal, + ), + ), + ], + ); + } + + Widget clearButton(VoidCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Icon(CupertinoIcons.multiply_circle, size: 24), + ); + } +} diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart new file mode 100644 index 0000000..d34910b --- /dev/null +++ b/lib/presentation/pages/splash/logic.dart @@ -0,0 +1,67 @@ +import 'package:flutter/animation.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_app/presentation/routes/app_pages.dart'; + +class SplashLogic extends GetxController with GetTickerProviderStateMixin { + late final AnimationController scaleController; + late final AnimationController rotateController; + Rxn> scaleAnimation = Rxn(); + Rxn> rotationAnimation = Rxn(); + + @override + void onInit() { + super.onInit(); + scaleController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1500), + ); + + rotateController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 8000), + ); + + scaleAnimation.value = Tween( + begin: 0.8, + end: 1.2, + ).animate(scaleController); + + rotationAnimation.value = Tween( + begin: 0.0, + end: 1, + ).animate(rotateController); + + rotateController.forward(); + rotateController.addStatusListener((status) { + if (status == AnimationStatus.completed) { + rotateController.repeat(); + } else if (status == AnimationStatus.dismissed) { + rotateController.forward(); + } + }); + + scaleController.forward(); + scaleController.addStatusListener((status) { + if (status == AnimationStatus.completed) { + scaleController.reverse(); + } else if (status == AnimationStatus.dismissed) { + scaleController.forward(); + } + }); + } + + @override + void onReady() { + super.onReady(); + Future.delayed(const Duration(seconds: 1), () { + Get.offAllNamed(AppPaths.authWithUserAndPass); + }); + } + + @override + void onClose() { + rotateController.dispose(); + scaleController.dispose(); + super.onClose(); + } +} diff --git a/lib/presentation/pages/splash/view.dart b/lib/presentation/pages/splash/view.dart new file mode 100644 index 0000000..75f37c3 --- /dev/null +++ b/lib/presentation/pages/splash/view.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/assets.dart'; + +import 'logic.dart'; + +class SplashPage extends GetView { + const SplashPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.blueDarker, + body: Center( + child: Stack( + alignment: Alignment.center, + children: [ + ObxValue((data) { + return ScaleTransition( + scale: data.value!, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 1), + child: Image.asset( + Assets.imagesInnerSplash, + width: 190, + height: 190, + ), + ), + ); + }, controller.scaleAnimation), + + ObxValue((data) { + return RotationTransition( + turns: data.value!, + + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 1), + child: Image.asset(Assets.imagesOutterSplash), + ), + ); + }, controller.rotationAnimation), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/pages/system_design/system_design.dart b/lib/presentation/pages/system_design/system_design.dart new file mode 100644 index 0000000..51ebace --- /dev/null +++ b/lib/presentation/pages/system_design/system_design.dart @@ -0,0 +1,265 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; +import 'package:rasadyar_app/presentation/utils/color_utils.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/fab.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/fab_outlined.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/outline_elevated.dart'; +import 'package:rasadyar_app/presentation/widget/buttons/text_button.dart'; +import 'package:rasadyar_app/presentation/widget/inputs/r_input.dart'; +import 'package:rasadyar_app/presentation/widget/pagination/pagination_from_until.dart'; +import 'package:rasadyar_app/presentation/widget/pagination/show_more.dart'; +import 'package:rasadyar_app/presentation/widget/tabs/tab.dart'; + +class SystemDesignPage extends StatefulWidget { + const SystemDesignPage({super.key}); + + @override + State createState() => _SystemDesignPageState(); +} + +class _SystemDesignPageState extends State { + List _isOpen = [false, false, false, false, false, false]; + + void _handleAdd() { + print("Add FAB pressed"); + } + + void _handleEdit() { + print("Edit FAB pressed"); + } + + void _handleDelete() { + print("Delete FAB pressed"); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("System design"), centerTitle: true), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: ExpansionPanelList( + expansionCallback: (panelIndex, isExpanded) { + setState(() { + _isOpen[panelIndex] = isExpanded; + }); + }, + children: [ + buttonWidget(), + fabWidget(), + outlinedFabWidget(), + paginationWidget(), + tabWidget(), + inputsWidget(), + ], + ), + ), + ), + ); + } + + ExpansionPanel inputsWidget() { + return ExpansionPanel( + isExpanded: _isOpen[5], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "inputs", + style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + ), + ); + }, + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + spacing: 14, + children: [ + RTextField( + hintText: 'حجم کشتار را در روز به قطعه وارد کنید', + hintStyle: AppFonts.yekan13Regular, + ), + RTextField( + label: 'تلفن مرغداری', + labelStyle: AppFonts.yekan10Regular, + ), + ], + ), + ), + ); + } + + ExpansionPanel tabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[4], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "tab", + style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + CupertinoSegmentedControlDemo(), + CupertinoSegmentedControlDemo2(), + ], + ), + ); + } + + ExpansionPanel paginationWidget() { + return ExpansionPanel( + isExpanded: _isOpen[3], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "پیجینیشن", + style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + ), + ); + }, + body: Column(spacing: 14, children: [RShowMore(), PaginationFromUntil()]), + ); + } + + ExpansionPanel outlinedFabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[2], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "Outlined Fab ", + style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + RFabOutlined.smallAdd(onPressed: () {}), + RFabOutlined.smallAdd(onPressed: null), + + RFabOutlined.smallAddNoBorder(onPressed: () {}), + RFabOutlined.smallAddNoBorder(onPressed: null), + + RFabOutlined.add(onPressed: () {}), + RFabOutlined.add(onPressed: null), + + RFabOutlined.addNoBorder(onPressed: () {}), + RFabOutlined.addNoBorder(onPressed: null), + ], + ), + ); + } + + ExpansionPanel fabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[1], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "Fab", + style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + RFab.smallAdd(onPressed: () {}), + RFab.smallAdd(onPressed: null), + + RFab.add(onPressed: () {}), + RFab.add(onPressed: null), + + RFab.smallEdit(onPressed: null), + RFab.smallEdit(onPressed: () {}), + + RFab.edit(onPressed: () {}), + RFab.edit(onPressed: null), + + RFab.smallDelete(onPressed: () {}), + RFab.smallDelete(onPressed: null), + + RFab.delete(onPressed: () {}), + RFab.delete(onPressed: null), + + RFab.smallAction(onPressed: () {}), + RFab.smallAction(onPressed: null), + + RFab.action(onPressed: () {}), + RFab.action(onPressed: null), + + RFab.smallFilter(onPressed: () {}), + RFab.smallFilter(onPressed: null), + + RFab.filter(onPressed: () {}), + RFab.filter(onPressed: null), + + RFab.smallDownload(onPressed: () {}), + RFab.smallDownload(onPressed: null), + + RFab.download(onPressed: () {}), + RFab.download(onPressed: null), + + RFab.smallExcel(onPressed: () {}), + RFab.smallExcel(onPressed: null), + + RFab.excel(onPressed: () {}), + RFab.excel(onPressed: null), + + RFab.smallBack(onPressed: () {}), + RFab.smallBack(onPressed: null), + + RFab.back(onPressed: () {}), + RFab.back(onPressed: null), + ], + ), + ); + } + + ExpansionPanel buttonWidget() { + return ExpansionPanel( + isExpanded: _isOpen[0], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "دکمه ها", + style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + RElevated(text: 'ثبت', onPressed: () {}), + + RElevated(text: 'ثبت', onPressed: null), + + ROutlinedElevated(text: 'ثبت', onPressed: () {}), + ROutlinedElevated( + text: 'ثبتwwww', + onPressed: () {}, + backgroundColor: AppColor.blueNormal.disabledColor, + pressedBackgroundColor: AppColor.blueNormal, + ), + ROutlinedElevated(text: 'ثبت', onPressed: null), + + RTextButton(text: 'ثبت', onPressed: () {}), + RTextButton(text: 'ثبت', onPressed: null), + ], + ), + ); + } +} diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart new file mode 100644 index 0000000..9faa5bf --- /dev/null +++ b/lib/presentation/routes/app_pages.dart @@ -0,0 +1,33 @@ +import 'package:get/get.dart'; +import 'package:rasadyar_app/presentation/pages/auth/auth_with_otp/logic.dart'; +import 'package:rasadyar_app/presentation/pages/auth/auth_with_otp/view.dart'; +import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logic.dart'; +import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; +import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; +import 'package:rasadyar_app/presentation/pages/splash/view.dart'; + +part 'app_paths.dart'; + +sealed class AppPages { + AppPages._(); + + static const String initRoutes = AppPaths.splash; + + static List pages = [ + GetPage( + name: AppPaths.splash, + page: () => SplashPage(), + binding: BindingsBuilder.put(() => SplashLogic()), + ), + GetPage( + name: AppPaths.authWithOtp, + page: () => AuthWithOtpPage(), + binding: BindingsBuilder.put(() => AuthWithOtpLogic()), + ), + GetPage( + name: AppPaths.authWithUserAndPass, + page: () => AuthWithUseAndPassPage(), + binding: BindingsBuilder.put(() => AuthWithUseAndPassLogic()), + ), + ]; +} diff --git a/lib/presentation/routes/app_paths.dart b/lib/presentation/routes/app_paths.dart new file mode 100644 index 0000000..dd68834 --- /dev/null +++ b/lib/presentation/routes/app_paths.dart @@ -0,0 +1,9 @@ +part of 'app_pages.dart'; + +sealed class AppPaths { + AppPaths._(); + + static const String splash = '/splash'; + static const String authWithUserAndPass = '/authWithUserAndPass'; + static const String authWithOtp = '/authWithOtp'; +} diff --git a/lib/presentation/widget/buttons/elevated.dart b/lib/presentation/widget/buttons/elevated.dart index c03bc2e..f97ecfc 100644 --- a/lib/presentation/widget/buttons/elevated.dart +++ b/lib/presentation/widget/buttons/elevated.dart @@ -36,9 +36,7 @@ class _RElevatedState extends State { @override Widget build(BuildContext context) { return ElevatedButton( - onPressed: () { - setState(() {}); - }, + onPressed: widget.onPressed, style: ElevatedButton.styleFrom( backgroundColor: widget.backgroundColor ?? AppColor.blueNormal, foregroundColor: widget.foregroundColor ?? Colors.white, diff --git a/lib/presentation/widget/captcha/captcha_widget.dart b/lib/presentation/widget/captcha/captcha_widget.dart new file mode 100644 index 0000000..fb25167 --- /dev/null +++ b/lib/presentation/widget/captcha/captcha_widget.dart @@ -0,0 +1,266 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; + +class CaptchaController { + int? captchaCode; + TextEditingController textController = TextEditingController(); + GlobalKey formKey = GlobalKey(); + + late Function() refreshCaptcha; + + bool validate() { + if (formKey.currentState?.validate() == true) { + return true; + } + return false; + } + + String get enteredText => textController.text; + + bool isCorrect() { + return textController.text == captchaCode.toString(); + } + + void clear() { + textController.clear(); + } +} + +class RandomLinePainter extends CustomPainter { + final Random random = Random(); + final Paint linePaint; + final List points; + + RandomLinePainter({ + required this.points, + required Color lineColor, + double strokeWidth = 2.0, + }) : linePaint = + Paint() + ..color = lineColor + ..strokeWidth = strokeWidth + ..strokeCap = StrokeCap.round + ..style = PaintingStyle.stroke; + + @override + void paint(Canvas canvas, Size size) { + final path = Path(); + + if (points.isNotEmpty) { + path.moveTo(points[0].dx, points[0].dy); + + for (int i = 1; i < points.length; i++) { + path.lineTo(points[i].dx, points[i].dy); + } + + canvas.drawPath(path, linePaint); + } + } + + @override + bool shouldRepaint(RandomLinePainter oldDelegate) => true; +} + +class CaptchaWidget extends StatefulWidget { + final CaptchaController controller; + final bool autoValidateMode; + + const CaptchaWidget({ + required this.controller, + this.autoValidateMode = false, + super.key, + }); + + @override + _CaptchaWidgetState createState() => _CaptchaWidgetState(); +} + +class _CaptchaWidgetState extends State { + late List points; + late List points1; + late List points2; + bool isOnError = false; + + @override + void initState() { + super.initState(); + generateLines(); + getRandomSixDigitNumber(); + + // Set the refresh function in the controller + widget.controller.refreshCaptcha = () { + getRandomSixDigitNumber(); + generateLines(); + setState(() {}); + }; + } + + void generateLines() { + points = generateRandomLine(); + points1 = generateRandomLine(); + points2 = generateRandomLine(); + setState(() {}); + } + + List generateRandomLine() { + final random = Random(); + int pointCount = random.nextInt(10) + 5; + List points = []; + + double previousY = 0; + + for (int i = 0; i < pointCount; i++) { + double x = (i / (pointCount - 1)) * 135; + + if (i == 0) { + previousY = 24; + } else { + double change = (random.nextDouble() * 20) - 10; + previousY = max(5, min(43, previousY + change)); + } + + points.add(Offset(x, previousY)); + } + + return points; + } + + void getRandomSixDigitNumber() { + final random = Random(); + widget.controller.captchaCode = random.nextInt(900000) + 100000; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 135, + height: 48, + decoration: BoxDecoration( + color: AppColor.whiteNormalHover, + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(8), + ), + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + CustomPaint( + painter: RandomLinePainter( + points: points, + lineColor: Colors.blue, + strokeWidth: 1.0, + ), + size: const Size(double.infinity, double.infinity), + ), + CustomPaint( + painter: RandomLinePainter( + points: points1, + lineColor: Colors.green, + strokeWidth: 1.0, + ), + size: const Size(double.infinity, double.infinity), + ), + CustomPaint( + painter: RandomLinePainter( + points: points2, + lineColor: Colors.red, + strokeWidth: 1.0, + ), + size: const Size(double.infinity, double.infinity), + ), + Text( + widget.controller.captchaCode.toString(), + style: AppFonts.yekan24Regular, + ), + ], + ), + ), + const SizedBox(height: 20), + IconButton( + padding: EdgeInsets.zero, + onPressed: widget.controller.refreshCaptcha, + icon: Icon(CupertinoIcons.refresh, size: 16), + ), + Expanded( + child: Form( + key: widget.controller.formKey, + autovalidateMode: + widget.autoValidateMode + ? AutovalidateMode.onUserInteraction + : AutovalidateMode.disabled, + child: TextFormField( + controller: widget.controller.textController, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'کد امنیتی', + labelStyle: AppFonts.yekan13Regular, + errorStyle: AppFonts.yekan10Regular.copyWith( + color: AppColor.redNormal, + fontSize: 8, + ), + suffixIconConstraints: BoxConstraints( + maxHeight: 24, + minHeight: 24, + maxWidth: 24, + minWidth: 24, + ), + + suffix: + widget.controller.textController.text.trim().isNotEmpty + ? clearButton(() { + widget.controller.textController.clear(); + setState(() {}); + }) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + maxLines: 1, + maxLength: 6, + onChanged: (value) { + if (isOnError) { + isOnError = !isOnError; + widget.controller.formKey.currentState?.reset(); + widget.controller.textController.text = value; + } + setState(() {}); + }, + validator: (value) { + if (value == null || value.isEmpty) { + isOnError = true; + return 'کد امنیتی را وارد کنید'; + } + if (value != widget.controller.captchaCode.toString()) { + isOnError = true; + return '⚠️کد امنیتی وارد شده اشتباه است'; + } + return null; + }, + style: AppFonts.yekan13Regular, + ), + ), + ), + ], + ); + } + + Widget clearButton(VoidCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Icon(CupertinoIcons.multiply_circle, size: 18), + ); + } +} diff --git a/lib/presentation/widget/vec_widget.dart b/lib/presentation/widget/vec_widget.dart index 8f76b40..3fb78f1 100644 --- a/lib/presentation/widget/vec_widget.dart +++ b/lib/presentation/widget/vec_widget.dart @@ -18,6 +18,25 @@ SvgPicture vecWidget( color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, ); } + +SvgPicture svgWidget( + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, + }) { + return SvgPicture.asset( + assets, + width: width, + height: height, + fit: fit ?? BoxFit.contain, + colorFilter: + color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, + ); +} + + Widget vecWidget2( String assets, { double? width, diff --git a/pubspec.lock b/pubspec.lock index 454e494..f6fe18f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: @@ -247,10 +247,10 @@ packages: dependency: "direct dev" description: name: freezed - sha256: a6274c34d61b3d68082f2b0e9a641a3ec197e525d269f35b82f62d5b2c6d9f75 + sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.6" freezed_annotation: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 52bb4ec..e3a7258 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,7 +54,6 @@ dev_dependencies: - flutter: uses-material-design: true diff --git a/runner.sh b/runner.sh new file mode 100644 index 0000000..e0b9992 --- /dev/null +++ b/runner.sh @@ -0,0 +1 @@ +dart run build_runner build --delete-conflicting-outputs \ No newline at end of file From 0286725ac6955be05f4bec8916360dfb3f2f2c32 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 9 Apr 2025 17:05:38 +0330 Subject: [PATCH 008/256] feat : map --- android/app/src/main/AndroidManifest.xml | 3 + assets/icons/map_marker.svg | 1 + .../lib/data/utils/cluster_generator.dart | 109 ++++++ .../lib/data/utils/marker_generator.dart | 57 +++ .../lib/presentation/routes/app_pages.dart | 16 + .../lib/presentation/routes/app_routes.dart | 7 + .../presentation/widget/cluster_marker.dart | 59 +++ features/supervision/lib/supervision.dart | 7 + features/supervision/pubspec.yaml | 17 + flutter_ddd_module/CHANGELOG.md | 3 + flutter_ddd_module/HELLO.md | 1 + flutter_ddd_module/LICENSE | 1 + flutter_ddd_module/README.md | 27 ++ flutter_ddd_module/__brick__/HELLO.md | 1 + .../__brick__/lib/data/.gitkeep | 0 .../lib/presentation/routes/app_pages.dart | 0 .../lib/presentation/routes/app_paths.dart | 0 flutter_ddd_module/__brick__/pubspec.yaml | 20 + flutter_ddd_module/brick.yaml | 33 ++ flutter_ddd_module/pubspec.yaml | 20 + ios/Runner/Info.plist | 2 + lib/presentation/common/app_fonts.dart | 34 +- lib/presentation/common/assets.dart | 1 + .../pages/auth/auth_with_otp/logic.dart | 15 - .../pages/auth/auth_with_otp/view.dart | 15 - .../auth/auth_with_use_and_pass/logic.dart | 45 ++- .../auth/auth_with_use_and_pass/view.dart | 346 +++++++++++++++++- lib/presentation/pages/splash/logic.dart | 3 +- .../pages/system_design/system_design.dart | 16 +- lib/presentation/routes/app_pages.dart | 10 +- lib/presentation/widget/buttons/elevated.dart | 2 +- .../widget/buttons/outline_elevated.dart | 2 +- .../widget/buttons/text_button.dart | 14 +- .../widget/captcha/captcha_widget.dart | 8 +- .../pagination/pagination_from_until.dart | 2 +- .../widget/pagination/show_more.dart | 2 +- lib/presentation/widget/tabs/tab.dart | 4 +- packages/core/lib/core.dart | 3 + packages/core/pubspec.yaml | 61 +++ pubspec.lock | 235 ++++++++++++ pubspec.yaml | 9 +- 41 files changed, 1120 insertions(+), 91 deletions(-) create mode 100644 assets/icons/map_marker.svg create mode 100644 features/supervision/lib/data/utils/cluster_generator.dart create mode 100644 features/supervision/lib/data/utils/marker_generator.dart create mode 100644 features/supervision/lib/presentation/routes/app_pages.dart create mode 100644 features/supervision/lib/presentation/routes/app_routes.dart create mode 100644 features/supervision/lib/presentation/widget/cluster_marker.dart create mode 100644 features/supervision/lib/supervision.dart create mode 100644 features/supervision/pubspec.yaml create mode 100644 flutter_ddd_module/CHANGELOG.md create mode 100644 flutter_ddd_module/HELLO.md create mode 100644 flutter_ddd_module/LICENSE create mode 100644 flutter_ddd_module/README.md create mode 100644 flutter_ddd_module/__brick__/HELLO.md create mode 100644 flutter_ddd_module/__brick__/lib/data/.gitkeep create mode 100644 flutter_ddd_module/__brick__/lib/presentation/routes/app_pages.dart create mode 100644 flutter_ddd_module/__brick__/lib/presentation/routes/app_paths.dart create mode 100644 flutter_ddd_module/__brick__/pubspec.yaml create mode 100644 flutter_ddd_module/brick.yaml create mode 100644 flutter_ddd_module/pubspec.yaml delete mode 100644 lib/presentation/pages/auth/auth_with_otp/logic.dart delete mode 100644 lib/presentation/pages/auth/auth_with_otp/view.dart create mode 100644 packages/core/lib/core.dart create mode 100644 packages/core/pubspec.yaml diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f5c459f..94398a7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,7 @@ + + + \ No newline at end of file diff --git a/features/supervision/lib/data/utils/cluster_generator.dart b/features/supervision/lib/data/utils/cluster_generator.dart new file mode 100644 index 0000000..18c5bcc --- /dev/null +++ b/features/supervision/lib/data/utils/cluster_generator.dart @@ -0,0 +1,109 @@ +import 'dart:math'; +import 'package:flutter/foundation.dart'; +import 'package:latlong2/latlong.dart'; + +class ClusterParams { + final List points; + final double clusterRadiusMeters; + + ClusterParams({ + required this.points, + required this.clusterRadiusMeters, + }); +} + +class Cluster { + final LatLng center; + final List members; + + Cluster(this.center, this.members); +} +// Use a more efficient quadtree-based clustering algorithm +Future> clusterMarkersQuadtreeIsolate(ClusterParams params) async { + return compute(_clusterMarkersQuadtree, params); +} + +List _clusterMarkersQuadtree(ClusterParams params) { + final points = params.points; + final radius = params.clusterRadiusMeters; + final distance = const Distance(); + final List clusters = []; + + // Skip clustering if we have a small number of points + if (points.length < 100) { + return points.map((p) => Cluster(p, [p])).toList(); + } + + // Find bounds + double minLat = points[0].latitude; + double maxLat = points[0].latitude; + double minLng = points[0].longitude; + double maxLng = points[0].longitude; + + for (final point in points) { + minLat = min(minLat, point.latitude); + maxLat = max(maxLat, point.latitude); + minLng = min(minLng, point.longitude); + maxLng = max(maxLng, point.longitude); + } + + // Build spatial grid for faster lookups (simple spatial index) + // Convert geographic distance to approximate degrees + final double radiusDegLat = radius / 111000; // ~111km per degree latitude + final double radiusDegLng = radius / (111000 * cos(minLat * pi / 180)); // Adjust for longitude + + final int gridLatSize = ((maxLat - minLat) / radiusDegLat).ceil(); + final int gridLngSize = ((maxLng - minLng) / radiusDegLng).ceil(); + + // Create spatial grid + final List>> grid = List.generate( + gridLatSize + 1, + (_) => List.generate(gridLngSize + 1, (_) => []) + ); + + // Add points to grid cells + for (final point in points) { + final int latIdx = ((point.latitude - minLat) / radiusDegLat).floor(); + final int lngIdx = ((point.longitude - minLng) / radiusDegLng).floor(); + grid[latIdx][lngIdx].add(point); + } + + // Process grid cells in batches + final Set processed = {}; + + for (int latIdx = 0; latIdx < gridLatSize; latIdx++) { + for (int lngIdx = 0; lngIdx < gridLngSize; lngIdx++) { + final cellPoints = grid[latIdx][lngIdx]; + + for (final point in cellPoints) { + if (processed.contains(point)) continue; + + // Find nearby points + final List neighbors = []; + neighbors.add(point); + processed.add(point); + + // Check current and adjacent cells for neighbors + for (int adjLat = max(0, latIdx - 1); adjLat <= min(gridLatSize - 1, latIdx + 1); adjLat++) { + for (int adjLng = max(0, lngIdx - 1); adjLng <= min(gridLngSize - 1, lngIdx + 1); adjLng++) { + for (final neighbor in grid[adjLat][adjLng]) { + if (!processed.contains(neighbor) && distance(point, neighbor) <= radius) { + neighbors.add(neighbor); + processed.add(neighbor); + } + } + } + } + + // Calculate cluster center + if (neighbors.isNotEmpty) { + final avgLat = neighbors.map((p) => p.latitude).reduce((a, b) => a + b) / neighbors.length; + final avgLng = neighbors.map((p) => p.longitude).reduce((a, b) => a + b) / neighbors.length; + clusters.add(Cluster(LatLng(avgLat, avgLng), neighbors)); + } + } + } + } + + return clusters; +} \ No newline at end of file diff --git a/features/supervision/lib/data/utils/marker_generator.dart b/features/supervision/lib/data/utils/marker_generator.dart new file mode 100644 index 0000000..c01e898 --- /dev/null +++ b/features/supervision/lib/data/utils/marker_generator.dart @@ -0,0 +1,57 @@ +import 'dart:math'; +import 'package:flutter/foundation.dart'; +import 'package:latlong2/latlong.dart'; + +class GridGenParams { + final LatLng center; + final int count; + final double spacingMeters; + + const GridGenParams({ + required this.center, + required this.count, + required this.spacingMeters, + }); +}Future> generateGridMarkersIsolate(GridGenParams params) async { + return compute(_generateGridMarkersOptimized, params); +} + +List _generateGridMarkersOptimized(GridGenParams params) { + final List result = []; + final Distance distance = const Distance(); + + // Pre-calculate the grid dimensions + final int gridSize = sqrt(params.count).ceil(); + final double halfWidth = (gridSize * params.spacingMeters) / 2; + final double halfHeight = (gridSize * params.spacingMeters) / 2; + + // Calculate top-left corner of the grid + final LatLng topLeft = distance.offset( + distance.offset(params.center, -halfHeight, 0), // south + -halfWidth, 270 // west + ); + + // Generate grid in batches for better memory management + const int batchSize = 10000; + for (int batch = 0; batch < (params.count / batchSize).ceil(); batch++) { + final int startIdx = batch * batchSize; + final int endIdx = min((batch + 1) * batchSize, params.count); + + for (int i = startIdx; i < endIdx; i++) { + final int row = i ~/ gridSize; + final int col = i % gridSize; + + final double dx = col * params.spacingMeters; + final double dy = row * params.spacingMeters; + + final LatLng point = distance.offset( + distance.offset(topLeft, dy, 180), // south + dx, 90 // east + ); + + result.add(point); + } + } + + return result.sublist(0, min(result.length, params.count)); +} diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart new file mode 100644 index 0000000..12c2320 --- /dev/null +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -0,0 +1,16 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:supervision/presentation/filter/logic.dart'; +import 'package:supervision/presentation/filter/view.dart'; +import 'package:supervision/presentation/routes/app_routes.dart'; + +sealed class SupervisionPages { + SupervisionPages._(); + + static final pages = [ + GetPage( + name: SupervisionRoutes.supervision, + page: () => SupervisionFilterPage(), + binding: BindingsBuilder.put(() => BazresiLogic()), + ), + ]; +} diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart new file mode 100644 index 0000000..bafe72c --- /dev/null +++ b/features/supervision/lib/presentation/routes/app_routes.dart @@ -0,0 +1,7 @@ +sealed class SupervisionRoutes { + SupervisionRoutes._(); + + + static const supervision = '/supervision'; + +} \ No newline at end of file diff --git a/features/supervision/lib/presentation/widget/cluster_marker.dart b/features/supervision/lib/presentation/widget/cluster_marker.dart new file mode 100644 index 0000000..4c8d82a --- /dev/null +++ b/features/supervision/lib/presentation/widget/cluster_marker.dart @@ -0,0 +1,59 @@ + +import 'package:flutter/material.dart'; + +class AnimatedClusterMarker extends StatefulWidget { + final int count; + + const AnimatedClusterMarker({super.key, required this.count}); + + @override + State createState() => _AnimatedClusterMarkerState(); +} + +class _AnimatedClusterMarkerState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + + @override + void initState() { + super.initState(); + + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 300), + )..forward(); // start animation + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ScaleTransition( + scale: CurvedAnimation(parent: _controller, curve: Curves.easeOutBack), + child: Opacity( + opacity: _controller.value, + child: Container( + width: 40, + height: 40, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.blueAccent, + shape: BoxShape.circle, + border: Border.all(color: Colors.white, width: 2), + ), + child: Text( + widget.count.toString(), + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ); + } +} diff --git a/features/supervision/lib/supervision.dart b/features/supervision/lib/supervision.dart new file mode 100644 index 0000000..66fd106 --- /dev/null +++ b/features/supervision/lib/supervision.dart @@ -0,0 +1,7 @@ +library; + +export 'presentation/filter/logic.dart'; +export 'presentation/filter/view.dart'; +export 'presentation/routes/app_pages.dart'; +export 'presentation/routes/app_routes.dart'; + diff --git a/features/supervision/pubspec.yaml b/features/supervision/pubspec.yaml new file mode 100644 index 0000000..bc13c6f --- /dev/null +++ b/features/supervision/pubspec.yaml @@ -0,0 +1,17 @@ +name: supervision +description: "A new Flutter project." +publish_to: 'none' +version: 1.0.0 + +environment: + sdk: ^3.7.0 + +dependencies: + flutter: + sdk: flutter + rasadyar_core: + path: ./../../packages/core + flutter_map: ^8.1.1 + location: ^8.0.0 + latlong2: ^0.9.1 + geolocator: ^13.0.4 diff --git a/flutter_ddd_module/CHANGELOG.md b/flutter_ddd_module/CHANGELOG.md new file mode 100644 index 0000000..f0640d6 --- /dev/null +++ b/flutter_ddd_module/CHANGELOG.md @@ -0,0 +1,3 @@ +# 0.1.0+1 + +- TODO: Describe initial release. diff --git a/flutter_ddd_module/HELLO.md b/flutter_ddd_module/HELLO.md new file mode 100644 index 0000000..56a50b8 --- /dev/null +++ b/flutter_ddd_module/HELLO.md @@ -0,0 +1 @@ +Hello moji -! \ No newline at end of file diff --git a/flutter_ddd_module/LICENSE b/flutter_ddd_module/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/flutter_ddd_module/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/flutter_ddd_module/README.md b/flutter_ddd_module/README.md new file mode 100644 index 0000000..ec1f8e9 --- /dev/null +++ b/flutter_ddd_module/README.md @@ -0,0 +1,27 @@ +# flutter_ddd_module + +[![Powered by Mason](https://img.shields.io/endpoint?url=https%3A%2F%2Ftinyurl.com%2Fmason-badge)](https://github.com/felangel/mason) + +A new brick created with the Mason CLI. + +_Generated by [mason][1] 🧱_ + +## Getting Started 🚀 + +This is a starting point for a new brick. +A few resources to get you started if this is your first brick template: + +- [Official Mason Documentation][2] +- [Code generation with Mason Blog][3] +- [Very Good Livestream: Felix Angelov Demos Mason][4] +- [Flutter Package of the Week: Mason][5] +- [Observable Flutter: Building a Mason brick][6] +- [Meet Mason: Flutter Vikings 2022][7] + +[1]: https://github.com/felangel/mason +[2]: https://docs.brickhub.dev +[3]: https://verygood.ventures/blog/code-generation-with-mason +[4]: https://youtu.be/G4PTjA6tpTU +[5]: https://youtu.be/qjA0JFiPMnQ +[6]: https://youtu.be/o8B1EfcUisw +[7]: https://youtu.be/LXhgiF5HiQg diff --git a/flutter_ddd_module/__brick__/HELLO.md b/flutter_ddd_module/__brick__/HELLO.md new file mode 100644 index 0000000..2f08230 --- /dev/null +++ b/flutter_ddd_module/__brick__/HELLO.md @@ -0,0 +1 @@ +Hello {{name}}! \ No newline at end of file diff --git a/flutter_ddd_module/__brick__/lib/data/.gitkeep b/flutter_ddd_module/__brick__/lib/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/flutter_ddd_module/__brick__/lib/presentation/routes/app_pages.dart b/flutter_ddd_module/__brick__/lib/presentation/routes/app_pages.dart new file mode 100644 index 0000000..e69de29 diff --git a/flutter_ddd_module/__brick__/lib/presentation/routes/app_paths.dart b/flutter_ddd_module/__brick__/lib/presentation/routes/app_paths.dart new file mode 100644 index 0000000..e69de29 diff --git a/flutter_ddd_module/__brick__/pubspec.yaml b/flutter_ddd_module/__brick__/pubspec.yaml new file mode 100644 index 0000000..c892059 --- /dev/null +++ b/flutter_ddd_module/__brick__/pubspec.yaml @@ -0,0 +1,20 @@ +name: {{feature_name}} +description: {{feature_name}} feature module +version: 0.0.1 +publish_to: 'none' + +environment: + sdk: '>=3.0.0 <4.0.0' + flutter: ">=3.10.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +flutter: + uses-material-design: true \ No newline at end of file diff --git a/flutter_ddd_module/brick.yaml b/flutter_ddd_module/brick.yaml new file mode 100644 index 0000000..591998f --- /dev/null +++ b/flutter_ddd_module/brick.yaml @@ -0,0 +1,33 @@ +name: flutter_ddd_module +description: A new brick created with the Mason CLI. + +# The following defines the brick repository url. +# Uncomment and update the following line before publishing the brick. +# repository: https://github.com/my_org/my_repo + +# The following defines the version and build number for your brick. +# A version number is three numbers separated by dots, like 1.2.34 +# followed by an optional build number (separated by a +). +version: 0.1.0+1 + +# The following defines the environment for the current brick. +# It includes the version of mason that the brick requires. +environment: + mason: ^0.1.1 + +# Variables specify dynamic values that your brick depends on. +# Zero or more variables can be specified for a given brick. +# Each variable has: +# * a type (string, number, boolean, enum, array, or list) +# * an optional short description +# * an optional default value +# * an optional list of default values (array only) +# * an optional prompt phrase used when asking for the variable +# * a list of values (enums only) +# * an optional separator (list only) +vars: + name: + type: string + description: Your name + default: Dash + prompt: What is your name? diff --git a/flutter_ddd_module/pubspec.yaml b/flutter_ddd_module/pubspec.yaml new file mode 100644 index 0000000..54cd675 --- /dev/null +++ b/flutter_ddd_module/pubspec.yaml @@ -0,0 +1,20 @@ +name: +description: feature module +version: 0.0.1 +publish_to: 'none' + +environment: + sdk: '>=3.0.0 <4.0.0' + flutter: ">=3.10.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +flutter: + uses-material-design: true \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 8479f72..14e47df 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -45,5 +45,7 @@ UIApplicationSupportsIndirectInputEvents +NSLocationWhenInUseUsageDescription +This app needs access to your location. diff --git a/lib/presentation/common/app_fonts.dart b/lib/presentation/common/app_fonts.dart index 70b06fe..65be3b0 100644 --- a/lib/presentation/common/app_fonts.dart +++ b/lib/presentation/common/app_fonts.dart @@ -11,70 +11,84 @@ class AppFonts { static const FontWeight bold = FontWeight.w600; static const double _height = 1.20; - static const TextStyle yekan61Regular = TextStyle( + static const TextStyle yekan61 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 61, height: _height, ); - static const TextStyle yekan49Regular = TextStyle( + static const TextStyle yekan49 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 48, height: _height, ); - static const TextStyle yekan39Regular = TextStyle( + static const TextStyle yekan39 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 39, height: _height, ); - static const TextStyle yekan31Regular = TextStyle( + static const TextStyle yekan31 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 31, height: _height, ); - static const TextStyle yekan25Regular = TextStyle( + static const TextStyle yekan25 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 25, height: _height, ); - static const TextStyle yekan24Regular = TextStyle( + static const TextStyle yekan24 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 24, height: _height, ); - static const TextStyle yekan20Regular = TextStyle( + static const TextStyle yekan20 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 20, height: _height, ); - static const TextStyle yekan16Regular = TextStyle( + static const TextStyle yekan18 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 18, + height: _height, + ); + + static const TextStyle yekan16 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 16, height: _height, ); - static const TextStyle yekan13Regular = TextStyle( + static const TextStyle yekan14 = TextStyle( fontFamily: yekan, fontWeight: regular, fontSize: 13, height: _height, ); - static const TextStyle yekan10Regular = TextStyle( + static const TextStyle yekan13 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 13, + height: _height, + ); + + static const TextStyle yekan10 = TextStyle( // Rounded from 10.24 fontFamily: yekan, fontWeight: regular, diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index 41892cf..4d590dc 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -10,6 +10,7 @@ class Assets { static const String iconsEdit = 'assets/icons/edit.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsMapMarker = 'assets/icons/map_marker.svg'; static const String iconsScan = 'assets/icons/scan.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; static const String iconsUser = 'assets/icons/user.svg'; diff --git a/lib/presentation/pages/auth/auth_with_otp/logic.dart b/lib/presentation/pages/auth/auth_with_otp/logic.dart deleted file mode 100644 index 5412998..0000000 --- a/lib/presentation/pages/auth/auth_with_otp/logic.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:get/get.dart'; - -class AuthWithOtpLogic extends GetxController { - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - } -} diff --git a/lib/presentation/pages/auth/auth_with_otp/view.dart b/lib/presentation/pages/auth/auth_with_otp/view.dart deleted file mode 100644 index 6a566f4..0000000 --- a/lib/presentation/pages/auth/auth_with_otp/view.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import 'logic.dart'; - -class AuthWithOtpPage extends StatelessWidget { - const AuthWithOtpPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final AuthWithOtpLogic logic = Get.put(AuthWithOtpLogic()); - - return Container(); - } -} diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart index 6de4422..d5ac08e 100644 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart @@ -1,17 +1,60 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart'; +enum AuthType { useAndPass, otp } + +enum AuthStatus { init } + +enum OtpStatus { init, sent, verified, reSend } + class AuthWithUseAndPassLogic extends GetxController { Rx> formKey = GlobalKey().obs; + Rx> formKeyOtp = GlobalKey().obs; + Rx> formKeySentOtp = GlobalKey().obs; Rx phoneNumberController = TextEditingController().obs; Rx passwordController = TextEditingController().obs; + Rx phoneOtpNumberController = + TextEditingController().obs; + Rx otpCodeController = TextEditingController().obs; CaptchaController captchaController = CaptchaController(); + CaptchaController captchaOtpController = CaptchaController(); RxnString phoneNumber = RxnString(null); RxnString password = RxnString(null); RxBool isOnError = false.obs; RxBool hidePassword = true.obs; + Rx authType = AuthType.useAndPass.obs; + Rx authStatus = AuthStatus.init.obs; + Rx otpStatus = OtpStatus.init.obs; + + RxInt secondsRemaining = 120.obs; + Timer? _timer; + + void startTimer() { + _timer?.cancel(); + secondsRemaining.value = 120; + + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (secondsRemaining.value > 0) { + secondsRemaining.value--; + } else { + timer.cancel(); + } + }); + } + + void stopTimer() { + _timer?.cancel(); + } + + String get timeFormatted { + final minutes = secondsRemaining.value ~/ 60; + final seconds = secondsRemaining.value % 60; + return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; + } @override void onReady() { @@ -21,7 +64,7 @@ class AuthWithUseAndPassLogic extends GetxController { @override void onClose() { - // TODO: implement onClose + _timer?.cancel(); super.onClose(); } } diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart index 022543e..9a45635 100644 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart @@ -1,4 +1,5 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:logger/logger.dart'; @@ -9,25 +10,89 @@ import 'package:rasadyar_app/presentation/common/assets.dart'; import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart'; import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; - +import 'package:supervision/supervision.dart'; import 'logic.dart'; class AuthWithUseAndPassPage extends GetView { - AuthWithUseAndPassPage({super.key}); + const AuthWithUseAndPassPage({super.key}); @override Widget build(BuildContext context) { - final AuthWithUseAndPassLogic logic = Get.put(AuthWithUseAndPassLogic()); return Scaffold( body: SingleChildScrollView( child: Column( - children: [SizedBox(height: 80), logoWidget(), loginForm()], + children: [ + SizedBox(height: 80), + logoWidget(), + ObxValue((types) { + switch (types.value) { + case AuthType.otp: + return otpForm(); + case AuthType.useAndPass: + return useAndPassFrom(); + } + }, controller.authType), + + SizedBox(height: 50), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: 'مطالعه بیانیه ', + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + recognizer: TapGestureRecognizer()..onTap = () {}, + text: 'حریم خصوصی', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + SizedBox(height: 18), + + ObxValue((types) { + return RichText( + text: TextSpan( + children: [ + TextSpan( + recognizer: + TapGestureRecognizer() + ..onTap = () { + if (controller.authType.value == AuthType.otp) { + controller.authType.value = AuthType.useAndPass; + if (controller.otpStatus.value != + OtpStatus.init) { + controller.otpStatus.value = OtpStatus.init; + } + } else { + controller.authType.value = AuthType.otp; + } + }, + text: + controller.authType.value == AuthType.otp + ? 'ورود با رمز ثابت' + : 'ورود با رمز یکبار مصرف', + + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ); + }, controller.authType), + ], ), ), ); } - Widget loginForm() { + Widget useAndPassFrom() { return ObxValue((data) { return Padding( padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), @@ -44,8 +109,8 @@ class AuthWithUseAndPassPage extends GetView { gapPadding: 11, ), labelText: 'شماره موبایل', - labelStyle: AppFonts.yekan13Regular, - errorStyle: AppFonts.yekan13Regular.copyWith( + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( color: AppColor.redNormal, ), @@ -79,6 +144,7 @@ class AuthWithUseAndPassPage extends GetView { if (controller.isOnError.value) { controller.isOnError.value = !controller.isOnError.value; data.value.currentState?.reset(); + data.refresh(); phoneController.value.text = value; } @@ -93,7 +159,7 @@ class AuthWithUseAndPassPage extends GetView { } return null; }, - style: AppFonts.yekan13Regular, + style: AppFonts.yekan13, ); }, controller.phoneNumberController), @@ -109,8 +175,8 @@ class AuthWithUseAndPassPage extends GetView { gapPadding: 11, ), labelText: 'رمز عبور', - labelStyle: AppFonts.yekan13Regular, - errorStyle: AppFonts.yekan13Regular.copyWith( + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( color: AppColor.redNormal, ), @@ -157,10 +223,9 @@ class AuthWithUseAndPassPage extends GetView { } return null; }, - style: AppFonts.yekan13Regular, + style: AppFonts.yekan13, ); }, controller.passwordController), - SizedBox(height: 26), CaptchaWidget(controller: controller.captchaController), @@ -173,7 +238,7 @@ class AuthWithUseAndPassPage extends GetView { di.get().t(controller.captchaController.validate()); if (data.value.currentState?.validate() == true && controller.captchaController.validate()) { - print("==============>ssakldjaskljdklasjd"); + Get.toNamed(SupervisionRoutes.supervision); } }, width: Get.width, @@ -186,6 +251,257 @@ class AuthWithUseAndPassPage extends GetView { }, controller.formKey); } + Widget otpForm() { + return ObxValue((status) { + switch (status.value) { + case OtpStatus.init: + return sendCodeForm(); + case OtpStatus.sent: + case OtpStatus.verified: + case OtpStatus.reSend: + return confirmCodeForm(); + } + }, controller.otpStatus); + } + + Widget sendCodeForm() { + return ObxValue((data) { + return Form( + key: data.value, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Column( + children: [ + SizedBox(height: 26), + ObxValue((phoneController) { + return TextFormField( + controller: phoneController.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'شماره موبایل', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + prefixIconConstraints: BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffix: + phoneController.value.text.trim().isNotEmpty + ? clearButton(() { + phoneController.value.clear(); + phoneController.refresh(); + }) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + maxLines: 1, + maxLength: 11, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + data.refresh(); + phoneController.value.text = value; + } + phoneController.refresh(); + }, + textInputAction: TextInputAction.next, + validator: (value) { + if (value == null) { + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.phoneOtpNumberController), + + SizedBox(height: 26), + + CaptchaWidget(controller: controller.captchaOtpController), + + SizedBox(height: 23), + RElevated( + text: 'ارسال رمز یکبار مصرف', + onPressed: () { + if (data.value.currentState?.validate() == true && + controller.captchaOtpController.validate()) { + controller.otpStatus.value = OtpStatus.sent; + controller.startTimer(); + } + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKeyOtp); + } + + Widget confirmCodeForm() { + return ObxValue((data) { + return Form( + key: data.value, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Column( + children: [ + SizedBox(height: 26), + + ObxValue((passwordController) { + return TextFormField( + controller: passwordController.value, + obscureText: controller.hidePassword.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'رمز عبور', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + suffix: + passwordController.value.text.trim().isNotEmpty + ? GestureDetector( + onTap: () { + controller.hidePassword.value = + !controller.hidePassword.value; + }, + child: Icon( + controller.hidePassword.value + ? CupertinoIcons.eye + : CupertinoIcons.eye_slash, + ), + ) + : null, + counterText: '', + ), + textInputAction: TextInputAction.done, + keyboardType: TextInputType.visiblePassword, + maxLines: 1, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + passwordController.value.text = value; + } + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.passwordController), + + SizedBox(height: 23), + + ObxValue((timer) { + if (timer.value == 0) { + return TextButton( + onPressed: () { + controller.otpStatus.value = OtpStatus.reSend; + controller.startTimer(); + }, + child: Text( + style: AppFonts.yekan13.copyWith( + color: AppColor.blueNormal, + ), + 'ارسال مجدد کد یکبار مصرف', + ), + ); + } else { + return Text( + 'اعتبار رمز ارسال شده ${controller.timeFormatted}', + style: AppFonts.yekan13, + ); + } + }, controller.secondsRemaining), + + RichText( + text: TextSpan( + children: [ + TextSpan( + text: ' کد ارسال شده به شماره ', + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + text: controller.phoneOtpNumberController.value.text, + style: AppFonts.yekan13Bold.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + recognizer: + TapGestureRecognizer() + ..onTap = () { + controller.otpStatus.value = OtpStatus.init; + controller.captchaOtpController.clear(); + }, + text: ' ویرایش', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + + SizedBox(height: 23), + RElevated( + text: 'ورود', + onPressed: () { + if (controller.formKeyOtp.value.currentState?.validate() == + true && + controller.captchaOtpController.validate()) {} + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKeySentOtp); + } + Widget logoWidget() { return Column( children: [ @@ -193,9 +509,7 @@ class AuthWithUseAndPassPage extends GetView { Image.asset(Assets.imagesInnerSplash, width: 120, height: 120), Text( 'سامانه رصدیار', - style: AppFonts.yekan16Regular.copyWith( - color: AppColor.darkGreyNormal, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyNormal), ), ], ); diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index d34910b..1f47f60 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -1,6 +1,7 @@ import 'package:flutter/animation.dart'; import 'package:get/get.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:supervision/supervision.dart'; class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController scaleController; @@ -54,7 +55,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { void onReady() { super.onReady(); Future.delayed(const Duration(seconds: 1), () { - Get.offAllNamed(AppPaths.authWithUserAndPass); + Get.offAllNamed(SupervisionRoutes.supervision); }); } diff --git a/lib/presentation/pages/system_design/system_design.dart b/lib/presentation/pages/system_design/system_design.dart index 51ebace..a5b08b5 100644 --- a/lib/presentation/pages/system_design/system_design.dart +++ b/lib/presentation/pages/system_design/system_design.dart @@ -68,7 +68,7 @@ class _SystemDesignPageState extends State { return ListTile( title: Text( "inputs", - style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + style: AppFonts.yekan20.copyWith(color: Colors.red), ), ); }, @@ -79,11 +79,11 @@ class _SystemDesignPageState extends State { children: [ RTextField( hintText: 'حجم کشتار را در روز به قطعه وارد کنید', - hintStyle: AppFonts.yekan13Regular, + hintStyle: AppFonts.yekan13, ), RTextField( label: 'تلفن مرغداری', - labelStyle: AppFonts.yekan10Regular, + labelStyle: AppFonts.yekan10, ), ], ), @@ -98,7 +98,7 @@ class _SystemDesignPageState extends State { return ListTile( title: Text( "tab", - style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + style: AppFonts.yekan20.copyWith(color: Colors.red), ), ); }, @@ -119,7 +119,7 @@ class _SystemDesignPageState extends State { return ListTile( title: Text( "پیجینیشن", - style: AppFonts.yekan20Regular.copyWith(color: Colors.red), + style: AppFonts.yekan20.copyWith(color: Colors.red), ), ); }, @@ -134,7 +134,7 @@ class _SystemDesignPageState extends State { return ListTile( title: Text( "Outlined Fab ", - style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + style: AppFonts.yekan20.copyWith(color: Colors.green), ), ); }, @@ -166,7 +166,7 @@ class _SystemDesignPageState extends State { return ListTile( title: Text( "Fab", - style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + style: AppFonts.yekan20.copyWith(color: Colors.green), ), ); }, @@ -234,7 +234,7 @@ class _SystemDesignPageState extends State { return ListTile( title: Text( "دکمه ها", - style: AppFonts.yekan20Regular.copyWith(color: Colors.green), + style: AppFonts.yekan20.copyWith(color: Colors.green), ), ); }, diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 9faa5bf..f7f0771 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -1,10 +1,9 @@ import 'package:get/get.dart'; -import 'package:rasadyar_app/presentation/pages/auth/auth_with_otp/logic.dart'; -import 'package:rasadyar_app/presentation/pages/auth/auth_with_otp/view.dart'; import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logic.dart'; import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; import 'package:rasadyar_app/presentation/pages/splash/view.dart'; +import 'package:supervision/supervision.dart'; part 'app_paths.dart'; @@ -19,15 +18,12 @@ sealed class AppPages { page: () => SplashPage(), binding: BindingsBuilder.put(() => SplashLogic()), ), - GetPage( - name: AppPaths.authWithOtp, - page: () => AuthWithOtpPage(), - binding: BindingsBuilder.put(() => AuthWithOtpLogic()), - ), GetPage( name: AppPaths.authWithUserAndPass, page: () => AuthWithUseAndPassPage(), binding: BindingsBuilder.put(() => AuthWithUseAndPassLogic()), ), + + ...SupervisionPages.pages, ]; } diff --git a/lib/presentation/widget/buttons/elevated.dart b/lib/presentation/widget/buttons/elevated.dart index f97ecfc..934bf4f 100644 --- a/lib/presentation/widget/buttons/elevated.dart +++ b/lib/presentation/widget/buttons/elevated.dart @@ -48,7 +48,7 @@ class _RElevatedState extends State { ), fixedSize: Size(widget.width, widget.height), padding: EdgeInsets.zero, - textStyle: widget.textStyle ?? AppFonts.yekan24Regular, + textStyle: widget.textStyle ?? AppFonts.yekan24, ), child: Text(widget.text), ); diff --git a/lib/presentation/widget/buttons/outline_elevated.dart b/lib/presentation/widget/buttons/outline_elevated.dart index 23272bf..db7b7bb 100644 --- a/lib/presentation/widget/buttons/outline_elevated.dart +++ b/lib/presentation/widget/buttons/outline_elevated.dart @@ -92,7 +92,7 @@ class _ROutlinedElevatedState extends State { padding: WidgetStatePropertyAll(EdgeInsets.zero), textStyle: WidgetStatePropertyAll( widget.textStyle ?? - AppFonts.yekan24Regular.copyWith(color: AppColor.blueNormal), + AppFonts.yekan24.copyWith(color: AppColor.blueNormal), ), ), child: Text(widget.text), diff --git a/lib/presentation/widget/buttons/text_button.dart b/lib/presentation/widget/buttons/text_button.dart index 40fb3a4..ba67892 100644 --- a/lib/presentation/widget/buttons/text_button.dart +++ b/lib/presentation/widget/buttons/text_button.dart @@ -7,12 +7,12 @@ class RTextButton extends StatefulWidget { super.key, required this.text, required this.onPressed, - foregroundColor, - backgroundColor, - borderColor, - disabledBackgroundColor, - radius, - textStyle, + this.foregroundColor, + this.backgroundColor, + this.borderColor, + this.disabledBackgroundColor, + this.radius, + this.textStyle, this.width = 150.0, this.height = 56.0, }); @@ -67,7 +67,7 @@ class _RTextButtonState extends State { padding: WidgetStatePropertyAll(EdgeInsets.zero), textStyle: WidgetStatePropertyAll( widget.textStyle ?? - AppFonts.yekan24Regular.copyWith(color: AppColor.blueNormal), + AppFonts.yekan24.copyWith(color: AppColor.blueNormal), ), ), onPressed:widget.onPressed, diff --git a/lib/presentation/widget/captcha/captcha_widget.dart b/lib/presentation/widget/captcha/captcha_widget.dart index fb25167..55b85f3 100644 --- a/lib/presentation/widget/captcha/captcha_widget.dart +++ b/lib/presentation/widget/captcha/captcha_widget.dart @@ -177,7 +177,7 @@ class _CaptchaWidgetState extends State { ), Text( widget.controller.captchaCode.toString(), - style: AppFonts.yekan24Regular, + style: AppFonts.yekan24, ), ], ), @@ -203,8 +203,8 @@ class _CaptchaWidgetState extends State { gapPadding: 11, ), labelText: 'کد امنیتی', - labelStyle: AppFonts.yekan13Regular, - errorStyle: AppFonts.yekan10Regular.copyWith( + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan10.copyWith( color: AppColor.redNormal, fontSize: 8, ), @@ -249,7 +249,7 @@ class _CaptchaWidgetState extends State { } return null; }, - style: AppFonts.yekan13Regular, + style: AppFonts.yekan13, ), ), ), diff --git a/lib/presentation/widget/pagination/pagination_from_until.dart b/lib/presentation/widget/pagination/pagination_from_until.dart index 53f1203..88d7429 100644 --- a/lib/presentation/widget/pagination/pagination_from_until.dart +++ b/lib/presentation/widget/pagination/pagination_from_until.dart @@ -45,7 +45,7 @@ class _PaginationFromUntilState extends State { '$current از $total', textAlign: TextAlign.center, textDirection: TextDirection.rtl, - style: AppFonts.yekan16Regular.copyWith( + style: AppFonts.yekan16.copyWith( color: AppColor.blueNormal, ), ), diff --git a/lib/presentation/widget/pagination/show_more.dart b/lib/presentation/widget/pagination/show_more.dart index 36fb207..bdaf713 100644 --- a/lib/presentation/widget/pagination/show_more.dart +++ b/lib/presentation/widget/pagination/show_more.dart @@ -64,7 +64,7 @@ class _RShowMoreState extends State child: Text( _toggled ? 'کمتر' : 'مشاهده بیشتر', key: ValueKey(_toggled), - style: AppFonts.yekan10Regular.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), ), ), SizedBox(height: 50,) diff --git a/lib/presentation/widget/tabs/tab.dart b/lib/presentation/widget/tabs/tab.dart index ac2f735..4b961ad 100644 --- a/lib/presentation/widget/tabs/tab.dart +++ b/lib/presentation/widget/tabs/tab.dart @@ -70,14 +70,14 @@ class _CupertinoSegmentedControlDemoState2 decoration: BoxDecoration( borderRadius: BorderRadius.circular(50) ), - child: Text('لاشه', style: AppFonts.yekan13Regular), + child: Text('لاشه', style: AppFonts.yekan13), ), 1: Container( padding: EdgeInsets.all(10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(50) ), - child: Text('زنده', style: AppFonts.yekan13Regular), + child: Text('زنده', style: AppFonts.yekan13), ), }; diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart new file mode 100644 index 0000000..72990be --- /dev/null +++ b/packages/core/lib/core.dart @@ -0,0 +1,3 @@ +library ; + +export 'package:get/get.dart'; \ No newline at end of file diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml new file mode 100644 index 0000000..7bdd078 --- /dev/null +++ b/packages/core/pubspec.yaml @@ -0,0 +1,61 @@ +name: rasadyar_core +description: "A new Flutter project." +publish_to: 'none' +version: 1.0.0+1 + +environment: + sdk: ^3.7.0 + +dependencies: + flutter: + sdk: flutter + + + cupertino_icons: ^1.0.8 + + ##Log + logger: ^2.5.0 + + ## reactive + dartx: ^1.2.0 + rxdart: ^0.28.0 + + ## local storage + hive_ce: ^2.10.1 + hive_ce_flutter: ^2.2.0 + + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 + + + #SVG + flutter_svg: ^2.0.17 + + ##state manger + get: ^4.7.2 + + ##Di + get_it: ^8.0.3 + + + permission_handler: ^11.4.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + ##code generation + build_runner: ^2.4.15 + hive_ce_generator: ^1.8.2 + freezed: ^3.0.3 + json_serializable: ^6.9.4 + + ##test + mocktail: ^1.0.4 + get_test: ^4.0.1 + + + +flutter: + uses-material-design: true diff --git a/pubspec.lock b/pubspec.lock index f6fe18f..c5b9b9f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -169,6 +169,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" dart_style: dependency: transitive description: @@ -230,6 +238,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_map: + dependency: transitive + description: + name: flutter_map + sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a + url: "https://pub.dev" + source: hosted + version: "8.1.1" flutter_svg: dependency: "direct main" description: @@ -243,6 +259,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" freezed: dependency: "direct dev" description: @@ -267,6 +288,54 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + geolocator: + dependency: transitive + description: + name: geolocator + sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2 + url: "https://pub.dev" + source: hosted + version: "13.0.4" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d + url: "https://pub.dev" + source: hosted + version: "4.6.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" + source: hosted + version: "4.2.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" get: dependency: "direct main" description: @@ -355,6 +424,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + intl: + dependency: transitive + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" io: dependency: transitive description: @@ -387,6 +464,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.9.4" + latlong2: + dependency: transitive + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" leak_tracker: dependency: transitive description: @@ -419,6 +504,38 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.1" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + location: + dependency: transitive + description: + name: location + sha256: c2c4304071ec860525d5c50d142410072f8620c1d9f74874811af2e804e1a9c8 + url: "https://pub.dev" + source: hosted + version: "8.0.0" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: a3404ea6d74e89b121630be62ed8edcc7b39fd108bd19805d0ae55c397135dd7 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + location_web: + dependency: transitive + description: + name: location_web + sha256: "744bdff53dc455a2dc9a34474c49cde364d4fbef2aee009f8b0b4b68570c27a1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" logger: dependency: "direct main" description: @@ -459,6 +576,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" mime: dependency: transitive description: @@ -555,6 +680,54 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + permission_handler: + dependency: transitive + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + url: "https://pub.dev" + source: hosted + version: "9.4.6" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" petitparser: dependency: transitive description: @@ -579,6 +752,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" pool: dependency: transitive description: @@ -587,6 +768,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" pub_semver: dependency: transitive description: @@ -603,6 +792,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + rasadyar_core: + dependency: transitive + description: + path: "packages/core" + relative: true + source: path + version: "1.0.0+1" rxdart: dependency: "direct main" description: @@ -656,6 +852,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -688,6 +892,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + supervision: + dependency: "direct main" + description: + path: "features/supervision" + relative: true + source: path + version: "1.0.0" term_glyph: dependency: transitive description: @@ -728,6 +939,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_graphics: dependency: transitive description: @@ -800,6 +1027,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e3a7258..326d4f4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: rasadyar_app description: "A new Flutter project." -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: 'none' version: 1.0.0+1 environment: @@ -38,6 +38,10 @@ dependencies: ##Di get_it: ^8.0.3 + + supervision: + path: ./features/supervision + dev_dependencies: flutter_test: sdk: flutter @@ -54,6 +58,9 @@ dev_dependencies: + + + flutter: uses-material-design: true From 39578bcff3deb2847b06cef309e074e1c3f9ca62 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 12 Apr 2025 11:07:52 +0330 Subject: [PATCH 009/256] feat : map and generate fake location --- .../lib/data/utils/cluster_generator.dart | 109 ------------------ .../lib/data/utils/marker_generator.dart | 34 ++++++ .../lib/presentation/routes/app_pages.dart | 2 +- .../lib/presentation/routes/app_routes.dart | 6 +- 4 files changed, 38 insertions(+), 113 deletions(-) delete mode 100644 features/supervision/lib/data/utils/cluster_generator.dart diff --git a/features/supervision/lib/data/utils/cluster_generator.dart b/features/supervision/lib/data/utils/cluster_generator.dart deleted file mode 100644 index 18c5bcc..0000000 --- a/features/supervision/lib/data/utils/cluster_generator.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'dart:math'; -import 'package:flutter/foundation.dart'; -import 'package:latlong2/latlong.dart'; - -class ClusterParams { - final List points; - final double clusterRadiusMeters; - - ClusterParams({ - required this.points, - required this.clusterRadiusMeters, - }); -} - -class Cluster { - final LatLng center; - final List members; - - Cluster(this.center, this.members); -} -// Use a more efficient quadtree-based clustering algorithm -Future> clusterMarkersQuadtreeIsolate(ClusterParams params) async { - return compute(_clusterMarkersQuadtree, params); -} - -List _clusterMarkersQuadtree(ClusterParams params) { - final points = params.points; - final radius = params.clusterRadiusMeters; - final distance = const Distance(); - final List clusters = []; - - // Skip clustering if we have a small number of points - if (points.length < 100) { - return points.map((p) => Cluster(p, [p])).toList(); - } - - // Find bounds - double minLat = points[0].latitude; - double maxLat = points[0].latitude; - double minLng = points[0].longitude; - double maxLng = points[0].longitude; - - for (final point in points) { - minLat = min(minLat, point.latitude); - maxLat = max(maxLat, point.latitude); - minLng = min(minLng, point.longitude); - maxLng = max(maxLng, point.longitude); - } - - // Build spatial grid for faster lookups (simple spatial index) - // Convert geographic distance to approximate degrees - final double radiusDegLat = radius / 111000; // ~111km per degree latitude - final double radiusDegLng = radius / (111000 * cos(minLat * pi / 180)); // Adjust for longitude - - final int gridLatSize = ((maxLat - minLat) / radiusDegLat).ceil(); - final int gridLngSize = ((maxLng - minLng) / radiusDegLng).ceil(); - - // Create spatial grid - final List>> grid = List.generate( - gridLatSize + 1, - (_) => List.generate(gridLngSize + 1, (_) => []) - ); - - // Add points to grid cells - for (final point in points) { - final int latIdx = ((point.latitude - minLat) / radiusDegLat).floor(); - final int lngIdx = ((point.longitude - minLng) / radiusDegLng).floor(); - grid[latIdx][lngIdx].add(point); - } - - // Process grid cells in batches - final Set processed = {}; - - for (int latIdx = 0; latIdx < gridLatSize; latIdx++) { - for (int lngIdx = 0; lngIdx < gridLngSize; lngIdx++) { - final cellPoints = grid[latIdx][lngIdx]; - - for (final point in cellPoints) { - if (processed.contains(point)) continue; - - // Find nearby points - final List neighbors = []; - neighbors.add(point); - processed.add(point); - - // Check current and adjacent cells for neighbors - for (int adjLat = max(0, latIdx - 1); adjLat <= min(gridLatSize - 1, latIdx + 1); adjLat++) { - for (int adjLng = max(0, lngIdx - 1); adjLng <= min(gridLngSize - 1, lngIdx + 1); adjLng++) { - for (final neighbor in grid[adjLat][adjLng]) { - if (!processed.contains(neighbor) && distance(point, neighbor) <= radius) { - neighbors.add(neighbor); - processed.add(neighbor); - } - } - } - } - - // Calculate cluster center - if (neighbors.isNotEmpty) { - final avgLat = neighbors.map((p) => p.latitude).reduce((a, b) => a + b) / neighbors.length; - final avgLng = neighbors.map((p) => p.longitude).reduce((a, b) => a + b) / neighbors.length; - clusters.add(Cluster(LatLng(avgLat, avgLng), neighbors)); - } - } - } - } - - return clusters; -} \ No newline at end of file diff --git a/features/supervision/lib/data/utils/marker_generator.dart b/features/supervision/lib/data/utils/marker_generator.dart index c01e898..af3ad4a 100644 --- a/features/supervision/lib/data/utils/marker_generator.dart +++ b/features/supervision/lib/data/utils/marker_generator.dart @@ -1,7 +1,12 @@ +import 'dart:async'; +import 'dart:convert'; import 'dart:math'; + import 'package:flutter/foundation.dart'; import 'package:latlong2/latlong.dart'; + +/* class GridGenParams { final LatLng center; final int count; @@ -55,3 +60,32 @@ List _generateGridMarkersOptimized(GridGenParams params) { return result.sublist(0, min(result.length, params.count)); } +*/ +class LatLngSimple { + final double lat; + final double lng; + + LatLngSimple(this.lat, this.lng); + + Map toJson() => {'lat': lat, 'lng': lng}; +} + + +List generateLatLngInIsolate(int count) { + final Random random = Random(); + const double minLat = 35.610; + const double maxLat = 36.120; + const double minLng = 50.190; + const double maxLng = 51.100; + + return List.generate(count, (_) { + double lat = minLat + random.nextDouble() * (maxLat - minLat); + double lng = minLng + random.nextDouble() * (maxLng - minLng); + return LatLngSimple(lat, lng); + }); +} + +Future> generateLocationsUsingCompute(int count) async { + final result = await compute(generateLatLngInIsolate, count); + return result.map((e) => LatLng(e.lat, e.lng)).toList(); +} \ No newline at end of file diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index 12c2320..46dad2e 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -10,7 +10,7 @@ sealed class SupervisionPages { GetPage( name: SupervisionRoutes.supervision, page: () => SupervisionFilterPage(), - binding: BindingsBuilder.put(() => BazresiLogic()), + binding: BindingsBuilder.put(() => SupervisionLogic()), ), ]; } diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart index bafe72c..37df78b 100644 --- a/features/supervision/lib/presentation/routes/app_routes.dart +++ b/features/supervision/lib/presentation/routes/app_routes.dart @@ -1,7 +1,7 @@ sealed class SupervisionRoutes { SupervisionRoutes._(); - static const supervision = '/supervision'; - -} \ No newline at end of file + static const supervisionAction = '/supervision/action'; + static const supervisionUserSetting = '/supervision/userSettings'; +} From 503dcd91b802fc41a788ec789badcfc92fb9acb6 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 12 Apr 2025 18:07:36 +0330 Subject: [PATCH 010/256] feat: 1-fake location 2-bottom navigation 3-bottom sheet 4-lazy map loading --- .mason/bricks.json | 1 + assets/icons/filter.svg | 10 +- assets/icons/map.svg | 6 + assets/icons/profile_circle.svg | 4 + assets/icons/setting.svg | 3 + assets/icons/user.svg | 1 - assets/vec/filter.svg.vec | Bin 1063 -> 495 bytes assets/vec/map.svg.vec | Bin 0 -> 817 bytes assets/vec/map_marker.svg.vec | Bin 0 -> 509 bytes assets/vec/profile_circle.svg.vec | Bin 0 -> 1347 bytes assets/vec/setting.svg.vec | Bin 0 -> 704 bytes .../lib/presentation/filter/logic.dart | 96 ++ .../lib/presentation/filter/view.dart | 174 ++++ .../lib/presentation/root/logic.dart | 28 + .../lib/presentation/root/view.dart | 62 ++ .../lib/presentation/routes/app_pages.dart | 10 +- features/supervision/pubspec.lock | 612 ++++++++++++ flutter_ddd_module/CHANGELOG.md | 3 - flutter_ddd_module/HELLO.md | 1 - flutter_ddd_module/LICENSE | 1 - flutter_ddd_module/README.md | 27 - flutter_ddd_module/__brick__/HELLO.md | 1 - .../__brick__/lib/data/.gitkeep | 0 .../lib/presentation/routes/app_pages.dart | 0 .../lib/presentation/routes/app_paths.dart | 0 flutter_ddd_module/__brick__/pubspec.yaml | 20 - flutter_ddd_module/brick.yaml | 33 - flutter_ddd_module/pubspec.yaml | 20 - lib/presentation/common/assets.dart | 8 +- packages/core/lib/core.dart | 9 +- .../lib/presentation/common/app_color.dart | 368 ++++++++ .../lib/presentation/common/app_fonts.dart | 169 ++++ .../core/lib/presentation/common/assets.dart | 36 + .../core/lib/presentation/common/common.dart | 3 + .../lib/presentation/utils/color_utils.dart | 24 + .../core/lib/presentation/utils/utils.dart | 1 + .../bottom_navigation_1.dart | 81 ++ .../presentation/widget/buttons/elevated.dart | 56 ++ .../lib/presentation/widget/buttons/fab.dart | 232 +++++ .../widget/buttons/fab_outlined.dart | 605 ++++++++++++ .../widget/buttons/outline_elevated.dart | 101 ++ .../widget/buttons/text_button.dart | 77 ++ .../widget/captcha/captcha_widget.dart | 266 ++++++ .../presentation/widget/inputs/r_input.dart | 216 +++++ .../pagination/pagination_from_until.dart | 255 +++++ .../widget/pagination/show_more.dart | 78 ++ .../lib/presentation/widget/tabs/new_tab.dart | 784 +++++++++++++++ .../lib/presentation/widget/tabs/tab.dart | 115 +++ .../lib/presentation/widget/vec_widget.dart | 66 ++ .../core/lib/presentation/widget/widget.dart | 2 + packages/core/pubspec.lock | 890 ++++++++++++++++++ packages/core/pubspec.yaml | 1 - 52 files changed, 5435 insertions(+), 121 deletions(-) create mode 100644 .mason/bricks.json create mode 100644 assets/icons/map.svg create mode 100644 assets/icons/profile_circle.svg create mode 100644 assets/icons/setting.svg delete mode 100644 assets/icons/user.svg create mode 100644 assets/vec/map.svg.vec create mode 100644 assets/vec/map_marker.svg.vec create mode 100644 assets/vec/profile_circle.svg.vec create mode 100644 assets/vec/setting.svg.vec create mode 100644 features/supervision/lib/presentation/filter/logic.dart create mode 100644 features/supervision/lib/presentation/filter/view.dart create mode 100644 features/supervision/lib/presentation/root/logic.dart create mode 100644 features/supervision/lib/presentation/root/view.dart create mode 100644 features/supervision/pubspec.lock delete mode 100644 flutter_ddd_module/CHANGELOG.md delete mode 100644 flutter_ddd_module/HELLO.md delete mode 100644 flutter_ddd_module/LICENSE delete mode 100644 flutter_ddd_module/README.md delete mode 100644 flutter_ddd_module/__brick__/HELLO.md delete mode 100644 flutter_ddd_module/__brick__/lib/data/.gitkeep delete mode 100644 flutter_ddd_module/__brick__/lib/presentation/routes/app_pages.dart delete mode 100644 flutter_ddd_module/__brick__/lib/presentation/routes/app_paths.dart delete mode 100644 flutter_ddd_module/__brick__/pubspec.yaml delete mode 100644 flutter_ddd_module/brick.yaml delete mode 100644 flutter_ddd_module/pubspec.yaml create mode 100644 packages/core/lib/presentation/common/app_color.dart create mode 100644 packages/core/lib/presentation/common/app_fonts.dart create mode 100644 packages/core/lib/presentation/common/assets.dart create mode 100644 packages/core/lib/presentation/common/common.dart create mode 100644 packages/core/lib/presentation/utils/color_utils.dart create mode 100644 packages/core/lib/presentation/utils/utils.dart create mode 100644 packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart create mode 100644 packages/core/lib/presentation/widget/buttons/elevated.dart create mode 100644 packages/core/lib/presentation/widget/buttons/fab.dart create mode 100644 packages/core/lib/presentation/widget/buttons/fab_outlined.dart create mode 100644 packages/core/lib/presentation/widget/buttons/outline_elevated.dart create mode 100644 packages/core/lib/presentation/widget/buttons/text_button.dart create mode 100644 packages/core/lib/presentation/widget/captcha/captcha_widget.dart create mode 100644 packages/core/lib/presentation/widget/inputs/r_input.dart create mode 100644 packages/core/lib/presentation/widget/pagination/pagination_from_until.dart create mode 100644 packages/core/lib/presentation/widget/pagination/show_more.dart create mode 100644 packages/core/lib/presentation/widget/tabs/new_tab.dart create mode 100644 packages/core/lib/presentation/widget/tabs/tab.dart create mode 100644 packages/core/lib/presentation/widget/vec_widget.dart create mode 100644 packages/core/lib/presentation/widget/widget.dart create mode 100644 packages/core/pubspec.lock diff --git a/.mason/bricks.json b/.mason/bricks.json new file mode 100644 index 0000000..2645872 --- /dev/null +++ b/.mason/bricks.json @@ -0,0 +1 @@ +{"flutter_ddd_module":"D:/fl_project/rasadyar_app/flutter_ddd_module"} \ No newline at end of file diff --git a/assets/icons/filter.svg b/assets/icons/filter.svg index 52500e7..25636f2 100644 --- a/assets/icons/filter.svg +++ b/assets/icons/filter.svg @@ -1,8 +1,4 @@ - - - - - - - + + + diff --git a/assets/icons/map.svg b/assets/icons/map.svg new file mode 100644 index 0000000..1d3b6f5 --- /dev/null +++ b/assets/icons/map.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/profile_circle.svg b/assets/icons/profile_circle.svg new file mode 100644 index 0000000..0b32445 --- /dev/null +++ b/assets/icons/profile_circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/setting.svg b/assets/icons/setting.svg new file mode 100644 index 0000000..622cf10 --- /dev/null +++ b/assets/icons/setting.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/user.svg b/assets/icons/user.svg deleted file mode 100644 index fbe07ed..0000000 --- a/assets/icons/user.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/vec/filter.svg.vec b/assets/vec/filter.svg.vec index 6c190a39e80c61de99b27f3d6782a329436382ed..6d6d5baa995290253224fbfae417399f51174cad 100644 GIT binary patch literal 495 zcmY+=KS%;m90%~vQAd+E@-;d9>~Ki+%4m!8UlG667V0E`=>4lNge;{+4{ zAJ9_N|DTH*X>FMU^bap?X)Bu4xxirOB~q7g#BChF;BPZ}B;7 zbPiB0B7$b)VRROox5wzp&7&SF<2t0!<{YOhXDcTbQ4JfoxX=0M{4!-96G*6x!#7t%ze-^u}#Wyfj zePI!EnesK6=oym&d@)g{dy!qzVoS;}-P5A|H>GW@Af3tW<432;`sas(;x>*GR3yJy Cg_+U- literal 1063 zcmbW%OH30%7zgkvB&O7Z25Nj@T1jeg!6%E)*zEidw)KP{CZ-f425OAaz{Lj`F92QgL8uL|rX>`IgdIg6&y(o(IQosFBykV5bD-pG{Nf`@B zRrR1W;wnSB`3UYLiYY!p`2|Qbb)e3ij*{3#jCUFli1)&+PI6&?a75}>Yo+6s<-9S` zj;zOhS|Hve?PqJH_Pgs)phmR4r&N?b9?%-B>+$vNP0e;=3*M)VYJ)Xf5lk3)Q*smZ z5-Z=iXFbmPHt>wGCTX58G#j^~#o?j$RvJgG^p0ypI#+qaD}pUJYfe%ez*IHEHrFAV zuY)Y3`ncdp?56s7q+;G87IhH1$3i$(T}*jxXx0nh^|vECwi)I~7}sgsp|@Me~|KX==vpI6t%;7qKhl46}9!3xj(oV z@2aA_TbqZ5#t<(u>HJ(pBQG8M%x4~*;?~jE(gp0Pw8mF2U8Z;`?>ravo_W+Kov$pG z_3r7i!5Mt1v1@jGD88*Z7v>kePsoX$NRKTb!+f_sP&)k>%Z1>i?O|%lQP}!9BT59!X1<6*t z^w7{I;6>3kDMG=5HUR~jgT+KW^-z*i!5oC1{8uFFn~8CD;WzW%yzhO??u?%^nRJ@5 zUS#YP9=B*Hj9HdjVyu2|n(;ydyVL>$ne_gvtj05MV#FU^LF5Xay38aDtf?cyV z?B0GASa+&uHykjORdH{i1L{!~^J+KIK|BF@^(f7qC`UEe3u@SRryYitHL7Wab*Dxe z&jMYu?P!a{NV`tjv4E$tE4YQDg3(nORz|)Dc>gVoi2hAKzXzt_&+1F~VB8l>d6SR| zuF?82q`WV{Q(2~Y8u~x3z-{Xx#h${g%{YwrJ%OJy9;$f+lbdefI-CpYRl#EK8IgZp zKS_*(p6nF$XAQ5=8(Rts{bKzFX|2K7k|Fvx{kSEW+4#Znv!qAqtLW1d zq5~&F3eLssD3v61SKBZXdkb><3&^9gy=?C~&2lZ+6bu*>mtMQfp`>JJKq%lf0F4U{Lf@Sj?3^NV& z{R8?}jtH-E!A{;=$Y&dd&$p20!{l8-dImh@nfN3TMhS$?p{(pV(`hOr33L5Mg)EOC8 zd~0^zrJ3w3{xi)vM7YBlB)>PQ>^~4Qps3YgVlbC%bY9`M-6@RkmlH@b-2MN5bDhH!KGHe8BDV*YX*z=3rzy6lLnd$F@cc@ zVgdsLOl|?xtf(V#&MU;4oLQzdI*V&II7ehobQV%Bh11eNH?e^%X95CdDG&?J{ZUDaC^Tj2h;AbG9)q9=q9zfPf;J-}q6=47Ui5?Cx!z<(fXJ6+)4hhAW|A9>xVcL(uqyyrIbxY3_m^19Ol zI|083@6ZtMp+fv7;yj4I0iFkWuOWXK;;({NhWuB+E5o}CY<9*`Px&uFkMj32Cc|eL zefcQ+lc6q-^JOEP=S(odd27s4BD^dS+9?v6Sa4PYZe8g7Nw2mzj!#^PtmA`!o;gmVoC% zo)YSKS&BFlJ+HOl`R1bFnBA)<6DJ zOjXKI=e(T4H)?G?&M3q#Ifz+MIE@)p_!G11_a6iH%e@V~GF3kyGYJFz8_u)c(`jHP zZJ^(Of$v)n8`#rrU?%Z5c3-}Qx$T$f>?5ut#PILB!>psHJMmkWp|hr3Y1Z{}^=GH+ FzW}|zA$9-& literal 0 HcmV?d00001 diff --git a/assets/vec/setting.svg.vec b/assets/vec/setting.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..5b88635dc5de8d4ea03c48bd0308675a89d146b1 GIT binary patch literal 704 zcmY+C!A}!W5XN7(sZk-?)&wCK1C22;U>58C0dF4M;9w$q@<6h+lpeis^PmY~tzJA( zmSVz%OW{BoLYlPn28Rulo;aYEtI?45KrooLK4+$KU^koJ&YPKUzI|_+P*5n@OQ z@kl+;cm;*fdQf1Dk1&kD|C`>fM?uUQM(_)k6?8}iPTzuAKL=t${{&bixNPy8BW3^A(6~=43Wr#PvPdD(%2b^9Y%T z&vpd$mY8P!1F!o@m+SoGd+wX@(yTMGIL*4F$;UjWHgt#QE`AR|-{}CPOZQ+d7Ki=6 zBkZ%G`q}qXrzXk&w*`-R>xC^-6B+2zV^+&s%%hbGOm&u}74eZZCh1U2x>oEf&#@v+ zpt*C;TR=Wic1V%0ABQ&;`FuBfSCQ|W8&&ij+Z$ok&bzqYqnzOk>fAe?qU}oEqx7%*&T)+}AP?EwSEZ>=Wl# h?KgOyYd|#XMJD;TFwew#BK1?Abg%Ts9@5XL^*_HK8Z-a^ literal 0 HcmV?d00001 diff --git a/features/supervision/lib/presentation/filter/logic.dart b/features/supervision/lib/presentation/filter/logic.dart new file mode 100644 index 0000000..168fbaa --- /dev/null +++ b/features/supervision/lib/presentation/filter/logic.dart @@ -0,0 +1,96 @@ +import 'dart:async'; +import 'dart:developer'; + +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:supervision/data/utils/marker_generator.dart'; + +class SupervisionFilterLogic extends GetxController { + Rx currentLocation = LatLng(35.824891, 50.948025).obs; + RxList allMarkers = [].obs; + RxList markers = [].obs; + Timer? _debounceTimer; + + + + + + RxBool isSelected = false.obs; + + Future determineCurrentPosition() async { + bool serviceEnabled; + LocationPermission permission; + + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + return Future.error('Location services are disabled.'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + return Future.error('Location permissions are denied.'); + } + } + + if (permission == LocationPermission.deniedForever) { + return Future.error('Location permissions are permanently denied.'); + } + + final position = await Geolocator.getCurrentPosition( + locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), + ); + final latLng = LatLng(position.latitude, position.longitude); + currentLocation.value = latLng; + markers.add(latLng); + } + + void debouncedUpdateVisibleMarkers({required LatLng center}) { + _debounceTimer?.cancel(); + _debounceTimer = Timer(const Duration(milliseconds: 300), () { + final filtered = filterNearbyMarkers({ + 'markers': allMarkers, + 'centerLat': center.latitude, + 'centerLng': center.longitude, + 'radius': 2000.0, + }); + + markers.addAll(filtered); + }); + } + + List filterNearbyMarkers(Map args) { + final List rawMarkers = args['markers']; + final double centerLat = args['centerLat']; + final double centerLng = args['centerLng']; + final double radiusInMeters = args['radius']; + final center = LatLng(centerLat, centerLng); + final distance = Distance(); + + return rawMarkers + .where((marker) => distance(center, marker) <= radiusInMeters) + .toList(); + } + + Future generatedMarkers() async { + final generatedMarkers = await generateLocationsUsingCompute(100000); + allMarkers.value = generatedMarkers; + + } + + @override + void onReady() { + super.onReady(); + + determineCurrentPosition(); + generatedMarkers(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart new file mode 100644 index 0000000..1d0b6ac --- /dev/null +++ b/features/supervision/lib/presentation/filter/view.dart @@ -0,0 +1,174 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; + +import 'logic.dart'; + +class SupervisionFilterPage extends GetView { + SupervisionFilterPage({super.key}); + + final Map styleTypes = { + 'satellite': 's', + 'satelliteWithLabel': 'y', + 'street': 'p', + 'streetWithTraffic': 'p,traffic', + }; + + final String token = + "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjJlMGQyZTUyYzU1ZDJmMDkxNzBmNTdmM2JmOGVkODgxOTg5YTQxN2E5M2JiNDRiZTk1YzEyMjI1NzRlYWM3ZGYwOTlkNzhkNDUyMDRlMDJiIn0.eyJhdWQiOiIyODYyMiIsImp0aSI6IjJlMGQyZTUyYzU1ZDJmMDkxNzBmNTdmM2JmOGVkODgxOTg5YTQxN2E5M2JiNDRiZTk1YzEyMjI1NzRlYWM3ZGYwOTlkNzhkNDUyMDRlMDJiIiwiaWF0IjoxNzI1MTc2MDI5LCJuYmYiOjE3MjUxNzYwMjksImV4cCI6MTcyNzc2ODAyOSwic3ViIjoiIiwic2NvcGVzIjpbImJhc2ljIl19.bYQSwq48FZ9IM-Y7aTQAblEmIAz1b4m3nOWuKg-VTalx-eZqcIlzIOJI7XarBeS35CGvPbu6W9tAFoliz_HPARSMJM_Ni0YwESjscVqvPNJqV2vZlmgMj_wRDa0W5FmBipZ-AzKGcsuoMEpD8WzUgnlrhUdqVob1UHXQmZt1BFJlFHLm_grzKFf1_Lw_cHA_mRhhe36d_hU5Qg0jY3NP2NXG_TmecQcqch4YEwCh5_R_dUyMIlt70FL2OJ37ESyPYl-XMg3qOOjgI5YD8h6rciSfFsQpnOgl84HhV3aQ4MvWrIPl9ekEnwLM71He8o5KY1hhSQdOHSvO4yL6MBg9Yw"; + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + ObxValue((currentLocation) { + return FlutterMap( + options: MapOptions( + initialCenter: currentLocation.value, + initialZoom: 18, + onPositionChanged: (camera, hasGesture) { + controller.debouncedUpdateVisibleMarkers(center: camera.center); + }, + ), + children: [ + TileLayer( + urlTemplate: + "https://map.ir/shiveh/xyz/1.0.0/Shiveh:Shiveh@EPSG:3857@png/{z}/{x}/{y}.png" + "?x-api-key=$token", + ), + + ObxValue((markers) { + return MarkerLayer( + markers: + markers + .map( + (marker) => Marker( + point: marker, + child: const Icon( + Icons.location_on, + color: Colors.red, + size: 30, + ), + ), + ) + .toList(), + ); + }, controller.markers), + ], + ); + }, controller.currentLocation), + + Positioned( + right: 10, + bottom: 100, + child: RFab.smallAdd( + onPressed: () { + controller.isSelected.value = !controller.isSelected.value; + }, + ), + ), + + Positioned( + bottom: 0, + left: 0, + right: 0, + child: ObxValue((isSelected) { + return DraggableBottomSheet(isVisible: isSelected.value); + }, controller.isSelected), + ), + ], + ); + } +} + +class DraggableBottomSheet extends StatefulWidget { + final bool isVisible; + final double initialHeight; + final double minHeight; + final double maxHeight; + + const DraggableBottomSheet({ + super.key, + required this.isVisible, + this.initialHeight = 200, + this.minHeight = 0, + this.maxHeight = 700, + }); + + @override + State createState() => _DraggableBottomSheetState(); +} + +class _DraggableBottomSheetState extends State { + late double _sheetHeight; + bool isWidgetVisible = false; + + @override + void initState() { + super.initState(); + _sheetHeight = widget.initialHeight; + isWidgetVisible = widget.isVisible; + } + + void _onVerticalDragUpdate(DragUpdateDetails details) { + setState(() { + _sheetHeight -= details.delta.dy; + _sheetHeight = _sheetHeight.clamp(widget.minHeight, widget.maxHeight); + }); + } + + @override + void didUpdateWidget(covariant DraggableBottomSheet oldWidget) { + if (_sheetHeight <= oldWidget.initialHeight) { + setState(() { + isWidgetVisible = !isWidgetVisible; + }); + } + + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + return AnimatedPositioned( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + bottom: widget.isVisible ? 0 : -widget.maxHeight, + left: 0, + right: 0, + child: GestureDetector( + onVerticalDragUpdate: _onVerticalDragUpdate, + child: Container( + height: _sheetHeight, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(50)), + ), + child: Column( + children: [ + const SizedBox(height: 10), + Container( + width: 40, + height: 5, + decoration: BoxDecoration( + color: Colors.grey[400], + borderRadius: BorderRadius.circular(5), + ), + ), + const SizedBox(height: 10), + Expanded( + child: ListView.builder( + itemCount: 15, + itemBuilder: + (context, index) => + ListTile(title: Text('Item ${index + 1}')), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/features/supervision/lib/presentation/root/logic.dart b/features/supervision/lib/presentation/root/logic.dart new file mode 100644 index 0000000..a2f73b3 --- /dev/null +++ b/features/supervision/lib/presentation/root/logic.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:supervision/presentation/filter/view.dart'; + +class RootLogic extends GetxController { + RxInt currentIndex = 0.obs; + List pages = [ + SupervisionFilterPage(), + Placeholder(color: Colors.red), + Placeholder(color: Colors.amber), + ]; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + void changePage(int index) { + currentIndex.value = index; + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/features/supervision/lib/presentation/root/view.dart b/features/supervision/lib/presentation/root/view.dart new file mode 100644 index 0000000..6d70f53 --- /dev/null +++ b/features/supervision/lib/presentation/root/view.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class RootPage extends GetView { + const RootPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + ObxValue( + (currentIndex) => IndexedStack( + index: currentIndex.value, + children: controller.pages, + ), + controller.currentIndex, + ), + + Positioned( + bottom: 0, + left: 0, + right: 0, + child: ObxValue( + (index) => BottomNavigation1( + items: [ + BottomNavigation1Item( + icon: Assets.vecMapSvg, + label: 'نقشه', + isSelected: controller.currentIndex.value == 0, + onTap: () { + controller.changePage(0); + }, + ), + BottomNavigation1Item( + icon: Assets.vecSettingSvg, + label: 'اقدام', + isSelected: controller.currentIndex.value == 1, + onTap: () { + controller.changePage(1); + }, + ), + BottomNavigation1Item( + icon: Assets.vecProfileCircleSvg, + label: 'پروفایل', + isSelected: controller.currentIndex.value == 2, + onTap: () { + controller.changePage(2); + }, + ), + ], + ), + controller.currentIndex, + ), + ), + ], + ), + ); + } +} diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index 46dad2e..2b44f68 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -1,6 +1,7 @@ import 'package:rasadyar_core/core.dart'; import 'package:supervision/presentation/filter/logic.dart'; -import 'package:supervision/presentation/filter/view.dart'; +import 'package:supervision/presentation/root/logic.dart'; +import 'package:supervision/presentation/root/view.dart'; import 'package:supervision/presentation/routes/app_routes.dart'; sealed class SupervisionPages { @@ -9,8 +10,11 @@ sealed class SupervisionPages { static final pages = [ GetPage( name: SupervisionRoutes.supervision, - page: () => SupervisionFilterPage(), - binding: BindingsBuilder.put(() => SupervisionLogic()), + page: () => RootPage(), + bindings: [ + BindingsBuilder.put(() => RootLogic()), + BindingsBuilder.put(() => SupervisionFilterLogic()), + ], ), ]; } diff --git a/features/supervision/pubspec.lock b/features/supervision/pubspec.lock new file mode 100644 index 0000000..05a3d7f --- /dev/null +++ b/features/supervision/pubspec.lock @@ -0,0 +1,612 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + cupertino_icons: + dependency: transitive + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dartx: + dependency: transitive + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a + url: "https://pub.dev" + source: hosted + version: "8.1.1" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + url: "https://pub.dev" + source: hosted + version: "2.0.17" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + url: "https://pub.dev" + source: hosted + version: "3.0.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2 + url: "https://pub.dev" + source: hosted + version: "13.0.4" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d + url: "https://pub.dev" + source: hosted + version: "4.6.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" + source: hosted + version: "4.2.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" + get: + dependency: transitive + description: + name: get + sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 + url: "https://pub.dev" + source: hosted + version: "4.7.2" + get_it: + dependency: transitive + description: + name: get_it + sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 + url: "https://pub.dev" + source: hosted + version: "8.0.3" + hive_ce: + dependency: transitive + description: + name: hive_ce + sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f + url: "https://pub.dev" + source: hosted + version: "2.10.1" + hive_ce_flutter: + dependency: transitive + description: + name: hive_ce_flutter + sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + http: + dependency: transitive + description: + name: http + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + url: "https://pub.dev" + source: hosted + version: "1.3.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + intl: + dependency: transitive + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + latlong2: + dependency: "direct main" + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + location: + dependency: "direct main" + description: + name: location + sha256: c2c4304071ec860525d5c50d142410072f8620c1d9f74874811af2e804e1a9c8 + url: "https://pub.dev" + source: hosted + version: "8.0.0" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: a3404ea6d74e89b121630be62ed8edcc7b39fd108bd19805d0ae55c397135dd7 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + location_web: + dependency: transitive + description: + name: location_web + sha256: "744bdff53dc455a2dc9a34474c49cde364d4fbef2aee009f8b0b4b68570c27a1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + logger: + dependency: transitive + description: + name: logger + sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + url: "https://pub.dev" + source: hosted + version: "2.5.0" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" + url: "https://pub.dev" + source: hosted + version: "2.2.16" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: transitive + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + url: "https://pub.dev" + source: hosted + version: "9.4.6" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" + rasadyar_core: + dependency: "direct main" + description: + path: "../../packages/core" + relative: true + source: path + version: "1.0.0+1" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + time: + dependency: transitive + description: + name: time + sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + url: "https://pub.dev" + source: hosted + version: "1.1.18" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" +sdks: + dart: ">=3.7.0 <4.0.0" + flutter: ">=3.27.0" diff --git a/flutter_ddd_module/CHANGELOG.md b/flutter_ddd_module/CHANGELOG.md deleted file mode 100644 index f0640d6..0000000 --- a/flutter_ddd_module/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -# 0.1.0+1 - -- TODO: Describe initial release. diff --git a/flutter_ddd_module/HELLO.md b/flutter_ddd_module/HELLO.md deleted file mode 100644 index 56a50b8..0000000 --- a/flutter_ddd_module/HELLO.md +++ /dev/null @@ -1 +0,0 @@ -Hello moji -! \ No newline at end of file diff --git a/flutter_ddd_module/LICENSE b/flutter_ddd_module/LICENSE deleted file mode 100644 index ba75c69..0000000 --- a/flutter_ddd_module/LICENSE +++ /dev/null @@ -1 +0,0 @@ -TODO: Add your license here. diff --git a/flutter_ddd_module/README.md b/flutter_ddd_module/README.md deleted file mode 100644 index ec1f8e9..0000000 --- a/flutter_ddd_module/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# flutter_ddd_module - -[![Powered by Mason](https://img.shields.io/endpoint?url=https%3A%2F%2Ftinyurl.com%2Fmason-badge)](https://github.com/felangel/mason) - -A new brick created with the Mason CLI. - -_Generated by [mason][1] 🧱_ - -## Getting Started 🚀 - -This is a starting point for a new brick. -A few resources to get you started if this is your first brick template: - -- [Official Mason Documentation][2] -- [Code generation with Mason Blog][3] -- [Very Good Livestream: Felix Angelov Demos Mason][4] -- [Flutter Package of the Week: Mason][5] -- [Observable Flutter: Building a Mason brick][6] -- [Meet Mason: Flutter Vikings 2022][7] - -[1]: https://github.com/felangel/mason -[2]: https://docs.brickhub.dev -[3]: https://verygood.ventures/blog/code-generation-with-mason -[4]: https://youtu.be/G4PTjA6tpTU -[5]: https://youtu.be/qjA0JFiPMnQ -[6]: https://youtu.be/o8B1EfcUisw -[7]: https://youtu.be/LXhgiF5HiQg diff --git a/flutter_ddd_module/__brick__/HELLO.md b/flutter_ddd_module/__brick__/HELLO.md deleted file mode 100644 index 2f08230..0000000 --- a/flutter_ddd_module/__brick__/HELLO.md +++ /dev/null @@ -1 +0,0 @@ -Hello {{name}}! \ No newline at end of file diff --git a/flutter_ddd_module/__brick__/lib/data/.gitkeep b/flutter_ddd_module/__brick__/lib/data/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/flutter_ddd_module/__brick__/lib/presentation/routes/app_pages.dart b/flutter_ddd_module/__brick__/lib/presentation/routes/app_pages.dart deleted file mode 100644 index e69de29..0000000 diff --git a/flutter_ddd_module/__brick__/lib/presentation/routes/app_paths.dart b/flutter_ddd_module/__brick__/lib/presentation/routes/app_paths.dart deleted file mode 100644 index e69de29..0000000 diff --git a/flutter_ddd_module/__brick__/pubspec.yaml b/flutter_ddd_module/__brick__/pubspec.yaml deleted file mode 100644 index c892059..0000000 --- a/flutter_ddd_module/__brick__/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: {{feature_name}} -description: {{feature_name}} feature module -version: 0.0.1 -publish_to: 'none' - -environment: - sdk: '>=3.0.0 <4.0.0' - flutter: ">=3.10.0" - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^5.0.0 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/flutter_ddd_module/brick.yaml b/flutter_ddd_module/brick.yaml deleted file mode 100644 index 591998f..0000000 --- a/flutter_ddd_module/brick.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: flutter_ddd_module -description: A new brick created with the Mason CLI. - -# The following defines the brick repository url. -# Uncomment and update the following line before publishing the brick. -# repository: https://github.com/my_org/my_repo - -# The following defines the version and build number for your brick. -# A version number is three numbers separated by dots, like 1.2.34 -# followed by an optional build number (separated by a +). -version: 0.1.0+1 - -# The following defines the environment for the current brick. -# It includes the version of mason that the brick requires. -environment: - mason: ^0.1.1 - -# Variables specify dynamic values that your brick depends on. -# Zero or more variables can be specified for a given brick. -# Each variable has: -# * a type (string, number, boolean, enum, array, or list) -# * an optional short description -# * an optional default value -# * an optional list of default values (array only) -# * an optional prompt phrase used when asking for the variable -# * a list of values (enums only) -# * an optional separator (list only) -vars: - name: - type: string - description: Your name - default: Dash - prompt: What is your name? diff --git a/flutter_ddd_module/pubspec.yaml b/flutter_ddd_module/pubspec.yaml deleted file mode 100644 index 54cd675..0000000 --- a/flutter_ddd_module/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: -description: feature module -version: 0.0.1 -publish_to: 'none' - -environment: - sdk: '>=3.0.0 <4.0.0' - flutter: ">=3.10.0" - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^5.0.0 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index 4d590dc..705ebe1 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -10,10 +10,12 @@ class Assets { static const String iconsEdit = 'assets/icons/edit.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; + static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsSetting = 'assets/icons/setting.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; - static const String iconsUser = 'assets/icons/user.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; static const String vecAddSvg = 'assets/vec/add.svg.vec'; @@ -24,7 +26,11 @@ class Assets { static const String vecEditSvg = 'assets/vec/edit.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; + static const String vecMapSvg = 'assets/vec/map.svg.vec'; + static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; } diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 72990be..be75d72 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -1,3 +1,8 @@ -library ; +library; + +export 'package:get/get.dart'; +export 'package:rasadyar_core/presentation/common/common.dart'; +export 'package:rasadyar_core/presentation/utils/utils.dart'; +export 'package:rasadyar_core/presentation/widget/widget.dart'; + -export 'package:get/get.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart new file mode 100644 index 0000000..6505e83 --- /dev/null +++ b/packages/core/lib/presentation/common/app_color.dart @@ -0,0 +1,368 @@ +import 'package:flutter/material.dart'; + +class AppColor { + AppColor._(); + + //region --- Blue Colors --- + static const Color blueLight = Color( + 0xFFeaefff, + ); // #eaefff rgb(234, 239, 255) + static const Color blueLightHover = Color( + 0xFFe0e7ff, + ); // #e0e7ff rgb(224, 231, 255) + static const Color blueLightActive = Color( + 0xFFbecdff, + ); // #becdff rgb(190, 205, 255) + static const Color blueNormal = Color(0xFF2d5fff); // #2d5fff rgb(45, 95, 255) + static const Color blueNormalHover = Color( + 0xFF2956e6, + ); // #2956e6 rgb(41, 86, 230) + static const Color blueNormalActive = Color( + 0xFF244ccc, + ); // #244ccc rgb(36, 76, 204) + static const Color blueDark = Color(0xFF2247bf); // #2247bf rgb(34, 71, 191) + static const Color blueDarkHover = Color( + 0xFF1b3999, + ); // #1b3999 rgb(27, 57, 153) + static const Color blueDarkActive = Color( + 0xFF142b73, + ); // #142b73 rgb(20, 43, 115) + static const Color blueDarker = Color(0xFF102159); // #102159 rgb(16, 33, 89) + //endregion + + //region --- Green Colors --- + static const Color greenLight = Color( + 0xFFe6faf5, + ); // #e6faf5 rgb(230, 250, 245) + static const Color greenLightHover = Color( + 0xFFd9f7f0, + ); // #d9f7f0 rgb(217, 247, 240) + static const Color greenLightActive = Color( + 0xFFb0efdf, + ); // #b0efdf rgb(176, 239, 223) + static const Color greenNormal = Color( + 0xFF00cc99, + ); // #00cc99 rgb(0, 204, 153) + static const Color greenNormalHover = Color( + 0xFF00b88a, + ); // #00b88a rgb(0, 184, 138) + static const Color greenNormalActive = Color( + 0xFF00a37a, + ); // #00a37a rgb(0, 163, 122) + static const Color greenDark = Color(0xFF009973); // #009973 rgb(0, 153, 115) + static const Color greenDarkHover = Color( + 0xFF007a5c, + ); // #007a5c rgb(0, 122, 92) + static const Color greenDarkActive = Color( + 0xFF005c45, + ); // #005c45 rgb(0, 92, 69) + static const Color greenDarker = Color(0xFF004736); // #004736 rgb(0, 71, 54) + //endregion + + //region --- Black Colors --- + static const Color blackLight = Color( + 0xFFe6e6e6, + ); // #e6e6e6 rgb(230, 230, 230) + static const Color blackLightHover = Color( + 0xFFd9d9d9, + ); // #d9d9d9 rgb(217, 217, 217) + static const Color blackLightActive = Color( + 0xFFb0b0b0, + ); // #b0b0b0 rgb(176, 176, 176) + static const Color blackNormal = Color(0xFF000000); // #000000 rgb(0, 0, 0) + static const Color blackNormalHover = Color( + 0xFF000000, + ); // #000000 rgb(0, 0, 0) + static const Color blackNormalActive = Color( + 0xFF000000, + ); // #000000 rgb(0, 0, 0) + static const Color blackDark = Color(0xFF000000); // #000000 rgb(0, 0, 0) + static const Color blackDarkHover = Color(0xFF000000); // #000000 rgb(0, 0, 0) + static const Color blackDarkActive = Color( + 0xFF000000, + ); // #000000 rgb(0, 0, 0) + static const Color blackDarker = Color(0xFF000000); // #000000 rgb(0, 0, 0) + //endregion + + //region ---Dark Grey Colors --- + static const Color darkGreyLight = Color( + 0xFFeaeaea, + ); // #eaeaea rgb(234, 234, 234) + static const Color darkGreyLightHover = Color( + 0xFFdfdfdf, + ); // #dfdfdf rgb(223, 223, 223) + static const Color darkGreyLightActive = Color( + 0xFFbdbdbd, + ); // #bdbdbd rgb(189, 189, 189) + static const Color darkGreyNormal = Color( + 0xFF2a2a2a, + ); // #2a2a2a rgb(42, 42, 42) + static const Color darkGreyNormalHover = Color( + 0xFF262626, + ); // #262626 rgb(38, 38, 38) + static const Color darkGreyNormalActive = Color( + 0xFF222222, + ); // #222222 rgb(34, 34, 34) + static const Color darkGreyDark = Color( + 0xFF202020, + ); // #202020 rgb(32, 32, 32) + static const Color darkGreyDarkHover = Color( + 0xFF191919, + ); // #191919 rgb(25, 25, 25) + static const Color darkGreyDarkActive = Color( + 0xFF131313, + ); // #131313 rgb(19, 19, 19) + static const Color darkGreyDarker = Color( + 0xFF0f0f0f, + ); // #0f0f0f rgb(15, 15, 15) + //endregion + + //region ---Medium Grey Colors --- + static const Color mediumGreyLight = Color( + 0xFFf4f4f4, + ); // #f4f4f4 rgb(244, 244, 244) + static const Color mediumGreyLightHover = Color( + 0xFFeeeeee, + ); // #eeeeee rgb(238, 238, 238) + static const Color mediumGreyLightActive = Color( + 0xFFdcdcdc, + ); // #dcdcdc rgb(220, 220, 220) + static const Color mediumGreyNormal = Color( + 0xFF8f8f8f, + ); // #8f8f8f rgb(143, 143, 143) + static const Color mediumGreyNormalHover = Color( + 0xFF818181, + ); // #818181 rgb(129, 129, 129) + static const Color mediumGreyNormalActive = Color( + 0xFF727272, + ); // #727272 rgb(114, 114, 114) + static const Color mediumGreyDark = Color( + 0xFF6b6b6b, + ); // #6b6b6b rgb(107, 107, 107) + static const Color mediumGreyDarkHover = Color( + 0xFF565656, + ); // #565656 rgb(86, 86, 86) + static const Color mediumGreyDarkActive = Color( + 0xFF404040, + ); // #404040 rgb(64, 64, 64) + static const Color mediumGreyDarker = Color( + 0xFF323232, + ); // #323232 rgb(50, 50, 50) + //endregion + + //region ---Light Grey Colors --- + static const Color lightGreyLight = Color( + 0xFFfdfdfd, + ); // #fdfdfd rgb(253, 253, 253) + static const Color lightGreyLightHover = Color( + 0xFFfcfcfc, + ); // #fcfcfc rgb(252, 252, 252) + static const Color lightGreyLightActive = Color( + 0xFFfafafa, + ); // #fafafa rgb(250, 250, 250) + static const Color lightGreyNormal = Color( + 0xFFeeeeee, + ); // #eeeeee rgb(238, 238, 238) + static const Color lightGreyNormalHover = Color( + 0xFFd6d6d6, + ); // #d6d6d6 rgb(214, 214, 214) + static const Color lightGreyNormalActive = Color( + 0xFFbebebe, + ); // #bebebe rgb(190, 190, 190) + static const Color lightGreyDark = Color( + 0xFFb3b3b3, + ); // #b3b3b3 rgb(179, 179, 179) + static const Color lightGreyDarkHover = Color( + 0xFF8f8f8f, + ); // #8f8f8f rgb(143, 143, 143) + static const Color lightGreyDarkActive = Color( + 0xFF6b6b6b, + ); // #6b6b6b rgb(107, 107, 107) + static const Color lightGreyDarker = Color( + 0xFF535353, + ); // #535353 rgb(83, 83, 83) + //endregion + + //region ---WhiteGrey Colors --- + static const Color whiteGreyLight = Color( + 0xFFfefefe, + ); // #fefefe rgb(254, 254, 254) + static const Color whiteGreyLightHover = Color( + 0xFFfefefe, + ); // #fefefe rgb(254, 254, 254) + static const Color whiteGreyLightActive = Color( + 0xFFfdfdfd, + ); // #fdfdfd rgb(253, 253, 253) + static const Color whiteGreyNormal = Color( + 0xFFf9f9f9, + ); // #f9f9f9 rgb(249, 249, 249) + static const Color whiteGreyNormalHover = Color( + 0xFFe0e0e0, + ); // #e0e0e0 rgb(224, 224, 224) + static const Color whiteGreyNormalActive = Color( + 0xFFc7c7c7, + ); // #c7c7c7 rgb(199, 199, 199) + static const Color whiteGreyDark = Color( + 0xFFbbbbbb, + ); // #bbbbbb rgb(187, 187, 187) + static const Color whiteGreyDarkHover = Color( + 0xFF959595, + ); // #959595 rgb(149, 149, 149) + static const Color whiteGreyDarkActive = Color( + 0xFF707070, + ); // #707070 rgb(112, 112, 112) + static const Color whiteGreyDarker = Color( + 0xFF575757, + ); // #575757 rgb(87, 87, 87) + //endregion + + //region ---White Colors --- + static const Color whiteLight = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteLightHover = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteLightActive = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteNormal = Color( + 0xFFffffff, + ); // #ffffff rgb(255, 255, 255) + static const Color whiteNormalHover = Color( + 0xFFe6e6e6, + ); // #e6e6e6 rgb(230, 230, 230) + static const Color whiteNormalActive = Color( + 0xFFcccccc, + ); // #cccccc rgb(204, 204, 204) + static const Color whiteDark = Color( + 0xFFbfbfbf, + ); // #bfbfbf rgb(191, 191, 191) + static const Color whiteDarkHover = Color( + 0xFF999999, + ); // #999999 rgb(153, 153, 153) + static const Color whiteDarkActive = Color( + 0xFF737373, + ); // #737373 rgb(115, 115, 115) + static const Color whiteDarker = Color(0xFF595959); // #595959 rgb(89, 89, 89) + //endregion + + //region --- green1 Colors --- + static const Color green1Light = Color( + 0xFFe6f6f4, + ); // #e6f6f4 rgb(230, 246, 244) + static const Color green1LightHover = Color( + 0xFFd9f2ef, + ); // #d9f2ef rgb(217, 242, 239) + static const Color green1LightActive = Color( + 0xFFb0e4dd, + ); // #b0e4dd rgb(176, 228, 221) + static const Color green1Normal = Color( + 0xFF00a991, + ); // #00a991 rgb(0, 169, 145) + static const Color green1NormalHover = Color( + 0xFF009883, + ); // #009883 rgb(0, 152, 131) + static const Color green1NormalActive = Color( + 0xFF008774, + ); // #008774 rgb(0, 135, 116) + static const Color green1Dark = Color(0xFF007f6d); // #007f6d rgb(0, 127, 109) + static const Color green1DarkHover = Color( + 0xFF006557, + ); // #006557 rgb(0, 101, 87) + static const Color green1DarkActive = Color( + 0xFF004c41, + ); // #004c41 rgb(0, 76, 65) + static const Color green1Darker = Color(0xFF003b33); // #003b33 rgb(0, 59, 51) + //endregion + + //region --- Yellow Colors --- + static const Color yellowLight = Color( + 0xFFfff9e6, + ); // #fff9e6 rgb(255, 249, 230) + static const Color yellowLightHover = Color( + 0xFFfff6da, + ); // #fff6da rgb(255, 246, 218) + static const Color yellowLightActive = Color( + 0xFFffecb2, + ); // #ffecb2 rgb(255, 236, 178) + static const Color yellowNormal = Color( + 0xFFffc107, + ); // #ffc107 rgb(255, 193, 7) + static const Color yellowNormalHover = Color( + 0xFFe6ae06, + ); // #e6ae06 rgb(230, 174, 6) + static const Color yellowNormalActive = Color( + 0xFFcc9a06, + ); // #cc9a06 rgb(204, 154, 6) + static const Color yellowDark = Color(0xFFbf9105); // #bf9105 rgb(191, 145, 5) + static const Color yellowDarkHover = Color( + 0xFF997404, + ); // #997404 rgb(153, 116, 4) + static const Color yellowDarkActive = Color( + 0xFF735703, + ); // #735703 rgb(115, 87, 3) + static const Color yellowDarker = Color(0xFF594402); // #594402 rgb(89, 68, 2) + //endregion + + //region --- red Colors --- + static const Color redLight = Color(0xFFfdeeee); // #fdeeee rgb(253, 238, 238) + static const Color redLightHover = Color( + 0xFFfce6e6, + ); // #fce6e6 rgb(252, 230, 230) + static const Color redLightActive = Color( + 0xFFf9cbcb, + ); // #f9cbcb rgb(249, 203, 203) + static const Color redNormal = Color(0xFFeb5757); // #eb5757 rgb(235, 87, 87) + static const Color redNormalHover = Color( + 0xFFd44e4e, + ); // #d44e4e rgb(212, 78, 78) + static const Color redNormalActive = Color( + 0xFFbc4646, + ); // #bc4646 rgb(188, 70, 70) + static const Color redDark = Color(0xFFb04141); // #b04141 rgb(176, 65, 65) + static const Color redDarkHover = Color( + 0xFF8d3434, + ); // #8d3434 rgb(141, 52, 52) + static const Color redDarkActive = Color( + 0xFF6a2727, + ); // #6a2727 rgb(106, 39, 39) + static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30) + //endregion + + //region --- Teal Colors --- + static const Color tealLight = Color( + 0xFFe8f6f8, + ); // #e8f6f8 rgb(232, 246, 248) + static const Color tealLightHover = Color( + 0xFFdcf1f4, + ); // #dcf1f4 rgb(220, 241, 244) + static const Color tealLightActive = Color( + 0xFFb7e2e9, + ); // #b7e2e9 rgb(183, 226, 233) + static const Color tealNormal = Color( + 0xFF17a2b8, + ); // #17a2b8 rgb(23, 162, 184) + static const Color tealNormalHover = Color( + 0xFF1592a6, + ); // #1592a6 rgb(21, 146, 166) + static const Color tealNormalActive = Color( + 0xFF128293, + ); // #128293 rgb(18, 130, 147) + static const Color tealDark = Color(0xFF117a8a); // #117a8a rgb(17, 122, 138) + static const Color tealDarkHover = Color( + 0xFF0e616e, + ); // #0e616e rgb(14, 97, 110) + static const Color tealDarkActive = Color( + 0xFF0a4953, + ); // #0a4953 rgb(10, 73, 83) + static const Color tealDarker = Color(0xFF083940); // #083940 rgb(8, 57, 64) + //endregion + + //region --- category Colors --- + static const Color confirm = greenNormalActive; + static const Color warning =yellowNormal; + static const Color error =redNormal; + static const Color info = tealNormal; + //endregion +} diff --git a/packages/core/lib/presentation/common/app_fonts.dart b/packages/core/lib/presentation/common/app_fonts.dart new file mode 100644 index 0000000..65be3b0 --- /dev/null +++ b/packages/core/lib/presentation/common/app_fonts.dart @@ -0,0 +1,169 @@ +import 'package:flutter/material.dart'; + +class AppFonts { + AppFonts._(); // Private constructor to prevent instantiation + + // --- Font Families --- + static const String yekan = 'yekan'; + + // --- Font Weights --- + static const FontWeight regular = FontWeight.w400; + static const FontWeight bold = FontWeight.w600; + static const double _height = 1.20; + + static const TextStyle yekan61 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 61, + height: _height, + ); + + static const TextStyle yekan49 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 48, + height: _height, + ); + + static const TextStyle yekan39 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 39, + height: _height, + ); + + static const TextStyle yekan31 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 31, + height: _height, + ); + + static const TextStyle yekan25 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 25, + height: _height, + ); + + static const TextStyle yekan24 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 24, + height: _height, + ); + + static const TextStyle yekan20 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 20, + height: _height, + ); + + static const TextStyle yekan18 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 18, + height: _height, + ); + + static const TextStyle yekan16 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 16, + height: _height, + ); + + static const TextStyle yekan14 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 13, + height: _height, + ); + + static const TextStyle yekan13 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 13, + height: _height, + ); + + static const TextStyle yekan10 = TextStyle( + // Rounded from 10.24 + fontFamily: yekan, + fontWeight: regular, + fontSize: 10, + height: _height, + ); + + static const TextStyle yekan61Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 61, + height: _height, + ); + + static const TextStyle yekan49Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 48, + height: _height, + ); + + static const TextStyle yekan39Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 39, + height: _height, + ); + + static const TextStyle yekan31Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 31, + height: _height, + ); + + static const TextStyle yekan25Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 25, + height: _height, + ); + + static const TextStyle yekan24Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 24, + height: _height, + ); + + static const TextStyle yekan20Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 20, + height: _height, + ); + + static const TextStyle yekan16Bold = TextStyle( + // Base size bold + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 16, + height: _height, + ); + + static const TextStyle yekan13Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 13, + height: _height, + ); + + static const TextStyle yekan10Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 10, + height: _height, + ); +} diff --git a/packages/core/lib/presentation/common/assets.dart b/packages/core/lib/presentation/common/assets.dart new file mode 100644 index 0000000..705ebe1 --- /dev/null +++ b/packages/core/lib/presentation/common/assets.dart @@ -0,0 +1,36 @@ +///This file is automatically generated. DO NOT EDIT, all your changes would be lost. +class Assets { + Assets._(); + + static const String iconsAdd = 'assets/icons/add.svg'; + static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; + static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsCall = 'assets/icons/call.svg'; + static const String iconsDownload = 'assets/icons/download.svg'; + static const String iconsEdit = 'assets/icons/edit.svg'; + static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsMap = 'assets/icons/map.svg'; + static const String iconsMapMarker = 'assets/icons/map_marker.svg'; + static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; + static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsSetting = 'assets/icons/setting.svg'; + static const String iconsTrash = 'assets/icons/trash.svg'; + static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; + static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; + static const String vecAddSvg = 'assets/vec/add.svg.vec'; + static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; + static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecCallSvg = 'assets/vec/call.svg.vec'; + static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; + static const String vecEditSvg = 'assets/vec/edit.svg.vec'; + static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; + static const String vecMapSvg = 'assets/vec/map.svg.vec'; + static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; + static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; + +} diff --git a/packages/core/lib/presentation/common/common.dart b/packages/core/lib/presentation/common/common.dart new file mode 100644 index 0000000..c3e9fa3 --- /dev/null +++ b/packages/core/lib/presentation/common/common.dart @@ -0,0 +1,3 @@ +export 'app_color.dart'; +export 'app_fonts.dart'; +export 'assets.dart'; diff --git a/packages/core/lib/presentation/utils/color_utils.dart b/packages/core/lib/presentation/utils/color_utils.dart new file mode 100644 index 0000000..46f9bb8 --- /dev/null +++ b/packages/core/lib/presentation/utils/color_utils.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +extension ColorUtils on Color { + Color _darken([double amount = 0.1]) { + assert(amount >= 0 && amount <= 1, 'مقدار تیرگی باید بین 0 و 1 باشد'); + final hslColor = HSLColor.fromColor(this); + final newLightness = (hslColor.lightness - amount).clamp(0.0, 1.0); + final hslDarkerColor = hslColor.withLightness(newLightness); + return hslDarkerColor.toColor(); + } + + get disabledColor{ + return withAlpha(38); + } + + get hoverColor{ + return _darken(0.5); + } + + get pressedColor{ + return _darken(0.10); + } + +} diff --git a/packages/core/lib/presentation/utils/utils.dart b/packages/core/lib/presentation/utils/utils.dart new file mode 100644 index 0000000..7eb0ee4 --- /dev/null +++ b/packages/core/lib/presentation/utils/utils.dart @@ -0,0 +1 @@ +import 'color_utils.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart b/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart new file mode 100644 index 0000000..07f98f4 --- /dev/null +++ b/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class BottomNavigation1 extends StatefulWidget { + const BottomNavigation1({super.key, required this.items}); + + final List items; + + @override + State createState() => _BottomNavigation1State(); +} + +class _BottomNavigation1State extends State { + @override + Widget build(BuildContext context) { + return Container( + height: 90, + padding: EdgeInsets.fromLTRB(50, 10, 50, 10), + decoration: BoxDecoration( + color: AppColor.blueNormal, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(50), + topRight: Radius.circular(50), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: widget.items, + ), + ); + } +} + +class BottomNavigation1Item extends StatelessWidget { + final String icon; + final String label; + final bool isSelected; + final Function() onTap; + + const BottomNavigation1Item({ + super.key, + required this.icon, + required this.label, + required this.isSelected, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: 80, + height: 80, + padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + color: isSelected ? Colors.white.withAlpha(208) : Colors.transparent, + borderRadius: BorderRadius.circular(10), + ), + child: InkWell( + onTap: onTap, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + vecWidget( + icon, + width: 32, + height: 32, + color: isSelected ? AppColor.blueNormal : Colors.white, + ), + const SizedBox(height: 5), + Text( + label, + style: AppFonts.yekan14.copyWith( + color: isSelected ? AppColor.blueNormal : Colors.white, + ), + ), + ], + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/buttons/elevated.dart b/packages/core/lib/presentation/widget/buttons/elevated.dart new file mode 100644 index 0000000..1aa97d9 --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/elevated.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +class RElevated extends StatefulWidget { + RElevated({ + super.key, + required this.text, + required this.onPressed, + foregroundColor, + backgroundColor, + disabledBackgroundColor, + disabledForegroundColor, + radius, + textStyle, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + Color? disabledForegroundColor; + Color? disabledBackgroundColor; + double? radius; + TextStyle? textStyle; + + @override + State createState() => _RElevatedState(); +} + +class _RElevatedState extends State { + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: widget.onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: widget.backgroundColor ?? AppColor.blueNormal, + foregroundColor: widget.foregroundColor ?? Colors.white, + disabledBackgroundColor: + widget.disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38), + disabledForegroundColor: widget.disabledForegroundColor ?? Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + fixedSize: Size(widget.width, widget.height), + padding: EdgeInsets.zero, + textStyle: widget.textStyle ?? AppFonts.yekan24, + ), + child: Text(widget.text), + ); + } +} diff --git a/packages/core/lib/presentation/widget/buttons/fab.dart b/packages/core/lib/presentation/widget/buttons/fab.dart new file mode 100644 index 0000000..c7c768e --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/fab.dart @@ -0,0 +1,232 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/assets.dart'; +import 'package:rasadyar_core/presentation/utils/color_utils.dart'; +import 'package:rasadyar_core/presentation/widget/vec_widget.dart'; + +class RFab extends StatefulWidget { + + + final VoidCallback? onPressed; + Color? foregroundColor; + Color? backgroundColor; + Color? disabledForegroundColor; + Color? disabledBackgroundColor; + double? radius; + ShapeBorder? shapeBorder; + Widget? icon; + + @override + State createState() => _RFabState(); + + //region Add + RFab.smallAdd({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecAddSvg), + backgroundColor: AppColor.greenNormal, + key: key, + ); + + RFab.add({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecAddSvg), + backgroundColor: AppColor.greenNormal, + key: key, + ); + + //endregion + + //region Edit + RFab.smallEdit({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecEditSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.edit({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecEditSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region delete + RFab.smallDelete({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecTrashSvg), + backgroundColor: AppColor.redNormal, + key: key, + ); + + RFab.delete({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecTrashSvg), + backgroundColor: AppColor.redNormal, + key: key, + ); + + //endregion + + //region action + RFab.smallAction({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecScanSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.action({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecScanSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region filter + RFab.smallFilter({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecFilterSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.filter({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecFilterSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region download + RFab.smallDownload({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.download({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region Excel + RFab.smallExcel({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.greenDark, + key: key, + ); + + RFab.excel({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecDownloadSvg), + backgroundColor: AppColor.greenDark, + key: key, + ); + + //endregion + + //region Back + RFab.smallBack({required VoidCallback? onPressed, Key? key}) + : this.small( + onPressed: onPressed, + icon: vecWidget(Assets.vecArrowLeftSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + RFab.back({required VoidCallback? onPressed, Key? key}) + : this( + onPressed: onPressed, + icon: vecWidget(Assets.vecArrowLeftSvg), + backgroundColor: AppColor.blueNormal, + key: key, + ); + + //endregion + + //region General + RFab.small({ + required this.onPressed, + required this.icon, + required this.backgroundColor, + super.key, + }) : radius = 40.0, + foregroundColor = Colors.white; + + RFab({ + required this.onPressed, + required this.icon, + required this.backgroundColor, + super.key, + }) : radius = 56.0, + foregroundColor = Colors.white; + + //endregion +} + +class _RFabState extends State { + @override + Widget build(BuildContext context) { + return ElevatedButton( + onPressed: widget.onPressed, + style: ButtonStyle( + side: WidgetStateProperty.all(BorderSide.none), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return widget.backgroundColor?.pressedColor ?? + AppColor.blueNormalActive; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.hoverColor ?? + AppColor.blueNormalHover; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor?.disabledColor ?? + AppColor.blueNormal.disabledColor; + } + return widget.backgroundColor ?? AppColor.blueNormal; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return widget.foregroundColor?.disabledColor; + } + return widget.foregroundColor; + }), + + shape: WidgetStatePropertyAll( + CircleBorder(side: BorderSide(width: 1, color: Colors.transparent)), + ), + fixedSize: WidgetStatePropertyAll( + Size(widget.radius ?? 56, widget.radius ?? 56), + ), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + ), + child: widget.icon, + ); + } +} diff --git a/packages/core/lib/presentation/widget/buttons/fab_outlined.dart b/packages/core/lib/presentation/widget/buttons/fab_outlined.dart new file mode 100644 index 0000000..fc9f209 --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/fab_outlined.dart @@ -0,0 +1,605 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/assets.dart'; +import 'package:rasadyar_core/presentation/utils/color_utils.dart'; +import 'package:rasadyar_core/presentation/widget/vec_widget.dart'; + +class RFabOutlined extends StatefulWidget { + final Widget icon; + VoidCallback? onPressed; + final Color backgroundColor; + final Color? borderColor; + final double? radius; + OutlinedBorder? shapeBorder; + + @override + State createState() => _RFabOutlinedState(); + + //region General + RFabOutlined({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + required this.borderColor, + this.radius = 56.0, + super.key, + }) : shapeBorder = CircleBorder( + side: BorderSide(color: borderColor ?? Colors.transparent), + ); + + RFabOutlined.noBorder({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + super.key, + }) : borderColor = Colors.transparent, + radius = 56.0, + shapeBorder = CircleBorder( + side: BorderSide(color: Colors.transparent, width: 1), + ); + + RFabOutlined.small({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + required this.borderColor, + super.key, + }) : radius = 40.0, + shapeBorder = CircleBorder( + side: BorderSide(color: borderColor ?? Colors.transparent, width: 1), + ); + + RFabOutlined.smallNoBorder({ + required this.icon, + required this.onPressed, + required this.backgroundColor, + super.key, + }) : borderColor = Colors.transparent, + radius = 40.0, + shapeBorder = CircleBorder( + side: BorderSide(color: Colors.transparent, width: 1), + ); + + //endregion + + //region Add + RFabOutlined.smallAdd({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + borderColor: AppColor.greenNormal, + icon: vecWidget2( + Assets.vecAddSvg, + + color: AppColor.greenNormal, + ), + ); + + RFabOutlined.smallAddNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + icon: vecWidget( + Assets.vecAddSvg, + color: + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + ), + ); + + RFabOutlined.add({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + borderColor: AppColor.greenNormal, + icon: vecWidget( + Assets.vecAddSvg, + color: + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + ), + ); + + RFabOutlined.addNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenNormal, + icon: vecWidget( + Assets.vecAddSvg, + color: + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + ), + ); + + //endregion + + //region Edit + RFabOutlined.smallEdit({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallEditNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.edit({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.editNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecEditSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion + + //region Delete + RFabOutlined.smallDelete({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + borderColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + RFabOutlined.smallDeleteNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + RFabOutlined.delete({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + borderColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + RFabOutlined.deleteNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.redNormal, + icon: vecWidget( + Assets.vecTrashSvg, + color: + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + ), + ); + + //endregion + + //region Action + RFabOutlined.smallAction({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallActionNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.action({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.actionNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecScanSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion + + //region Filter + RFabOutlined.smallFilter({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallFilterNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.filter({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.filterNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecFilterSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion + + //region Download + RFabOutlined.smallDownload({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.smallDownloadNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.download({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.downloadNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + //endregion + + //region Excel + RFabOutlined.smallExcel({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + borderColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.smallExcelNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.excel({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + borderColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + RFabOutlined.excelNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.greenDark, + icon: vecWidget( + Assets.vecDownloadSvg, + color: + onPressed != null + ? AppColor.greenDark + : AppColor.greenDark.disabledColor, + ), + ); + + //endregion + + //region Back + RFabOutlined.smallBack({VoidCallback? onPressed, Key? key}) + : this.small( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.smallBackNoBorder({VoidCallback? onPressed, Key? key}) + : this.smallNoBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.back({VoidCallback? onPressed, Key? key}) + : this( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + borderColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + RFabOutlined.backNoBorder({VoidCallback? onPressed, Key? key}) + : this.noBorder( + key: key, + onPressed: onPressed, + backgroundColor: AppColor.blueNormal, + icon: vecWidget( + Assets.vecArrowLeftSvg, + color: + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + ), + ); + + //endregion +} + +class _RFabOutlinedState extends State { + bool isOnPressed =false; + @override + Widget build(BuildContext context) { + return OutlinedButton( + onPressed:widget.onPressed , + style: ButtonStyle( + side: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return BorderSide( + color: + widget.borderColor?.disabledColor ?? + AppColor.blueNormal.disabledColor, + width: 2, + ); + } + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return widget.backgroundColor; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor.hoverColor ?? + AppColor.blueNormal.hoverColor; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor.disabledColor ?? + AppColor.blueNormal.disabledColor; + } + return Colors.transparent; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor.disabledColor ?? + AppColor.blueNormal.disabledColor; + } + return widget.backgroundColor; + }), + + shape: WidgetStatePropertyAll(widget.shapeBorder), + fixedSize: WidgetStatePropertyAll( + Size(widget.radius ?? 56, widget.radius ?? 56), + ), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + ), + child: widget.icon + ); + } +} + diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart new file mode 100644 index 0000000..a4b2806 --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; +import 'package:rasadyar_core/presentation/utils/color_utils.dart'; + +class ROutlinedElevated extends StatefulWidget { + ROutlinedElevated({ + super.key, + required this.text, + required this.onPressed, + this.foregroundColor, + this.backgroundColor, + this.borderColor, + this.disabledBackgroundColor, + this.pressedBackgroundColor, + this.radius, + this.textStyle, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + + Color? borderColor; + + Color? disabledBackgroundColor; + Color? pressedBackgroundColor; + double? radius; + TextStyle? textStyle; + + @override + State createState() => _ROutlinedElevatedState(); +} + +class _ROutlinedElevatedState extends State { + @override + Widget build(BuildContext context) { + return OutlinedButton( + onPressed: widget.onPressed, + style: ButtonStyle( + side: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + } else if (states.contains(WidgetState.disabled)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), + width: 2, + ); + } + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + if (widget.pressedBackgroundColor != null) { + return widget.pressedBackgroundColor; + } + return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.hoverColor ?? + AppColor.blueNormal.hoverColor; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor?.disabledColor ?? Colors.transparent; + } + return widget.backgroundColor; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return AppColor.blueNormal.withAlpha(38); + } + return AppColor.blueNormal; + }), + + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + ), + fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + textStyle: WidgetStatePropertyAll( + widget.textStyle ?? + AppFonts.yekan24.copyWith(color: AppColor.blueNormal), + ), + ), + child: Text(widget.text), + ); + } +} diff --git a/packages/core/lib/presentation/widget/buttons/text_button.dart b/packages/core/lib/presentation/widget/buttons/text_button.dart new file mode 100644 index 0000000..5c9bbb7 --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/text_button.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +class RTextButton extends StatefulWidget { + RTextButton({ + super.key, + required this.text, + required this.onPressed, + this.foregroundColor, + this.backgroundColor, + this.borderColor, + this.disabledBackgroundColor, + this.radius, + this.textStyle, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + Color? borderColor; + + Color? disabledBackgroundColor; + double? radius; + TextStyle? textStyle; + + @override + State createState() => _RTextButtonState(); +} + +class _RTextButtonState extends State { + @override + Widget build(BuildContext context) { + return TextButton( + style: ButtonStyle( + side: WidgetStatePropertyAll(BorderSide.none), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return widget.backgroundColor ?? AppColor.blueNormal; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.withAlpha(38) ?? AppColor.blueNormal.withAlpha(38); + } else if (states.contains(WidgetState.disabled)) { + return widget.disabledBackgroundColor ?? Colors.transparent; + } + return Colors.transparent; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return AppColor.blueNormal.withAlpha(38); + } + return AppColor.blueNormal; + }), + + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + ), + fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + textStyle: WidgetStatePropertyAll( + widget.textStyle ?? + AppFonts.yekan24.copyWith(color: AppColor.blueNormal), + ), + ), + onPressed:widget.onPressed, + child: Text(widget.text), + ); + } +} diff --git a/packages/core/lib/presentation/widget/captcha/captcha_widget.dart b/packages/core/lib/presentation/widget/captcha/captcha_widget.dart new file mode 100644 index 0000000..fc20c4e --- /dev/null +++ b/packages/core/lib/presentation/widget/captcha/captcha_widget.dart @@ -0,0 +1,266 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +class CaptchaController { + int? captchaCode; + TextEditingController textController = TextEditingController(); + GlobalKey formKey = GlobalKey(); + + late Function() refreshCaptcha; + + bool validate() { + if (formKey.currentState?.validate() == true) { + return true; + } + return false; + } + + String get enteredText => textController.text; + + bool isCorrect() { + return textController.text == captchaCode.toString(); + } + + void clear() { + textController.clear(); + } +} + +class RandomLinePainter extends CustomPainter { + final Random random = Random(); + final Paint linePaint; + final List points; + + RandomLinePainter({ + required this.points, + required Color lineColor, + double strokeWidth = 2.0, + }) : linePaint = + Paint() + ..color = lineColor + ..strokeWidth = strokeWidth + ..strokeCap = StrokeCap.round + ..style = PaintingStyle.stroke; + + @override + void paint(Canvas canvas, Size size) { + final path = Path(); + + if (points.isNotEmpty) { + path.moveTo(points[0].dx, points[0].dy); + + for (int i = 1; i < points.length; i++) { + path.lineTo(points[i].dx, points[i].dy); + } + + canvas.drawPath(path, linePaint); + } + } + + @override + bool shouldRepaint(RandomLinePainter oldDelegate) => true; +} + +class CaptchaWidget extends StatefulWidget { + final CaptchaController controller; + final bool autoValidateMode; + + const CaptchaWidget({ + required this.controller, + this.autoValidateMode = false, + super.key, + }); + + @override + _CaptchaWidgetState createState() => _CaptchaWidgetState(); +} + +class _CaptchaWidgetState extends State { + late List points; + late List points1; + late List points2; + bool isOnError = false; + + @override + void initState() { + super.initState(); + generateLines(); + getRandomSixDigitNumber(); + + // Set the refresh function in the controller + widget.controller.refreshCaptcha = () { + getRandomSixDigitNumber(); + generateLines(); + setState(() {}); + }; + } + + void generateLines() { + points = generateRandomLine(); + points1 = generateRandomLine(); + points2 = generateRandomLine(); + setState(() {}); + } + + List generateRandomLine() { + final random = Random(); + int pointCount = random.nextInt(10) + 5; + List points = []; + + double previousY = 0; + + for (int i = 0; i < pointCount; i++) { + double x = (i / (pointCount - 1)) * 135; + + if (i == 0) { + previousY = 24; + } else { + double change = (random.nextDouble() * 20) - 10; + previousY = max(5, min(43, previousY + change)); + } + + points.add(Offset(x, previousY)); + } + + return points; + } + + void getRandomSixDigitNumber() { + final random = Random(); + widget.controller.captchaCode = random.nextInt(900000) + 100000; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 135, + height: 48, + decoration: BoxDecoration( + color: AppColor.whiteNormalHover, + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(8), + ), + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + CustomPaint( + painter: RandomLinePainter( + points: points, + lineColor: Colors.blue, + strokeWidth: 1.0, + ), + size: const Size(double.infinity, double.infinity), + ), + CustomPaint( + painter: RandomLinePainter( + points: points1, + lineColor: Colors.green, + strokeWidth: 1.0, + ), + size: const Size(double.infinity, double.infinity), + ), + CustomPaint( + painter: RandomLinePainter( + points: points2, + lineColor: Colors.red, + strokeWidth: 1.0, + ), + size: const Size(double.infinity, double.infinity), + ), + Text( + widget.controller.captchaCode.toString(), + style: AppFonts.yekan24, + ), + ], + ), + ), + const SizedBox(height: 20), + IconButton( + padding: EdgeInsets.zero, + onPressed: widget.controller.refreshCaptcha, + icon: Icon(CupertinoIcons.refresh, size: 16), + ), + Expanded( + child: Form( + key: widget.controller.formKey, + autovalidateMode: + widget.autoValidateMode + ? AutovalidateMode.onUserInteraction + : AutovalidateMode.disabled, + child: TextFormField( + controller: widget.controller.textController, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'کد امنیتی', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan10.copyWith( + color: AppColor.redNormal, + fontSize: 8, + ), + suffixIconConstraints: BoxConstraints( + maxHeight: 24, + minHeight: 24, + maxWidth: 24, + minWidth: 24, + ), + + suffix: + widget.controller.textController.text.trim().isNotEmpty + ? clearButton(() { + widget.controller.textController.clear(); + setState(() {}); + }) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + maxLines: 1, + maxLength: 6, + onChanged: (value) { + if (isOnError) { + isOnError = !isOnError; + widget.controller.formKey.currentState?.reset(); + widget.controller.textController.text = value; + } + setState(() {}); + }, + validator: (value) { + if (value == null || value.isEmpty) { + isOnError = true; + return 'کد امنیتی را وارد کنید'; + } + if (value != widget.controller.captchaCode.toString()) { + isOnError = true; + return '⚠️کد امنیتی وارد شده اشتباه است'; + } + return null; + }, + style: AppFonts.yekan13, + ), + ), + ), + ], + ); + } + + Widget clearButton(VoidCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Icon(CupertinoIcons.multiply_circle, size: 18), + ); + } +} diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart new file mode 100644 index 0000000..07edc2b --- /dev/null +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -0,0 +1,216 @@ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +@immutable +class RTextField extends StatefulWidget { + RTextField( + {super.key, + this.maxLines, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.isForNumber = false, + this.style, + this.hintStyle, + this.suffixIcon, + this.prefixIcon, + this.validator, + this.readonly = false, + this.boxConstraints, + this.minLines, + this.radius, + this.filled, + this.enabled, + this.errorStyle, + this.labelStyle, + this.label}) { + filled = filled ?? false; + obscure = false; + _inputBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(radius ?? 16)); + } + + RTextField.noBorder( + {super.key, + this.maxLines, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.style, + this.hintStyle, + this.suffixIcon, + this.radius, + this.validator, + this.boxConstraints, + this.minLines, + this.isForNumber = false, + this.readonly = false, + this.label, + this.filled, + this.errorStyle, + this.labelStyle, + this.enabled}) { + _inputBorder = OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(radius ?? 16)); + obscure = false; + filled = filled ?? true; + } + + RTextField.password( + {super.key, + this.maxLines = 1, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.style, + this.hintStyle, + this.suffixIcon, + this.prefixIcon, + this.radius, + this.validator, + this.boxConstraints, + this.minLines, + this.isForNumber = false, + this.readonly = false, + this.label, + this.filled, + this.errorStyle, + this.labelStyle, + this.enabled}) { + _inputBorder = OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(radius ?? 16)); + filled = filled ?? true; + obscure = true; + _isPassword = true; + prefixIcon = prefixIcon ?? const Icon(CupertinoIcons.person); + } + + final int? maxLines; + final int? minLines; + final int? maxLength; + final String? hintText; + final String? label; + final EdgeInsets? padding; + final TextStyle? style; + final TextStyle? errorStyle; + final TextStyle? hintStyle; + final TextStyle? labelStyle; + final bool showCounter; + final bool? isDense; + final bool? isForNumber; + final bool readonly; + bool? obscure; + final bool? enabled; + final double? radius; + final TextInputType? keyboardType; + final Function(String)? onChanged; + final Function(String)? onSubmitted; + final FormFieldValidator? validator; + final String? initText; + Widget? suffixIcon; + Widget? prefixIcon; + bool? filled; + bool _isPassword = false; + + final BoxConstraints? boxConstraints; + late final InputBorder? _inputBorder; + + @override + State createState() => _RTextFieldState(); +} + +class _RTextFieldState extends State { + final TextEditingController _controller = TextEditingController(); + bool? obscure; + + @override + void initState() { + super.initState(); + if (widget.initText != null) { + _controller.text = widget.initText!; + } + obscure = widget.obscure; + } + + @override + void didUpdateWidget(covariant RTextField oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.initText != oldWidget.initText) { + _controller.text = widget.initText ?? ''; + } + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 6.0), + child: TextFormField( + controller: _controller, + readOnly: widget.readonly, + minLines: widget.minLines, + maxLines: widget.maxLines, + onChanged: widget.onChanged, + validator: widget.validator, + enabled: widget.enabled, + obscureText: obscure ?? false, + onTapOutside: (event) { + FocusScope.of(context).unfocus(); + }, + onFieldSubmitted: widget.onSubmitted, + maxLength: widget.maxLength, + textDirection: TextDirection.rtl, + style: widget.style , + keyboardType: widget.keyboardType, + decoration: InputDecoration( + errorStyle: widget.errorStyle, + errorMaxLines: 1, + isDense: widget.isDense, + suffixIcon: widget.suffixIcon ?? + (widget._isPassword + ? IconButton( + onPressed: () { + setState(() { + obscure = !obscure!; + }); + }, + icon: Icon(!obscure! + ? CupertinoIcons.eye_slash + : CupertinoIcons.eye)) + : null), + suffixIconConstraints: widget.boxConstraints, + prefixIcon: widget.prefixIcon, + prefixIconConstraints: widget.boxConstraints, + hintText: widget.hintText, + labelText: widget.label, + labelStyle: widget.labelStyle, + filled: widget.filled, + counter: widget.showCounter ? null : const SizedBox(), + hintStyle: widget.hintStyle, + enabledBorder: widget._inputBorder, + focusedBorder: widget._inputBorder, + border: widget._inputBorder), + )); + } +} \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/pagination/pagination_from_until.dart b/packages/core/lib/presentation/widget/pagination/pagination_from_until.dart new file mode 100644 index 0000000..63c1ac0 --- /dev/null +++ b/packages/core/lib/presentation/widget/pagination/pagination_from_until.dart @@ -0,0 +1,255 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +class PaginationFromUntil extends StatefulWidget { + const PaginationFromUntil({super.key}); + + @override + State createState() => _PaginationFromUntilState(); +} + +class _PaginationFromUntilState extends State { + int current = 1; + int total = 10; + + @override + Widget build(BuildContext context) { + return Container( + width: 164, + height: 47, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color(0xFFEAEFFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)), + ), + child: Row( + children: [ + FloatingActionButton.small( + onPressed: () { + if(current>1){ + setState(() { + current--; + }); + } + + }, + shape: CircleBorder(), + elevation: 0, + backgroundColor: Colors.white, + child: Icon(CupertinoIcons.arrow_left, color: AppColor.blueNormal), + ), + Expanded( + child: Text( + '$current از $total', + textAlign: TextAlign.center, + textDirection: TextDirection.rtl, + style: AppFonts.yekan16.copyWith( + color: AppColor.blueNormal, + ), + ), + ), + FloatingActionButton.small( + + onPressed:() { + if (current < total) { + setState(() { + current++; + }); + } + }, + shape: CircleBorder(), + elevation: 0, + backgroundColor: AppColor.blueNormal, + child: Icon(CupertinoIcons.arrow_right, color: Colors.white), + ), + ], + ), + ); + } + + Stack buildStack() { + return Stack( + children: [ + Positioned( + left: 4, + top: 4, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 40, + top: 40, + child: Container( + transform: + Matrix4.identity() + ..translate(0.0, 0.0) + ..rotateZ(-3.14), + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: + Colors.white /* Secondary */, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: + Colors + .white /* Secondary */, + ), + borderRadius: + BorderRadius.circular(50), + ), + ), + child: Stack(), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + Positioned( + left: 8, + top: 8, + child: Container(width: 24, height: 24, child: Stack()), + ), + ], + ), + ), + ), + Positioned( + left: 120, + top: 3, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 40, + top: 40, + child: Container( + transform: + Matrix4.identity() + ..translate(0.0, 0.0) + ..rotateZ(-3.14), + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + child: Stack( + children: [ + Positioned( + left: 0, + top: 0, + child: Container( + width: 40, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: const Color( + 0xFF2D5FFF, + ) /* Primary */, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: const Color( + 0xFF2D5FFF, + ) /* Primary */, + ), + borderRadius: + BorderRadius.circular(50), + ), + ), + child: Stack(), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + Positioned( + left: 8, + top: 8, + child: Container(width: 24, height: 24, child: Stack()), + ), + ], + ), + ), + ), + Positioned( + left: 63, + top: 9, + child: Text( + '1 از 17', + style: TextStyle( + color: const Color(0xFF2D5FFF) /* Primary */, + fontSize: 16, + fontFamily: 'IRANYekanFN', + fontWeight: FontWeight.w400, + height: 1.75, + ), + ), + ), + ], + ); + } +} diff --git a/packages/core/lib/presentation/widget/pagination/show_more.dart b/packages/core/lib/presentation/widget/pagination/show_more.dart new file mode 100644 index 0000000..757e952 --- /dev/null +++ b/packages/core/lib/presentation/widget/pagination/show_more.dart @@ -0,0 +1,78 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +class RShowMore extends StatefulWidget { + const RShowMore({super.key}); + + @override + State createState() => _RShowMoreState(); +} + +class _RShowMoreState extends State + with SingleTickerProviderStateMixin { + bool _toggled = false; + late final AnimationController _controller; + late final Animation _iconRotation; + + @override + void initState() { + super.initState(); + + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 500), + ); + _iconRotation = Tween( + begin: 0, + end: 0.50, + ) // 90 degrees (quarter turn) + .animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut)); + } + + void _toggle() { + setState(() => _toggled = !_toggled); + _toggled ? _controller.forward() : _controller.reverse(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: _toggle, + behavior: HitTestBehavior.opaque, + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 8, + children: [ + RotationTransition( + turns: _iconRotation, + child: const Icon(CupertinoIcons.chevron_down, size: 12,color:AppColor.blueNormal ,), + ), + + AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + transitionBuilder: + (child, animation) => + FadeTransition(opacity: animation, child: child), + child: Text( + _toggled ? 'کمتر' : 'مشاهده بیشتر', + key: ValueKey(_toggled), + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(height: 50,) + ], + + + + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/tabs/new_tab.dart b/packages/core/lib/presentation/widget/tabs/new_tab.dart new file mode 100644 index 0000000..c6e73c4 --- /dev/null +++ b/packages/core/lib/presentation/widget/tabs/new_tab.dart @@ -0,0 +1,784 @@ +// 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. + +/// @docImport 'switch.dart'; +library; + +import 'dart:collection'; +import 'dart:math' as math; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/rendering.dart'; + +// Minimum padding from edges of the segmented control to edges of +// encompassing widget. +const EdgeInsetsGeometry _kHorizontalItemPadding = EdgeInsets.symmetric( + horizontal: 16.0, +); + +// Minimum height of the segmented control. +const double _kMinSegmentedControlHeight = 28.0; + +// The default color used for the text of the disabled segment. +const Color _kDisableTextColor = Color.fromARGB(115, 122, 122, 122); + +// The duration of the fade animation used to transition when a new widget +// is selected. +const Duration _kFadeDuration = Duration(milliseconds: 165); + +class NewCupertinoSegmentedControl extends StatefulWidget { + /// Creates an iOS-style segmented control bar. + /// + /// The [children] argument must be an ordered [Map] such as a + /// [LinkedHashMap]. Further, the length of the [children] list must be + /// greater than one. + /// + /// Each widget value in the map of [children] must have an associated key + /// that uniquely identifies this widget. This key is what will be returned + /// in the [onValueChanged] callback when a new value from the [children] map + /// is selected. + /// + /// The [groupValue] is the currently selected value for the segmented control. + /// If no [groupValue] is provided, or the [groupValue] is null, no widget will + /// appear as selected. The [groupValue] must be either null or one of the keys + /// in the [children] map. + NewCupertinoSegmentedControl({ + super.key, + required this.children, + required this.onValueChanged, + this.groupValue, + this.unselectedColor, + this.selectedColor, + this.borderColor, + this.pressedColor, + this.disabledColor, + this.disabledTextColor, + this.padding, + this.disabledChildren = const {}, + }) : assert(children.length >= 2), + assert( + groupValue == null || + children.keys.any((T child) => child == groupValue), + 'The groupValue must be either null or one of the keys in the children map.', + ); + + /// The identifying keys and corresponding widget values in the + /// segmented control. + /// + /// The map must have more than one entry. + /// This attribute must be an ordered [Map] such as a [LinkedHashMap]. + final Map children; + + /// The identifier of the widget that is currently selected. + /// + /// This must be one of the keys in the [Map] of [children]. + /// If this attribute is null, no widget will be initially selected. + final T? groupValue; + + /// The callback that is called when a new option is tapped. + /// + /// The segmented control passes the newly selected widget's associated key + /// to the callback but does not actually change state until the parent + /// widget rebuilds the segmented control with the new [groupValue]. + final ValueChanged onValueChanged; + + /// The color used to fill the backgrounds of unselected widgets and as the + /// text color of the selected widget. + /// + /// Defaults to [CupertinoTheme]'s `primaryContrastingColor` if null. + final Color? unselectedColor; + + /// The color used to fill the background of the selected widget and as the text + /// color of unselected widgets. + /// + /// Defaults to [CupertinoTheme]'s `primaryColor` if null. + final Color? selectedColor; + + /// The color used as the border around each widget. + /// + /// Defaults to [CupertinoTheme]'s `primaryColor` if null. + final Color? borderColor; + + /// The color used to fill the background of the widget the user is + /// temporarily interacting with through a long press or drag. + /// + /// Defaults to the selectedColor at 20% opacity if null. + final Color? pressedColor; + + /// The color used to fill the background of the segment when it is disabled. + /// + /// If null, this color will be 50% opacity of the [selectedColor] when + /// the segment is selected. If the segment is unselected, this color will be + /// set to [unselectedColor]. + final Color? disabledColor; + + /// The color used for the text of the segment when it is disabled. + final Color? disabledTextColor; + + /// The CupertinoSegmentedControl will be placed inside this padding. + /// + /// Defaults to EdgeInsets.symmetric(horizontal: 16.0) + final EdgeInsetsGeometry? padding; + + /// The set of identifying keys that correspond to the segments that should be disabled. + /// + /// All segments are enabled by default. + final Set disabledChildren; + + @override + State> createState() => + _SegmentedControlState(); +} + +class _SegmentedControlState + extends State> + with TickerProviderStateMixin> { + T? _pressedKey; + + final List _selectionControllers = + []; + final List _childTweens = []; + + late ColorTween _forwardBackgroundColorTween; + late ColorTween _reverseBackgroundColorTween; + late ColorTween _textColorTween; + + Color? _selectedColor; + Color? _unselectedColor; + Color? _borderColor; + Color? _pressedColor; + Color? _selectedDisabledColor; + Color? _unselectedDisabledColor; + Color? _disabledTextColor; + + AnimationController createAnimationController() { + return AnimationController(duration: _kFadeDuration, vsync: this) + ..addListener(() { + setState(() { + // State of background/text colors has changed + }); + }); + } + + bool _updateColors() { + assert(mounted, 'This should only be called after didUpdateDependencies'); + bool changed = false; + final Color disabledTextColor = + widget.disabledTextColor ?? _kDisableTextColor; + if (_disabledTextColor != disabledTextColor) { + changed = true; + _disabledTextColor = disabledTextColor; + } + final Color selectedColor = + widget.selectedColor ?? CupertinoTheme.of(context).primaryColor; + if (_selectedColor != selectedColor) { + changed = true; + _selectedColor = selectedColor; + } + final Color unselectedColor = + widget.unselectedColor ?? + CupertinoTheme.of(context).primaryContrastingColor; + if (_unselectedColor != unselectedColor) { + changed = true; + _unselectedColor = unselectedColor; + } + final Color selectedDisabledColor = + widget.disabledColor ?? selectedColor.withOpacity(0.5); + final Color unselectedDisabledColor = + widget.disabledColor ?? unselectedColor; + if (_selectedDisabledColor != selectedDisabledColor || + _unselectedDisabledColor != unselectedDisabledColor) { + changed = true; + _selectedDisabledColor = selectedDisabledColor; + _unselectedDisabledColor = unselectedDisabledColor; + } + final Color borderColor = + widget.borderColor ?? CupertinoTheme.of(context).primaryColor; + if (_borderColor != borderColor) { + changed = true; + _borderColor = borderColor; + } + final Color pressedColor = + widget.pressedColor ?? + CupertinoTheme.of(context).primaryColor.withOpacity(0.2); + if (_pressedColor != pressedColor) { + changed = true; + _pressedColor = pressedColor; + } + + _forwardBackgroundColorTween = ColorTween( + begin: _pressedColor, + end: _selectedColor, + ); + _reverseBackgroundColorTween = ColorTween( + begin: _unselectedColor, + end: _selectedColor, + ); + _textColorTween = ColorTween(begin: _selectedColor, end: _unselectedColor); + return changed; + } + + void _updateAnimationControllers() { + assert(mounted, 'This should only be called after didUpdateDependencies'); + for (final AnimationController controller in _selectionControllers) { + controller.dispose(); + } + _selectionControllers.clear(); + _childTweens.clear(); + + for (final T key in widget.children.keys) { + final AnimationController animationController = + createAnimationController(); + if (widget.groupValue == key) { + _childTweens.add(_reverseBackgroundColorTween); + animationController.value = 1.0; + } else { + _childTweens.add(_forwardBackgroundColorTween); + } + _selectionControllers.add(animationController); + } + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + if (_updateColors()) { + _updateAnimationControllers(); + } + } + + @override + void didUpdateWidget(NewCupertinoSegmentedControl oldWidget) { + super.didUpdateWidget(oldWidget); + + if (_updateColors() || + oldWidget.children.length != widget.children.length) { + _updateAnimationControllers(); + } + + if (oldWidget.groupValue != widget.groupValue) { + int index = 0; + for (final T key in widget.children.keys) { + if (widget.groupValue == key) { + _childTweens[index] = _forwardBackgroundColorTween; + _selectionControllers[index].forward(); + } else { + _childTweens[index] = _reverseBackgroundColorTween; + _selectionControllers[index].reverse(); + } + index += 1; + } + } + } + + @override + void dispose() { + for (final AnimationController animationController + in _selectionControllers) { + animationController.dispose(); + } + super.dispose(); + } + + void _onTapDown(T currentKey) { + if (_pressedKey == null && currentKey != widget.groupValue) { + setState(() { + _pressedKey = currentKey; + }); + } + } + + void _onTapCancel() { + setState(() { + _pressedKey = null; + }); + } + + void _onTap(T currentKey) { + if (currentKey != _pressedKey) { + return; + } + if (!widget.disabledChildren.contains(currentKey)) { + if (currentKey != widget.groupValue) { + widget.onValueChanged(currentKey); + } + } + _pressedKey = null; + } + + Color? getTextColor(int index, T currentKey) { + if (widget.disabledChildren.contains(currentKey)) { + return _disabledTextColor; + } + if (_selectionControllers[index].isAnimating) { + return _textColorTween.evaluate(_selectionControllers[index]); + } + if (widget.groupValue == currentKey) { + return _unselectedColor; + } + return _selectedColor; + } + + Color? getBackgroundColor(int index, T currentKey) { + if (widget.disabledChildren.contains(currentKey)) { + return widget.groupValue == currentKey + ? _selectedDisabledColor + : _unselectedDisabledColor; + } + if (_selectionControllers[index].isAnimating) { + return _childTweens[index].evaluate(_selectionControllers[index]); + } + if (widget.groupValue == currentKey) { + return _selectedColor; + } + if (_pressedKey == currentKey) { + return _pressedColor; + } + return _unselectedColor; + } + + @override + Widget build(BuildContext context) { + final List gestureChildren = []; + final List backgroundColors = []; + int index = 0; + int? selectedIndex; + int? pressedIndex; + for (final T currentKey in widget.children.keys) { + selectedIndex = (widget.groupValue == currentKey) ? index : selectedIndex; + pressedIndex = (_pressedKey == currentKey) ? index : pressedIndex; + + final TextStyle textStyle = DefaultTextStyle.of( + context, + ).style.copyWith(color: getTextColor(index, currentKey)); + final IconThemeData iconTheme = IconThemeData( + color: getTextColor(index, currentKey), + ); + + Widget child = Center(child: widget.children[currentKey]); + + child = MouseRegion( + cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTapDown: + widget.disabledChildren.contains(currentKey) + ? null + : (TapDownDetails event) { + _onTapDown(currentKey); + }, + onTapCancel: + widget.disabledChildren.contains(currentKey) + ? null + : _onTapCancel, + onTap: () { + _onTap(currentKey); + }, + child: IconTheme( + data: iconTheme, + child: DefaultTextStyle( + style: textStyle, + child: Semantics( + button: true, + inMutuallyExclusiveGroup: true, + selected: widget.groupValue == currentKey, + child: child, + ), + ), + ), + ), + ); + + backgroundColors.add(getBackgroundColor(index, currentKey)!); + gestureChildren.add(child); + index += 1; + } + + final Widget box = _SegmentedControlRenderWidget( + selectedIndex: selectedIndex, + pressedIndex: pressedIndex, + backgroundColors: backgroundColors, + borderColor: _borderColor!, + children: gestureChildren, + ); + + return Padding( + padding: widget.padding ?? _kHorizontalItemPadding, + child: UnconstrainedBox(constrainedAxis: Axis.horizontal, child: box), + ); + } +} + +class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { + const _SegmentedControlRenderWidget({ + super.key, + super.children, + required this.selectedIndex, + required this.pressedIndex, + required this.backgroundColors, + required this.borderColor, + }); + + final int? selectedIndex; + final int? pressedIndex; + final List backgroundColors; + final Color borderColor; + + @override + RenderObject createRenderObject(BuildContext context) { + return _RenderSegmentedControl( + textDirection: Directionality.of(context), + selectedIndex: selectedIndex, + pressedIndex: pressedIndex, + backgroundColors: backgroundColors, + borderColor: borderColor, + ); + } + + @override + void updateRenderObject( + BuildContext context, + _RenderSegmentedControl renderObject, + ) { + renderObject + ..textDirection = Directionality.of(context) + ..selectedIndex = selectedIndex + ..pressedIndex = pressedIndex + ..backgroundColors = backgroundColors + ..borderColor = borderColor; + } +} + +class _SegmentedControlContainerBoxParentData + extends ContainerBoxParentData { + RRect? surroundingRect; +} + +typedef _NextChild = RenderBox? Function(RenderBox child); + +class _RenderSegmentedControl extends RenderBox + with + ContainerRenderObjectMixin< + RenderBox, + ContainerBoxParentData + >, + RenderBoxContainerDefaultsMixin< + RenderBox, + ContainerBoxParentData + > { + _RenderSegmentedControl({ + required int? selectedIndex, + required int? pressedIndex, + required TextDirection textDirection, + required List backgroundColors, + required Color borderColor, + }) : _textDirection = textDirection, + _selectedIndex = selectedIndex, + _pressedIndex = pressedIndex, + _backgroundColors = backgroundColors, + _borderColor = borderColor; + + int? get selectedIndex => _selectedIndex; + int? _selectedIndex; + + set selectedIndex(int? value) { + if (_selectedIndex == value) { + return; + } + _selectedIndex = value; + markNeedsPaint(); + } + + int? get pressedIndex => _pressedIndex; + int? _pressedIndex; + + set pressedIndex(int? value) { + if (_pressedIndex == value) { + return; + } + _pressedIndex = value; + markNeedsPaint(); + } + + TextDirection get textDirection => _textDirection; + TextDirection _textDirection; + + set textDirection(TextDirection value) { + if (_textDirection == value) { + return; + } + _textDirection = value; + markNeedsLayout(); + } + + List get backgroundColors => _backgroundColors; + List _backgroundColors; + + set backgroundColors(List value) { + if (_backgroundColors == value) { + return; + } + _backgroundColors = value; + markNeedsPaint(); + } + + Color get borderColor => _borderColor; + Color _borderColor; + + set borderColor(Color value) { + if (_borderColor == value) { + return; + } + _borderColor = value; + markNeedsPaint(); + } + + @override + double computeMinIntrinsicWidth(double height) { + RenderBox? child = firstChild; + double minWidth = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childWidth = child.getMinIntrinsicWidth(height); + minWidth = math.max(minWidth, childWidth); + child = childParentData.nextSibling; + } + return minWidth * childCount; + } + + @override + double computeMaxIntrinsicWidth(double height) { + RenderBox? child = firstChild; + double maxWidth = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childWidth = child.getMaxIntrinsicWidth(height); + maxWidth = math.max(maxWidth, childWidth); + child = childParentData.nextSibling; + } + return maxWidth * childCount; + } + + @override + double computeMinIntrinsicHeight(double width) { + RenderBox? child = firstChild; + double minHeight = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childHeight = child.getMinIntrinsicHeight(width); + minHeight = math.max(minHeight, childHeight); + child = childParentData.nextSibling; + } + return minHeight; + } + + @override + double computeMaxIntrinsicHeight(double width) { + RenderBox? child = firstChild; + double maxHeight = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final double childHeight = child.getMaxIntrinsicHeight(width); + maxHeight = math.max(maxHeight, childHeight); + child = childParentData.nextSibling; + } + return maxHeight; + } + + @override + double? computeDistanceToActualBaseline(TextBaseline baseline) { + return defaultComputeDistanceToHighestActualBaseline(baseline); + } + + @override + void setupParentData(RenderBox child) { + if (child.parentData is! _SegmentedControlContainerBoxParentData) { + child.parentData = _SegmentedControlContainerBoxParentData(); + } + } + + void _layoutRects( + _NextChild nextChild, + RenderBox? leftChild, + RenderBox? rightChild, + ) { + RenderBox? child = leftChild; + double start = 0.0; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + final Offset childOffset = Offset(start, 0.0); + childParentData.offset = childOffset; + final Rect childRect = Rect.fromLTWH( + start, + 0.0, + child.size.width, + child.size.height, + ); + final RRect rChildRect; + if (child == leftChild) { + rChildRect = RRect.fromRectAndCorners( + childRect, + topLeft: const Radius.circular(10.0), + bottomLeft: const Radius.circular(10.0), + ); + } else if (child == rightChild) { + rChildRect = RRect.fromRectAndCorners( + childRect, + topRight: const Radius.circular(10.0), + bottomRight: const Radius.circular(10.0), + ); + } else { + rChildRect = RRect.fromRectAndCorners(childRect); + } + childParentData.surroundingRect = rChildRect; + start += child.size.width; + child = nextChild(child); + } + } + + Size _calculateChildSize(BoxConstraints constraints) { + double maxHeight = _kMinSegmentedControlHeight; + double childWidth = constraints.minWidth / childCount; + RenderBox? child = firstChild; + while (child != null) { + childWidth = math.max( + childWidth, + child.getMaxIntrinsicWidth(double.infinity), + ); + child = childAfter(child); + } + childWidth = math.min(childWidth, constraints.maxWidth / childCount); + child = firstChild; + while (child != null) { + final double boxHeight = child.getMaxIntrinsicHeight(childWidth); + maxHeight = math.max(maxHeight, boxHeight); + child = childAfter(child); + } + return Size(childWidth, maxHeight); + } + + Size _computeOverallSizeFromChildSize(Size childSize) { + return constraints.constrain( + Size(childSize.width * childCount, childSize.height), + ); + } + + @override + double? computeDryBaseline( + covariant BoxConstraints constraints, + TextBaseline baseline, + ) { + final Size childSize = _calculateChildSize(constraints); + final BoxConstraints childConstraints = BoxConstraints.tight(childSize); + + BaselineOffset baselineOffset = BaselineOffset.noBaseline; + for ( + RenderBox? child = firstChild; + child != null; + child = childAfter(child) + ) { + baselineOffset = baselineOffset.minOf( + BaselineOffset(child.getDryBaseline(childConstraints, baseline)), + ); + } + return baselineOffset.offset; + } + + @override + Size computeDryLayout(BoxConstraints constraints) { + final Size childSize = _calculateChildSize(constraints); + return _computeOverallSizeFromChildSize(childSize); + } + + @override + void performLayout() { + final BoxConstraints constraints = this.constraints; + final Size childSize = _calculateChildSize(constraints); + + final BoxConstraints childConstraints = BoxConstraints.tightFor( + width: childSize.width, + height: childSize.height, + ); + + RenderBox? child = firstChild; + while (child != null) { + child.layout(childConstraints, parentUsesSize: true); + child = childAfter(child); + } + + switch (textDirection) { + case TextDirection.rtl: + _layoutRects(childBefore, lastChild, firstChild); + case TextDirection.ltr: + _layoutRects(childAfter, firstChild, lastChild); + } + + size = _computeOverallSizeFromChildSize(childSize); + } + + @override + void paint(PaintingContext context, Offset offset) { + RenderBox? child = firstChild; + int index = 0; + while (child != null) { + _paintChild(context, offset, child, index); + child = childAfter(child); + index += 1; + } + } + + void _paintChild( + PaintingContext context, + Offset offset, + RenderBox child, + int childIndex, + ) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + + context.canvas.drawRRect( + childParentData.surroundingRect!.shift(offset), + Paint() + ..color = backgroundColors[childIndex] + ..style = PaintingStyle.fill, + ); + context.canvas.drawRRect( + childParentData.surroundingRect!.shift(offset), + Paint() + ..color = borderColor + ..strokeWidth = 1.0 + ..style = PaintingStyle.stroke, + ); + + context.paintChild(child, childParentData.offset + offset); + } + + @override + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { + RenderBox? child = lastChild; + while (child != null) { + final _SegmentedControlContainerBoxParentData childParentData = + child.parentData! as _SegmentedControlContainerBoxParentData; + if (childParentData.surroundingRect!.contains(position)) { + return result.addWithPaintOffset( + offset: childParentData.offset, + position: position, + hitTest: (BoxHitTestResult result, Offset localOffset) { + assert(localOffset == position - childParentData.offset); + return child!.hitTest(result, position: localOffset); + }, + ); + } + child = childParentData.previousSibling; + } + return false; + } +} diff --git a/packages/core/lib/presentation/widget/tabs/tab.dart b/packages/core/lib/presentation/widget/tabs/tab.dart new file mode 100644 index 0000000..fc90a70 --- /dev/null +++ b/packages/core/lib/presentation/widget/tabs/tab.dart @@ -0,0 +1,115 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +import 'new_tab.dart'; + +class CupertinoSegmentedControlDemo extends StatefulWidget { + const CupertinoSegmentedControlDemo({super.key}); + + @override + State createState() => + _CupertinoSegmentedControlDemoState(); +} + +class _CupertinoSegmentedControlDemoState + extends State { + int _selectedSegment = 0; + + // The data for the segments + final Map _segments = const { + 0: Text('Segment 1'), + 1: Text('Segment 2'), + 2: Text('Segment 3'), + }; + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CupertinoSlidingSegmentedControl( + children: _segments, + groupValue: _selectedSegment, + + onValueChanged: (int? value) { + setState(() { + _selectedSegment = value!; + }); + }, + ), + const SizedBox(height: 20), + Text( + 'Selected Segment: ${_selectedSegment + 1}', + style: const TextStyle(fontSize: 24), + ), + ], + ), + ); + } +} + +class CupertinoSegmentedControlDemo2 extends StatefulWidget { + const CupertinoSegmentedControlDemo2({super.key}); + + @override + State createState() => + _CupertinoSegmentedControlDemoState2(); +} + +class _CupertinoSegmentedControlDemoState2 + extends State { + int _selectedSegment = 0; + + // The data for the segments + final Map _segments = { + 0:Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50) + ), + child: Text('لاشه', style: AppFonts.yekan13), + ), + 1: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50) + ), + child: Text('زنده', style: AppFonts.yekan13), + ), + }; + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + NewCupertinoSegmentedControl( + padding: EdgeInsetsDirectional.symmetric( + horizontal: 20, + vertical: 10, + ), + children: _segments, + groupValue: _selectedSegment, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + setState(() { + _selectedSegment = value; + }); + }, + ), + const SizedBox(height: 20), + Text( + 'Selected Segment: ${_selectedSegment + 1}', + style: const TextStyle(fontSize: 24), + ), + ], + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/vec_widget.dart b/packages/core/lib/presentation/widget/vec_widget.dart new file mode 100644 index 0000000..3fb78f1 --- /dev/null +++ b/packages/core/lib/presentation/widget/vec_widget.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:vector_graphics/vector_graphics.dart'; + +SvgPicture vecWidget( + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, +}) { + return SvgPicture( + AssetBytesLoader(assets), + width: width, + height: height, + fit: fit ?? BoxFit.contain, + colorFilter: + color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, + ); +} + +SvgPicture svgWidget( + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, + }) { + return SvgPicture.asset( + assets, + width: width, + height: height, + fit: fit ?? BoxFit.contain, + colorFilter: + color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, + ); +} + + +Widget vecWidget2( + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, + }) { + final resolvedColor = WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } + return color; + }).resolve({}); // You can pass actual states if needed + + return IconTheme( + data: IconThemeData(color: resolvedColor), + child: SvgPicture( + AssetBytesLoader(assets), + width: width, + height: height, + fit: fit ?? BoxFit.contain, + colorFilter: resolvedColor != null + ? ColorFilter.mode(resolvedColor, BlendMode.srcIn) + : null, + ), + ); +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart new file mode 100644 index 0000000..2e060ee --- /dev/null +++ b/packages/core/lib/presentation/widget/widget.dart @@ -0,0 +1,2 @@ +export 'vec_widget.dart'; +export 'bottom_navigation/bottom_navigation_1.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock new file mode 100644 index 0000000..c2b2c17 --- /dev/null +++ b/packages/core/pubspec.lock @@ -0,0 +1,890 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + url: "https://pub.dev" + source: hosted + version: "80.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + url: "https://pub.dev" + source: hosted + version: "2.12.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.dev" + source: hosted + version: "4.0.4" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + url: "https://pub.dev" + source: hosted + version: "2.4.15" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + url: "https://pub.dev" + source: hosted + version: "8.9.5" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + dartx: + dependency: "direct main" + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + url: "https://pub.dev" + source: hosted + version: "1.3.2" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + url: "https://pub.dev" + source: hosted + version: "2.0.17" + 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" + freezed: + dependency: "direct dev" + description: + name: freezed + sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + freezed_annotation: + dependency: "direct main" + description: + name: freezed_annotation + sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + url: "https://pub.dev" + source: hosted + version: "3.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 + url: "https://pub.dev" + source: hosted + version: "4.7.2" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 + url: "https://pub.dev" + source: hosted + version: "8.0.3" + get_test: + dependency: "direct dev" + description: + name: get_test + sha256: "558c39cb35fb37bd501f337dc143de60a4314d5ef3b75f4b0551d6741634995b" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hive_ce: + dependency: "direct main" + description: + name: hive_ce + sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f + url: "https://pub.dev" + source: hosted + version: "2.10.1" + hive_ce_flutter: + dependency: "direct main" + description: + name: hive_ce_flutter + sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + hive_ce_generator: + dependency: "direct dev" + description: + name: hive_ce_generator + sha256: "0b1c750e2d10c55a14cde16d479ada42704be6cef43c54b728ed0e4e02f7d808" + url: "https://pub.dev" + source: hosted + version: "1.8.2" + http: + dependency: transitive + description: + name: http + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + url: "https://pub.dev" + source: hosted + version: "1.3.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a" + url: "https://pub.dev" + source: hosted + version: "6.9.4" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + url: "https://pub.dev" + source: hosted + version: "10.0.8" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + logger: + dependency: "direct main" + description: + name: logger + sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + url: "https://pub.dev" + source: hosted + version: "2.5.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6 + url: "https://pub.dev" + source: hosted + version: "5.4.5" + mocktail: + dependency: "direct dev" + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" + url: "https://pub.dev" + source: hosted + version: "2.2.16" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + url: "https://pub.dev" + source: hosted + version: "9.4.6" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + rxdart: + dependency: "direct main" + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + url: "https://pub.dev" + source: hosted + version: "1.3.5" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" + source: hosted + version: "0.7.4" + time: + dependency: transitive + description: + name: time + sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + url: "https://pub.dev" + source: hosted + version: "1.1.18" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + url: "https://pub.dev" + source: hosted + version: "14.3.1" + watcher: + dependency: transitive + description: + name: watcher + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" + yaml_writer: + dependency: transitive + description: + name: yaml_writer + sha256: "69651cd7238411179ac32079937d4aa9a2970150d6b2ae2c6fe6de09402a5dc5" + url: "https://pub.dev" + source: hosted + version: "2.1.0" +sdks: + dart: ">=3.7.0 <4.0.0" + flutter: ">=3.27.0" diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 7bdd078..1aca781 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -56,6 +56,5 @@ dev_dependencies: get_test: ^4.0.1 - flutter: uses-material-design: true From 28d43aa0270bc21a4296647baebaa7cf7f1e8fb9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Apr 2025 12:00:13 +0330 Subject: [PATCH 011/256] fix: 1-bottom sheet 2-details filter 3- animated to current location 4- --- assets/icons/gps.svg | 3 + assets/vec/gps.svg.vec | Bin 0 -> 536 bytes .../lib/presentation/filter/logic.dart | 65 +++- .../lib/presentation/filter/view.dart | 343 +++++++++++++----- features/supervision/pubspec.lock | 8 + features/supervision/pubspec.yaml | 1 + lib/presentation/common/assets.dart | 2 + .../core/lib/presentation/common/assets.dart | 2 + .../lib/presentation/widget/buttons/fab.dart | 23 +- .../draggable_bottom_sheet.dart | 95 +++++ .../draggable_bottom_sheet_controller.dart | 76 ++++ .../core/lib/presentation/widget/widget.dart | 2 + pubspec.lock | 8 + 13 files changed, 529 insertions(+), 99 deletions(-) create mode 100644 assets/icons/gps.svg create mode 100644 assets/vec/gps.svg.vec create mode 100644 packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart create mode 100644 packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart diff --git a/assets/icons/gps.svg b/assets/icons/gps.svg new file mode 100644 index 0000000..de896a0 --- /dev/null +++ b/assets/icons/gps.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/vec/gps.svg.vec b/assets/vec/gps.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..4508f5df6ebef71bc3dd7abc9791b915c37ab9c7 GIT binary patch literal 536 zcmY+BJ#NB45QWEfPvs7jG-*;GQMjS9w~15u21&&UK%#;Q38WO3asi~cNNq(zqD~(; zgzHFL!MrzvwPxk@toO})^W)k0LxN|KU&lRau_BSS9g4^ZTY@kM@!Y*439+Ijb@@SL z;^O*C?fJBK>-ds2tF3ERWhPR%I^U>;v)aeqU;6&}0{<$-mD=z5^!A-N>SUUKqVZ&& zPbIiz# currentLocation = LatLng(35.824891, 50.948025).obs; RxList allMarkers = [].obs; RxList markers = [].obs; Timer? _debounceTimer; + RxBool isLoading = false.obs; + RxInt filterIndex = 0.obs; + RxInt showIndex = 0.obs; + Rx bottomSheetStep = BottomSheetStep.filter.obs; + Rx mapController = MapController().obs; + late final AnimatedMapController animatedMapController; - - RxBool isSelected = false.obs; + late Rx sheetController; Future determineCurrentPosition() async { bool serviceEnabled; @@ -45,6 +55,12 @@ class SupervisionFilterLogic extends GetxController { final latLng = LatLng(position.latitude, position.longitude); currentLocation.value = latLng; markers.add(latLng); + animatedMapController.animateTo( + dest: latLng, + zoom: 18, + curve: Curves.easeInOut, + duration: const Duration(seconds: 1), + ); } void debouncedUpdateVisibleMarkers({required LatLng center}) { @@ -77,13 +93,50 @@ class SupervisionFilterLogic extends GetxController { Future generatedMarkers() async { final generatedMarkers = await generateLocationsUsingCompute(100000); allMarkers.value = generatedMarkers; + } + @override + void onInit() { + super.onInit(); + animatedMapController = AnimatedMapController( + vsync: this, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + cancelPreviousAnimations: true, + ); + sheetController = + DraggableBottomSheetController( + initialVisibility: false, + initialHeight: 300, + minHeight: 50, + maxHeight: 600, + ).obs; + + bottomSheetStep.listen((data) { + if (data == BottomSheetStep.filter) { + sheetController = + DraggableBottomSheetController( + initialVisibility: false, + initialHeight: 300, + minHeight: 50, + maxHeight: 600, + ).obs; + } else if (data == BottomSheetStep.markerSelected) { + sheetController = + DraggableBottomSheetController( + initialVisibility: true, + initialHeight: 150, + minHeight: 50, + maxHeight: 150, + ).obs; + sheetController.refresh(); + } + }); } @override void onReady() { super.onReady(); - determineCurrentPosition(); generatedMarkers(); } diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 1d0b6ac..034b0e5 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -24,6 +24,7 @@ class SupervisionFilterPage extends GetView { children: [ ObxValue((currentLocation) { return FlutterMap( + mapController: controller.animatedMapController.mapController, options: MapOptions( initialCenter: currentLocation.value, initialZoom: 18, @@ -45,10 +46,18 @@ class SupervisionFilterPage extends GetView { .map( (marker) => Marker( point: marker, - child: const Icon( - Icons.location_on, - color: Colors.red, - size: 30, + + child: IconButton( + onPressed: () { + controller.bottomSheetStep.value = + BottomSheetStep.markerSelected; + + }, + icon: Icon( + Icons.location_on, + color: Colors.red, + size: 30, + ), ), ), ) @@ -59,116 +68,274 @@ class SupervisionFilterPage extends GetView { ); }, controller.currentLocation), + Positioned( + right: 10, + bottom: 150, + child: ObxValue((data) { + return RFab.small( + backgroundColor: AppColor.greenNormal, + isLoading: data.value, + icon: vecWidget(Assets.vecGpsSvg), + onPressed: () { + controller.isLoading.value = true; + controller.determineCurrentPosition().then( + (value) => + controller.isLoading.value = !controller.isLoading.value, + ); + }, + ); + }, controller.isLoading), + ), Positioned( right: 10, bottom: 100, - child: RFab.smallAdd( + child: RFab.small( + backgroundColor: AppColor.blueNormal, + icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), onPressed: () { - controller.isSelected.value = !controller.isSelected.value; + controller.sheetController.value.toggle(); }, ), ), - Positioned( bottom: 0, left: 0, right: 0, - child: ObxValue((isSelected) { - return DraggableBottomSheet(isVisible: isSelected.value); - }, controller.isSelected), + child: ObxValue((data) { + return DraggableBottomSheet( + controller: data.value, + child: ObxValue((data) { + if (data.value == BottomSheetStep.filter) { + return filterWidget(); + } else if (data.value == BottomSheetStep.markerSelected) { + return const SizedBox( + height: 150, + child: Center(child: Text('Marker Selected')), + ); + } else { + return const SizedBox( + height: 150, + child: Center(child: Text('Noting')), + ); + } + }, controller.bottomSheetStep), + ); + }, controller.sheetController), ), ], ); } -} -class DraggableBottomSheet extends StatefulWidget { - final bool isVisible; - final double initialHeight; - final double minHeight; - final double maxHeight; - - const DraggableBottomSheet({ - super.key, - required this.isVisible, - this.initialHeight = 200, - this.minHeight = 0, - this.maxHeight = 700, - }); - - @override - State createState() => _DraggableBottomSheetState(); -} - -class _DraggableBottomSheetState extends State { - late double _sheetHeight; - bool isWidgetVisible = false; - - @override - void initState() { - super.initState(); - _sheetHeight = widget.initialHeight; - isWidgetVisible = widget.isVisible; - } - - void _onVerticalDragUpdate(DragUpdateDetails details) { - setState(() { - _sheetHeight -= details.delta.dy; - _sheetHeight = _sheetHeight.clamp(widget.minHeight, widget.maxHeight); - }); - } - - @override - void didUpdateWidget(covariant DraggableBottomSheet oldWidget) { - if (_sheetHeight <= oldWidget.initialHeight) { - setState(() { - isWidgetVisible = !isWidgetVisible; - }); - } - - super.didUpdateWidget(oldWidget); - } - - @override - Widget build(BuildContext context) { - return AnimatedPositioned( - duration: const Duration(milliseconds: 300), - curve: Curves.easeOut, - bottom: widget.isVisible ? 0 : -widget.maxHeight, - left: 0, - right: 0, - child: GestureDetector( - onVerticalDragUpdate: _onVerticalDragUpdate, - child: Container( - height: _sheetHeight, - decoration: const BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.vertical(top: Radius.circular(50)), - ), - child: Column( + Padding filterWidget() { + return Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + spacing: 16, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + spacing: 16, children: [ - const SizedBox(height: 10), Container( - width: 40, - height: 5, + width: 100, + height: 64, + clipBehavior: Clip.antiAlias, decoration: BoxDecoration( - color: Colors.grey[400], - borderRadius: BorderRadius.circular(5), + color: AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text('دامداران', style: AppFonts.yekan10), + Text('183 عدد', style: AppFonts.yekan13Bold), + ], ), ), - const SizedBox(height: 10), - Expanded( - child: ListView.builder( - itemCount: 15, - itemBuilder: - (context, index) => - ListTile(title: Text('Item ${index + 1}')), + Container( + width: 100, + height: 64, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: AppColor.greenLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text('مرغداران', style: AppFonts.yekan10), + Text('183 عدد', style: AppFonts.yekan13Bold), + ], + ), + ), + Container( + width: 100, + height: 64, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text('اصناف', style: AppFonts.yekan10), + Text('183 عدد', style: AppFonts.yekan13Bold), + ], ), ), ], ), - ), + + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'فیلتر نمایش', + textAlign: TextAlign.center, + style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), + ), + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + customChip( + isSelected: data.value == 0, + onTap: (data) { + controller.filterIndex.value = data; + }, + index: 0, + title: 'دامداران', + ), + customChip( + isSelected: data.value == 1, + title: 'مرغداران', + onTap: (data) { + controller.filterIndex.value = data; + }, + index: 1, + ), + customChip( + isSelected: data.value == 2, + title: 'اصناف', + onTap: (data) { + controller.filterIndex.value = data; + }, + index: 2, + ), + ], + ); + }, controller.filterIndex), + ], + ), + + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'نمایش', + textAlign: TextAlign.center, + style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), + ), + ObxValue((data) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + customChip( + isSelected: data.value == 0, + title: 'نمایش همه', + onTap: (data) { + controller.showIndex.value = data; + }, + index: 0, + ), + customChip( + isSelected: data.value == 1, + title: 'دارای تراکنش', + onTap: (data) { + controller.showIndex.value = data; + }, + index: 1, + ), + customChip( + isSelected: data.value == 2, + title: 'بازرسی شده ها', + onTap: (data) { + controller.showIndex.value = data; + }, + index: 2, + ), + customChip( + isSelected: data.value == 3, + title: 'بازرسی نشده ها', + onTap: (data) { + controller.showIndex.value = data; + }, + index: 3, + ), + customChip( + isSelected: data.value == 4, + title: 'متخلفین', + onTap: (data) { + controller.showIndex.value = data; + }, + index: 4, + ), + ], + ), + ); + }, controller.showIndex), + ], + ), + ], ), ); } } + +Widget customChip({ + bool isSelected = false, + required String title, + required int index, + required Function(int) onTap, +}) { + return GestureDetector( + onTap: () { + onTap.call(index); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, + borderRadius: BorderRadius.circular(8), + border: + isSelected + ? Border.fromBorderSide(BorderSide.none) + : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + ), + child: Text( + title, + textAlign: TextAlign.center, + style: + isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) + : AppFonts.yekan10, + ), + ), + ); +} diff --git a/features/supervision/pubspec.lock b/features/supervision/pubspec.lock index 05a3d7f..3ee017f 100644 --- a/features/supervision/pubspec.lock +++ b/features/supervision/pubspec.lock @@ -102,6 +102,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.1" + flutter_map_animations: + dependency: "direct main" + description: + name: flutter_map_animations + sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e + url: "https://pub.dev" + source: hosted + version: "0.9.0" flutter_svg: dependency: transitive description: diff --git a/features/supervision/pubspec.yaml b/features/supervision/pubspec.yaml index bc13c6f..7dd0679 100644 --- a/features/supervision/pubspec.yaml +++ b/features/supervision/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: rasadyar_core: path: ./../../packages/core flutter_map: ^8.1.1 + flutter_map_animations: ^0.9.0 location: ^8.0.0 latlong2: ^0.9.1 geolocator: ^13.0.4 diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index 705ebe1..4e91d17 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -9,6 +9,7 @@ class Assets { static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsGps = 'assets/icons/gps.svg'; static const String iconsKey = 'assets/icons/key.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; @@ -25,6 +26,7 @@ class Assets { static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; static const String vecEditSvg = 'assets/vec/edit.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; static const String vecKeySvg = 'assets/vec/key.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; diff --git a/packages/core/lib/presentation/common/assets.dart b/packages/core/lib/presentation/common/assets.dart index 705ebe1..4e91d17 100644 --- a/packages/core/lib/presentation/common/assets.dart +++ b/packages/core/lib/presentation/common/assets.dart @@ -9,6 +9,7 @@ class Assets { static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsGps = 'assets/icons/gps.svg'; static const String iconsKey = 'assets/icons/key.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; @@ -25,6 +26,7 @@ class Assets { static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; static const String vecEditSvg = 'assets/vec/edit.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; static const String vecKeySvg = 'assets/vec/key.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; diff --git a/packages/core/lib/presentation/widget/buttons/fab.dart b/packages/core/lib/presentation/widget/buttons/fab.dart index c7c768e..3dfe651 100644 --- a/packages/core/lib/presentation/widget/buttons/fab.dart +++ b/packages/core/lib/presentation/widget/buttons/fab.dart @@ -5,16 +5,15 @@ import 'package:rasadyar_core/presentation/utils/color_utils.dart'; import 'package:rasadyar_core/presentation/widget/vec_widget.dart'; class RFab extends StatefulWidget { - - final VoidCallback? onPressed; Color? foregroundColor; Color? backgroundColor; Color? disabledForegroundColor; Color? disabledBackgroundColor; - double? radius; + double radius; ShapeBorder? shapeBorder; Widget? icon; + bool isLoading; @override State createState() => _RFabState(); @@ -177,6 +176,7 @@ class RFab extends StatefulWidget { required this.icon, required this.backgroundColor, super.key, + this.isLoading = false, }) : radius = 40.0, foregroundColor = Colors.white; @@ -184,6 +184,7 @@ class RFab extends StatefulWidget { required this.onPressed, required this.icon, required this.backgroundColor, + this.isLoading = false, super.key, }) : radius = 56.0, foregroundColor = Colors.white; @@ -195,7 +196,7 @@ class _RFabState extends State { @override Widget build(BuildContext context) { return ElevatedButton( - onPressed: widget.onPressed, + onPressed: widget.isLoading == false ? widget.onPressed : null, style: ButtonStyle( side: WidgetStateProperty.all(BorderSide.none), backgroundColor: WidgetStateProperty.resolveWith((states) { @@ -226,7 +227,19 @@ class _RFabState extends State { ), padding: WidgetStatePropertyAll(EdgeInsets.zero), ), - child: widget.icon, + child: + widget.isLoading + ? SizedBox( + height: widget.radius / 2, + width: widget.radius / 2, + child: CircularProgressIndicator( + strokeWidth: 2.5, + valueColor: AlwaysStoppedAnimation( + widget.foregroundColor ?? Colors.white, + ), + ), + ) + : widget.icon, ); } } diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart new file mode 100644 index 0000000..b61941c --- /dev/null +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart @@ -0,0 +1,95 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_core/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; + +class DraggableBottomSheet extends StatelessWidget { + final DraggableBottomSheetController? controller; + final bool isVisible; + final double initialHeight; + final double minHeight; + final double maxHeight; + final Widget? child; + + const DraggableBottomSheet({ + super.key, + this.controller, + this.isVisible = false, + this.initialHeight = 200, + this.minHeight = 0, + this.maxHeight = 700, + this.child, + }); + + @override + Widget build(BuildContext context) { + // If no controller is passed, create one locally + final DraggableBottomSheetController bottomSheetController = + controller ?? + Get.put( + DraggableBottomSheetController( + initialVisibility: false, // always start hidden + initialHeight: initialHeight, + minHeight: minHeight, + maxHeight: maxHeight, + ), + tag: 'local_$hashCode', + ); + + // Optionally show after first frame if isVisible is true + WidgetsBinding.instance.addPostFrameCallback((_) { + if (isVisible && !bottomSheetController.isVisible.value) { + bottomSheetController.show(); + } + }); + + return ObxValue( + (data) => AnimatedPositioned( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + bottom: bottomSheetController.isVisible.value ? 0 : -maxHeight, + left: 0, + right: 0, + child: GestureDetector( + onVerticalDragUpdate: (DragUpdateDetails details) { + bottomSheetController.updateHeight(details.delta.dy); + }, + child: Container( + height: data.value, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(50)), + ), + child: Column( + children: [ + const SizedBox(height: 10), + + /* Container( + width: 40, + height: 5, + decoration: BoxDecoration( + color: Colors.grey[400], + borderRadius: BorderRadius.circular(5), + ), + ),*/ + GestureDetector( + onTap: () { + bottomSheetController.hide(); + }, + behavior: HitTestBehavior.opaque, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [const Icon(CupertinoIcons.chevron_down)], + ), + ), + const SizedBox(height: 10), + Expanded(child: child ?? SizedBox.shrink()), + ], + ), + ), + ), + ), + bottomSheetController.currentHeight, + ); + } +} diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart new file mode 100644 index 0000000..eedebc8 --- /dev/null +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart @@ -0,0 +1,76 @@ +import 'package:flutter/foundation.dart'; +import 'package:get/get.dart'; + + +class DraggableBottomSheetController extends GetxController { + // Observable variables + final RxBool isVisible = false.obs; + final RxDouble currentHeight = 200.0.obs; + + // Configuration values + final double initialHeight; + final double minHeight; + final double maxHeight; + + DraggableBottomSheetController({ + bool initialVisibility = false, + this.initialHeight = 200, + this.minHeight = 0, + this.maxHeight = 700, + }) { + isVisible.value = initialVisibility; + currentHeight.value = initialHeight; + } + + // Show the bottom sheet + void show() { + if (!isVisible.value) { + isVisible.value = true; + currentHeight.value = initialHeight; + } + } + + // Hide the bottom sheet + void hide() { + if (isVisible.value) { + isVisible.value = false; + } + } + + // Toggle visibility + void toggle() { + isVisible.value = !isVisible.value; + if (isVisible.value) { + currentHeight.value = initialHeight; + } + } + + // Set a specific height for the bottom sheet + void setHeight(double height) { + final clampedHeight = height.clamp(minHeight, maxHeight); + if (currentHeight.value != clampedHeight) { + currentHeight.value = clampedHeight; + } + } + + // Update height (usually called during drag) + void updateHeight(double delta) { + final newHeight = currentHeight.value - delta; + if(newHeight < minHeight) { + hide(); + return; + } + currentHeight.value = newHeight.clamp(minHeight, maxHeight); + } + + // Expand to maximum height + void expandFully() { + currentHeight.value = maxHeight; + isVisible.value = true; + } + + // Collapse to minimum height + void collapse() { + currentHeight.value = minHeight; + } +} \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 2e060ee..076a534 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -1,2 +1,4 @@ export 'vec_widget.dart'; export 'bottom_navigation/bottom_navigation_1.dart'; +export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; +export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; diff --git a/pubspec.lock b/pubspec.lock index c5b9b9f..ef4da26 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -246,6 +246,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.1" + flutter_map_animations: + dependency: transitive + description: + name: flutter_map_animations + sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e + url: "https://pub.dev" + source: hosted + version: "0.9.0" flutter_svg: dependency: "direct main" description: From cf4dfb23eafbf99efe74de5656cc4596b38749fd Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Apr 2025 16:23:09 +0330 Subject: [PATCH 012/256] fix: 1-bottom sheet 2- on tap location 3- swipe widget --- android/app/build.gradle.kts | 2 +- assets/icons/message_add.svg | 7 + assets/icons/scan_barcode.svg | 14 ++ assets/icons/security-time.svg | 8 + assets/vec/message_add.svg.vec | Bin 0 -> 472 bytes assets/vec/scan_barcode.svg.vec | Bin 0 -> 2129 bytes assets/vec/security-time.svg.vec | Bin 0 -> 719 bytes copyAssets.sh | 17 +++ .../common/assets.dart/assets.dart | 42 ++++++ .../lib/presentation/filter/logic.dart | 28 ++-- .../lib/presentation/filter/view.dart | 139 ++++++++++++++---- features/supervision/pubspec.lock | 8 + lib/domain/service/user/user_service.dart | 2 +- lib/infrastructure/di/di.dart | 2 + lib/main.dart | 1 + lib/presentation/common/assets.dart | 6 + .../auth/auth_with_use_and_pass/view.dart | 3 +- packages/core/lib/core.dart | 1 + packages/core/lib/data/utils.dart | 22 +++ packages/core/lib/infrastructure/di/di.dart | 32 ++++ .../lib/presentation/common/app_fonts.dart | 11 ++ .../core/lib/presentation/common/assets.dart | 6 + .../draggable_bottom_sheet.dart | 19 +-- .../draggable_bottom_sheet_controller.dart | 21 ++- packages/core/pubspec.lock | 8 + packages/core/pubspec.yaml | 4 +- pubspec.lock | 10 +- pubspec.yaml | 4 + 28 files changed, 349 insertions(+), 68 deletions(-) create mode 100644 assets/icons/message_add.svg create mode 100644 assets/icons/scan_barcode.svg create mode 100644 assets/icons/security-time.svg create mode 100644 assets/vec/message_add.svg.vec create mode 100644 assets/vec/scan_barcode.svg.vec create mode 100644 assets/vec/security-time.svg.vec create mode 100644 copyAssets.sh create mode 100644 core/lib/presentation/common/assets.dart/assets.dart create mode 100644 packages/core/lib/data/utils.dart create mode 100644 packages/core/lib/infrastructure/di/di.dart diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index bfb2507..ac6af7a 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -8,7 +8,7 @@ plugins { android { namespace = "com.hoshomandsazan.rasadyar_app" compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion + ndkVersion = "27.0.12077973" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 diff --git a/assets/icons/message_add.svg b/assets/icons/message_add.svg new file mode 100644 index 0000000..9d83a3f --- /dev/null +++ b/assets/icons/message_add.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/scan_barcode.svg b/assets/icons/scan_barcode.svg new file mode 100644 index 0000000..cd387e0 --- /dev/null +++ b/assets/icons/scan_barcode.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/icons/security-time.svg b/assets/icons/security-time.svg new file mode 100644 index 0000000..1fab0fe --- /dev/null +++ b/assets/icons/security-time.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/vec/message_add.svg.vec b/assets/vec/message_add.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..f740dd5a09a0b358250fe6a0ac58fb887ac05963 GIT binary patch literal 472 zcmZ8eF%E)25Zr^tKS=B?Oe|>Zj>d{7P#Hr_X+;Q?9bd4pu(0q6K0yCNhcoQzU4%?# zcV~C@4i1~MxV6Z$AhHQhDl$z=5y=2?iN2{gmn1RLBX#L8DIPHH7#n`EX}6i{`d++W z8G0Vby)k{5UyS4Ut8oYG^kpCSP$QqfO^y)EU7d=K#57jxtesT=0u}AlX+2B>0N7xykC7i7{k8lTisLolv>vn~&f&cdb Dn%P@J literal 0 HcmV?d00001 diff --git a/assets/vec/scan_barcode.svg.vec b/assets/vec/scan_barcode.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..2456035186f52f92febe3ac7fba1ce54afb0ae12 GIT binary patch literal 2129 zcmai$ziU%b6vyvN`UAwFg9!D7x(N=IK)aT_2SOb(brTALJR)upy12Or9cntbl+Yny zrXWQWLPl{4NWnir|B`q<_j@n*I!IDp&pY>g@AsVZJtw6v_s?DN*tzdDPiOUFf7Nzw zwJHne?mGLlT7~`atNjGuO?uAl7<$q>y}VyPeE-w@j`^;_zBzi}t#jRqI97PL*U8)e7@@XEdU1C^xt}0^k^LND}mb=1{H|Adkj-~DJt$&egFvpg*;AY^J;Z(f3DZ5tHuZTws)|EH>BZH8d=BpL=_A{4x0BpxxMf z_^|Xg_Pq*+PTa%7b7lQJ4}L#r(hv8r@bo>eaO92o*#-C;ufyr(zpv|FuZ=!b6GWJHV z!X*tHk^V}wg*5hIN`&$+}c%-Hh^N1i-?6XuT|`8)SH1KZf& z=!<}(Z(>+tBOjBWzbh88%tQN^I2CK^?w+&HYPDC$v}Ejm0}eN2Hf6SCw!QfaXx7cD literal 0 HcmV?d00001 diff --git a/assets/vec/security-time.svg.vec b/assets/vec/security-time.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..72e5dee3c591b93dbbbfb2e2c5faf6edd614c658 GIT binary patch literal 719 zcmXw#-%FEW6vxlIISLs;ZACD*3ti}lTy4`yG1HtCS3I>6J!LAf9v@HXX zK!f2Zg5Ds4eh@+_-9#7t3%iM6-IPD>0`KzeoYVGf=l#6re810mp7-3o^oXno(HBT` zIlSCNjuWtme8kJe%S|rJ#eaUdEcb+ziM+gHh{KCWA;8hY?;RXQ*{}<(ysSD=nRD@% z(XjIzqR(-Nf3CG(azczju|-PXACQ zUd%)4N3|vFuCJKsTdR0DQ!~Zb8b;ps;I;1!im^Dh_dmd6k14}_1+Aa)*I8S`X!<$6 z-&n=RiVf)_l)gea=gO81Id|{VQ^-Bq_wRRx(eEsCuXD=T<6q|IUJ=6CB literal 0 HcmV?d00001 diff --git a/copyAssets.sh b/copyAssets.sh new file mode 100644 index 0000000..a32ff95 --- /dev/null +++ b/copyAssets.sh @@ -0,0 +1,17 @@ +#!/bin/bash + + +SOURCE_FILE="lib/presentation/common/assets.dart" +TARGET_DIR="packages/core/lib/presentation/common/assets.dart" + +echo "--- Starting File Operations ---" + +echo " 💀 Attempting to delete '$FILE_PATH_TO_DELETE'..." +rm -fv "$FILE_PATH_TO_DELETE" +echo "✅ Deletion step complete (file removed if it existed)." + + + + +echo "Attempting to copy source(s) to '$TARGET_DIR'..." + diff --git a/core/lib/presentation/common/assets.dart/assets.dart b/core/lib/presentation/common/assets.dart/assets.dart new file mode 100644 index 0000000..432e743 --- /dev/null +++ b/core/lib/presentation/common/assets.dart/assets.dart @@ -0,0 +1,42 @@ +///This file is automatically generated. DO NOT EDIT, all your changes would be lost. +class Assets { + Assets._(); + + static const String iconsAdd = 'assets/icons/add.svg'; + static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; + static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsCall = 'assets/icons/call.svg'; + static const String iconsDownload = 'assets/icons/download.svg'; + static const String iconsEdit = 'assets/icons/edit.svg'; + static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsGps = 'assets/icons/gps.svg'; + static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsMap = 'assets/icons/map.svg'; + static const String iconsMapMarker = 'assets/icons/map_marker.svg'; + static const String iconsMessageAdd = 'assets/icons/message_add.svg'; + static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; + static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsSecurityTime = 'assets/icons/security-time.svg'; + static const String iconsSetting = 'assets/icons/setting.svg'; + static const String iconsTrash = 'assets/icons/trash.svg'; + static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; + static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; + static const String vecAddSvg = 'assets/vec/add.svg.vec'; + static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; + static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecCallSvg = 'assets/vec/call.svg.vec'; + static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; + static const String vecEditSvg = 'assets/vec/edit.svg.vec'; + static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; + static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; + static const String vecMapSvg = 'assets/vec/map.svg.vec'; + static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; + static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security-time.svg.vec'; + static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; + static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; + +} diff --git a/features/supervision/lib/presentation/filter/logic.dart b/features/supervision/lib/presentation/filter/logic.dart index 521ed9c..3b2ca9f 100644 --- a/features/supervision/lib/presentation/filter/logic.dart +++ b/features/supervision/lib/presentation/filter/logic.dart @@ -6,6 +6,7 @@ import 'package:flutter_map_animations/flutter_map_animations.dart'; import 'package:geolocator/geolocator.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; import 'package:supervision/data/utils/marker_generator.dart'; enum BottomSheetStep { filter, markerSelected, markerDetails } @@ -108,30 +109,35 @@ class SupervisionFilterLogic extends GetxController DraggableBottomSheetController( initialVisibility: false, initialHeight: 300, - minHeight: 50, + minHeight: 70, maxHeight: 600, ).obs; bottomSheetStep.listen((data) { + tLog('1 bottomSheetStep -> ${data.name}'); if (data == BottomSheetStep.filter) { - sheetController = - DraggableBottomSheetController( - initialVisibility: false, + sheetController.value = DraggableBottomSheetController( + initialVisibility: true, initialHeight: 300, - minHeight: 50, + minHeight: 70, maxHeight: 600, - ).obs; + ); } else if (data == BottomSheetStep.markerSelected) { - sheetController = + sheetController.value = DraggableBottomSheetController( initialVisibility: true, - initialHeight: 150, + initialHeight: 300, minHeight: 50, - maxHeight: 150, - ).obs; - sheetController.refresh(); + maxHeight: 300, + ); + } + sheetController.refresh(); + sheetController.value.toggle(); + }); + + } @override diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 034b0e5..27587bb 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -42,26 +44,7 @@ class SupervisionFilterPage extends GetView { ObxValue((markers) { return MarkerLayer( markers: - markers - .map( - (marker) => Marker( - point: marker, - - child: IconButton( - onPressed: () { - controller.bottomSheetStep.value = - BottomSheetStep.markerSelected; - - }, - icon: Icon( - Icons.location_on, - color: Colors.red, - size: 30, - ), - ), - ), - ) - .toList(), + markers.map((marker) => markerWidget(marker)).toList(), ); }, controller.markers), ], @@ -93,6 +76,9 @@ class SupervisionFilterPage extends GetView { backgroundColor: AppColor.blueNormal, icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), onPressed: () { + if (controller.bottomSheetStep.value != BottomSheetStep.filter) { + controller.bottomSheetStep.value = BottomSheetStep.filter; + } controller.sheetController.value.toggle(); }, ), @@ -102,20 +88,18 @@ class SupervisionFilterPage extends GetView { left: 0, right: 0, child: ObxValue((data) { + fLog(data); return DraggableBottomSheet( controller: data.value, child: ObxValue((data) { if (data.value == BottomSheetStep.filter) { return filterWidget(); } else if (data.value == BottomSheetStep.markerSelected) { - return const SizedBox( - height: 150, - child: Center(child: Text('Marker Selected')), - ); + return selectedLocationWidget(); } else { return const SizedBox( height: 150, - child: Center(child: Text('Noting')), + child: Center(child: Text('Marker Selected')), ); } }, controller.bottomSheetStep), @@ -126,6 +110,111 @@ class SupervisionFilterPage extends GetView { ); } + Marker markerWidget(LatLng marker) { + return Marker( + point: marker, + child: IconButton( + onPressed: () { + controller.bottomSheetStep.value = BottomSheetStep.markerSelected; + if (!controller.sheetController.value.isVisible.value) { + controller.sheetController.value.show(); + } + }, + icon: Icon(Icons.location_on, color: Colors.red, size: 30), + ), + ); + } + + Widget selectedLocationWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), + child: Slidable( + key: Key('item'), + + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.blueNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(8), + topRight: Radius.circular(8), + ), + child: vecWidget(Assets.vecMapSvg, width: 24, height: 24), + ), + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.greenNormal, + padding: EdgeInsets.all(16), + child: vecWidget(Assets.vecMessageAddSvg), + ), + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.warning, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8), + topLeft: Radius.circular(8), + ), + child: vecWidget(Assets.vecSecurityTimeSvg), + ), + ], + ), + child: Container( + height: 58, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + vecWidget(Assets.vecScanBarcodeSvg), + ], + ), + ), + ), + ); + } + Padding filterWidget() { return Padding( padding: const EdgeInsets.all(20.0), diff --git a/features/supervision/pubspec.lock b/features/supervision/pubspec.lock index 3ee017f..ad08c3e 100644 --- a/features/supervision/pubspec.lock +++ b/features/supervision/pubspec.lock @@ -110,6 +110,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.0" + flutter_slidable: + dependency: transitive + description: + name: flutter_slidable + sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a + url: "https://pub.dev" + source: hosted + version: "4.0.0" flutter_svg: dependency: transitive description: diff --git a/lib/domain/service/user/user_service.dart b/lib/domain/service/user/user_service.dart index db8005c..3c4b464 100644 --- a/lib/domain/service/user/user_service.dart +++ b/lib/domain/service/user/user_service.dart @@ -8,7 +8,7 @@ class UserService extends GetxService { @override void onInit() { return super.onInit(); - _userLocalStorage = di.get(); + // _userLocalStorage = di.get(); } Future isUserAuthed() async { diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index 7b43cc5..b3919d0 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -1,3 +1,4 @@ +/* import 'package:get_it/get_it.dart'; import 'package:hive_ce_flutter/hive_flutter.dart'; import 'package:logger/logger.dart'; @@ -33,3 +34,4 @@ Future _setupLocalStorage() async { // } +*/ diff --git a/lib/main.dart b/lib/main.dart index c62ccab..5163177 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:rasadyar_app/domain/service/user/user_service.dart'; import 'package:rasadyar_app/infrastructure/di/di.dart'; import 'package:rasadyar_app/presentation/common/app_color.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:rasadyar_core/infrastructure/di/di.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index 4e91d17..c51cd01 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -13,8 +13,11 @@ class Assets { static const String iconsKey = 'assets/icons/key.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; + static const String iconsMessageAdd = 'assets/icons/message_add.svg'; static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; + static const String iconsSecurityTime = 'assets/icons/security-time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; @@ -30,8 +33,11 @@ class Assets { static const String vecKeySvg = 'assets/vec/key.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; + static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security-time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart index 9a45635..e92376c 100644 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart @@ -234,8 +234,7 @@ class AuthWithUseAndPassPage extends GetView { RElevated( text: 'ورود', onPressed: () { - di.get().t(data.value.currentState?.validate()); - di.get().t(controller.captchaController.validate()); + if (data.value.currentState?.validate() == true && controller.captchaController.validate()) { Get.toNamed(SupervisionRoutes.supervision); diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index be75d72..6359f17 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -4,5 +4,6 @@ export 'package:get/get.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; +export 'package:flutter_slidable/flutter_slidable.dart'; diff --git a/packages/core/lib/data/utils.dart b/packages/core/lib/data/utils.dart new file mode 100644 index 0000000..fbaf1a8 --- /dev/null +++ b/packages/core/lib/data/utils.dart @@ -0,0 +1,22 @@ +import 'package:logger/logger.dart'; +import 'package:rasadyar_core/infrastructure/di/di.dart'; + +void iLog(dynamic message) { + di.get().i(message.toString()); +} + +void eLog(dynamic message) { + di.get().e(message.toString()); +} + +void dLog(dynamic message) { + di.get().d(message.toString()); +} + +void fLog(dynamic message) { + di.get().f(message.toString()); +} + +void tLog(dynamic message) { + di.get().t(message.toString()); +} diff --git a/packages/core/lib/infrastructure/di/di.dart b/packages/core/lib/infrastructure/di/di.dart new file mode 100644 index 0000000..c6ecb54 --- /dev/null +++ b/packages/core/lib/infrastructure/di/di.dart @@ -0,0 +1,32 @@ +import 'package:get_it/get_it.dart'; +import 'package:hive_ce_flutter/hive_flutter.dart'; +import 'package:logger/logger.dart'; + + +final di = GetIt.instance; + +void setupInjection() { + // di.registerLazySingleton(() => HiveProvider(), instanceName: 'HiveProvider'); + di.registerSingleton( Logger()); +} + +Future setupAllProvider() async { + //await _setupLocalStorage(); + await di.allReady(); +} + +// Future _setupLocalStorage() async { +// final hiveProvider = di.get(instanceName: 'HiveProvider'); +// await hiveProvider.init(); +// Hive.registerAdapter(UserModelAdapter()); +// +// await Hive.openBox(HiveBoxNames.user.name); +// +// //user +// di.registerLazySingleton(() => UserLocalStorage()); +// di.registerLazySingleton( +// () => UserRepository(di.get()), +// ); +// +// // +// } diff --git a/packages/core/lib/presentation/common/app_fonts.dart b/packages/core/lib/presentation/common/app_fonts.dart index 65be3b0..dd5d433 100644 --- a/packages/core/lib/presentation/common/app_fonts.dart +++ b/packages/core/lib/presentation/common/app_fonts.dart @@ -81,6 +81,8 @@ class AppFonts { height: _height, ); + + static const TextStyle yekan13 = TextStyle( fontFamily: yekan, fontWeight: regular, @@ -88,6 +90,15 @@ class AppFonts { height: _height, ); + + static const TextStyle yekan12 = TextStyle( + fontFamily: yekan, + fontWeight: regular, + fontSize: 12, + height: _height, + ); + + static const TextStyle yekan10 = TextStyle( // Rounded from 10.24 fontFamily: yekan, diff --git a/packages/core/lib/presentation/common/assets.dart b/packages/core/lib/presentation/common/assets.dart index 4e91d17..c51cd01 100644 --- a/packages/core/lib/presentation/common/assets.dart +++ b/packages/core/lib/presentation/common/assets.dart @@ -13,8 +13,11 @@ class Assets { static const String iconsKey = 'assets/icons/key.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; + static const String iconsMessageAdd = 'assets/icons/message_add.svg'; static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; + static const String iconsSecurityTime = 'assets/icons/security-time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; @@ -30,8 +33,11 @@ class Assets { static const String vecKeySvg = 'assets/vec/key.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; + static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security-time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart index b61941c..39517bf 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; class DraggableBottomSheet extends StatelessWidget { @@ -23,12 +24,11 @@ class DraggableBottomSheet extends StatelessWidget { @override Widget build(BuildContext context) { - // If no controller is passed, create one locally final DraggableBottomSheetController bottomSheetController = controller ?? Get.put( DraggableBottomSheetController( - initialVisibility: false, // always start hidden + initialVisibility: false, initialHeight: initialHeight, minHeight: minHeight, maxHeight: maxHeight, @@ -52,7 +52,7 @@ class DraggableBottomSheet extends StatelessWidget { right: 0, child: GestureDetector( onVerticalDragUpdate: (DragUpdateDetails details) { - bottomSheetController.updateHeight(details.delta.dy); + bottomSheetController.updateHeight(details.primaryDelta); }, child: Container( height: data.value, @@ -63,18 +63,9 @@ class DraggableBottomSheet extends StatelessWidget { child: Column( children: [ const SizedBox(height: 10), - - /* Container( - width: 40, - height: 5, - decoration: BoxDecoration( - color: Colors.grey[400], - borderRadius: BorderRadius.circular(5), - ), - ),*/ GestureDetector( onTap: () { - bottomSheetController.hide(); + bottomSheetController.toggle(); }, behavior: HitTestBehavior.opaque, child: Row( @@ -83,7 +74,7 @@ class DraggableBottomSheet extends StatelessWidget { ), ), const SizedBox(height: 10), - Expanded(child: child ?? SizedBox.shrink()), + child ?? SizedBox.shrink(), ], ), ), diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart index eedebc8..e42138e 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart @@ -1,7 +1,5 @@ -import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; - class DraggableBottomSheetController extends GetxController { // Observable variables final RxBool isVisible = false.obs; @@ -19,7 +17,7 @@ class DraggableBottomSheetController extends GetxController { this.maxHeight = 700, }) { isVisible.value = initialVisibility; - currentHeight.value = initialHeight; + currentHeight.value = 0; } // Show the bottom sheet @@ -53,14 +51,15 @@ class DraggableBottomSheetController extends GetxController { } } - // Update height (usually called during drag) - void updateHeight(double delta) { - final newHeight = currentHeight.value - delta; - if(newHeight < minHeight) { - hide(); - return; + void updateHeight(double? delta) { + if (delta == null) return; + final newHeight = (currentHeight.value - delta).clamp(minHeight, maxHeight); + + if (newHeight <= minHeight) { + toggle(); + } else { + currentHeight.value = newHeight; } - currentHeight.value = newHeight.clamp(minHeight, maxHeight); } // Expand to maximum height @@ -73,4 +72,4 @@ class DraggableBottomSheetController extends GetxController { void collapse() { currentHeight.value = minHeight; } -} \ No newline at end of file +} diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index c2b2c17..e6df05c 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -230,6 +230,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_slidable: + dependency: "direct main" + description: + name: flutter_slidable + sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a + url: "https://pub.dev" + source: hosted + version: "4.0.0" flutter_svg: dependency: "direct main" description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 1aca781..d46e2e5 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: flutter: sdk: flutter - + #UI cupertino_icons: ^1.0.8 + flutter_slidable: ^4.0.0 ##Log logger: ^2.5.0 @@ -38,7 +39,6 @@ dependencies: ##Di get_it: ^8.0.3 - permission_handler: ^11.4.0 dev_dependencies: diff --git a/pubspec.lock b/pubspec.lock index ef4da26..29b58c7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -254,6 +254,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.0" + flutter_slidable: + dependency: transitive + description: + name: flutter_slidable + sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a + url: "https://pub.dev" + source: hosted + version: "4.0.0" flutter_svg: dependency: "direct main" description: @@ -801,7 +809,7 @@ packages: source: hosted version: "1.5.0" rasadyar_core: - dependency: transitive + dependency: "direct main" description: path: "packages/core" relative: true diff --git a/pubspec.yaml b/pubspec.yaml index 326d4f4..546bb1c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,10 @@ dependencies: supervision: path: ./features/supervision + rasadyar_core: + path: ./packages/core + + dev_dependencies: flutter_test: sdk: flutter From 1a31d4cdbfbf2e54c3f3b56611f0a4dcec9c3b1a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Apr 2025 17:31:17 +0330 Subject: [PATCH 013/256] feat : bottom sheet markerDetails --- .../lib/presentation/filter/logic.dart | 10 +- .../lib/presentation/filter/view.dart | 250 ++++++++++++++---- .../draggable_bottom_sheet.dart | 6 +- 3 files changed, 215 insertions(+), 51 deletions(-) diff --git a/features/supervision/lib/presentation/filter/logic.dart b/features/supervision/lib/presentation/filter/logic.dart index 3b2ca9f..61626f7 100644 --- a/features/supervision/lib/presentation/filter/logic.dart +++ b/features/supervision/lib/presentation/filter/logic.dart @@ -126,11 +126,19 @@ class SupervisionFilterLogic extends GetxController sheetController.value = DraggableBottomSheetController( initialVisibility: true, - initialHeight: 300, + initialHeight: 250, minHeight: 50, maxHeight: 300, ); + }else if(data == BottomSheetStep.markerDetails){ + sheetController.value = + DraggableBottomSheetController( + initialVisibility: true, + initialHeight: 500, + minHeight: 50, + maxHeight: 700, + ); } sheetController.refresh(); sheetController.value.toggle(); diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 27587bb..c349694 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -88,19 +88,19 @@ class SupervisionFilterPage extends GetView { left: 0, right: 0, child: ObxValue((data) { - fLog(data); + return DraggableBottomSheet( controller: data.value, + backgroundColor: controller.bottomSheetStep.value == BottomSheetStep.filter ? Colors.white : AppColor.lightGreyLight , child: ObxValue((data) { if (data.value == BottomSheetStep.filter) { return filterWidget(); } else if (data.value == BottomSheetStep.markerSelected) { return selectedLocationWidget(); + } else if (data.value == BottomSheetStep.markerDetails) { + return markerDetailsWidget(); } else { - return const SizedBox( - height: 150, - child: Center(child: Text('Marker Selected')), - ); + return Container(height: 300, color: AppColor.blueNormal); } }, controller.bottomSheetStep), ); @@ -130,7 +130,6 @@ class SupervisionFilterPage extends GetView { padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), child: Slidable( key: Key('item'), - endActionPane: ActionPane( motion: StretchMotion(), children: [ @@ -163,52 +162,59 @@ class SupervisionFilterPage extends GetView { ), ], ), - child: Container( - height: 58, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, + child: GestureDetector( + onTap: () { + controller.bottomSheetStep.value = BottomSheetStep.markerDetails; + if (!controller.sheetController.value.isVisible.value) { + controller.sheetController.value.show(); + } + }, + child: Container( + height: 58, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), ), - ), - Text( - 'گوشت و مرغ', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), - ), - ], - ), - Column( - children: [ - Text( - 'باقی مانده', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, + ], + ), + Column( + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), ), - ), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), - ), - ], - ), - vecWidget(Assets.vecScanBarcodeSvg), - ], + ], + ), + vecWidget(Assets.vecScanBarcodeSvg), + ], + ), ), ), ), @@ -394,6 +400,154 @@ class SupervisionFilterPage extends GetView { ), ); } + + Widget markerDetailsWidget() { + return Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.all(35), + padding: EdgeInsets.symmetric(horizontal: 20,vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داود خرم پور', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Container( + height: 32, + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'باقی مانده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + + ...List.generate( + 5, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + ], + ), + ); + } } Widget customChip({ diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart index 39517bf..90e8b3d 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart @@ -11,11 +11,13 @@ class DraggableBottomSheet extends StatelessWidget { final double minHeight; final double maxHeight; final Widget? child; + final Color? backgroundColor; const DraggableBottomSheet({ super.key, this.controller, this.isVisible = false, + this.backgroundColor = Colors.white, this.initialHeight = 200, this.minHeight = 0, this.maxHeight = 700, @@ -56,8 +58,8 @@ class DraggableBottomSheet extends StatelessWidget { }, child: Container( height: data.value, - decoration: const BoxDecoration( - color: Colors.white, + decoration: BoxDecoration( + color: backgroundColor, borderRadius: BorderRadius.vertical(top: Radius.circular(50)), ), child: Column( From a754ac687344cc98b08214d9a7001705670e48ee Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Apr 2025 13:33:26 +0330 Subject: [PATCH 014/256] fix : onTap marker --- .../{security-time.svg => security_time.svg} | 0 ...ity-time.svg.vec => security_time.svg.vec} | Bin .../common/assets.dart/assets.dart | 4 +- .../lib/presentation/filter/view.dart | 91 ++++++++++++------ .../lib/presentation/routes/app_pages.dart | 16 +++ .../lib/presentation/routes/app_routes.dart | 1 + lib/presentation/common/assets.dart | 4 +- .../core/lib/presentation/common/assets.dart | 4 +- .../lib/presentation/widget/vec_widget.dart | 55 +++++++---- 9 files changed, 123 insertions(+), 52 deletions(-) rename assets/icons/{security-time.svg => security_time.svg} (100%) rename assets/vec/{security-time.svg.vec => security_time.svg.vec} (100%) diff --git a/assets/icons/security-time.svg b/assets/icons/security_time.svg similarity index 100% rename from assets/icons/security-time.svg rename to assets/icons/security_time.svg diff --git a/assets/vec/security-time.svg.vec b/assets/vec/security_time.svg.vec similarity index 100% rename from assets/vec/security-time.svg.vec rename to assets/vec/security_time.svg.vec diff --git a/core/lib/presentation/common/assets.dart/assets.dart b/core/lib/presentation/common/assets.dart/assets.dart index 432e743..9d075b7 100644 --- a/core/lib/presentation/common/assets.dart/assets.dart +++ b/core/lib/presentation/common/assets.dart/assets.dart @@ -16,7 +16,7 @@ class Assets { static const String iconsMessageAdd = 'assets/icons/message_add.svg'; static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; static const String iconsScan = 'assets/icons/scan.svg'; - static const String iconsSecurityTime = 'assets/icons/security-time.svg'; + static const String iconsSecurityTime = 'assets/icons/security_time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; @@ -35,7 +35,7 @@ class Assets { static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; - static const String vecSecurityTimeSvg = 'assets/vec/security-time.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index c349694..53100cb 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -4,6 +4,7 @@ import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:supervision/presentation/routes/app_routes.dart'; import 'logic.dart'; @@ -83,29 +84,26 @@ class SupervisionFilterPage extends GetView { }, ), ), - Positioned( - bottom: 0, - left: 0, - right: 0, - child: ObxValue((data) { - - return DraggableBottomSheet( - controller: data.value, - backgroundColor: controller.bottomSheetStep.value == BottomSheetStep.filter ? Colors.white : AppColor.lightGreyLight , - child: ObxValue((data) { - if (data.value == BottomSheetStep.filter) { - return filterWidget(); - } else if (data.value == BottomSheetStep.markerSelected) { - return selectedLocationWidget(); - } else if (data.value == BottomSheetStep.markerDetails) { - return markerDetailsWidget(); - } else { - return Container(height: 300, color: AppColor.blueNormal); - } - }, controller.bottomSheetStep), - ); - }, controller.sheetController), - ), + ObxValue((data) { + return DraggableBottomSheet( + controller: data.value, + backgroundColor: + controller.bottomSheetStep.value == BottomSheetStep.filter + ? Colors.white + : AppColor.lightGreyLight, + child: ObxValue((data) { + if (data.value == BottomSheetStep.filter) { + return filterWidget(); + } else if (data.value == BottomSheetStep.markerSelected) { + return selectedLocationWidget(); + } else if (data.value == BottomSheetStep.markerDetails) { + return markerDetailsWidget(); + } else { + return Container(height: 300, color: AppColor.blueNormal); + } + }, controller.bottomSheetStep), + ); + }, controller.sheetController), ], ); } @@ -113,14 +111,20 @@ class SupervisionFilterPage extends GetView { Marker markerWidget(LatLng marker) { return Marker( point: marker, - child: IconButton( - onPressed: () { + + child: GestureDetector( + onTap: () { controller.bottomSheetStep.value = BottomSheetStep.markerSelected; if (!controller.sheetController.value.isVisible.value) { controller.sheetController.value.show(); } }, - icon: Icon(Icons.location_on, color: Colors.red, size: 30), + behavior: HitTestBehavior.opaque, + child: SizedBox( + width: 36, + height: 36, + child: Icon(Icons.location_on, color: Colors.red, size: 30), + ), ), ); } @@ -134,7 +138,9 @@ class SupervisionFilterPage extends GetView { motion: StretchMotion(), children: [ CustomSlidableAction( - onPressed: (context) {}, + onPressed: (context) { + Get.toNamed(SupervisionRoutes.supervisionLocationDetails); + }, backgroundColor: AppColor.blueNormal, foregroundColor: Colors.white, padding: EdgeInsets.all(16), @@ -405,7 +411,7 @@ class SupervisionFilterPage extends GetView { return Container( clipBehavior: Clip.antiAlias, margin: EdgeInsets.all(35), - padding: EdgeInsets.symmetric(horizontal: 20,vertical: 10), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), decoration: ShapeDecoration( color: Colors.white, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), @@ -414,7 +420,8 @@ class SupervisionFilterPage extends GetView { spacing: 15, children: [ Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 12, children: [ Text( 'داود خرم پور', @@ -423,6 +430,32 @@ class SupervisionFilterPage extends GetView { color: AppColor.darkGreyDarkHover, ), ), + Spacer(), + vecWidgetWithOnTap( + assets: Assets.vecMapSvg, + onTap: () { + eLog('vecWidgetWithOnTap ==> Assets.vecMapSvg'); + Get.toNamed(SupervisionRoutes.supervisionLocationDetails); + }, + width: 24, + height: 24, + color: AppColor.blueNormal, + ), + vecWidgetWithOnTap( + assets: Assets.vecMessageAddSvg, + width: 24, + height: 24, + color: AppColor.greenNormal, + onTap: () {}, + ), + + vecWidgetWithOnTap( + assets: Assets.vecSecurityTimeSvg, + color: AppColor.warning, + height: 24, + width: 24, + onTap: () {}, + ), ], ), Container( diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index 2b44f68..78a8a11 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -1,5 +1,7 @@ import 'package:rasadyar_core/core.dart'; import 'package:supervision/presentation/filter/logic.dart'; +import 'package:supervision/presentation/location_details/logic.dart'; +import 'package:supervision/presentation/location_details/view.dart'; import 'package:supervision/presentation/root/logic.dart'; import 'package:supervision/presentation/root/view.dart'; import 'package:supervision/presentation/routes/app_routes.dart'; @@ -16,5 +18,19 @@ sealed class SupervisionPages { BindingsBuilder.put(() => SupervisionFilterLogic()), ], ), + GetPage( + name: SupervisionRoutes.supervision, + page: () => RootPage(), + bindings: [ + BindingsBuilder.put(() => RootLogic()), + BindingsBuilder.put(() => SupervisionFilterLogic()), + ], + ), + + GetPage( + name: SupervisionRoutes.supervisionLocationDetails, + page: () => LocationDetailsPage(), + bindings: [BindingsBuilder.put(() => LocationDetailsLogic())], + ), ]; } diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart index 37df78b..f5b027a 100644 --- a/features/supervision/lib/presentation/routes/app_routes.dart +++ b/features/supervision/lib/presentation/routes/app_routes.dart @@ -4,4 +4,5 @@ sealed class SupervisionRoutes { static const supervision = '/supervision'; static const supervisionAction = '/supervision/action'; static const supervisionUserSetting = '/supervision/userSettings'; + static const supervisionLocationDetails= '/supervision/locationDetails'; } diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index c51cd01..5eeb4c1 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -17,7 +17,7 @@ class Assets { static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; static const String iconsScan = 'assets/icons/scan.svg'; static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; - static const String iconsSecurityTime = 'assets/icons/security-time.svg'; + static const String iconsSecurityTime = 'assets/icons/security_time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; @@ -37,7 +37,7 @@ class Assets { static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; - static const String vecSecurityTimeSvg = 'assets/vec/security-time.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; diff --git a/packages/core/lib/presentation/common/assets.dart b/packages/core/lib/presentation/common/assets.dart index c51cd01..5eeb4c1 100644 --- a/packages/core/lib/presentation/common/assets.dart +++ b/packages/core/lib/presentation/common/assets.dart @@ -17,7 +17,7 @@ class Assets { static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; static const String iconsScan = 'assets/icons/scan.svg'; static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; - static const String iconsSecurityTime = 'assets/icons/security-time.svg'; + static const String iconsSecurityTime = 'assets/icons/security_time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; @@ -37,7 +37,7 @@ class Assets { static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; - static const String vecSecurityTimeSvg = 'assets/vec/security-time.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; diff --git a/packages/core/lib/presentation/widget/vec_widget.dart b/packages/core/lib/presentation/widget/vec_widget.dart index 3fb78f1..4a1c313 100644 --- a/packages/core/lib/presentation/widget/vec_widget.dart +++ b/packages/core/lib/presentation/widget/vec_widget.dart @@ -19,31 +19,51 @@ SvgPicture vecWidget( ); } +Widget vecWidgetWithOnTap({ + required String assets, + required VoidCallback onTap, + double? width, + double? height, + BoxFit? fit, + Color? color, +}) { + return InkWell( + onTap: onTap, + child: SvgPicture( + AssetBytesLoader(assets), + width: width, + height: height, + fit: fit ?? BoxFit.contain, + colorFilter: + color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, + ), + ); +} + SvgPicture svgWidget( - String assets, { - double? width, - double? height, - BoxFit? fit, - Color? color, - }) { + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, +}) { return SvgPicture.asset( assets, width: width, height: height, fit: fit ?? BoxFit.contain, colorFilter: - color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, + color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, ); } - Widget vecWidget2( - String assets, { - double? width, - double? height, - BoxFit? fit, - Color? color, - }) { + String assets, { + double? width, + double? height, + BoxFit? fit, + Color? color, +}) { final resolvedColor = WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.pressed)) { return Colors.white; @@ -58,9 +78,10 @@ Widget vecWidget2( width: width, height: height, fit: fit ?? BoxFit.contain, - colorFilter: resolvedColor != null - ? ColorFilter.mode(resolvedColor, BlendMode.srcIn) - : null, + colorFilter: + resolvedColor != null + ? ColorFilter.mode(resolvedColor, BlendMode.srcIn) + : null, ), ); } From 63395c557b828da1c701bca2e99960609f2af359 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Apr 2025 17:27:48 +0330 Subject: [PATCH 015/256] feat : location details --- assets/icons/calendar.svg | 16 ++ .../presentation/location_details/logic.dart | 34 +++ .../presentation/location_details/view.dart | 245 ++++++++++++++++++ lib/main.dart | 1 - lib/presentation/common/assets.dart | 1 + lib/presentation/routes/app_pages.dart | 3 + lib/presentation/routes/app_paths.dart | 1 + .../widget/buttons/outline_elevated_icon.dart | 103 ++++++++ lib/presentation/widget/vec_widget.dart | 67 +++++ .../widget/buttons/outline_elevated.dart | 10 +- .../widget/buttons/outline_elevated_icon.dart | 132 ++++++++++ .../lib/presentation/widget/vec_widget.dart | 3 + .../core/lib/presentation/widget/widget.dart | 3 + 13 files changed, 614 insertions(+), 5 deletions(-) create mode 100644 assets/icons/calendar.svg create mode 100644 features/supervision/lib/presentation/location_details/logic.dart create mode 100644 features/supervision/lib/presentation/location_details/view.dart create mode 100644 lib/presentation/widget/buttons/outline_elevated_icon.dart create mode 100644 packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart diff --git a/assets/icons/calendar.svg b/assets/icons/calendar.svg new file mode 100644 index 0000000..2b55ed8 --- /dev/null +++ b/assets/icons/calendar.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/features/supervision/lib/presentation/location_details/logic.dart b/features/supervision/lib/presentation/location_details/logic.dart new file mode 100644 index 0000000..bc0a16e --- /dev/null +++ b/features/supervision/lib/presentation/location_details/logic.dart @@ -0,0 +1,34 @@ +import 'package:flutter/cupertino.dart'; +import 'package:rasadyar_core/core.dart'; + +class LocationDetailsLogic extends GetxController { + RxInt selectedSegment = 0.obs; + + // The data for the segments + final Map segments = { + 0: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(50)), + child: Text('همه', style: AppFonts.yekan13), + ), + 1: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(50)), + child: Text('بر اساس تاریخ', style: AppFonts.yekan13), + ), + }; + + RxBool seletected = false.obs; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/features/supervision/lib/presentation/location_details/view.dart b/features/supervision/lib/presentation/location_details/view.dart new file mode 100644 index 0000000..8b30656 --- /dev/null +++ b/features/supervision/lib/presentation/location_details/view.dart @@ -0,0 +1,245 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/utils/color_utils.dart'; +import 'package:rasadyar_core/presentation/widget/tabs/new_tab.dart'; + +import 'logic.dart'; + +class LocationDetailsPage extends GetView { + const LocationDetailsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + actions: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: IconButton( + onPressed: () { + Get.back(); + }, + icon: Icon(CupertinoIcons.chevron_back), + color: AppColor.blueNormal, + ), + ), + ], + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 22), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + headerInfo(description: 'ایداگل محمدی', title: 'نام مالک'), + + headerInfo( + description: '09415115545', + title: 'شماره همراه', + background: AppColor.green1Light, + ), + + headerInfo(description: '183کیلوگرم', title: 'موجودی'), + ], + ), + ), + + Padding( + padding: const EdgeInsets.fromLTRB(22, 13, 22, 4), + child: Text( + 'نوع دریافت', + textAlign: TextAlign.center, + style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), + ), + ), + + ObxValue((data) { + return NewCupertinoSegmentedControl( + padding: EdgeInsetsDirectional.symmetric( + horizontal: 20, + vertical: 10, + ), + children: controller.segments, + groupValue: data.value, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + data.value = value; + }, + ); + }, controller.selectedSegment), + Container( + height: 32, + margin: EdgeInsets.only(top: 10, left: 22, right: 22), + + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 10, + children: [ + Expanded( + child: ROutlinedElevatedIcon( + icon: Icon(Icons.calendar_month), + onPressed: () {}, + text: 'از تاریخ', + textStyle: AppFonts.yekan16.copyWith( + color: AppColor.blueNormal, + ), + ), + ), + Expanded( + child: ROutlinedElevatedIcon( + icon: Icon(Icons.calendar_month), + onPressed: () {}, + text: 'تا تاریخ', + textStyle: AppFonts.yekan16.copyWith( + color: AppColor.blueNormal, + ), + ), + ), + ], + ), + ), + SizedBox(height: 20), + Row( + children: [ + Expanded(child: Divider()), + Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 6), + margin: EdgeInsets.symmetric(horizontal: 2), + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: AppColor.blueNormal.disabledColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(60), + ), + ), + child: Text( + 'تعداد کل تراکنش ها : 0', + textAlign: TextAlign.center, + style: AppFonts.yekan10, + ), + ), + Expanded(child: Divider()), + ], + ), + + Expanded( + child: GridView.builder( + itemCount: 50, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.fromLTRB(20, 14, 20, 50), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 8, + mainAxisSpacing: 8, + ), + itemBuilder: + (context, index) => Container( + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: const Color(0xFFEFEFEF), + ), + borderRadius: BorderRadius.circular(16), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 22, + vertical: 25, + ), + child: Column( + spacing: 6, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + '${index + 1}- تراکنش موفق', + textAlign: TextAlign.center, + style: AppFonts.yekan10, + ), + SizedBox(height: 2), + Text( + '1043/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan12, + ), + + Text( + 'محصول : مرغ', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.lightGreyNormalActive, + ), + ), + Text( + 'وزن : 5555 گرم', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.lightGreyNormalActive, + ), + ), + Text( + 'مبلغ : 14،000،000', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.lightGreyNormalActive, + ), + ), + + Text( + 'سرویس سامان کیش', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + ); + } + + Container headerInfo({ + required String title, + required String description, + Color? background, + }) { + return Container( + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: ShapeDecoration( + color: background ?? AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blackLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + alignment: AlignmentDirectional.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 10, + children: [ + Text(title, style: AppFonts.yekan10), + + Text(description, style: AppFonts.yekan12), + ], + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 5163177..0839833 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rasadyar_app/domain/service/user/user_service.dart'; -import 'package:rasadyar_app/infrastructure/di/di.dart'; import 'package:rasadyar_app/presentation/common/app_color.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_core/infrastructure/di/di.dart'; diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index 5eeb4c1..0859799 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -5,6 +5,7 @@ class Assets { static const String iconsAdd = 'assets/icons/add.svg'; static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsCalendar = 'assets/icons/calendar.svg'; static const String iconsCall = 'assets/icons/call.svg'; static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index f7f0771..e3b62ae 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -3,6 +3,7 @@ import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logi import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; import 'package:rasadyar_app/presentation/pages/splash/view.dart'; +import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; import 'package:supervision/supervision.dart'; part 'app_paths.dart'; @@ -11,8 +12,10 @@ sealed class AppPages { AppPages._(); static const String initRoutes = AppPaths.splash; + static const String initDesignSystem = AppPaths.systemDesignPage; static List pages = [ + GetPage(name: AppPaths.systemDesignPage, page: () => SystemDesignPage()), GetPage( name: AppPaths.splash, page: () => SplashPage(), diff --git a/lib/presentation/routes/app_paths.dart b/lib/presentation/routes/app_paths.dart index dd68834..f6fde78 100644 --- a/lib/presentation/routes/app_paths.dart +++ b/lib/presentation/routes/app_paths.dart @@ -6,4 +6,5 @@ sealed class AppPaths { static const String splash = '/splash'; static const String authWithUserAndPass = '/authWithUserAndPass'; static const String authWithOtp = '/authWithOtp'; + static const String systemDesignPage = '/systemDesignPage'; } diff --git a/lib/presentation/widget/buttons/outline_elevated_icon.dart b/lib/presentation/widget/buttons/outline_elevated_icon.dart new file mode 100644 index 0000000..8753779 --- /dev/null +++ b/lib/presentation/widget/buttons/outline_elevated_icon.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; +import 'package:rasadyar_app/presentation/common/app_fonts.dart'; +import 'package:rasadyar_app/presentation/utils/color_utils.dart'; + +class ROutlinedElevatedIcon extends StatefulWidget { + ROutlinedElevatedIcon({ + super.key, + required this.text, + required this.onPressed, + this.foregroundColor, + this.backgroundColor, + this.borderColor, + this.disabledBackgroundColor, + this.pressedBackgroundColor, + this.radius, + this.textStyle, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + + Color? borderColor; + + Color? disabledBackgroundColor; + Color? pressedBackgroundColor; + double? radius; + TextStyle? textStyle; + Widget? icon; + + @override + State createState() => _ROutlinedElevatedStateIcon(); +} + +class _ROutlinedElevatedStateIcon extends State { + @override + Widget build(BuildContext context) { + return OutlinedButton.icon( + icon: widget.icon, + label: Text(widget.text), + onPressed: widget.onPressed, + style: ButtonStyle( + side: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + } else if (states.contains(WidgetState.disabled)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), + width: 2, + ); + } + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + if (widget.pressedBackgroundColor != null) { + return widget.pressedBackgroundColor; + } + return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.hoverColor ?? + AppColor.blueNormal.hoverColor; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor?.disabledColor ?? Colors.transparent; + } + return widget.backgroundColor; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return AppColor.blueNormal.withAlpha(38); + } + return AppColor.blueNormal; + }), + + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + ), + fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + textStyle: WidgetStatePropertyAll( + widget.textStyle ?? + AppFonts.yekan24.copyWith(color: AppColor.blueNormal), + ), + ), + ); + } +} diff --git a/lib/presentation/widget/vec_widget.dart b/lib/presentation/widget/vec_widget.dart index 3fb78f1..a85e527 100644 --- a/lib/presentation/widget/vec_widget.dart +++ b/lib/presentation/widget/vec_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:rasadyar_app/presentation/common/app_color.dart'; import 'package:vector_graphics/vector_graphics.dart'; SvgPicture vecWidget( @@ -64,3 +65,69 @@ Widget vecWidget2( ), ); } + + +class ColoredSvgButton extends StatefulWidget { + final String svgPath; + final String text; + final VoidCallback? onPressed; + + const ColoredSvgButton({ + required this.svgPath, + required this.text, + this.onPressed, + super.key, + }); + + @override + State createState() => _ColoredSvgButtonState(); +} + +class _ColoredSvgButtonState extends State { + bool _isPressed = false; + bool _isHovered = false; + + Color _getIconColor() { + if (_isPressed) return Colors.white; + if (_isHovered) return AppColor.blueNormal.withAlpha(50); + return AppColor.blueNormal; + } + + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: (_) => setState(() => _isHovered = true), + onExit: (_) => setState(() { + _isHovered = false; + _isPressed = false; + }), + child: GestureDetector( + onTapDown: (_) => setState(() => _isPressed = true), + onTapUp: (_) => setState(() => _isPressed = false), + onTapCancel: () => setState(() => _isPressed = false), + child: OutlinedButton.icon( + icon: SvgPicture.asset( + widget.svgPath, + width: 24, + height: 24, + color: _getIconColor(), + ), + label: Text(widget.text), + onPressed: widget.onPressed, + style: OutlinedButton.styleFrom( + side: BorderSide( + color: AppColor.blueNormal, + width: 2, + ), + foregroundColor: AppColor.blueNormal, + backgroundColor: _isPressed ? AppColor.blueNormal : null, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + ), + ), + ); + } +} + diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart index a4b2806..3663161 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart @@ -6,8 +6,8 @@ import 'package:rasadyar_core/presentation/utils/color_utils.dart'; class ROutlinedElevated extends StatefulWidget { ROutlinedElevated({ super.key, - required this.text, - required this.onPressed, + this.text, + this.onPressed, this.foregroundColor, this.backgroundColor, this.borderColor, @@ -15,11 +15,12 @@ class ROutlinedElevated extends StatefulWidget { this.pressedBackgroundColor, this.radius, this.textStyle, + this.child, this.width = 150.0, this.height = 56.0, }); - final String text; + final String? text; final VoidCallback? onPressed; final double width; final double height; @@ -32,6 +33,7 @@ class ROutlinedElevated extends StatefulWidget { Color? pressedBackgroundColor; double? radius; TextStyle? textStyle; + Widget? child; @override State createState() => _ROutlinedElevatedState(); @@ -95,7 +97,7 @@ class _ROutlinedElevatedState extends State { AppFonts.yekan24.copyWith(color: AppColor.blueNormal), ), ), - child: Text(widget.text), + child: widget.child ?? Text(widget.text!, style: widget.textStyle), ); } } diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart new file mode 100644 index 0000000..2503575 --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; +import 'package:rasadyar_core/presentation/utils/color_utils.dart'; + +class ROutlinedElevatedIcon extends StatefulWidget { + ROutlinedElevatedIcon({ + super.key, + required this.text, + required this.onPressed, + this.foregroundColor, + this.backgroundColor, + this.borderColor, + this.disabledBackgroundColor, + this.pressedBackgroundColor, + this.radius, + this.textStyle, + this.icon, + this.width = 150.0, + this.height = 56.0, + }); + + final String text; + final VoidCallback? onPressed; + final double width; + final double height; + Color? foregroundColor; + Color? backgroundColor; + Color? borderColor; + Color? disabledBackgroundColor; + Color? pressedBackgroundColor; + double? radius; + TextStyle? textStyle; + Widget? icon; + + @override + State createState() => _ROutlinedElevatedStateIcon(); +} + +class _ROutlinedElevatedStateIcon extends State { + @override + Widget build(BuildContext context) { + return OutlinedButton.icon( + icon: widget.icon, + label: Text(widget.text), + onPressed: () {}, + style: ButtonStyle( + side: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + } else if (states.contains(WidgetState.disabled)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), + width: 2, + ); + } + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal, + width: 2, + ); + }), + iconColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return widget.foregroundColor?.disabledColor ?? + AppColor.blueNormal.withAlpha(38); + } else if (states.contains(WidgetState.hovered)) { + return widget.foregroundColor?.hoverColor ?? + AppColor.blueNormal.withAlpha(50); + } + return widget.foregroundColor ?? AppColor.blueNormal; + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + if (widget.pressedBackgroundColor != null) { + return widget.pressedBackgroundColor; + } + return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.hoverColor ?? + AppColor.blueNormal.hoverColor; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor?.disabledColor ?? Colors.transparent; + } + return widget.backgroundColor; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return widget.foregroundColor?.disabledColor ?? + AppColor.blueNormal.withAlpha(38); + } else if (states.contains(WidgetState.hovered)) { + return widget.foregroundColor?.hoverColor ?? + AppColor.blueNormal.withAlpha(50); + } + return widget.foregroundColor ?? AppColor.blueNormal; + }), + shape: WidgetStatePropertyAll( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(widget.radius ?? 8), + ), + ), + fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + textStyle: WidgetStatePropertyAll( + widget.textStyle ?? + AppFonts.yekan24.copyWith(color: AppColor.blueNormal), + ), + ), + ); + } +} + +Color? _getIconColor(BuildContext context) { + var ss =WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return Colors.grey.withAlpha(38); + } else if (states.contains(WidgetState.hovered)) { + return Colors.blue.withAlpha(50); + } + return Colors.blue; + }).resolve({}); + fLog(ss); + return ss; +} diff --git a/packages/core/lib/presentation/widget/vec_widget.dart b/packages/core/lib/presentation/widget/vec_widget.dart index 4a1c313..4bf8b36 100644 --- a/packages/core/lib/presentation/widget/vec_widget.dart +++ b/packages/core/lib/presentation/widget/vec_widget.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/utils/color_utils.dart'; import 'package:vector_graphics/vector_graphics.dart'; SvgPicture vecWidget( @@ -85,3 +87,4 @@ Widget vecWidget2( ), ); } + diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 076a534..22fb4a5 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -2,3 +2,6 @@ export 'vec_widget.dart'; export 'bottom_navigation/bottom_navigation_1.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; +export 'buttons/outline_elevated_icon.dart'; +export 'buttons/outline_elevated.dart'; + From ebfbaf012609018cc92bbd1a9dc69973339f0666 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Apr 2025 10:10:02 +0330 Subject: [PATCH 016/256] chore : check debug mode --- packages/core/lib/data/utils.dart | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/data/utils.dart b/packages/core/lib/data/utils.dart index fbaf1a8..c7a1250 100644 --- a/packages/core/lib/data/utils.dart +++ b/packages/core/lib/data/utils.dart @@ -1,22 +1,37 @@ +import 'package:flutter/foundation.dart'; import 'package:logger/logger.dart'; import 'package:rasadyar_core/infrastructure/di/di.dart'; void iLog(dynamic message) { - di.get().i(message.toString()); + if(kDebugMode){ + di.get().i(message.toString()); + } } void eLog(dynamic message) { + if(kDebugMode){ di.get().e(message.toString()); + } } + void dLog(dynamic message) { + if(kDebugMode){ di.get().d(message.toString()); + } } -void fLog(dynamic message) { + +void fLog(dynamic message){ + if(kDebugMode){ di.get().f(message.toString()); + } } + void tLog(dynamic message) { + if(kDebugMode){ di.get().t(message.toString()); + } } + From 363d83430c07aa0f30ffdaf6d71187c148c4b8f8 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Apr 2025 15:15:45 +0330 Subject: [PATCH 017/256] feat : app bar widget --- .../widget/app_bar/r_app_bar.dart | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 packages/core/lib/presentation/widget/app_bar/r_app_bar.dart diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart new file mode 100644 index 0000000..df1a0b9 --- /dev/null +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -0,0 +1,53 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +class RAppBar extends StatelessWidget implements PreferredSizeWidget { + final String title; + final Color backgroundColor; + final Color iconColor; + final TextStyle? titleTextStyle; + final VoidCallback? onBackPressed; + final List? additionalActions; + + const RAppBar({ + super.key, + required this.title, + this.backgroundColor = AppColor.lightGreyLight, + this.iconColor = AppColor.blueNormal, + this.titleTextStyle, + this.onBackPressed, + this.additionalActions, + }); + + @override + Widget build(BuildContext context) { + return AppBar( + automaticallyImplyLeading: false, + backgroundColor: backgroundColor, + elevation: 0, + excludeHeaderSemantics: true, + scrolledUnderElevation: 0, + titleTextStyle: + titleTextStyle ?? + AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + title: Text(title), + actions: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: IconButton( + onPressed: onBackPressed ?? () => Get.back(), + icon: const Icon(CupertinoIcons.chevron_back), + color: iconColor, + ), + ), + if (additionalActions != null) ...additionalActions!, + ], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} From 75903650b88958aa4c14b2d8fa390ae03acc2753 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Apr 2025 15:16:25 +0330 Subject: [PATCH 018/256] fix : bottom sheet draggable --- .../draggable_bottom_sheet.dart | 3 +- .../draggable_bottom_sheet_controller.dart | 54 ++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart index 90e8b3d..ed56eba 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rasadyar_core/data/utils.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; class DraggableBottomSheet extends StatelessWidget { @@ -17,7 +18,7 @@ class DraggableBottomSheet extends StatelessWidget { super.key, this.controller, this.isVisible = false, - this.backgroundColor = Colors.white, + this.backgroundColor = AppColor.lightGreyNormal, this.initialHeight = 200, this.minHeight = 0, this.maxHeight = 700, diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart index e42138e..8c57cdf 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart @@ -1,6 +1,12 @@ +import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:rasadyar_core/core.dart'; +import 'draggable_bottom_sheet.dart'; class DraggableBottomSheetController extends GetxController { + final RxList bottomSheets = + [].obs; + // Observable variables final RxBool isVisible = false.obs; final RxDouble currentHeight = 200.0.obs; @@ -17,7 +23,7 @@ class DraggableBottomSheetController extends GetxController { this.maxHeight = 700, }) { isVisible.value = initialVisibility; - currentHeight.value = 0; + currentHeight.value = initialHeight; } // Show the bottom sheet @@ -72,4 +78,50 @@ class DraggableBottomSheetController extends GetxController { void collapse() { currentHeight.value = minHeight; } + + void addBottomSheet({ + required Widget child, + required double initHeight, + required double maxHeight, + required double minHeight, + }) { + final controller = DraggableBottomSheetController( + initialVisibility: true, + initialHeight: initHeight, + minHeight: minHeight, + maxHeight: maxHeight, + ); + + final bottomSheet = DraggableBottomSheet( + controller: controller, + backgroundColor: AppColor.lightGreyLightActive, + child: child, + ); + if (bottomSheets.isNotEmpty) { + bottomSheets.removeLast(); + } + + bottomSheets.add(bottomSheet); + } + + void removeLastBottomSheet() { + if (bottomSheets.isNotEmpty) { + bottomSheets.last.controller?.hide(); + Future.delayed(Duration(milliseconds: 200), () { + bottomSheets.removeLast(); + if(bottomSheets.isNotEmpty){ + bottomSheets.last.controller?.show(); + } + + }); + } + } + + bool handleBack() { + if (bottomSheets.isNotEmpty) { + removeLastBottomSheet(); + return true; + } + return false; + } } From 9188bf871fb48fe8b5e6da55dd17c3ca085ddd4e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Apr 2025 15:16:47 +0330 Subject: [PATCH 019/256] chore : font awesome --- features/supervision/pubspec.lock | 8 ++++++++ packages/core/pubspec.lock | 8 ++++++++ packages/core/pubspec.yaml | 1 + pubspec.lock | 8 ++++++++ 4 files changed, 25 insertions(+) diff --git a/features/supervision/pubspec.lock b/features/supervision/pubspec.lock index ad08c3e..24150a4 100644 --- a/features/supervision/pubspec.lock +++ b/features/supervision/pubspec.lock @@ -131,6 +131,14 @@ packages: description: flutter source: sdk version: "0.0.0" + font_awesome_flutter: + dependency: transitive + description: + name: font_awesome_flutter + sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a + url: "https://pub.dev" + source: hosted + version: "10.8.0" freezed_annotation: dependency: transitive description: diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index e6df05c..a78dfca 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -256,6 +256,14 @@ packages: description: flutter source: sdk version: "0.0.0" + font_awesome_flutter: + dependency: "direct main" + description: + name: font_awesome_flutter + sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a + url: "https://pub.dev" + source: hosted + version: "10.8.0" freezed: dependency: "direct dev" description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index d46e2e5..4e46e52 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: #SVG flutter_svg: ^2.0.17 + font_awesome_flutter: ^10.8.0 ##state manger get: ^4.7.2 diff --git a/pubspec.lock b/pubspec.lock index 29b58c7..106e938 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -280,6 +280,14 @@ packages: description: flutter source: sdk version: "0.0.0" + font_awesome_flutter: + dependency: transitive + description: + name: font_awesome_flutter + sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a + url: "https://pub.dev" + source: hosted + version: "10.8.0" freezed: dependency: "direct dev" description: From 8f93a5c89334164c4a93664e3e9ee610ee9a5651 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Apr 2025 15:17:17 +0330 Subject: [PATCH 020/256] feat : new logic --- .../lib/presentation/filter/logic.dart | 24 +- .../lib/presentation/filter/view.dart | 279 ++++++++++-------- .../presentation/location_details/view.dart | 25 +- .../lib/presentation/routes/app_pages.dart | 17 +- packages/core/lib/core.dart | 3 + .../core/lib/presentation/widget/widget.dart | 1 + 6 files changed, 191 insertions(+), 158 deletions(-) diff --git a/features/supervision/lib/presentation/filter/logic.dart b/features/supervision/lib/presentation/filter/logic.dart index 61626f7..55b7f5a 100644 --- a/features/supervision/lib/presentation/filter/logic.dart +++ b/features/supervision/lib/presentation/filter/logic.dart @@ -6,7 +6,6 @@ import 'package:flutter_map_animations/flutter_map_animations.dart'; import 'package:geolocator/geolocator.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; import 'package:supervision/data/utils/marker_generator.dart'; enum BottomSheetStep { filter, markerSelected, markerDetails } @@ -21,8 +20,10 @@ class SupervisionFilterLogic extends GetxController RxInt filterIndex = 0.obs; RxInt showIndex = 0.obs; + bool showSlideHint = true; Rx bottomSheetStep = BottomSheetStep.filter.obs; + late Rx slidController; Rx mapController = MapController().obs; late final AnimatedMapController animatedMapController; @@ -113,8 +114,10 @@ class SupervisionFilterLogic extends GetxController maxHeight: 600, ).obs; - bottomSheetStep.listen((data) { - tLog('1 bottomSheetStep -> ${data.name}'); + slidController = SlidableController(this).obs; + + /*bottomSheetStep.listen((data) { + tLog('1 bottomSheetStep -> ${data.nme}'); if (data == BottomSheetStep.filter) { sheetController.value = DraggableBottomSheetController( initialVisibility: true, @@ -143,9 +146,7 @@ class SupervisionFilterLogic extends GetxController sheetController.refresh(); sheetController.value.toggle(); - }); - - + });*/ } @override @@ -153,8 +154,19 @@ class SupervisionFilterLogic extends GetxController super.onReady(); determineCurrentPosition(); generatedMarkers(); + } + Future triggerSlidableAnimation() async { + await Future.delayed(Duration(milliseconds: 200)); + await slidController.value.openEndActionPane(); + await Future.delayed(Duration(milliseconds: 200)); + await slidController.value.close(); + showSlideHint = !showSlideHint; + } + + + @override void onClose() { // TODO: implement onClose diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 53100cb..932f5d7 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -4,6 +4,7 @@ import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:supervision/presentation/location_details/view.dart'; import 'package:supervision/presentation/routes/app_routes.dart'; import 'logic.dart'; @@ -23,88 +24,110 @@ class SupervisionFilterPage extends GetView { @override Widget build(BuildContext context) { - return Stack( - children: [ - ObxValue((currentLocation) { - return FlutterMap( - mapController: controller.animatedMapController.mapController, - options: MapOptions( - initialCenter: currentLocation.value, - initialZoom: 18, - onPositionChanged: (camera, hasGesture) { - controller.debouncedUpdateVisibleMarkers(center: camera.center); + return PopScope( + canPop: controller.sheetController.value.handleBack(), + onPopInvokedWithResult: (didPop, result) { + if (!didPop && + controller.sheetController.value.bottomSheets.isNotEmpty) { + controller.sheetController.value.removeLastBottomSheet(); + } + }, + child: Stack( + children: [ + ObxValue((currentLocation) { + return FlutterMap( + mapController: controller.animatedMapController.mapController, + options: MapOptions( + initialCenter: currentLocation.value, + initialZoom: 18, + onPositionChanged: (camera, hasGesture) { + controller.debouncedUpdateVisibleMarkers( + center: camera.center, + ); + }, + ), + children: [ + TileLayer( + urlTemplate: + "https://map.ir/shiveh/xyz/1.0.0/Shiveh:Shiveh@EPSG:3857@png/{z}/{x}/{y}.png" + "?x-api-key=$token", + ), + + ObxValue((markers) { + return MarkerLayer( + markers: + markers.map((marker) => markerWidget(marker)).toList(), + ); + }, controller.markers), + ], + ); + }, controller.currentLocation), + + Positioned( + right: 10, + bottom: 150, + child: ObxValue((data) { + return RFab.small( + backgroundColor: AppColor.greenNormal, + isLoading: data.value, + icon: vecWidget(Assets.vecGpsSvg), + onPressed: () { + controller.isLoading.value = true; + controller.determineCurrentPosition().then( + (value) => + controller.isLoading.value = + !controller.isLoading.value, + ); + }, + ); + }, controller.isLoading), + ), + Positioned( + right: 10, + bottom: 100, + child: RFab.small( + backgroundColor: AppColor.blueNormal, + icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), + onPressed: () { + if (controller.bottomSheetStep.value != + BottomSheetStep.filter) { + controller.bottomSheetStep.value = BottomSheetStep.filter; + } + controller.sheetController.value.toggle(); }, ), - children: [ - TileLayer( - urlTemplate: - "https://map.ir/shiveh/xyz/1.0.0/Shiveh:Shiveh@EPSG:3857@png/{z}/{x}/{y}.png" - "?x-api-key=$token", - ), - - ObxValue((markers) { - return MarkerLayer( - markers: - markers.map((marker) => markerWidget(marker)).toList(), - ); - }, controller.markers), - ], - ); - }, controller.currentLocation), - - Positioned( - right: 10, - bottom: 150, - child: ObxValue((data) { - return RFab.small( - backgroundColor: AppColor.greenNormal, - isLoading: data.value, - icon: vecWidget(Assets.vecGpsSvg), - onPressed: () { - controller.isLoading.value = true; - controller.determineCurrentPosition().then( - (value) => - controller.isLoading.value = !controller.isLoading.value, - ); - }, - ); - }, controller.isLoading), - ), - Positioned( - right: 10, - bottom: 100, - child: RFab.small( - backgroundColor: AppColor.blueNormal, - icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), - onPressed: () { - if (controller.bottomSheetStep.value != BottomSheetStep.filter) { - controller.bottomSheetStep.value = BottomSheetStep.filter; - } - controller.sheetController.value.toggle(); - }, ), - ), - ObxValue((data) { - return DraggableBottomSheet( - controller: data.value, - backgroundColor: - controller.bottomSheetStep.value == BottomSheetStep.filter - ? Colors.white - : AppColor.lightGreyLight, - child: ObxValue((data) { - if (data.value == BottomSheetStep.filter) { - return filterWidget(); - } else if (data.value == BottomSheetStep.markerSelected) { - return selectedLocationWidget(); - } else if (data.value == BottomSheetStep.markerDetails) { - return markerDetailsWidget(); - } else { - return Container(height: 300, color: AppColor.blueNormal); - } - }, controller.bottomSheetStep), - ); - }, controller.sheetController), - ], + Obx( + () => Stack( + children: + controller.sheetController.value.bottomSheets + .map((sheet) => sheet) + .toList(), + ), + ), + + /* ObxValue((data) { + return DraggableBottomSheet( + controller: data.value, + backgroundColor: + controller.bottomSheetStep.value == BottomSheetStep.filter + ? Colors.white + : AppColor.lightGreyLight, + child: ObxValue((data) { + if (data.value == BottomSheetStep.filter) { + return filterWidget(); + } else if (data.value == BottomSheetStep.markerSelected) { + return selectedLocationWidget(); + } else if (data.value == BottomSheetStep.markerDetails) { + return markerDetailsWidget(); + } else { + return Container(height: 300, color: AppColor.blueNormal); + } + }, controller.bottomSheetStep), + ); + }, controller.sheetController),*/ + ], + ), ); } @@ -114,10 +137,12 @@ class SupervisionFilterPage extends GetView { child: GestureDetector( onTap: () { - controller.bottomSheetStep.value = BottomSheetStep.markerSelected; - if (!controller.sheetController.value.isVisible.value) { - controller.sheetController.value.show(); - } + controller.sheetController.value.addBottomSheet( + child: selectedLocationWidget(), + minHeight: 0, + maxHeight: 250, + initHeight: 250, + ); }, behavior: HitTestBehavior.opaque, child: SizedBox( @@ -130,10 +155,15 @@ class SupervisionFilterPage extends GetView { } Widget selectedLocationWidget() { + if (controller.showSlideHint) { + controller.triggerSlidableAnimation(); + } + return Padding( padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), child: Slidable( - key: Key('item'), + key: Key('selectedLocationWidget'), + controller: controller.slidController.value, endActionPane: ActionPane( motion: StretchMotion(), children: [ @@ -151,7 +181,14 @@ class SupervisionFilterPage extends GetView { child: vecWidget(Assets.vecMapSvg, width: 24, height: 24), ), CustomSlidableAction( - onPressed: (context) {}, + onPressed: (context) { + controller.sheetController.value.addBottomSheet( + child: LocationDetailsPage(), + initHeight: 500, + maxHeight: Get.height * 2, + minHeight: 0, + ); + }, backgroundColor: AppColor.greenNormal, padding: EdgeInsets.all(16), child: vecWidget(Assets.vecMessageAddSvg), @@ -170,10 +207,12 @@ class SupervisionFilterPage extends GetView { ), child: GestureDetector( onTap: () { - controller.bottomSheetStep.value = BottomSheetStep.markerDetails; - if (!controller.sheetController.value.isVisible.value) { - controller.sheetController.value.show(); - } + controller.sheetController.value.addBottomSheet( + child: markerDetailsWidget(), + minHeight: 0, + maxHeight: Get.height * 0.65, + initHeight: Get.height * 0.6, + ); }, child: Container( height: 58, @@ -581,37 +620,37 @@ class SupervisionFilterPage extends GetView { ), ); } -} -Widget customChip({ - bool isSelected = false, - required String title, - required int index, - required Function(int) onTap, -}) { - return GestureDetector( - onTap: () { - onTap.call(index); - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, - borderRadius: BorderRadius.circular(8), - border: - isSelected - ? Border.fromBorderSide(BorderSide.none) - : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + Widget customChip({ + bool isSelected = false, + required String title, + required int index, + required Function(int) onTap, + }) { + return GestureDetector( + onTap: () { + onTap.call(index); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, + borderRadius: BorderRadius.circular(8), + border: + isSelected + ? Border.fromBorderSide(BorderSide.none) + : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + ), + child: Text( + title, + textAlign: TextAlign.center, + style: + isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) + : AppFonts.yekan10, + ), ), - child: Text( - title, - textAlign: TextAlign.center, - style: - isSelected - ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) - : AppFonts.yekan10, - ), - ), - ); + ); + } } diff --git a/features/supervision/lib/presentation/location_details/view.dart b/features/supervision/lib/presentation/location_details/view.dart index 8b30656..6b19305 100644 --- a/features/supervision/lib/presentation/location_details/view.dart +++ b/features/supervision/lib/presentation/location_details/view.dart @@ -1,9 +1,7 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/utils/color_utils.dart'; import 'package:rasadyar_core/presentation/widget/tabs/new_tab.dart'; - import 'logic.dart'; class LocationDetailsPage extends GetView { @@ -12,21 +10,8 @@ class LocationDetailsPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - actions: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: IconButton( - onPressed: () { - Get.back(); - }, - icon: Icon(CupertinoIcons.chevron_back), - color: AppColor.blueNormal, - ), - ), - ], - ), + backgroundColor: AppColor.lightGreyLight, + appBar: RAppBar(title: 'جزئیات محل'), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -84,7 +69,7 @@ class LocationDetailsPage extends GetView { children: [ Expanded( child: ROutlinedElevatedIcon( - icon: Icon(Icons.calendar_month), + icon: FaIcon(FontAwesomeIcons.calendar), onPressed: () {}, text: 'از تاریخ', textStyle: AppFonts.yekan16.copyWith( @@ -94,7 +79,7 @@ class LocationDetailsPage extends GetView { ), Expanded( child: ROutlinedElevatedIcon( - icon: Icon(Icons.calendar_month), + icon: FaIcon(FontAwesomeIcons.calendar), onPressed: () {}, text: 'تا تاریخ', textStyle: AppFonts.yekan16.copyWith( @@ -131,7 +116,7 @@ class LocationDetailsPage extends GetView { Expanded( child: GridView.builder( - itemCount: 50, + itemCount: 51, physics: BouncingScrollPhysics(), padding: EdgeInsets.fromLTRB(20, 14, 20, 50), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index 78a8a11..590f04b 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -13,18 +13,11 @@ sealed class SupervisionPages { GetPage( name: SupervisionRoutes.supervision, page: () => RootPage(), - bindings: [ - BindingsBuilder.put(() => RootLogic()), - BindingsBuilder.put(() => SupervisionFilterLogic()), - ], - ), - GetPage( - name: SupervisionRoutes.supervision, - page: () => RootPage(), - bindings: [ - BindingsBuilder.put(() => RootLogic()), - BindingsBuilder.put(() => SupervisionFilterLogic()), - ], + binding: BindingsBuilder(() { + Get.put(RootLogic()); + Get.put(SupervisionFilterLogic()); + Get.lazyPut(() => LocationDetailsLogic(), fenix: true); + }), ), GetPage( diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 6359f17..5388a48 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -4,6 +4,9 @@ export 'package:get/get.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; + +//other packages export 'package:flutter_slidable/flutter_slidable.dart'; +export 'package:font_awesome_flutter/font_awesome_flutter.dart'; diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 22fb4a5..ec3894b 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -4,4 +4,5 @@ export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; export 'buttons/outline_elevated_icon.dart'; export 'buttons/outline_elevated.dart'; +export 'app_bar/r_app_bar.dart'; From a413aa47ea2404a05e57c56a317ceb4ec677328e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Apr 2025 15:53:58 +0330 Subject: [PATCH 021/256] feat : add supervision --- .../presentation/add_supervision/logic.dart | 34 ++++++++++ .../presentation/add_supervision/view.dart | 62 +++++++++++++++++++ .../lib/presentation/filter/view.dart | 5 +- .../lib/presentation/routes/app_pages.dart | 8 +++ .../lib/presentation/routes/app_routes.dart | 8 ++- .../widget/app_bar/r_app_bar.dart | 7 +++ 6 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 features/supervision/lib/presentation/add_supervision/logic.dart create mode 100644 features/supervision/lib/presentation/add_supervision/view.dart diff --git a/features/supervision/lib/presentation/add_supervision/logic.dart b/features/supervision/lib/presentation/add_supervision/logic.dart new file mode 100644 index 0000000..c818ce8 --- /dev/null +++ b/features/supervision/lib/presentation/add_supervision/logic.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class AddSupervisionLogic extends GetxController { + RxInt selectedSegment = 0.obs; + + // The data for the segments + final Map segments = { + 0: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(50)), + child: Text('دائم', style: AppFonts.yekan13), + ), + 1: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(50)), + child: Text('موقت', style: AppFonts.yekan13), + ), + }; + + + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/features/supervision/lib/presentation/add_supervision/view.dart b/features/supervision/lib/presentation/add_supervision/view.dart new file mode 100644 index 0000000..014c45b --- /dev/null +++ b/features/supervision/lib/presentation/add_supervision/view.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; +import 'package:rasadyar_core/presentation/widget/tabs/new_tab.dart'; + +import 'logic.dart'; + +class AddSupervisionPage extends GetView { + const AddSupervisionPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.lightGreyLight, + appBar: RAppBar( + title: 'ایجاد بازرسی', + leading: vecWidget( + Assets.vecMessageAddSvg, + color: AppColor.blueNormal, + width: 16, + height: 16, + ), + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 16, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(22, 13, 22, 4), + child: Text( + 'نوع پروانه کسب', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ), + + ObxValue((data) { + return NewCupertinoSegmentedControl( + padding: EdgeInsetsDirectional.symmetric( + horizontal: 20, + vertical: 10, + ), + children: controller.segments, + groupValue: data.value, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + data.value = value; + }, + ); + }, controller.selectedSegment), + + RTextField(label: 'صادر کننده پروانه'), + RTextField(label: 'شماره مجوز'), + RTextField(label: 'شماره ثبت'), + RTextField(label: 'کد اقتصادی'), + ], + ), + ); + } +} diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 932f5d7..d18094e 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -473,7 +473,6 @@ class SupervisionFilterPage extends GetView { vecWidgetWithOnTap( assets: Assets.vecMapSvg, onTap: () { - eLog('vecWidgetWithOnTap ==> Assets.vecMapSvg'); Get.toNamed(SupervisionRoutes.supervisionLocationDetails); }, width: 24, @@ -485,7 +484,9 @@ class SupervisionFilterPage extends GetView { width: 24, height: 24, color: AppColor.greenNormal, - onTap: () {}, + onTap: () { + Get.toNamed(SupervisionRoutes.supervisionAddSupervision); + }, ), vecWidgetWithOnTap( diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index 590f04b..fc4fae2 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -1,4 +1,6 @@ import 'package:rasadyar_core/core.dart'; +import 'package:supervision/presentation/add_supervision/logic.dart'; +import 'package:supervision/presentation/add_supervision/view.dart'; import 'package:supervision/presentation/filter/logic.dart'; import 'package:supervision/presentation/location_details/logic.dart'; import 'package:supervision/presentation/location_details/view.dart'; @@ -25,5 +27,11 @@ sealed class SupervisionPages { page: () => LocationDetailsPage(), bindings: [BindingsBuilder.put(() => LocationDetailsLogic())], ), + + GetPage( + name: SupervisionRoutes.supervisionAddSupervision, + page: () => AddSupervisionPage(), + binding: BindingsBuilder.put(() => AddSupervisionLogic()), + ), ]; } diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart index f5b027a..87ea34d 100644 --- a/features/supervision/lib/presentation/routes/app_routes.dart +++ b/features/supervision/lib/presentation/routes/app_routes.dart @@ -2,7 +2,9 @@ sealed class SupervisionRoutes { SupervisionRoutes._(); static const supervision = '/supervision'; - static const supervisionAction = '/supervision/action'; - static const supervisionUserSetting = '/supervision/userSettings'; - static const supervisionLocationDetails= '/supervision/locationDetails'; + static const supervisionAction = '$supervision/action'; + static const supervisionUserSetting = '$supervision/userSettings'; + static const supervisionLocationDetails = '$supervision/locationDetails'; + static const supervisionAddSupervision = + '$supervisionLocationDetails/addSupervision'; } diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index df1a0b9..df74c72 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -11,6 +11,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { final TextStyle? titleTextStyle; final VoidCallback? onBackPressed; final List? additionalActions; + final Widget? leading; const RAppBar({ super.key, @@ -20,6 +21,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { this.titleTextStyle, this.onBackPressed, this.additionalActions, + this.leading, }); @override @@ -34,6 +36,11 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { titleTextStyle ?? AppFonts.yekan16.copyWith(color: AppColor.blueNormal), title: Text(title), + + leading:Padding( + padding: const EdgeInsets.only(right: 16), + child: leading, + ), actions: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 8), From 3b693c7e601e218c98be33066c433b0d2a39e2d5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 19 Apr 2025 16:50:36 +0330 Subject: [PATCH 022/256] feat : action add supervisons --- assets/icons/calendar_search.svg | 4 + assets/icons/diagram.svg | 4 + assets/icons/logout.svg | 5 + assets/icons/profile_user.svg | 6 + assets/vec/calendar.svg.vec | Bin 0 -> 2687 bytes assets/vec/calendar_search.svg.vec | Bin 0 -> 703 bytes assets/vec/diagram.svg.vec | Bin 0 -> 651 bytes assets/vec/logout.svg.vec | Bin 0 -> 738 bytes assets/vec/profile_user.svg.vec | Bin 0 -> 817 bytes .../presentation/add_supervision/logic.dart | 7 +- .../presentation/add_supervision/view.dart | 115 +++-- .../display_information/logic.dart | 3 + .../display_information/view.dart | 421 ++++++++++++++++++ .../lib/presentation/filter/logic.dart | 2 +- .../lib/presentation/filter/view.dart | 9 +- .../registration_of_violation/logic.dart | 5 + .../registration_of_violation/view.dart | 105 +++++ .../lib/presentation/root/logic.dart | 3 +- .../lib/presentation/routes/app_pages.dart | 15 + .../lib/presentation/routes/app_routes.dart | 6 +- features/supervision/pubspec.lock | 8 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Podfile | 43 ++ .../presentations/common}/assets.dart | 12 + packages/core/lib/core.dart | 1 + .../lib/presentation/common/app_color.dart | 7 +- .../core/lib/presentation/common/assets.dart | 10 + .../widget/app_bar/r_app_bar.dart | 3 +- .../presentation/widget/buttons/elevated.dart | 39 +- .../presentation/widget/inputs/r_input.dart | 8 +- packages/core/pubspec.lock | 8 + packages/core/pubspec.yaml | 3 + pubspec.lock | 8 + 34 files changed, 797 insertions(+), 65 deletions(-) create mode 100644 assets/icons/calendar_search.svg create mode 100644 assets/icons/diagram.svg create mode 100644 assets/icons/logout.svg create mode 100644 assets/icons/profile_user.svg create mode 100644 assets/vec/calendar.svg.vec create mode 100644 assets/vec/calendar_search.svg.vec create mode 100644 assets/vec/diagram.svg.vec create mode 100644 assets/vec/logout.svg.vec create mode 100644 assets/vec/profile_user.svg.vec create mode 100644 features/supervision/lib/presentation/display_information/logic.dart create mode 100644 features/supervision/lib/presentation/display_information/view.dart create mode 100644 features/supervision/lib/presentation/registration_of_violation/logic.dart create mode 100644 features/supervision/lib/presentation/registration_of_violation/view.dart create mode 100644 ios/Podfile rename {core/lib/presentation/common/assets.dart => lib/presentations/common}/assets.dart (74%) diff --git a/assets/icons/calendar_search.svg b/assets/icons/calendar_search.svg new file mode 100644 index 0000000..59ed538 --- /dev/null +++ b/assets/icons/calendar_search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/diagram.svg b/assets/icons/diagram.svg new file mode 100644 index 0000000..7e505bd --- /dev/null +++ b/assets/icons/diagram.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/logout.svg b/assets/icons/logout.svg new file mode 100644 index 0000000..c5a263d --- /dev/null +++ b/assets/icons/logout.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/profile_user.svg b/assets/icons/profile_user.svg new file mode 100644 index 0000000..c9218f9 --- /dev/null +++ b/assets/icons/profile_user.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/vec/calendar.svg.vec b/assets/vec/calendar.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..17a6d46a90da54e7f840d7a5efc3ee723485d79a GIT binary patch literal 2687 zcmaJ@TWnNS6g{^?Un3&Q&=Lnqj3iD&BtyrD2u<&fPzrrar)nTjEg%e2By<`;k>|8C z#mb{&{7{hyr3Dj+ogWC)9|PqNO8k=k_(2mBl@d~cjv7hEwf4ObjKoQA);;I!z4qSg zoPB!NzuaxCa$_zDpP4!QJjUd5e#@95gI}JNhd)ml-;IIQpj|V1*CrbCt36mYplD35 zi$-yF*R?9guD8mlUvE`&x&ZzhPZq8du?Bl0{U;0g96Rzm@%)zcgj^Du%c=NBipFeL zU!ucBB=>fW<=8Pc{d%i1%aV%59B^|v;MxN}v3!}A+XTKM#cW`*;_b*(Ik7k@<;~M%<(l`f?vsN(>*e~ePrkpr zPBP1;%kTHs!hbsKTO=ASkuAk7(ll5iXQsU?p-`#(GV2}WT`F?|&Em_H%DRd*h+B&F z)!>@}|5b|faw`=V-gr~mD@){!fw0ES@2``Z(JAn+fq$WVaI+fmEcvN=ImS8r%(N9U zy6b_xuA&zC{AJTV8qL}#7B@&XaNnMn3rlnQu6^!SM6OJX+vGQ99OJhYow(!n^O0uc zc@MZ&c~~!b|Gu_C*i+jE`BAlPkmr2VHZ0*XY8#d#s%==Vst5`Thu;1)T;i*#9TdNE`LnpWdkvde>)P>d`5T0G{5V^G0iu#tkuoG zRqNU9+pP694Q|$YNBXy@9_^J|UH#jzU)0~x)oha!dJP*v*iieFqg=O}FBmu`XTT25ouAyw%hx zr{Yh`obUFbXY&-<)0}5df8$MRPv5~Fu&3u{Q`*zyVNcJ^@=hGL9sY5f@z~RhPafvO zp8g@)13M#gvpuN8smpH_Jh5(`d;0k@3$!lp$Rf9H+pT+vTX&6HcdgpDqeq;&8{N7a zVaK`~5tny)SeSRyU<1Y}AcA$oYOswgE zeL{-89a8DtFJBHPQ0qSF?@z#guT(@6h`UD?S0=E&8}Sm*a0hx~Kh9uW2Ef7m$sY>6 z4<2f@St6=ctMp7zs~E;SJ28xTc4BUxG1z~i>&%}$RqQ>a{?)$2%GWbN4IO>_R+006 z-?H!tVtGnby}13LZ5BBDpP7*pde(YXBoe*uqC422Ha&UmUF3Z2H>RE&8JiOh%d$MDcDh=+be z@&qyewL8wB?qitGU`#(Ec{qO>5A7KD@%Y{L=&n=n>BbYs`+3EO^*H`A%%cy!=fOcc#-SgPJl%FsKL~TVG7B?+JO}XY$k8MR R@*OB}pwIz+Rl=lL;UCk9UBdtX literal 0 HcmV?d00001 diff --git a/assets/vec/calendar_search.svg.vec b/assets/vec/calendar_search.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..199ea1a2a2db9ba4c977710457292ff69788fc22 GIT binary patch literal 703 zcmX|-ziSjx5Xa~35{Stm7YjLwL@fgb!mgkakT)+^34+Bvyh6l?yWs@?2EjC!E?qb= zB(YJJSZE=K7aI}9yIpfit})1gSc(w^ixfU*W;Z@|_rrI;^Xtv6nI@=dfYXNGla7uL z;M}AFC<7hkdBvlM{w4a=tqrkUx0*ROe5IpAnWb|*U5Urc`Qx`Rz^(sF9F>dZ` zU&D$WGZz+bU?m&?BV!rh~r`V-Xg_o+vk^H#fCn(N$s@=J5wg&Im9Cii7t zd^oMoMwdyCkha2^`J07qh`&&46!8rl-Fiv$_Wm=UzbA3GzwAg}w>A*Yrk@Kv6#wwP zlc3;uz7s`DQJxR79FM<#ogKJhM~n-W@VXsnCP2I326376hK`#n!YKJF3@8WSr*0+3 zOkgcC7wtd@;2G8cCGt3~Wb(X{$?KG;AJ;u1eGmI*X&+C7p2^Y=MBjwfl%13+ z;X7d~c_V%+d0oV}F>W3pOgzJ=j@j3Ts?i8cs8^Zou3}UX=$G`J`XtrI7KM;mhpnK%^nVsS-J2#~S F{{S-d_W}R_ literal 0 HcmV?d00001 diff --git a/assets/vec/diagram.svg.vec b/assets/vec/diagram.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..74ab0035f6344e80a8ce8aa1e23f464f5852c647 GIT binary patch literal 651 zcmZ8fO=uHA6rSC%Vx&tNu~bMY67&$HQcXZa!Tp9v4?Wm}D;_)vZlneAmXjbt>9!RQ zu?M@mrmYl_RJ~NNX!PJku_kCeM%Um$=ntevFS35K#*4GFeDmJ--Z$^P-77<`&~ic? zlIk6ZxDrA{QAQJ@M{sGnuJPec9HXgUFwm^^%hB3?sqmoF7vm_;KFH)sV;AJ z<4yTD-;}M%_g1rJO5<_G%5?U`=-a=c?A}YZrSMdcvs#n4Xd6~?%#QK+T&`;yF`pbW z;&_EBU!hm-kyQlL@9*BnT7)M0R6nYd|90ZCB7|7KsCwJMnWl&_)PGr8xQ*+xyH=^V zg-~x(^Cv#Ezgdpc#_-6FRmgrta^?o(=WzP_O^D7NoSb%1D!Q0hsXz;-u+RwL%`1F_ zl0AzJ@eH0@A^#Hj`~vMav>(Da_ZEfhGCrr@#W-GHhY-u;KT&6i{x8(6;&yhg^yY_f zzLS)`eFWFirYsc?Bgm(uS3ZiMnC3S)flW6p^ZBzFsHdb}AEEva-oJtguZ2Q-mAV^f zyn2CZsP0>%|1}(E4deAy_Vb*5Jb_n!%D6=|J}$Ce_ECO7o%_u58Gny;`KWg8vd)0~ p40WpXPmy2Z91pO+O+?eZ%-hD*-F@*~|IK-LP)$9G2KlcM{s8CH?Tr8c literal 0 HcmV?d00001 diff --git a/assets/vec/logout.svg.vec b/assets/vec/logout.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..8ea1d5f7bf3ab532127872f6cbbd61d459f8e2ea GIT binary patch literal 738 zcmX|qmxRWN%YEC_<2_ThG(XU=oE{LcS5&-0xBJ?FNq9}=2J z2$!U{%2dNDglRf8A?!j8%|eeF3lnRL3MWse(a~d(Niv|j!1o2w?T?>=SO=hkDB z?0e=HF`(ja(HswA+rAI*cZKj|qD&6UORAq;md?|uX`-xn?iNkctPV9F`~F22;vO<) z3dFkZ31-I3;%N6R70)VtgE=xZGQS?5&yQo{EY-(x>g#jeYmTDS&nYZo3GG$9VohDM z)vM(8MO8@MokqiN2eT%>0;#8OP?KM(IE7vHKHa}PkyYW7$1yP=vs#x$$dze}(%{sZ%>5XS%j literal 0 HcmV?d00001 diff --git a/assets/vec/profile_user.svg.vec b/assets/vec/profile_user.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..4d9a07dbbea25bb14df1ed4e38ea992f5d707bd0 GIT binary patch literal 817 zcmZvbPe>F|9LL|xYDCS5J`VrXzrusdIemb{AQ&yMTGJp2y+h4 zQ@bHzCA5fE>cc$oB-KBI-^FXRK7~~N7WJlpATdDyFHwHkLl51~Aob_H(q$$W6-8`Q zXGL$68UH<(V|E>%H9Zs~b-Wn+igCY&2c19gRD^iW|AU=L#zjo$-QFt3J%bOKi?~jG zjJwOEC!l-dBj tmpLs = ['دولتی', 'غیر دولتی', 'استیجاری', 'شخصی', 'سایر']; // The data for the segments final Map segments = { @@ -18,8 +23,6 @@ class AddSupervisionLogic extends GetxController { ), }; - - @override void onReady() { // TODO: implement onReady diff --git a/features/supervision/lib/presentation/add_supervision/view.dart b/features/supervision/lib/presentation/add_supervision/view.dart index 014c45b..483fc95 100644 --- a/features/supervision/lib/presentation/add_supervision/view.dart +++ b/features/supervision/lib/presentation/add_supervision/view.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; import 'package:rasadyar_core/presentation/widget/tabs/new_tab.dart'; +import 'package:supervision/supervision.dart'; import 'logic.dart'; @@ -21,42 +23,97 @@ class AddSupervisionPage extends GetView { height: 16, ), ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 16, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(22, 13, 22, 4), - child: Text( + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 16, + children: [ + Text( 'نوع پروانه کسب', textAlign: TextAlign.center, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), - ), - ObxValue((data) { - return NewCupertinoSegmentedControl( - padding: EdgeInsetsDirectional.symmetric( - horizontal: 20, - vertical: 10, - ), - children: controller.segments, - groupValue: data.value, - selectedColor: AppColor.blueNormal, - unselectedColor: Colors.white, - borderColor: Colors.grey.shade300, - onValueChanged: (int value) { - data.value = value; + ObxValue((data) { + return NewCupertinoSegmentedControl( + padding: EdgeInsets.zero, + children: controller.segments, + groupValue: data.value, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + data.value = value; + }, + ); + }, controller.selectedSegment), + + RTextField(label: 'صادر کننده پروانه'), + RTextField(label: 'شماره مجوز'), + RTextField(label: 'شماره ثبت'), + RTextField(label: 'کد اقتصادی'), + + optionWidget(controller.selectedTypeOfOwnership), + optionWidget(controller.selectedAccompanyingInspectors), + optionWidget(controller.selectedUnitType), + SizedBox(height: 25), + RElevated( + text: 'مرحله بعد', + onPressed: () { + Get.toNamed(SupervisionRoutes.supervisionRegistrationOfViolation); }, - ); - }, controller.selectedSegment), - - RTextField(label: 'صادر کننده پروانه'), - RTextField(label: 'شماره مجوز'), - RTextField(label: 'شماره ثبت'), - RTextField(label: 'کد اقتصادی'), - ], + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + ), + ], + ), ), ); } + + Column optionWidget(RxInt selected) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'نوع پروانه کسب', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + + SizedBox( + height: 75, + child: ListView.separated( + shrinkWrap: true, + padding: EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + itemBuilder: + (context, index) => ObxValue((data) { + return ChoiceChip( + onSelected: (value) { + selected.value = index; + }, + selectedColor: AppColor.blueNormal, + labelStyle: + data.value == index + ? AppFonts.yekan13.copyWith( + color: AppColor.whiteLight, + ) + : AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormalActive, + ), + checkmarkColor: Colors.white, + label: Text(controller.tmpLs[index]), + selected: index == data.value, + ); + }, selected), + + separatorBuilder: (context, index) => SizedBox(width: 8), + itemCount: controller.tmpLs.length, + ), + ), + ], + ); + } } diff --git a/features/supervision/lib/presentation/display_information/logic.dart b/features/supervision/lib/presentation/display_information/logic.dart new file mode 100644 index 0000000..e90fe4d --- /dev/null +++ b/features/supervision/lib/presentation/display_information/logic.dart @@ -0,0 +1,3 @@ +import 'package:rasadyar_core/core.dart'; + +class DisplayInformationLogic extends GetxController {} diff --git a/features/supervision/lib/presentation/display_information/view.dart b/features/supervision/lib/presentation/display_information/view.dart new file mode 100644 index 0000000..9b4ddca --- /dev/null +++ b/features/supervision/lib/presentation/display_information/view.dart @@ -0,0 +1,421 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; +import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; +import 'package:supervision/supervision.dart'; + +import 'logic.dart'; + +class DisplayInformationPage extends GetView { + const DisplayInformationPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: RAppBar( + title: 'نمایش اطلاعات', + leading: vecWidget( + Assets.vecMessageAddSvg, + color: AppColor.blueNormal, + width: 16, + height: 16, + ), + ), + + body: SingleChildScrollView( + child: Column( + spacing: 20, + children: [ + markerDetailsWidget(), + accompanyingInspectorsWidget(), + accompanyingInspectorsWidget(), + violationWidget(), + violationWidget(), + ratingbarWidget() + + ], + ), + ),); + } + + Widget ratingbarWidget() { + return Padding( + padding: const EdgeInsets.fromLTRB(35, 5, 35, 35), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + children: [ Text('به این صنف امتیاز دهید',style: AppFonts.yekan12,),], + ), + + SizedBox(height: 12,), + RatingBar.builder( + initialRating: 3, + minRating: 1, + direction: Axis.horizontal, + allowHalfRating: true, + itemCount: 5, + wrapAlignment: WrapAlignment.center, + itemPadding: EdgeInsets.symmetric(horizontal: 4.0), + itemBuilder: (context, _) => + Icon( + Icons.star, + color: Colors.amber, + ), + onRatingUpdate: (rating) { + + }, + ), + + + Row( + children: [ + Expanded( + child: RElevated( + height: 40, + text: 'ثبت', onPressed: (){})), + SizedBox(width: 8,), + Expanded(child: ROutlinedElevated( + height: 40, + text: 'انصراف', onPressed: (){ + Get.offAllNamed(SupervisionRoutes.supervision); + })) + ], + ) + ], + ), + ); + } +} + +Widget violationWidget() { + return Container( + margin: EdgeInsets.symmetric(horizontal: 35), + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.bgDark), + + ), + child: Column( + spacing: 16, + children: [ + + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 5, + minLines: 5, + + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 5, + minLines: 5, + + ), + + ], + ), + ); +} + +Widget markerDetailsWidget() { + return Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.symmetric(horizontal: 35, vertical: 10), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 12, + children: [ + Text( + 'ایجاد بازرسی', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.bgDark), + ), + ], + ), + Container( + height: 32, + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تاریخ بازرسی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '1403/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + + ...List.generate( + 5, + (index) => + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + ], + ), + ); +} + +Widget accompanyingInspectorsWidget() { + return Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.symmetric(horizontal: 35), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 12, + children: [ + Text( + 'بازرس همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.bgDark), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'نام و نام خانوادگی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + 'آیدا گل محمدی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تاریخ بازرسی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '1403/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ], + ), + ); +} diff --git a/features/supervision/lib/presentation/filter/logic.dart b/features/supervision/lib/presentation/filter/logic.dart index 55b7f5a..2eaec13 100644 --- a/features/supervision/lib/presentation/filter/logic.dart +++ b/features/supervision/lib/presentation/filter/logic.dart @@ -169,7 +169,7 @@ class SupervisionFilterLogic extends GetxController @override void onClose() { - // TODO: implement onClose + super.onClose(); } } diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index d18094e..16fefd7 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -182,12 +182,7 @@ class SupervisionFilterPage extends GetView { ), CustomSlidableAction( onPressed: (context) { - controller.sheetController.value.addBottomSheet( - child: LocationDetailsPage(), - initHeight: 500, - maxHeight: Get.height * 2, - minHeight: 0, - ); + Get.toNamed(SupervisionRoutes.supervisionAddSupervision); }, backgroundColor: AppColor.greenNormal, padding: EdgeInsets.all(16), @@ -473,6 +468,7 @@ class SupervisionFilterPage extends GetView { vecWidgetWithOnTap( assets: Assets.vecMapSvg, onTap: () { + Get.toNamed(SupervisionRoutes.supervisionLocationDetails); }, width: 24, @@ -485,6 +481,7 @@ class SupervisionFilterPage extends GetView { height: 24, color: AppColor.greenNormal, onTap: () { + Get.toNamed(SupervisionRoutes.supervisionAddSupervision); }, ), diff --git a/features/supervision/lib/presentation/registration_of_violation/logic.dart b/features/supervision/lib/presentation/registration_of_violation/logic.dart new file mode 100644 index 0000000..ba48ff1 --- /dev/null +++ b/features/supervision/lib/presentation/registration_of_violation/logic.dart @@ -0,0 +1,5 @@ +import 'package:rasadyar_core/core.dart'; + +class RegistrationOfViolationLogic extends GetxController { + RxInt countViolation = 1.obs; +} diff --git a/features/supervision/lib/presentation/registration_of_violation/view.dart b/features/supervision/lib/presentation/registration_of_violation/view.dart new file mode 100644 index 0000000..5ddb3ac --- /dev/null +++ b/features/supervision/lib/presentation/registration_of_violation/view.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; +import 'package:supervision/presentation/registration_of_violation/logic.dart'; +import 'package:supervision/presentation/routes/app_routes.dart'; + +class RegistrationOfViolationPage + extends GetView { + const RegistrationOfViolationPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( +backgroundColor:AppColor.bgLight, + appBar: RAppBar( + title: 'ثبت تخلف', + leading: vecWidget( + Assets.vecMessageAddSvg, + color: AppColor.blueNormal, + width: 16, + height: 16, + ), + additionalActions: [ + RFab.smallAdd(onPressed: () => controller.countViolation.value++), + ], + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20,vertical: 10), + child: Column( + children: [ + Expanded( + child: ObxValue((data) { + return ListView.separated( + itemBuilder: (context, index) =>Container( + padding:EdgeInsets.symmetric(horizontal: 8,vertical: 12), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1,color: AppColor.bgDark), + + ), + child: Column( + spacing:16 , + children: [ + + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 5, + minLines: 5, + + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 5, + minLines: 5, + + ), + + ], + ), + ) , + separatorBuilder: (context, index) => SizedBox(height: 15,), + itemCount: data.value, + ); + },controller.countViolation), + ), + + RElevated( + text: 'مرحله بعد', + onPressed: () { + Get.toNamed(SupervisionRoutes.supervisionDisplayInformation); + }, + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + ), + ], + ), + ), + ); + } +} diff --git a/features/supervision/lib/presentation/root/logic.dart b/features/supervision/lib/presentation/root/logic.dart index a2f73b3..82d44bc 100644 --- a/features/supervision/lib/presentation/root/logic.dart +++ b/features/supervision/lib/presentation/root/logic.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:supervision/presentation/actions/view.dart'; import 'package:supervision/presentation/filter/view.dart'; class RootLogic extends GetxController { RxInt currentIndex = 0.obs; List pages = [ SupervisionFilterPage(), - Placeholder(color: Colors.red), + ActionsPage(), Placeholder(color: Colors.amber), ]; diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index fc4fae2..d0fd20c 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -1,9 +1,14 @@ import 'package:rasadyar_core/core.dart'; +import 'package:supervision/presentation/actions/logic.dart'; import 'package:supervision/presentation/add_supervision/logic.dart'; import 'package:supervision/presentation/add_supervision/view.dart'; +import 'package:supervision/presentation/display_information/logic.dart'; +import 'package:supervision/presentation/display_information/view.dart'; import 'package:supervision/presentation/filter/logic.dart'; import 'package:supervision/presentation/location_details/logic.dart'; import 'package:supervision/presentation/location_details/view.dart'; +import 'package:supervision/presentation/registration_of_violation/logic.dart'; +import 'package:supervision/presentation/registration_of_violation/view.dart'; import 'package:supervision/presentation/root/logic.dart'; import 'package:supervision/presentation/root/view.dart'; import 'package:supervision/presentation/routes/app_routes.dart'; @@ -19,6 +24,7 @@ sealed class SupervisionPages { Get.put(RootLogic()); Get.put(SupervisionFilterLogic()); Get.lazyPut(() => LocationDetailsLogic(), fenix: true); + Get.lazyPut(() => ActionsLogic(), fenix: true); }), ), @@ -33,5 +39,14 @@ sealed class SupervisionPages { page: () => AddSupervisionPage(), binding: BindingsBuilder.put(() => AddSupervisionLogic()), ), + GetPage( + name: SupervisionRoutes.supervisionRegistrationOfViolation, + page: () => RegistrationOfViolationPage(), + binding: BindingsBuilder.put(() => RegistrationOfViolationLogic()), + ), GetPage( + name: SupervisionRoutes.supervisionDisplayInformation, + page: () => DisplayInformationPage(), + binding: BindingsBuilder.put(() => DisplayInformationLogic()), + ), ]; } diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart index 87ea34d..011dee1 100644 --- a/features/supervision/lib/presentation/routes/app_routes.dart +++ b/features/supervision/lib/presentation/routes/app_routes.dart @@ -5,6 +5,8 @@ sealed class SupervisionRoutes { static const supervisionAction = '$supervision/action'; static const supervisionUserSetting = '$supervision/userSettings'; static const supervisionLocationDetails = '$supervision/locationDetails'; - static const supervisionAddSupervision = - '$supervisionLocationDetails/addSupervision'; + static const supervisionAddSupervision = '$supervisionLocationDetails/addSupervision'; + static const supervisionRegistrationOfViolation = '$supervisionAddSupervision/RegistrationOfViolation'; + static const supervisionDisplayInformation = '$supervisionRegistrationOfViolation/DisplayInformation'; + } diff --git a/features/supervision/pubspec.lock b/features/supervision/pubspec.lock index 24150a4..fa96362 100644 --- a/features/supervision/pubspec.lock +++ b/features/supervision/pubspec.lock @@ -110,6 +110,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.0" + flutter_rating_bar: + dependency: transitive + description: + name: flutter_rating_bar + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" + source: hosted + version: "4.0.1" flutter_slidable: dependency: transitive description: diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..ec97fc6 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..c4855bf 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..e549ee2 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '12.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/core/lib/presentation/common/assets.dart/assets.dart b/lib/presentations/common/assets.dart similarity index 74% rename from core/lib/presentation/common/assets.dart/assets.dart rename to lib/presentations/common/assets.dart index 9d075b7..de73abf 100644 --- a/core/lib/presentation/common/assets.dart/assets.dart +++ b/lib/presentations/common/assets.dart @@ -5,17 +5,23 @@ class Assets { static const String iconsAdd = 'assets/icons/add.svg'; static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsCalendar = 'assets/icons/calendar.svg'; + static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; static const String iconsCall = 'assets/icons/call.svg'; + static const String iconsDiagram = 'assets/icons/diagram.svg'; static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; static const String iconsGps = 'assets/icons/gps.svg'; static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsLogout = 'assets/icons/logout.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; static const String iconsMessageAdd = 'assets/icons/message_add.svg'; static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; + static const String iconsProfileUser = 'assets/icons/profile_user.svg'; static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; static const String iconsSecurityTime = 'assets/icons/security_time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; @@ -24,16 +30,22 @@ class Assets { static const String vecAddSvg = 'assets/vec/add.svg.vec'; static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; + static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; static const String vecCallSvg = 'assets/vec/call.svg.vec'; + static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; static const String vecEditSvg = 'assets/vec/edit.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; + static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 5388a48..d3ea5ec 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -8,5 +8,6 @@ export 'package:rasadyar_core/presentation/widget/widget.dart'; //other packages export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; +export 'package:flutter_rating_bar/flutter_rating_bar.dart'; diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index 6505e83..8116ba2 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -84,7 +84,7 @@ class AppColor { static const Color blackDarker = Color(0xFF000000); // #000000 rgb(0, 0, 0) //endregion - //region ---Dark Grey Colors --- + //region --- Grey Colors --- static const Color darkGreyLight = Color( 0xFFeaeaea, ); // #eaeaea rgb(234, 234, 234) @@ -357,6 +357,11 @@ class AppColor { 0xFF0a4953, ); // #0a4953 rgb(10, 73, 83) static const Color tealDarker = Color(0xFF083940); // #083940 rgb(8, 57, 64) + + + + static const Color bgLight = Color(0xFFF5F5F5); // #083940 rgb(8, 57, 64) + static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64) //endregion //region --- category Colors --- diff --git a/packages/core/lib/presentation/common/assets.dart b/packages/core/lib/presentation/common/assets.dart index 5eeb4c1..de73abf 100644 --- a/packages/core/lib/presentation/common/assets.dart +++ b/packages/core/lib/presentation/common/assets.dart @@ -5,16 +5,21 @@ class Assets { static const String iconsAdd = 'assets/icons/add.svg'; static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsCalendar = 'assets/icons/calendar.svg'; + static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; static const String iconsCall = 'assets/icons/call.svg'; + static const String iconsDiagram = 'assets/icons/diagram.svg'; static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; static const String iconsGps = 'assets/icons/gps.svg'; static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsLogout = 'assets/icons/logout.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; static const String iconsMessageAdd = 'assets/icons/message_add.svg'; static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; + static const String iconsProfileUser = 'assets/icons/profile_user.svg'; static const String iconsScan = 'assets/icons/scan.svg'; static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; static const String iconsSecurityTime = 'assets/icons/security_time.svg'; @@ -25,16 +30,21 @@ class Assets { static const String vecAddSvg = 'assets/vec/add.svg.vec'; static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; + static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; static const String vecCallSvg = 'assets/vec/call.svg.vec'; + static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; static const String vecEditSvg = 'assets/vec/edit.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index df74c72..6fdecfb 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -42,6 +42,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { child: leading, ), actions: [ + if (additionalActions != null) ...additionalActions!, Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: IconButton( @@ -50,7 +51,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { color: iconColor, ), ), - if (additionalActions != null) ...additionalActions!, + ], ); } diff --git a/packages/core/lib/presentation/widget/buttons/elevated.dart b/packages/core/lib/presentation/widget/buttons/elevated.dart index 1aa97d9..3e4e5ff 100644 --- a/packages/core/lib/presentation/widget/buttons/elevated.dart +++ b/packages/core/lib/presentation/widget/buttons/elevated.dart @@ -2,25 +2,27 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/common/app_fonts.dart'; -class RElevated extends StatefulWidget { +class RElevated extends StatelessWidget { RElevated({ super.key, required this.text, required this.onPressed, - foregroundColor, - backgroundColor, - disabledBackgroundColor, - disabledForegroundColor, - radius, - textStyle, + this.foregroundColor, + this.backgroundColor, + this.disabledBackgroundColor, + this.disabledForegroundColor, + this.radius, + this.textStyle, this.width = 150.0, this.height = 56.0, + this.isFullWidth, }); final String text; final VoidCallback? onPressed; final double width; final double height; + final bool? isFullWidth; Color? foregroundColor; Color? backgroundColor; Color? disabledForegroundColor; @@ -28,29 +30,24 @@ class RElevated extends StatefulWidget { double? radius; TextStyle? textStyle; - @override - State createState() => _RElevatedState(); -} - -class _RElevatedState extends State { @override Widget build(BuildContext context) { return ElevatedButton( - onPressed: widget.onPressed, + onPressed: onPressed, style: ElevatedButton.styleFrom( - backgroundColor: widget.backgroundColor ?? AppColor.blueNormal, - foregroundColor: widget.foregroundColor ?? Colors.white, + backgroundColor: backgroundColor ?? AppColor.blueNormal, + foregroundColor: foregroundColor ?? Colors.white, disabledBackgroundColor: - widget.disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38), - disabledForegroundColor: widget.disabledForegroundColor ?? Colors.white, + disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38), + disabledForegroundColor: disabledForegroundColor ?? Colors.white, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(widget.radius ?? 8), + borderRadius: BorderRadius.circular(radius ?? 8), ), - fixedSize: Size(widget.width, widget.height), + minimumSize: Size((isFullWidth ??false) ? double.infinity : width, height), padding: EdgeInsets.zero, - textStyle: widget.textStyle ?? AppFonts.yekan24, + textStyle: textStyle ?? AppFonts.yekan24, ), - child: Text(widget.text), + child: Text(text), ); } } diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 07edc2b..2d1b0f6 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; @immutable class RTextField extends StatefulWidget { @@ -27,6 +28,7 @@ class RTextField extends StatefulWidget { this.minLines, this.radius, this.filled, + this.filledColor, this.enabled, this.errorStyle, this.labelStyle, @@ -61,6 +63,7 @@ class RTextField extends StatefulWidget { this.readonly = false, this.label, this.filled, + this.filledColor, this.errorStyle, this.labelStyle, this.enabled}) { @@ -95,6 +98,7 @@ class RTextField extends StatefulWidget { this.readonly = false, this.label, this.filled, + this.filledColor, this.errorStyle, this.labelStyle, this.enabled}) { @@ -132,6 +136,7 @@ class RTextField extends StatefulWidget { Widget? suffixIcon; Widget? prefixIcon; bool? filled; + Color? filledColor; bool _isPassword = false; final BoxConstraints? boxConstraints; @@ -204,8 +209,9 @@ class _RTextFieldState extends State { prefixIconConstraints: widget.boxConstraints, hintText: widget.hintText, labelText: widget.label, - labelStyle: widget.labelStyle, + labelStyle: widget.labelStyle??AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarkActive), filled: widget.filled, + fillColor: widget.filledColor, counter: widget.showCounter ? null : const SizedBox(), hintStyle: widget.hintStyle, enabledBorder: widget._inputBorder, diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index a78dfca..31270d6 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -230,6 +230,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_rating_bar: + dependency: "direct main" + description: + name: flutter_rating_bar + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" + source: hosted + version: "4.0.1" flutter_slidable: dependency: "direct main" description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 4e46e52..bcc2ec7 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: #UI cupertino_icons: ^1.0.8 flutter_slidable: ^4.0.0 + flutter_rating_bar: ^4.0.1 ##Log logger: ^2.5.0 @@ -42,6 +43,8 @@ dependencies: permission_handler: ^11.4.0 + + dev_dependencies: flutter_test: sdk: flutter diff --git a/pubspec.lock b/pubspec.lock index 106e938..91b7ffd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -254,6 +254,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.0" + flutter_rating_bar: + dependency: transitive + description: + name: flutter_rating_bar + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" + source: hosted + version: "4.0.1" flutter_slidable: dependency: transitive description: From e643a4844ef190aba55d36dad46a657133d14d42 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Apr 2025 08:53:15 +0330 Subject: [PATCH 023/256] feat : header action --- .../lib/presentation/action/logic.dart | 36 +++++++++ .../lib/presentation/action/view.dart | 76 +++++++++++++++++++ .../lib/presentation/root/logic.dart | 6 +- .../lib/presentation/routes/app_pages.dart | 4 +- 4 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 features/supervision/lib/presentation/action/logic.dart create mode 100644 features/supervision/lib/presentation/action/view.dart diff --git a/features/supervision/lib/presentation/action/logic.dart b/features/supervision/lib/presentation/action/logic.dart new file mode 100644 index 0000000..33d2701 --- /dev/null +++ b/features/supervision/lib/presentation/action/logic.dart @@ -0,0 +1,36 @@ +import 'package:get/get.dart'; +import 'package:rasadyar_core/presentation/common/assets.dart'; + +class ActionLogic extends GetxController { + RxInt selectedIndex = 0.obs; + + List headersTitle = [ + 'کاربران', + 'سوابق بازرسی من', + 'آمار', + 'خروج از سامانه' + + ]; + + + List headersIcons = [ + Assets.vecProfileUserSvg, + Assets.vecCalendarSearchSvg, + Assets.vecDiagramSvg, + Assets.vecLogoutSvg, + + + ]; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/features/supervision/lib/presentation/action/view.dart b/features/supervision/lib/presentation/action/view.dart new file mode 100644 index 0000000..239ba02 --- /dev/null +++ b/features/supervision/lib/presentation/action/view.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class ActionPage extends GetView { + const ActionPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.bgLight, + body: SafeArea( + child: Column( + children: [ + SizedBox(height: 20), + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: List.generate(4, (index) { + return headerWidget( + icon: controller.headersIcons[index], + title: controller.headersTitle[index], + onTap: () { + controller.selectedIndex.value = index; + }, + isSelected: controller.selectedIndex.value == index, + ); + }), + ); + }, controller.selectedIndex), + ], + ), + ), + ); + } + + Widget headerWidget({ + required String icon, + required String title, + required VoidCallback onTap, + bool isSelected = false, + }) { + return GestureDetector( + onTap: onTap, + child: Column( + spacing: 8, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(8), + decoration: ShapeDecoration( + color: isSelected ? AppColor.blueLightActive : AppColor.blueLight, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: vecWidget( + icon, + width: 40, + height: 40, + color: AppColor.blueNormal, + ), + ), + Text( + title, + style: AppFonts.yekan12.copyWith( + color: isSelected ? AppColor.blueNormalActive : AppColor.blueNormal, + ), + ), + ], + ), + ); + } +} diff --git a/features/supervision/lib/presentation/root/logic.dart b/features/supervision/lib/presentation/root/logic.dart index 82d44bc..4d76474 100644 --- a/features/supervision/lib/presentation/root/logic.dart +++ b/features/supervision/lib/presentation/root/logic.dart @@ -1,19 +1,19 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:supervision/presentation/actions/view.dart'; +import 'package:supervision/presentation/action/view.dart'; import 'package:supervision/presentation/filter/view.dart'; class RootLogic extends GetxController { RxInt currentIndex = 0.obs; List pages = [ SupervisionFilterPage(), - ActionsPage(), + ActionPage(), Placeholder(color: Colors.amber), ]; @override void onReady() { - // TODO: implement onReady + super.onReady(); } diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index d0fd20c..07404d2 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -1,5 +1,5 @@ import 'package:rasadyar_core/core.dart'; -import 'package:supervision/presentation/actions/logic.dart'; +import 'package:supervision/presentation/action/logic.dart'; import 'package:supervision/presentation/add_supervision/logic.dart'; import 'package:supervision/presentation/add_supervision/view.dart'; import 'package:supervision/presentation/display_information/logic.dart'; @@ -24,7 +24,7 @@ sealed class SupervisionPages { Get.put(RootLogic()); Get.put(SupervisionFilterLogic()); Get.lazyPut(() => LocationDetailsLogic(), fenix: true); - Get.lazyPut(() => ActionsLogic(), fenix: true); + Get.lazyPut(() => ActionLogic(), fenix: true); }), ), From a7c3fa4c989437ed4ab9554ceaf599983f1402aa Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Apr 2025 11:48:06 +0330 Subject: [PATCH 024/256] feat : profile and history action supervision --- .../lib/presentation/action/logic.dart | 30 +- .../lib/presentation/action/view.dart | 258 +++++++++++++++++- .../lib/presentation/filter/logic.dart | 2 + .../lib/presentation/filter/view.dart | 28 +- 4 files changed, 283 insertions(+), 35 deletions(-) diff --git a/features/supervision/lib/presentation/action/logic.dart b/features/supervision/lib/presentation/action/logic.dart index 33d2701..f9cdbce 100644 --- a/features/supervision/lib/presentation/action/logic.dart +++ b/features/supervision/lib/presentation/action/logic.dart @@ -1,27 +1,31 @@ -import 'package:get/get.dart'; -import 'package:rasadyar_core/presentation/common/assets.dart'; +import 'package:rasadyar_core/core.dart'; -class ActionLogic extends GetxController { +class ActionLogic extends GetxController with GetTickerProviderStateMixin { + late Rx slidController; + bool showSlideHint = true; + RxBool isExpanded = false.obs; RxInt selectedIndex = 0.obs; List headersTitle = [ 'کاربران', 'سوابق بازرسی من', 'آمار', - 'خروج از سامانه' - + 'خروج از سامانه', ]; - List headersIcons = [ Assets.vecProfileUserSvg, Assets.vecCalendarSearchSvg, Assets.vecDiagramSvg, Assets.vecLogoutSvg, - - ]; + @override + void onInit() { + super.onInit(); + slidController = SlidableController(this).obs; + } + @override void onReady() { // TODO: implement onReady @@ -33,4 +37,14 @@ class ActionLogic extends GetxController { // TODO: implement onClose super.onClose(); } + + + Future triggerSlidableAnimation() async { + await Future.delayed(Duration(milliseconds: 200)); + await slidController.value.openEndActionPane(); + await Future.delayed(Duration(milliseconds: 200)); + await slidController.value.close(); + showSlideHint = !showSlideHint; + } + } diff --git a/features/supervision/lib/presentation/action/view.dart b/features/supervision/lib/presentation/action/view.dart index 239ba02..9f58b3f 100644 --- a/features/supervision/lib/presentation/action/view.dart +++ b/features/supervision/lib/presentation/action/view.dart @@ -29,12 +29,36 @@ class ActionPage extends GetView { }), ); }, controller.selectedIndex), + Expanded( + child: ObxValue( + (index) => switch (index.value) { + 0 => profileWidget(), + 1 => slidableWidgetTwo(), + 2 => slidableWidgetOne(), + 3 => slidableWidgetOne(), + int() => Placeholder(), + }, + controller.selectedIndex, + ), + ), ], ), ), ); } + Column profileWidget() { + return Column( + children: [ + slidableWidgetOne(), + slidableWidgetOne(), + slidableWidgetOne(), + slidableWidgetOne(), + slidableWidgetOne(), + ], + ); + } + Widget headerWidget({ required String icon, required String title, @@ -66,11 +90,243 @@ class ActionPage extends GetView { Text( title, style: AppFonts.yekan12.copyWith( - color: isSelected ? AppColor.blueNormalActive : AppColor.blueNormal, + color: + isSelected ? AppColor.blueNormalActive : AppColor.blueNormal, ), ), ], ), ); } + + Widget slidableWidgetOne() { + if (controller.showSlideHint) { + controller.triggerSlidableAnimation(); + } + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), + child: Slidable( + key: Key('selectedLocationWidget'), + controller: controller.slidController.value, + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.redNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.circular(8), + autoClose: true, + child: vecWidget(Assets.vecTrashSvg, width: 24, height: 24), + ), + ], + ), + child: GestureDetector( + onTap: () {}, + child: Container( + height: 62, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + spacing: 4, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + '03295224154', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + spacing: 4, + children: [ + Text( + 'افزودن کاربر', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'ثبت بازرسی', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + spacing: 4, + children: [ + Text( + 'همدان', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'همدان', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } + + Widget slidableWidgetTwo() { + return ObxValue((data) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), + child: GestureDetector( + onTap: (){ + controller.isExpanded.value = !controller.isExpanded.value; + }, + child: AnimatedContainer( + duration: Duration(milliseconds: 2000), + height: data.value ? 370 : 62, + child: + data.value + ? Container(color: Colors.yellow,height: 80,width: 180,) + : Slidable( + key: Key('selectedLocationWidget'), + controller: controller.slidController.value, + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.blueNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + autoClose: true, + child: vecWidget( + Assets.vecEditSvg, + width: 24, + height: 24, + ), + ), + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.redNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), + autoClose: true, + child: vecWidget( + Assets.vecTrashSvg, + width: 24, + height: 24, + ), + ), + ], + ), + child: GestureDetector( + onTap: () {}, + child: Container( + height: 62, + padding: EdgeInsets.symmetric( + horizontal: 20, + vertical: 15, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 1, + color: AppColor.blackLightHover, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + spacing: 4, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + '03295224154', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + spacing: 4, + children: [ + Text( + 'افزودن کاربر', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'ثبت بازرسی', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + spacing: 4, + children: [ + Text( + 'همدان', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'همدان', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + ), + ); + }, controller.isExpanded); + } } diff --git a/features/supervision/lib/presentation/filter/logic.dart b/features/supervision/lib/presentation/filter/logic.dart index 2eaec13..4818aaa 100644 --- a/features/supervision/lib/presentation/filter/logic.dart +++ b/features/supervision/lib/presentation/filter/logic.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter/animation.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_animations/flutter_map_animations.dart'; import 'package:geolocator/geolocator.dart'; @@ -22,6 +23,7 @@ class SupervisionFilterLogic extends GetxController RxInt showIndex = 0.obs; bool showSlideHint = true; + Rx bottomSheetStep = BottomSheetStep.filter.obs; late Rx slidController; diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 16fefd7..0c6147a 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -2,9 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; -import 'package:supervision/presentation/location_details/view.dart'; import 'package:supervision/presentation/routes/app_routes.dart'; import 'logic.dart'; @@ -105,27 +103,6 @@ class SupervisionFilterPage extends GetView { .toList(), ), ), - - /* ObxValue((data) { - return DraggableBottomSheet( - controller: data.value, - backgroundColor: - controller.bottomSheetStep.value == BottomSheetStep.filter - ? Colors.white - : AppColor.lightGreyLight, - child: ObxValue((data) { - if (data.value == BottomSheetStep.filter) { - return filterWidget(); - } else if (data.value == BottomSheetStep.markerSelected) { - return selectedLocationWidget(); - } else if (data.value == BottomSheetStep.markerDetails) { - return markerDetailsWidget(); - } else { - return Container(height: 300, color: AppColor.blueNormal); - } - }, controller.bottomSheetStep), - ); - }, controller.sheetController),*/ ], ), ); @@ -182,7 +159,7 @@ class SupervisionFilterPage extends GetView { ), CustomSlidableAction( onPressed: (context) { - Get.toNamed(SupervisionRoutes.supervisionAddSupervision); + Get.toNamed(SupervisionRoutes.supervisionAddSupervision); }, backgroundColor: AppColor.greenNormal, padding: EdgeInsets.all(16), @@ -468,7 +445,6 @@ class SupervisionFilterPage extends GetView { vecWidgetWithOnTap( assets: Assets.vecMapSvg, onTap: () { - Get.toNamed(SupervisionRoutes.supervisionLocationDetails); }, width: 24, @@ -481,7 +457,6 @@ class SupervisionFilterPage extends GetView { height: 24, color: AppColor.greenNormal, onTap: () { - Get.toNamed(SupervisionRoutes.supervisionAddSupervision); }, ), @@ -651,4 +626,5 @@ class SupervisionFilterPage extends GetView { ), ); } + } From d4ebefedba9f182877b34d9409954ed402b1441e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Apr 2025 07:30:14 +0330 Subject: [PATCH 025/256] feat : action add supervisons --- .../lib/presentation/actions/logic.dart | 15 ++ .../lib/presentation/actions/view.dart | 209 ++++++++++++++++++ .../lib/presentation/rds/logic.dart | 5 + .../lib/presentation/rds/view.dart | 15 ++ 4 files changed, 244 insertions(+) create mode 100644 features/supervision/lib/presentation/actions/logic.dart create mode 100644 features/supervision/lib/presentation/actions/view.dart create mode 100644 features/supervision/lib/presentation/rds/logic.dart create mode 100644 features/supervision/lib/presentation/rds/view.dart diff --git a/features/supervision/lib/presentation/actions/logic.dart b/features/supervision/lib/presentation/actions/logic.dart new file mode 100644 index 0000000..e79eb8e --- /dev/null +++ b/features/supervision/lib/presentation/actions/logic.dart @@ -0,0 +1,15 @@ +import 'package:rasadyar_core/core.dart'; + +class ActionsLogic extends GetxController with GetTickerProviderStateMixin{ + + RxInt currentIndex = 0.obs; + late Rx slidController; + @override + void onInit() { + + super.onInit(); + slidController = SlidableController(this).obs; + } + +} + diff --git a/features/supervision/lib/presentation/actions/view.dart b/features/supervision/lib/presentation/actions/view.dart new file mode 100644 index 0000000..766b00e --- /dev/null +++ b/features/supervision/lib/presentation/actions/view.dart @@ -0,0 +1,209 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:supervision/presentation/actions/logic.dart'; + +class ActionsPage extends GetView { + const ActionsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Column( + children: [ + SizedBox(height: 10), + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + cardActionWidget( + title: 'کاربران', + onPressed: () { + controller.currentIndex.value = 0; + }, + icon: Assets.vecProfileUserSvg, + selected: data.value == 0, + ), + cardActionWidget( + title: 'سوابق بازرسی من', + onPressed: () { + controller.currentIndex.value = 1; + }, + icon: Assets.vecCalendarSearchSvg, + selected: data.value == 1, + ), + cardActionWidget( + title: 'آمار', + onPressed: () { + controller.currentIndex.value = 2; + }, + icon: Assets.vecDiagramSvg, + selected: data.value == 2, + ), + cardActionWidget( + title: 'خروج از سامانه', + onPressed: () { + controller.currentIndex.value = 3; + }, + icon: Assets.vecLogoutSvg, + selected: data.value == 3, + ), + ], + ); + }, controller.currentIndex), + SizedBox(height: 20), + Expanded( + child: Column( + spacing: 13, + children: [ + selectedLocationWidget(), + selectedLocationWidget(), + selectedLocationWidget(), + ], + ), + ), + ], + ), + ), + ); + } + + Widget selectedLocationWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Slidable( + key: Key('selectedLocationWidget'), + controller: controller.slidController.value, + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.redNormal, + foregroundColor: AppColor.whiteLight, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(8), + topRight: Radius.circular(8), + ), + child: vecWidget(Assets.vecTrashSvg, width: 24, height: 24), + ), + ], + ), + child: GestureDetector( + onTap: () {}, + child: Container( + height: 58, + alignment: AlignmentDirectional.center, + padding: EdgeInsets.symmetric(horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + spacing: 4, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + '03295224154', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + spacing: 4, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + spacing: 4, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } +} + +Widget cardActionWidget({ + required String title, + required VoidCallback onPressed, + required String icon, + bool selected = false, +}) { + return GestureDetector( + onTap: onPressed, + child: Column( + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: selected ? AppColor.blueLightActive : AppColor.blueLight, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: vecWidget( + icon, + width: 40, + height: 40, + color: selected ? AppColor.blueNormalActive : AppColor.blueNormal, + ), + ), + SizedBox(height: 2), + Text( + title, + style: AppFonts.yekan10.copyWith( + color: selected ? AppColor.blueNormal : AppColor.blueLightActive, + ), + ), + ], + ), + ); +} diff --git a/features/supervision/lib/presentation/rds/logic.dart b/features/supervision/lib/presentation/rds/logic.dart new file mode 100644 index 0000000..939a067 --- /dev/null +++ b/features/supervision/lib/presentation/rds/logic.dart @@ -0,0 +1,5 @@ +import 'package:get/get.dart'; + +class RdsLogic extends GetxController { + +} diff --git a/features/supervision/lib/presentation/rds/view.dart b/features/supervision/lib/presentation/rds/view.dart new file mode 100644 index 0000000..f620eb5 --- /dev/null +++ b/features/supervision/lib/presentation/rds/view.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class RdsPage extends StatelessWidget { + RdsPage({Key? key}) : super(key: key); + + final RdsLogic logic = Get.put(RdsLogic()); + + @override + Widget build(BuildContext context) { + return Container(); + } +} From 0c750e1c01cd4e99c84ef96ab44fb20bd0fe3462 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Apr 2025 15:45:15 +0330 Subject: [PATCH 026/256] feat : action profile --- assets/icons/bg_header_user_profile.svg | 3 + assets/icons/excel_download.svg | 12 + assets/icons/information.svg | 3 + assets/icons/pdf_download.svg | 12 + assets/icons/picture_frame.svg | 5 + assets/icons/receipt_discount.svg | 4 + assets/icons/tag_user.svg | 3 + assets/icons/user.svg | 4 + assets/icons/user_square.svg | 4 + assets/vec/bg_header_user_profile.svg.vec | Bin 0 -> 256 bytes assets/vec/excel_download.svg.vec | Bin 0 -> 9183 bytes assets/vec/information.svg.vec | Bin 0 -> 448 bytes assets/vec/pdf_download.svg.vec | Bin 0 -> 7647 bytes assets/vec/picture_frame.svg.vec | Bin 0 -> 518 bytes assets/vec/receipt_discount.svg.vec | Bin 0 -> 1047 bytes assets/vec/tag_user.svg.vec | Bin 0 -> 540 bytes assets/vec/user.svg.vec | Bin 0 -> 295 bytes assets/vec/user_square.svg.vec | Bin 0 -> 567 bytes .../lib/presentation/action/logic.dart | 34 +- .../lib/presentation/action/view.dart | 643 ++++++++++++++---- .../lib/presentation/filter/view.dart | 1 + .../lib/presentation/profile/logic.dart | 33 + .../lib/presentation/profile/view.dart | 257 +++++++ .../lib/presentation/root/logic.dart | 8 +- .../lib/presentation/routes/app_pages.dart | 12 +- .../lib/presentation/routes/app_routes.dart | 3 +- lib/main.dart | 24 + lib/presentation/common/assets.dart | 27 + .../pages/system_design/system_design.dart | 8 +- lib/presentation/widget/buttons/fab.dart | 2 + .../widget/buttons/fab_outlined.dart | 2 + lib/presentations/common/assets.dart | 54 -- .../core/lib/presentation/common/assets.dart | 18 + packages/core/pubspec.yaml | 1 + pubspec.lock | 105 ++- pubspec.yaml | 7 +- 36 files changed, 1082 insertions(+), 207 deletions(-) create mode 100644 assets/icons/bg_header_user_profile.svg create mode 100644 assets/icons/excel_download.svg create mode 100644 assets/icons/information.svg create mode 100644 assets/icons/pdf_download.svg create mode 100644 assets/icons/picture_frame.svg create mode 100644 assets/icons/receipt_discount.svg create mode 100644 assets/icons/tag_user.svg create mode 100644 assets/icons/user.svg create mode 100644 assets/icons/user_square.svg create mode 100644 assets/vec/bg_header_user_profile.svg.vec create mode 100644 assets/vec/excel_download.svg.vec create mode 100644 assets/vec/information.svg.vec create mode 100644 assets/vec/pdf_download.svg.vec create mode 100644 assets/vec/picture_frame.svg.vec create mode 100644 assets/vec/receipt_discount.svg.vec create mode 100644 assets/vec/tag_user.svg.vec create mode 100644 assets/vec/user.svg.vec create mode 100644 assets/vec/user_square.svg.vec create mode 100644 features/supervision/lib/presentation/profile/logic.dart create mode 100644 features/supervision/lib/presentation/profile/view.dart delete mode 100644 lib/presentations/common/assets.dart diff --git a/assets/icons/bg_header_user_profile.svg b/assets/icons/bg_header_user_profile.svg new file mode 100644 index 0000000..3fdb2f5 --- /dev/null +++ b/assets/icons/bg_header_user_profile.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/excel_download.svg b/assets/icons/excel_download.svg new file mode 100644 index 0000000..a1c7e4b --- /dev/null +++ b/assets/icons/excel_download.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/information.svg b/assets/icons/information.svg new file mode 100644 index 0000000..1ae3840 --- /dev/null +++ b/assets/icons/information.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/pdf_download.svg b/assets/icons/pdf_download.svg new file mode 100644 index 0000000..bb80401 --- /dev/null +++ b/assets/icons/pdf_download.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/icons/picture_frame.svg b/assets/icons/picture_frame.svg new file mode 100644 index 0000000..1aa2bc8 --- /dev/null +++ b/assets/icons/picture_frame.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/receipt_discount.svg b/assets/icons/receipt_discount.svg new file mode 100644 index 0000000..1f41ab6 --- /dev/null +++ b/assets/icons/receipt_discount.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/tag_user.svg b/assets/icons/tag_user.svg new file mode 100644 index 0000000..a7e464a --- /dev/null +++ b/assets/icons/tag_user.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/user.svg b/assets/icons/user.svg new file mode 100644 index 0000000..af27d7c --- /dev/null +++ b/assets/icons/user.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/user_square.svg b/assets/icons/user_square.svg new file mode 100644 index 0000000..c2de783 --- /dev/null +++ b/assets/icons/user_square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/vec/bg_header_user_profile.svg.vec b/assets/vec/bg_header_user_profile.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..c58f58c7ae8854f87f93023aa2ab75136a1dbfc7 GIT binary patch literal 256 zcmYe&?OEb~8J_dhcO!~g%%j0_B13_!pH1Dd#nJiVjtJ zT02KKr5~#7^l)BM&~;E`U7EAfgLwz6_s?;j+wk1+&&<2dI;pk?KP-Reyl6_Flk)Aq z&Q1w}&KDn@ao*J#>ufr2g|onpI%jGBZs({YJFZR35@xdJ)C#eG> sPDfOiJLnlSI?dvkb8vmg7N@tqT8FlHd~~Y3QFjRDegip>Z~p%W0Pxyqga7~l literal 0 HcmV?d00001 diff --git a/assets/vec/excel_download.svg.vec b/assets/vec/excel_download.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..623671dcb4c7de7db1ad5b8dd70a6f7b3937b50f GIT binary patch literal 9183 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 Z=i*zZuPwaif+bK%cTG{)aM_XRICa<~8h literal 0 HcmV?d00001 diff --git a/assets/vec/pdf_download.svg.vec b/assets/vec/pdf_download.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..b74b2220b0a934d6936bda6d593dfa13b6f282ab GIT binary patch literal 7647 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 literal 0 HcmV?d00001 diff --git a/assets/vec/receipt_discount.svg.vec b/assets/vec/receipt_discount.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..851be37ad1fc855eed54721dd9408ef0221ebb19 GIT binary patch literal 1047 zcmZXTUr1AN6vuz}ZrbdRcE_SZ6I%}%BpGflh~RgAt-y%zK`#YGA*Guy^$^SgSyqC> zml8rZS1U@yDG^x^I>KI}Kl`KA9y5FtLVXm1t#i&c6ug&vKm5-3{Lb&3d(Y`;7!cYK zA?g%8HTkOzd5aMFe6=P-y}(P;bxqUsjoZQ|UDquFU!`{xU4Mu=*nP2G`o$V^{q7Po zGn9qt4`KPx%tHO}PkFCB3zskblDW1lRMljeC;t?vPY%H->Lt3wPDSfTz);PpFOUv9 zlwZt2U%R2AO%tG{Y`A`fELZ7)D7cJm%Dp%Yqn#Bh6X;`qPpAicO?#E4r;GX2xWe{W zsuAN>s4~}K-nZu6$8jLCi{rLxbCS-fNk?Tm?od?Qy8(kqdC|I5^PNNAWUKaEZnjxX zH~5?%Arp8B&6C|&*El>|?O-lAO}3xtx&V44hWc5EHiem^?N5O031dI_#T&4i2Dlfe znNjZy+bM3sIDqlzV8Q7GpYaK(4&uD`DAQ^lXT6k1_hJjgQn!G(;Os!2LYlbm7}FD~ zE7HNbC*)v%qNOJYr0a=(_9xQ*0$W%w#rGM5km-DlISiuy9^9*skh5qTVd{xkkz=gu zi81yk`iyb3#gH%9pXf6l^P1w3UW#8WG_j}Dqu8aohAqjxifwt01R=g3Ec7DLHZ>zh zR@RxpxKKCkUuAgKf?Sfxm2&mK^-l)lHdWbG2}Jt0L{I1%bKZL!&Iihs)$B!T%v{?t z{+C`L7J7IY&a8cwxf_4^oYJ|Q^PnEdwH0QAX23QT*)jtZpJpJL-@y#V?KlVhn1{WX zkG+_mU73?Q+N)HnHZR})-j4N5$Yj1u*{1Hx>&YCH`Axay{L>rXh4N{vrLUFG*W%nG F{sV?sa9RKW literal 0 HcmV?d00001 diff --git a/assets/vec/tag_user.svg.vec b/assets/vec/tag_user.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..e90f06b742b2c37b15bdfdd8a0eb546cc2684f70 GIT binary patch literal 540 zcmYk4Pe=k$5XPS^bXd^}gQzs|Bugz8L6H#693mp2T=Eh^i-m{q&_O6DA_&3gU}q0e z;2}Che@HwSg%T7L-Ruwqg;HUMh`hGFd7IE%9zSN@x8KY>UPMhYi^AAC(smlNsv$9E z7@dqU7vId%@c)xo11%F$oCLH0Jx2#4+yRJM&yXM;bhO!l7-^msOwK915`*>^Ka$R_ zj#Fj9%)qvw+_ERAtsTSZN&qv9=a7$Un5aJUcpk&4FHlcnsO1`wI4n0Ik`Kv0RUQ{CbTn{?(}_4yda?qlFiSOxEHTQRF{ z0&&W+D>$>01^K~>8<*FhTrhl3-@r%Eq!KoOV)w+4V6OZMq$~JJK>rcRCmJmQ`4($$ zK=t^2iF#Vd#piXR?6;w`?8WL<1&HC$6~7NB7Hj*UPC5h^@{-8+t$stQP=V3UC(uGR ZH0eUhyA$0=I^tu$1MB|1UA!WH1HT8auVVlJ literal 0 HcmV?d00001 diff --git a/assets/vec/user.svg.vec b/assets/vec/user.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..9455e63d6ed4f7268706149e0e558aed8e523de3 GIT binary patch literal 295 zcmXxgF$+Oa6bJD0o-i9M53fuzkbx5A-SY_yWT22yi83op%KSEiNyuQaSuG~J#fP8_ za@_wdr*6M{I_I8Kx0hLvl_r`pPFy+}2@r|IETRzUuyq6+-01ifwI$-mIKl8*FYwvB zDR^l3#^OD%P){EB9{S-rdNIChzCs;YqqCPu^ORjHx zR^MJ|R$=(r^^K>^fP>4R%F2*=5;3OMEk^!WwT;bJm(d6D4q{GuRM5G@|2;VuTSZ*` G51JpQ&~IY^ literal 0 HcmV?d00001 diff --git a/assets/vec/user_square.svg.vec b/assets/vec/user_square.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..85abcceeb2d1319c79c6c5dc6583ef053c7df800 GIT binary patch literal 567 zcmYk4PfG$(6vf}nNCXDC5h_J6A_+KlR%8r<;YJc_Rf{$$q)?E%q85=Y zDn%p0{(OKI(juc4egvZ;!d(=^YtBpqzM04G@y@yT9+*jZx0p1U3HsSsqKzG&?lHY)?fToU-lI{?a`>*tmpSUD5?vg9FdKc_vzXbC0~?xo z_i_=W#b%UNZz2@^h-foaYUM&YjoIpdZk6ue=Xj|WCfkCYLj%zVga)>sO|4Kjyx+$m z3LFObbN>t-tYkRmdQJ^a=l6Iz6{6c@jrUr7RAP+4wYpQMW!|UfGV?l^#5(XzWNj&Z zII(>pc;|VUd+r)Ke+yUK`S`%Wy!A_G`ou=in@?_nAI!S!1a6KD5_AxL5cSZ}*X%#) M!ZaaV+JB+p4^#rodH?_b literal 0 HcmV?d00001 diff --git a/features/supervision/lib/presentation/action/logic.dart b/features/supervision/lib/presentation/action/logic.dart index f9cdbce..34a4ec6 100644 --- a/features/supervision/lib/presentation/action/logic.dart +++ b/features/supervision/lib/presentation/action/logic.dart @@ -1,10 +1,12 @@ import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; class ActionLogic extends GetxController with GetTickerProviderStateMixin { late Rx slidController; bool showSlideHint = true; - RxBool isExpanded = false.obs; + RxInt selectedIndex = 0.obs; + RxInt previousIndex = 0.obs; List headersTitle = [ 'کاربران', @@ -20,10 +22,31 @@ class ActionLogic extends GetxController with GetTickerProviderStateMixin { Assets.vecLogoutSvg, ]; + RxList supervisionHistoryList = [false, false, false, false].obs; + + List tmpLs = ['دولتی', 'غیر دولتی', 'استیجاری', 'شخصی', 'سایر']; + + List hamadanCities = [ + 'همدان', + 'ملایر', + 'نهاوند', + 'تویسرکان', + 'اسدآباد', + 'بهار', + 'رزن', + 'کبودرآهنگ', + 'فامنین', + 'لالجین', + ]; + + RxInt filter1Index = 0.obs; + RxInt filter2Index = 0.obs; + @override void onInit() { super.onInit(); slidController = SlidableController(this).obs; + } @override @@ -38,7 +61,6 @@ class ActionLogic extends GetxController with GetTickerProviderStateMixin { super.onClose(); } - Future triggerSlidableAnimation() async { await Future.delayed(Duration(milliseconds: 200)); await slidController.value.openEndActionPane(); @@ -47,4 +69,12 @@ class ActionLogic extends GetxController with GetTickerProviderStateMixin { showSlideHint = !showSlideHint; } + + void updateSelectedIndex(int index) { + if(index == selectedIndex.value) { + return; + } + previousIndex.value = selectedIndex.value; + selectedIndex.value = index; + } } diff --git a/features/supervision/lib/presentation/action/view.dart b/features/supervision/lib/presentation/action/view.dart index 9f58b3f..37917a1 100644 --- a/features/supervision/lib/presentation/action/view.dart +++ b/features/supervision/lib/presentation/action/view.dart @@ -1,5 +1,9 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'logic.dart'; @@ -22,7 +26,8 @@ class ActionPage extends GetView { icon: controller.headersIcons[index], title: controller.headersTitle[index], onTap: () { - controller.selectedIndex.value = index; + controller.updateSelectedIndex(index); + }, isSelected: controller.selectedIndex.value == index, ); @@ -30,16 +35,63 @@ class ActionPage extends GetView { ); }, controller.selectedIndex), Expanded( - child: ObxValue( - (index) => switch (index.value) { + child: ObxValue((index) { + if (index.value == 3) { + WidgetsBinding.instance.addPostFrameCallback((_) { + showCupertinoDialog( + context: context, + barrierDismissible: true, + builder: (context) { + return CupertinoAlertDialog( + title: Text( + 'از سامانه خارج می شوید؟', + style: AppFonts.yekan18.copyWith( + color: AppColor.lightGreyDarkActive, + ), + ), + actions: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + spacing: 16, + children: [ + Expanded( + child: RElevated( + text: 'بله', + onPressed: () { + exit(0); + }, + ), + ), + Expanded( + child: ROutlinedElevated( + text: 'خیر', + onPressed: () { + + controller.updateSelectedIndex(controller.previousIndex.value); + + Get.back(); + }, + ), + ), + ], + ), + ), + ], + ); + }, + ); + }); + } + + return switch (index.value) { 0 => profileWidget(), - 1 => slidableWidgetTwo(), - 2 => slidableWidgetOne(), - 3 => slidableWidgetOne(), - int() => Placeholder(), - }, - controller.selectedIndex, - ), + 1 => supervisionHistoryWidget(), + 2 => statisticsWidget(), + + int() => Container(), + }; + }, controller.selectedIndex), ), ], ), @@ -47,6 +99,112 @@ class ActionPage extends GetView { ); } + Container statisticsWidget() => Container( + margin: EdgeInsets.only(top: 50), + padding: EdgeInsets.symmetric(horizontal: 35, vertical: 50), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + child: Column( + children: [ + Container( + height: 32, + margin: EdgeInsets.only(top: 10, left: 22, right: 22), + + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 10, + children: [ + Expanded( + child: ROutlinedElevatedIcon( + icon: FaIcon(FontAwesomeIcons.calendar), + onPressed: () {}, + text: 'از تاریخ', + textStyle: AppFonts.yekan16.copyWith( + color: AppColor.blueNormal, + ), + ), + ), + Expanded( + child: ROutlinedElevatedIcon( + icon: FaIcon(FontAwesomeIcons.calendar), + onPressed: () {}, + text: 'تا تاریخ', + textStyle: AppFonts.yekan16.copyWith( + color: AppColor.blueNormal, + ), + ), + ), + ], + ), + ), + optionWidget( + selected: controller.filter1Index, + title: 'فیلترتراکنش ها', + options: controller.tmpLs, + ), + optionWidget( + selected: controller.filter2Index, + title: 'فیلتر شهرستان', + options: controller.hamadanCities, + ), + + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.end, + + children: [ + vecWidgetWithOnTap( + assets: Assets.vecPdfDownloadSvg, + onTap: () {}, + width: 64, + height: 64, + ), + vecWidgetWithOnTap( + assets: Assets.vecExcelDownloadSvg, + onTap: () {}, + width: 64, + height: 64, + ), + ], + ), + SizedBox(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 25, + children: [ + headerInfo(title: 'تعداد تراکنش ها', description: '183 '), + headerInfo( + title: 'جمع تراکنش ها', + description: '183 ریال', + background: AppColor.green1Light, + ), + ], + ), + ], + ), + ); + + Widget supervisionHistoryWidget() { + return ObxValue((data) { + return ListView.builder( + itemBuilder: (context, index) { + return historyItem(data[index], () { + data[index] = !data[index]; + }); + }, + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemCount: data.length, + ); + }, controller.supervisionHistoryList); + } + Column profileWidget() { return Column( children: [ @@ -195,138 +353,363 @@ class ActionPage extends GetView { ); } - Widget slidableWidgetTwo() { - return ObxValue((data) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), - child: GestureDetector( - onTap: (){ - controller.isExpanded.value = !controller.isExpanded.value; - }, - child: AnimatedContainer( - duration: Duration(milliseconds: 2000), - height: data.value ? 370 : 62, - child: - data.value - ? Container(color: Colors.yellow,height: 80,width: 180,) - : Slidable( - key: Key('selectedLocationWidget'), - controller: controller.slidController.value, - endActionPane: ActionPane( - motion: StretchMotion(), + Widget slidableWidgetTwo({required VoidCallback onTap}) { + return Slidable( + key: Key('selectedLocationWidget'), + controller: controller.slidController.value, + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.blueNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + autoClose: true, + child: vecWidget(Assets.vecEditSvg, width: 24, height: 24), + ), + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.redNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), + autoClose: true, + child: vecWidget(Assets.vecTrashSvg, width: 24, height: 24), + ), + ], + ), + child: GestureDetector( + onTap: onTap, + child: Container( + height: 62, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + spacing: 4, children: [ - CustomSlidableAction( - onPressed: (context) {}, - backgroundColor: AppColor.blueNormal, - foregroundColor: Colors.white, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - topRight: Radius.circular(8), - bottomRight: Radius.circular(8), - ), - autoClose: true, - child: vecWidget( - Assets.vecEditSvg, - width: 24, - height: 24, + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, ), ), - CustomSlidableAction( - onPressed: (context) {}, - backgroundColor: AppColor.redNormal, - foregroundColor: Colors.white, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(8), - bottomLeft: Radius.circular(8), - ), - autoClose: true, - child: vecWidget( - Assets.vecTrashSvg, - width: 24, - height: 24, + Text( + '03295224154', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, ), ), ], ), - child: GestureDetector( - onTap: () {}, - child: Container( - height: 62, - padding: EdgeInsets.symmetric( - horizontal: 20, - vertical: 15, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all( - width: 1, - color: AppColor.blackLightHover, + Column( + spacing: 4, + children: [ + Text( + 'افزودن کاربر', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, ), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - spacing: 4, - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '03295224154', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - children: [ - Text( - 'افزودن کاربر', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'ثبت بازرسی', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - children: [ - Text( - 'همدان', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'همدان', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ], + Text( + 'ثبت بازرسی', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), - ), + ], ), - ), + Column( + spacing: 4, + children: [ + Text( + 'همدان', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'همدان', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ], ), ), - ); - }, controller.isExpanded); + ), + ); } + + Widget historyItem(bool isExpanded, VoidCallback onTap) { + return AnimatedContainer( + margin: EdgeInsets.symmetric(horizontal: 30, vertical: 10), + curve: Curves.easeInOut, + duration: Duration(seconds: 1), + height: isExpanded ? 364 : 62, + child: + isExpanded + ? markerDetailsWidget(ontap: onTap) + : slidableWidgetTwo(onTap: onTap), + ); + } + + Widget markerDetailsWidget({required VoidCallback ontap}) { + return GestureDetector( + onTap: ontap, + behavior: HitTestBehavior.opaque, + child: Container( + clipBehavior: Clip.antiAlias, + + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 12, + children: [ + vecWidgetWithOnTap( + assets: Assets.vecEditSvg, + onTap: () {}, + width: 24, + height: 24, + color: AppColor.blueNormal, + ), + Text( + 'سوابق بازرسی من', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + vecWidgetWithOnTap( + assets: Assets.vecTrashSvg, + width: 24, + height: 24, + color: AppColor.redNormal, + onTap: () {}, + ), + ], + ), + Container( + height: 32, + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تاریخ بازرسی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '1403/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + + ...List.generate( + 5, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } + + Column optionWidget({ + required RxInt selected, + required String title, + required List options, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + + Wrap( + runSpacing: 8, + spacing: 8, + children: + options + .map( + (e) => ObxValue((data) { + return ChoiceChip( + onSelected: (value) { + selected.value = options.indexOf(e); + }, + selectedColor: AppColor.blueNormal, + labelStyle: + data.value == options.indexOf(e) + ? AppFonts.yekan13.copyWith( + color: AppColor.whiteLight, + ) + : AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormalActive, + ), + checkmarkColor: Colors.white, + label: Text(e), + selected: options.indexOf(e) == data.value, + ); + }, selected), + ) + .toList(), + ), + ], + ); + } + + Container headerInfo({ + required String title, + required String description, + Color? background, + }) { + return Container( + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: ShapeDecoration( + color: background ?? AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blackLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + alignment: AlignmentDirectional.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 10, + children: [ + Text(title, style: AppFonts.yekan10), + + Text(description, style: AppFonts.yekan12), + ], + ), + ); + } + } diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 0c6147a..5b4f6eb 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -627,4 +627,5 @@ class SupervisionFilterPage extends GetView { ); } + } diff --git a/features/supervision/lib/presentation/profile/logic.dart b/features/supervision/lib/presentation/profile/logic.dart new file mode 100644 index 0000000..ced5ff0 --- /dev/null +++ b/features/supervision/lib/presentation/profile/logic.dart @@ -0,0 +1,33 @@ +import 'package:rasadyar_core/core.dart'; + +class ProfileLogic extends GetxController { + + + List roles = [ + 'کاربر عادی', + 'کاربر ویژه', + 'کاربر VIP', + 'کاربر نقره ای', + 'کاربر طلایی', + + ]; + + + + + RxInt selectedRole = 0.obs; + RxInt selectedInformationType = 0.obs; + + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/features/supervision/lib/presentation/profile/view.dart b/features/supervision/lib/presentation/profile/view.dart new file mode 100644 index 0000000..7c2b49e --- /dev/null +++ b/features/supervision/lib/presentation/profile/view.dart @@ -0,0 +1,257 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class ProfilePage extends GetView { + const ProfilePage({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + spacing: 30, + children: [ + SizedBox( + height: Get.height * 0.3, + child: Stack( + fit: StackFit.expand, + alignment: Alignment.center, + clipBehavior: Clip.none, + children: [ + vecWidget(Assets.vecBgHeaderUserProfileSvg, fit: BoxFit.cover), + + Positioned( + bottom: -20, + left: 0, + right: 0, + child: SizedBox( + width: 110, + height: 110, + child: CircleAvatar( + backgroundColor: AppColor.blueLightHover, + child: FaIcon( + FontAwesomeIcons.user, + size: 45, + color: Colors.white, + ), + ), + ), + ), + ], + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + + spacing: 16, + children: [ + SizedBox( + height: 75, + child: ListView.separated( + shrinkWrap: true, + padding: EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + itemBuilder: + (context, index) => ObxValue((data) { + return ChoiceChip( + onSelected: (value) { + data.value = index; + }, + selectedColor: AppColor.blueNormal, + labelStyle: + data.value == index + ? AppFonts.yekan13.copyWith( + color: AppColor.whiteLight, + ) + : AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormalActive, + ), + checkmarkColor: Colors.white, + label: Text(controller.roles[index]), + selected: index == data.value, + ); + }, controller.selectedRole), + + separatorBuilder: (context, index) => SizedBox(width: 8), + itemCount: controller.roles.length, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 30, + vertical: 10, + ), + child: Expanded( + child: ObxValue((data) { + return switch (data.value) { + 0 => userProfileInformation(), + 1 => bankInformationWidget(), + 2 => invoiceIssuanceInformation(), + int() => Placeholder(), + }; + }, controller.selectedInformationType), + ), + ), + + ObxValue((data) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Wrap( + spacing: 20, + runSpacing: 10, + children: [ + cardActionWidget( + title: 'اطلاعات کاربری', + onPressed: () { + data.value = 0; + }, + icon: Assets.vecProfileUserSvg, + selected: data.value == 0, + ), + cardActionWidget( + title: 'اطلاعات بانکی', + onPressed: () { + data.value = 1; + }, + icon: Assets.vecInformationSvg, + selected: data.value == 1, + ), + cardActionWidget( + title: 'اطلاعات \nصدور فاکتور', + onPressed: () { + data.value = 2; + }, + icon: Assets.vecReceiptDiscountSvg, + selected: data.value == 2, + ), + ], + ), + ); + }, controller.selectedInformationType), + ], + ), + ), + ], + ); + } + + Container invoiceIssuanceInformation() => Container(); + + Widget bankInformationWidget() => Column( + spacing: 16, + children: [ + itemList(title: 'نام بانک', content: 'سامان'), + itemList(title: 'نام صاحب حساب', content: 'رضا رضایی'), + itemList(title: 'شماره کارت ', content: '54154545415'), + itemList(title: 'شماره حساب', content: '62565263263652'), + itemList(title: 'شماره شبا', content: '62565263263652'), + ], + ); + + Column userProfileInformation() { + return Column( + spacing: 10, + children: [ + itemList( + title: 'نام و نام خانوادگی', + content: 'آیدا گل محمدی', + icon: Assets.vecUserSvg, + ), + itemList( + title: 'موبایل', + content: '09302654896', + icon: Assets.vecCallSvg, + ), + itemList( + title: 'کدملی', + content: 'نا مشخص', + icon: Assets.vecTagUserSvg, + ), + itemList( + title: 'شماره شناسنامه', + content: 'نا مشخص', + icon: Assets.vecUserSquareSvg, + ), + itemList( + title: 'تاریخ تولد', + content: '1404/10/12', + icon: Assets.vecCalendarSvg, + ), + itemList( + title: 'استان', + content: 'لرستان', + icon: Assets.vecPictureFrameSvg, + ), + itemList(title: 'شهر', content: 'خرم آباد', icon: Assets.vecMapSvg), + ], + ); + } + + Widget itemList({ + required String title, + required String content, + String? icon, + }) => Row( + spacing: 4, + children: [ + if (icon != null) + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: vecWidget( + icon, + width: 20, + height: 20, + color: AppColor.blueNormal, + ), + ), + Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), + Spacer(), + Text( + content, + style: AppFonts.yekan13.copyWith(color: AppColor.darkGreyNormalHover), + ), + ], + ); + + Widget cardActionWidget({ + required String title, + required VoidCallback onPressed, + required String icon, + bool selected = false, + }) { + return GestureDetector( + onTap: onPressed, + child: Column( + spacing: 4, + children: [ + Container( + width: 52, + height: 52, + padding: EdgeInsets.all(8), + decoration: ShapeDecoration( + color: selected ? AppColor.blueLightActive : AppColor.blueLight, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: vecWidget( + icon, + width: 40, + height: 40, + color: selected ? AppColor.blueNormalActive : AppColor.blueNormal, + ), + ), + SizedBox(height: 2), + Text( + title, + style: AppFonts.yekan10.copyWith( + color: selected ? AppColor.blueNormal : AppColor.blueLightActive, + ), + textAlign: TextAlign.center, + ), + ], + ), + ); + } +} diff --git a/features/supervision/lib/presentation/root/logic.dart b/features/supervision/lib/presentation/root/logic.dart index 4d76474..c5d51a7 100644 --- a/features/supervision/lib/presentation/root/logic.dart +++ b/features/supervision/lib/presentation/root/logic.dart @@ -2,18 +2,14 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:supervision/presentation/action/view.dart'; import 'package:supervision/presentation/filter/view.dart'; +import 'package:supervision/presentation/profile/view.dart'; class RootLogic extends GetxController { RxInt currentIndex = 0.obs; - List pages = [ - SupervisionFilterPage(), - ActionPage(), - Placeholder(color: Colors.amber), - ]; + List pages = [SupervisionFilterPage(), ActionPage(), ProfilePage()]; @override void onReady() { - super.onReady(); } diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index 07404d2..792d402 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -7,6 +7,8 @@ import 'package:supervision/presentation/display_information/view.dart'; import 'package:supervision/presentation/filter/logic.dart'; import 'package:supervision/presentation/location_details/logic.dart'; import 'package:supervision/presentation/location_details/view.dart'; +import 'package:supervision/presentation/profile/logic.dart'; +import 'package:supervision/presentation/profile/view.dart'; import 'package:supervision/presentation/registration_of_violation/logic.dart'; import 'package:supervision/presentation/registration_of_violation/view.dart'; import 'package:supervision/presentation/root/logic.dart'; @@ -25,6 +27,7 @@ sealed class SupervisionPages { Get.put(SupervisionFilterLogic()); Get.lazyPut(() => LocationDetailsLogic(), fenix: true); Get.lazyPut(() => ActionLogic(), fenix: true); + Get.lazyPut(() => ProfileLogic(), fenix: true); }), ), @@ -43,10 +46,17 @@ sealed class SupervisionPages { name: SupervisionRoutes.supervisionRegistrationOfViolation, page: () => RegistrationOfViolationPage(), binding: BindingsBuilder.put(() => RegistrationOfViolationLogic()), - ), GetPage( + ), + + GetPage( name: SupervisionRoutes.supervisionDisplayInformation, page: () => DisplayInformationPage(), binding: BindingsBuilder.put(() => DisplayInformationLogic()), ), + GetPage( + name: SupervisionRoutes.supervisionUserProfile, + page: () => ProfilePage(), + binding: BindingsBuilder.put(() => ProfileLogic()), + ), ]; } diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart index 011dee1..6397834 100644 --- a/features/supervision/lib/presentation/routes/app_routes.dart +++ b/features/supervision/lib/presentation/routes/app_routes.dart @@ -3,10 +3,11 @@ sealed class SupervisionRoutes { static const supervision = '/supervision'; static const supervisionAction = '$supervision/action'; - static const supervisionUserSetting = '$supervision/userSettings'; + static const supervisionUserProfile = '$supervision/userSettings'; static const supervisionLocationDetails = '$supervision/locationDetails'; static const supervisionAddSupervision = '$supervisionLocationDetails/addSupervision'; static const supervisionRegistrationOfViolation = '$supervisionAddSupervision/RegistrationOfViolation'; static const supervisionDisplayInformation = '$supervisionRegistrationOfViolation/DisplayInformation'; + } diff --git a/lib/main.dart b/lib/main.dart index 0839833..6e2dc9d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:device_preview/device_preview.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rasadyar_app/domain/service/user/user_service.dart'; @@ -12,6 +13,29 @@ void main() async { await setupAllProvider(); runApp(MyApp()); + // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); +} + + + +class ForDevicePreview extends StatelessWidget { + const ForDevicePreview({super.key}); + + @override + Widget build(BuildContext context) { + return GetMaterialApp( + useInheritedMediaQuery: true, + locale: DevicePreview.locale(context), + builder: DevicePreview.appBuilder, + title: 'رصدیار', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal), + ), + initialRoute: AppPages.initRoutes, + initialBinding: BindingsBuilder.put(() => UserService()), + getPages: AppPages.pages, + ); + } } class MyApp extends StatelessWidget { diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart index 0859799..0e70b14 100644 --- a/lib/presentation/common/assets.dart +++ b/lib/presentation/common/assets.dart @@ -5,41 +5,68 @@ class Assets { static const String iconsAdd = 'assets/icons/add.svg'; static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg'; static const String iconsCalendar = 'assets/icons/calendar.svg'; + static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; static const String iconsCall = 'assets/icons/call.svg'; + static const String iconsDiagram = 'assets/icons/diagram.svg'; static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; + static const String iconsExcelDownload = 'assets/icons/excel_download.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; static const String iconsGps = 'assets/icons/gps.svg'; + static const String iconsInformation = 'assets/icons/information.svg'; static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsLogout = 'assets/icons/logout.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; static const String iconsMessageAdd = 'assets/icons/message_add.svg'; + static const String iconsPdfDownload = 'assets/icons/pdf_download.svg'; + static const String iconsPictureFrame = 'assets/icons/picture_frame.svg'; static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; + static const String iconsProfileUser = 'assets/icons/profile_user.svg'; + static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg'; static const String iconsScan = 'assets/icons/scan.svg'; static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; static const String iconsSecurityTime = 'assets/icons/security_time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; + static const String iconsTagUser = 'assets/icons/tag_user.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; + static const String iconsUser = 'assets/icons/user.svg'; + static const String iconsUserSquare = 'assets/icons/user_square.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; static const String vecAddSvg = 'assets/vec/add.svg.vec'; static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec'; + static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; + static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; static const String vecCallSvg = 'assets/vec/call.svg.vec'; + static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; static const String vecEditSvg = 'assets/vec/edit.svg.vec'; + static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; + static const String vecInformationSvg = 'assets/vec/information.svg.vec'; static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; + static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec'; + static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec'; static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; + static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec'; static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; + static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; + static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec'; + static const String vecUserSvg = 'assets/vec/user.svg.vec'; } diff --git a/lib/presentation/pages/system_design/system_design.dart b/lib/presentation/pages/system_design/system_design.dart index a5b08b5..6c5c04d 100644 --- a/lib/presentation/pages/system_design/system_design.dart +++ b/lib/presentation/pages/system_design/system_design.dart @@ -142,7 +142,7 @@ class _SystemDesignPageState extends State { spacing: 14, children: [ Row(), - +/* RFabOutlined.smallAdd(onPressed: () {}), RFabOutlined.smallAdd(onPressed: null), @@ -153,7 +153,7 @@ class _SystemDesignPageState extends State { RFabOutlined.add(onPressed: null), RFabOutlined.addNoBorder(onPressed: () {}), - RFabOutlined.addNoBorder(onPressed: null), + RFabOutlined.addNoBorder(onPressed: null),*/ ], ), ); @@ -175,7 +175,7 @@ class _SystemDesignPageState extends State { children: [ Row(), - RFab.smallAdd(onPressed: () {}), + /* RFab.smallAdd(onPressed: () {}), RFab.smallAdd(onPressed: null), RFab.add(onPressed: () {}), @@ -221,7 +221,7 @@ class _SystemDesignPageState extends State { RFab.smallBack(onPressed: null), RFab.back(onPressed: () {}), - RFab.back(onPressed: null), + RFab.back(onPressed: null),*/ ], ), ); diff --git a/lib/presentation/widget/buttons/fab.dart b/lib/presentation/widget/buttons/fab.dart index 84a4e8b..360b850 100644 --- a/lib/presentation/widget/buttons/fab.dart +++ b/lib/presentation/widget/buttons/fab.dart @@ -1,3 +1,4 @@ +/* import 'package:flutter/material.dart'; import 'package:rasadyar_app/presentation/common/app_color.dart'; import 'package:rasadyar_app/presentation/common/assets.dart'; @@ -230,3 +231,4 @@ class _RFabState extends State { ); } } +*/ diff --git a/lib/presentation/widget/buttons/fab_outlined.dart b/lib/presentation/widget/buttons/fab_outlined.dart index ecd9ea1..ab6a1ba 100644 --- a/lib/presentation/widget/buttons/fab_outlined.dart +++ b/lib/presentation/widget/buttons/fab_outlined.dart @@ -1,3 +1,4 @@ +/* import 'package:flutter/material.dart'; import 'package:rasadyar_app/presentation/common/app_color.dart'; import 'package:rasadyar_app/presentation/common/assets.dart'; @@ -603,3 +604,4 @@ class _RFabOutlinedState extends State { } } +*/ diff --git a/lib/presentations/common/assets.dart b/lib/presentations/common/assets.dart deleted file mode 100644 index de73abf..0000000 --- a/lib/presentations/common/assets.dart +++ /dev/null @@ -1,54 +0,0 @@ -///This file is automatically generated. DO NOT EDIT, all your changes would be lost. -class Assets { - Assets._(); - - static const String iconsAdd = 'assets/icons/add.svg'; - static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; - static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; - static const String iconsCalendar = 'assets/icons/calendar.svg'; - static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; - static const String iconsCall = 'assets/icons/call.svg'; - static const String iconsDiagram = 'assets/icons/diagram.svg'; - static const String iconsDownload = 'assets/icons/download.svg'; - static const String iconsEdit = 'assets/icons/edit.svg'; - static const String iconsFilter = 'assets/icons/filter.svg'; - static const String iconsGps = 'assets/icons/gps.svg'; - static const String iconsKey = 'assets/icons/key.svg'; - static const String iconsLogout = 'assets/icons/logout.svg'; - static const String iconsMap = 'assets/icons/map.svg'; - static const String iconsMapMarker = 'assets/icons/map_marker.svg'; - static const String iconsMessageAdd = 'assets/icons/message_add.svg'; - static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; - static const String iconsProfileUser = 'assets/icons/profile_user.svg'; - static const String iconsScan = 'assets/icons/scan.svg'; - static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; - static const String iconsSecurityTime = 'assets/icons/security_time.svg'; - static const String iconsSetting = 'assets/icons/setting.svg'; - static const String iconsTrash = 'assets/icons/trash.svg'; - static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; - static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; - static const String vecAddSvg = 'assets/vec/add.svg.vec'; - static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; - static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; - static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; - static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; - static const String vecCallSvg = 'assets/vec/call.svg.vec'; - static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; - static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; - static const String vecEditSvg = 'assets/vec/edit.svg.vec'; - static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; - static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; - static const String vecKeySvg = 'assets/vec/key.svg.vec'; - static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; - static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; - static const String vecMapSvg = 'assets/vec/map.svg.vec'; - static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; - static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; - static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; - static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; - static const String vecScanSvg = 'assets/vec/scan.svg.vec'; - static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; - static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; - static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; - -} diff --git a/packages/core/lib/presentation/common/assets.dart b/packages/core/lib/presentation/common/assets.dart index de73abf..0e70b14 100644 --- a/packages/core/lib/presentation/common/assets.dart +++ b/packages/core/lib/presentation/common/assets.dart @@ -5,50 +5,68 @@ class Assets { static const String iconsAdd = 'assets/icons/add.svg'; static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg'; static const String iconsCalendar = 'assets/icons/calendar.svg'; static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; static const String iconsCall = 'assets/icons/call.svg'; static const String iconsDiagram = 'assets/icons/diagram.svg'; static const String iconsDownload = 'assets/icons/download.svg'; static const String iconsEdit = 'assets/icons/edit.svg'; + static const String iconsExcelDownload = 'assets/icons/excel_download.svg'; static const String iconsFilter = 'assets/icons/filter.svg'; static const String iconsGps = 'assets/icons/gps.svg'; + static const String iconsInformation = 'assets/icons/information.svg'; static const String iconsKey = 'assets/icons/key.svg'; static const String iconsLogout = 'assets/icons/logout.svg'; static const String iconsMap = 'assets/icons/map.svg'; static const String iconsMapMarker = 'assets/icons/map_marker.svg'; static const String iconsMessageAdd = 'assets/icons/message_add.svg'; + static const String iconsPdfDownload = 'assets/icons/pdf_download.svg'; + static const String iconsPictureFrame = 'assets/icons/picture_frame.svg'; static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; static const String iconsProfileUser = 'assets/icons/profile_user.svg'; + static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg'; static const String iconsScan = 'assets/icons/scan.svg'; static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; static const String iconsSecurityTime = 'assets/icons/security_time.svg'; static const String iconsSetting = 'assets/icons/setting.svg'; + static const String iconsTagUser = 'assets/icons/tag_user.svg'; static const String iconsTrash = 'assets/icons/trash.svg'; + static const String iconsUser = 'assets/icons/user.svg'; + static const String iconsUserSquare = 'assets/icons/user_square.svg'; static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; static const String vecAddSvg = 'assets/vec/add.svg.vec'; static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec'; static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; static const String vecCallSvg = 'assets/vec/call.svg.vec'; static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; static const String vecEditSvg = 'assets/vec/edit.svg.vec'; + static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec'; static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; + static const String vecInformationSvg = 'assets/vec/information.svg.vec'; static const String vecKeySvg = 'assets/vec/key.svg.vec'; static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; static const String vecMapSvg = 'assets/vec/map.svg.vec'; static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; + static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec'; + static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec'; static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; + static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec'; static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; static const String vecScanSvg = 'assets/vec/scan.svg.vec'; static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; + static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec'; static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; + static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec'; + static const String vecUserSvg = 'assets/vec/user.svg.vec'; } diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index bcc2ec7..724acd2 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: + dev_dependencies: flutter_test: sdk: flutter diff --git a/pubspec.lock b/pubspec.lock index 91b7ffd..747dc7c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -193,6 +193,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + device_frame: + dependency: transitive + description: + name: device_frame + sha256: d031a06f5d6f4750009672db98a5aa1536aa4a231713852469ce394779a23d75 + url: "https://pub.dev" + source: hosted + version: "1.2.0" + device_preview: + dependency: "direct main" + description: + name: device_preview + sha256: a694acdd3894b4c7d600f4ee413afc4ff917f76026b97ab06575fe886429ef19 + url: "https://pub.dev" + source: hosted + version: "1.2.0" fake_async: dependency: transitive description: @@ -238,6 +254,11 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_map: dependency: transitive description: @@ -305,13 +326,13 @@ packages: source: hosted version: "3.0.6" freezed_annotation: - dependency: "direct main" + dependency: "direct overridden" description: name: freezed_annotation - sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "2.4.4" frontend_server_client: dependency: transitive description: @@ -460,10 +481,10 @@ packages: dependency: transitive description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.19.0" io: dependency: transitive description: @@ -481,7 +502,7 @@ packages: source: hosted version: "0.7.2" json_annotation: - dependency: "direct main" + dependency: transitive description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" @@ -640,6 +661,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" package_config: dependency: transitive description: @@ -808,6 +837,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + provider: + dependency: transitive + description: + name: provider + sha256: "489024f942069c2920c844ee18bb3d467c69e48955a4f32d1677f71be103e310" + url: "https://pub.dev" + source: hosted + version: "6.1.4" pub_semver: dependency: transitive description: @@ -839,6 +876,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.28.0" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" + url: "https://pub.dev" + source: hosted + version: "2.4.10" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" shelf: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 546bb1c..97afd30 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,9 +24,6 @@ dependencies: hive_ce: ^2.10.1 hive_ce_flutter: ^2.2.0 - ##code generation - freezed_annotation: ^3.0.0 - json_annotation: ^4.9.0 #SVG @@ -45,6 +42,10 @@ dependencies: rasadyar_core: path: ./packages/core + device_preview: ^1.2.0 + +dependency_overrides: + freezed_annotation: ^2.4.1 dev_dependencies: flutter_test: From 9751c5cee4a92fe57abb441a2010a773f6715d6e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 22 Apr 2025 14:42:42 +0330 Subject: [PATCH 027/256] feat : 1 - add mobile inspector fix : 1 - fix ui onTap location 2 - fix ui action --- .../lib/presentation/action/view.dart | 120 +++++----- .../lib/presentation/actions/logic.dart | 15 -- .../lib/presentation/actions/view.dart | 209 ------------------ .../add_mobile_inspector/logic.dart | 17 ++ .../add_mobile_inspector/view.dart | 122 ++++++++++ .../presentation/add_supervision/view.dart | 93 ++++---- .../lib/presentation/filter/view.dart | 77 +++---- .../lib/presentation/rds/logic.dart | 5 - .../lib/presentation/rds/view.dart | 15 -- .../registration_of_violation/view.dart | 14 ++ .../lib/presentation/routes/app_pages.dart | 7 + .../lib/presentation/routes/app_routes.dart | 13 +- 12 files changed, 326 insertions(+), 381 deletions(-) delete mode 100644 features/supervision/lib/presentation/actions/logic.dart delete mode 100644 features/supervision/lib/presentation/actions/view.dart create mode 100644 features/supervision/lib/presentation/add_mobile_inspector/logic.dart create mode 100644 features/supervision/lib/presentation/add_mobile_inspector/view.dart delete mode 100644 features/supervision/lib/presentation/rds/logic.dart delete mode 100644 features/supervision/lib/presentation/rds/view.dart diff --git a/features/supervision/lib/presentation/action/view.dart b/features/supervision/lib/presentation/action/view.dart index 37917a1..1889549 100644 --- a/features/supervision/lib/presentation/action/view.dart +++ b/features/supervision/lib/presentation/action/view.dart @@ -27,7 +27,6 @@ class ActionPage extends GetView { title: controller.headersTitle[index], onTap: () { controller.updateSelectedIndex(index); - }, isSelected: controller.selectedIndex.value == index, ); @@ -67,8 +66,9 @@ class ActionPage extends GetView { child: ROutlinedElevated( text: 'خیر', onPressed: () { - - controller.updateSelectedIndex(controller.previousIndex.value); + controller.updateSelectedIndex( + controller.previousIndex.value, + ); Get.back(); }, @@ -101,7 +101,7 @@ class ActionPage extends GetView { Container statisticsWidget() => Container( margin: EdgeInsets.only(top: 50), - padding: EdgeInsets.symmetric(horizontal: 35, vertical: 50), + padding: EdgeInsets.symmetric(vertical: 50), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( @@ -113,8 +113,7 @@ class ActionPage extends GetView { children: [ Container( height: 32, - margin: EdgeInsets.only(top: 10, left: 22, right: 22), - + margin: EdgeInsets.symmetric(horizontal: 22,vertical: 10), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, @@ -143,6 +142,7 @@ class ActionPage extends GetView { ], ), ), + optionWidget( selected: controller.filter1Index, title: 'فیلترتراکنش ها', @@ -155,28 +155,30 @@ class ActionPage extends GetView { ), SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.end, - - children: [ - vecWidgetWithOnTap( - assets: Assets.vecPdfDownloadSvg, - onTap: () {}, - width: 64, - height: 64, - ), - vecWidgetWithOnTap( - assets: Assets.vecExcelDownloadSvg, - onTap: () {}, - width: 64, - height: 64, - ), - ], + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + vecWidgetWithOnTap( + assets: Assets.vecPdfDownloadSvg, + onTap: () {}, + width: 64, + height: 64, + ), + vecWidgetWithOnTap( + assets: Assets.vecExcelDownloadSvg, + onTap: () {}, + width: 64, + height: 64, + ), + ], + ), ), SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.center, - spacing: 25, + spacing: 20, children: [ headerInfo(title: 'تعداد تراکنش ها', description: '183 '), headerInfo( @@ -645,39 +647,46 @@ class ActionPage extends GetView { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - title, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + Row(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 22,vertical: 10), + child: Text( + title, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), ), - Wrap( - runSpacing: 8, - spacing: 8, - children: - options - .map( - (e) => ObxValue((data) { - return ChoiceChip( - onSelected: (value) { - selected.value = options.indexOf(e); - }, - selectedColor: AppColor.blueNormal, - labelStyle: - data.value == options.indexOf(e) - ? AppFonts.yekan13.copyWith( - color: AppColor.whiteLight, - ) - : AppFonts.yekan12.copyWith( - color: AppColor.darkGreyNormalActive, - ), - checkmarkColor: Colors.white, - label: Text(e), - selected: options.indexOf(e) == data.value, - ); - }, selected), - ) - .toList(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Wrap( + runSpacing: 8, + spacing: 8, + children: + options + .map( + (e) => ObxValue((data) { + return ChoiceChip( + onSelected: (value) { + selected.value = options.indexOf(e); + }, + selectedColor: AppColor.blueNormal, + labelStyle: + data.value == options.indexOf(e) + ? AppFonts.yekan13.copyWith( + color: AppColor.whiteLight, + ) + : AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormalActive, + ), + checkmarkColor: Colors.white, + label: Text(e), + selected: options.indexOf(e) == data.value, + ); + }, selected), + ) + .toList(), + ), ), ], ); @@ -711,5 +720,4 @@ class ActionPage extends GetView { ), ); } - } diff --git a/features/supervision/lib/presentation/actions/logic.dart b/features/supervision/lib/presentation/actions/logic.dart deleted file mode 100644 index e79eb8e..0000000 --- a/features/supervision/lib/presentation/actions/logic.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:rasadyar_core/core.dart'; - -class ActionsLogic extends GetxController with GetTickerProviderStateMixin{ - - RxInt currentIndex = 0.obs; - late Rx slidController; - @override - void onInit() { - - super.onInit(); - slidController = SlidableController(this).obs; - } - -} - diff --git a/features/supervision/lib/presentation/actions/view.dart b/features/supervision/lib/presentation/actions/view.dart deleted file mode 100644 index 766b00e..0000000 --- a/features/supervision/lib/presentation/actions/view.dart +++ /dev/null @@ -1,209 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; -import 'package:supervision/presentation/actions/logic.dart'; - -class ActionsPage extends GetView { - const ActionsPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: SafeArea( - child: Column( - children: [ - SizedBox(height: 10), - ObxValue((data) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - cardActionWidget( - title: 'کاربران', - onPressed: () { - controller.currentIndex.value = 0; - }, - icon: Assets.vecProfileUserSvg, - selected: data.value == 0, - ), - cardActionWidget( - title: 'سوابق بازرسی من', - onPressed: () { - controller.currentIndex.value = 1; - }, - icon: Assets.vecCalendarSearchSvg, - selected: data.value == 1, - ), - cardActionWidget( - title: 'آمار', - onPressed: () { - controller.currentIndex.value = 2; - }, - icon: Assets.vecDiagramSvg, - selected: data.value == 2, - ), - cardActionWidget( - title: 'خروج از سامانه', - onPressed: () { - controller.currentIndex.value = 3; - }, - icon: Assets.vecLogoutSvg, - selected: data.value == 3, - ), - ], - ); - }, controller.currentIndex), - SizedBox(height: 20), - Expanded( - child: Column( - spacing: 13, - children: [ - selectedLocationWidget(), - selectedLocationWidget(), - selectedLocationWidget(), - ], - ), - ), - ], - ), - ), - ); - } - - Widget selectedLocationWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 30), - child: Slidable( - key: Key('selectedLocationWidget'), - controller: controller.slidController.value, - endActionPane: ActionPane( - motion: StretchMotion(), - children: [ - CustomSlidableAction( - onPressed: (context) {}, - backgroundColor: AppColor.redNormal, - foregroundColor: AppColor.whiteLight, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(8), - topRight: Radius.circular(8), - ), - child: vecWidget(Assets.vecTrashSvg, width: 24, height: 24), - ), - ], - ), - child: GestureDetector( - onTap: () {}, - child: Container( - height: 58, - alignment: AlignmentDirectional.center, - padding: EdgeInsets.symmetric(horizontal: 20), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - spacing: 4, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '03295224154', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'باقی مانده', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'باقی مانده', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ], - ), - ), - ), - ), - ); - } -} - -Widget cardActionWidget({ - required String title, - required VoidCallback onPressed, - required String icon, - bool selected = false, -}) { - return GestureDetector( - onTap: onPressed, - child: Column( - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(4), - decoration: ShapeDecoration( - color: selected ? AppColor.blueLightActive : AppColor.blueLight, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - ), - child: vecWidget( - icon, - width: 40, - height: 40, - color: selected ? AppColor.blueNormalActive : AppColor.blueNormal, - ), - ), - SizedBox(height: 2), - Text( - title, - style: AppFonts.yekan10.copyWith( - color: selected ? AppColor.blueNormal : AppColor.blueLightActive, - ), - ), - ], - ), - ); -} diff --git a/features/supervision/lib/presentation/add_mobile_inspector/logic.dart b/features/supervision/lib/presentation/add_mobile_inspector/logic.dart new file mode 100644 index 0000000..83748bd --- /dev/null +++ b/features/supervision/lib/presentation/add_mobile_inspector/logic.dart @@ -0,0 +1,17 @@ +import 'package:rasadyar_core/core.dart'; + +class AddMobileInspectorLogic extends GetxController { + RxInt countInspector = 1.obs; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/features/supervision/lib/presentation/add_mobile_inspector/view.dart b/features/supervision/lib/presentation/add_mobile_inspector/view.dart new file mode 100644 index 0000000..df7c460 --- /dev/null +++ b/features/supervision/lib/presentation/add_mobile_inspector/view.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; +import 'package:supervision/presentation/routes/app_routes.dart'; + +import 'logic.dart'; + +class AddMobileInspectorPage extends GetView { + const AddMobileInspectorPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.bgLight, + appBar: RAppBar( + title: 'افزودن بازرس همراه', + leading: vecWidget( + Assets.vecMessageAddSvg, + color: AppColor.blueNormal, + width: 16, + height: 16, + ), + additionalActions: [ + RFab.smallAdd(onPressed: () => controller.countInspector.value++), + ], + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Column( + children: [ + Expanded( + child: ObxValue((data) { + return ListView.separated( + itemBuilder: + (context, index) => Container( + padding: EdgeInsets.symmetric( + horizontal: 12, + vertical: 16, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.bgDark), + ), + child: Column( + spacing: 16, + children: [ + RTextField( + label: 'نام و نام خانوادگی', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'شماره مجوز', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'شماره ثبت', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'کد اقتصادی', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: SizedBox( + height: 40, + child: Row( + spacing: 16, + children: [ + Expanded( + child: RElevated( + text: 'ثبت', + onPressed: () {}, + ), + ), + Expanded( + child: ROutlinedElevated( + text: 'انصراف', + onPressed: () {}, + ), + ), + ], + ), + ), + ), + ], + ), + ), + separatorBuilder: (context, index) => SizedBox(height: 15), + itemCount: data.value, + ); + }, controller.countInspector), + ), + + RElevated( + text: 'مرحله بعد', + onPressed: () { + Get.toNamed(SupervisionRoutes.supervisionRegistrationOfViolation); + }, + isFullWidth: true, + height: 40, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + ), + SizedBox(height: 25), + ], + ), + ), + ); + } +} diff --git a/features/supervision/lib/presentation/add_supervision/view.dart b/features/supervision/lib/presentation/add_supervision/view.dart index 483fc95..2b5c68b 100644 --- a/features/supervision/lib/presentation/add_supervision/view.dart +++ b/features/supervision/lib/presentation/add_supervision/view.dart @@ -28,43 +28,57 @@ class AddSupervisionPage extends GetView { crossAxisAlignment: CrossAxisAlignment.start, spacing: 16, children: [ - Text( - 'نوع پروانه کسب', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'نوع پروانه کسب', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + ), + ), + + ObxValue((data) { + return NewCupertinoSegmentedControl( + padding: EdgeInsets.zero, + children: controller.segments, + groupValue: data.value, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + data.value = value; + }, + ); + }, controller.selectedSegment), + + RTextField(label: 'صادر کننده پروانه'), + RTextField(label: 'شماره مجوز'), + RTextField(label: 'شماره ثبت'), + RTextField(label: 'کد اقتصادی'), + ], + ), ), - - ObxValue((data) { - return NewCupertinoSegmentedControl( - padding: EdgeInsets.zero, - children: controller.segments, - groupValue: data.value, - selectedColor: AppColor.blueNormal, - unselectedColor: Colors.white, - borderColor: Colors.grey.shade300, - onValueChanged: (int value) { - data.value = value; - }, - ); - }, controller.selectedSegment), - - RTextField(label: 'صادر کننده پروانه'), - RTextField(label: 'شماره مجوز'), - RTextField(label: 'شماره ثبت'), - RTextField(label: 'کد اقتصادی'), - optionWidget(controller.selectedTypeOfOwnership), optionWidget(controller.selectedAccompanyingInspectors), optionWidget(controller.selectedUnitType), - SizedBox(height: 25), - RElevated( - text: 'مرحله بعد', - onPressed: () { - Get.toNamed(SupervisionRoutes.supervisionRegistrationOfViolation); - }, - isFullWidth: true, - backgroundColor: AppColor.greenNormal, - textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: RElevated( + text: 'مرحله بعد', + onPressed: () { + Get.toNamed(SupervisionRoutes.supervisionAddMobileInspector); + }, + height: 40, + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + ), ), ], ), @@ -76,17 +90,20 @@ class AddSupervisionPage extends GetView { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - 'نوع پروانه کسب', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Text( + 'نوع پروانه کسب', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), ), SizedBox( height: 75, child: ListView.separated( shrinkWrap: true, - padding: EdgeInsets.all(16), + padding: EdgeInsets.all(20), scrollDirection: Axis.horizontal, itemBuilder: (context, index) => ObxValue((data) { diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 5b4f6eb..49ca869 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -47,14 +47,14 @@ class SupervisionFilterPage extends GetView { children: [ TileLayer( urlTemplate: - "https://map.ir/shiveh/xyz/1.0.0/Shiveh:Shiveh@EPSG:3857@png/{z}/{x}/{y}.png" + "https://map.ir/shiveh/xyz/1.0.0/Shiveh:Shiveh@EPSG:3857@png/{z}/{x}/{y}.png" "?x-api-key=$token", ), ObxValue((markers) { return MarkerLayer( markers: - markers.map((marker) => markerWidget(marker)).toList(), + markers.map((marker) => markerWidget(marker)).toList(), ); }, controller.markers), ], @@ -72,9 +72,9 @@ class SupervisionFilterPage extends GetView { onPressed: () { controller.isLoading.value = true; controller.determineCurrentPosition().then( - (value) => - controller.isLoading.value = - !controller.isLoading.value, + (value) => + controller.isLoading.value = + !controller.isLoading.value, ); }, ); @@ -87,21 +87,21 @@ class SupervisionFilterPage extends GetView { backgroundColor: AppColor.blueNormal, icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), onPressed: () { - if (controller.bottomSheetStep.value != - BottomSheetStep.filter) { - controller.bottomSheetStep.value = BottomSheetStep.filter; - } - controller.sheetController.value.toggle(); + controller.sheetController.value.addBottomSheet(child: filterWidget(), + initHeight: 400, + maxHeight: 470, + minHeight: 350); }, ), ), Obx( - () => Stack( - children: + () => + Stack( + children: controller.sheetController.value.bottomSheets .map((sheet) => sheet) .toList(), - ), + ), ), ], ), @@ -567,27 +567,28 @@ class SupervisionFilterPage extends GetView { ...List.generate( 5, - (index) => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + (index) => + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'فروش رفته', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), ), ], ), @@ -611,17 +612,17 @@ class SupervisionFilterPage extends GetView { color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, borderRadius: BorderRadius.circular(8), border: - isSelected - ? Border.fromBorderSide(BorderSide.none) - : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + isSelected + ? Border.fromBorderSide(BorderSide.none) + : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), ), child: Text( title, textAlign: TextAlign.center, style: - isSelected - ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) - : AppFonts.yekan10, + isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) + : AppFonts.yekan10, ), ), ); diff --git a/features/supervision/lib/presentation/rds/logic.dart b/features/supervision/lib/presentation/rds/logic.dart deleted file mode 100644 index 939a067..0000000 --- a/features/supervision/lib/presentation/rds/logic.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:get/get.dart'; - -class RdsLogic extends GetxController { - -} diff --git a/features/supervision/lib/presentation/rds/view.dart b/features/supervision/lib/presentation/rds/view.dart deleted file mode 100644 index f620eb5..0000000 --- a/features/supervision/lib/presentation/rds/view.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import 'logic.dart'; - -class RdsPage extends StatelessWidget { - RdsPage({Key? key}) : super(key: key); - - final RdsLogic logic = Get.put(RdsLogic()); - - @override - Widget build(BuildContext context) { - return Container(); - } -} diff --git a/features/supervision/lib/presentation/registration_of_violation/view.dart b/features/supervision/lib/presentation/registration_of_violation/view.dart index 5ddb3ac..d012467 100644 --- a/features/supervision/lib/presentation/registration_of_violation/view.dart +++ b/features/supervision/lib/presentation/registration_of_violation/view.dart @@ -79,6 +79,18 @@ backgroundColor:AppColor.bgLight, ), + SizedBox( + height: 40, + child: Row( + spacing: 16, + children: [ + Expanded(child: RElevated(text: 'ثبت', onPressed: (){})), + Expanded(child:ROutlinedElevated(text: 'انصراف',onPressed: (){},) ), + + ], + ), + ) + ], ), ) , @@ -94,9 +106,11 @@ backgroundColor:AppColor.bgLight, Get.toNamed(SupervisionRoutes.supervisionDisplayInformation); }, isFullWidth: true, + height: 40, backgroundColor: AppColor.greenNormal, textStyle: AppFonts.yekan16.copyWith(color: Colors.white), ), + SizedBox(height: 25,) ], ), ), diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart index 792d402..de326a2 100644 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ b/features/supervision/lib/presentation/routes/app_pages.dart @@ -1,5 +1,7 @@ import 'package:rasadyar_core/core.dart'; import 'package:supervision/presentation/action/logic.dart'; +import 'package:supervision/presentation/add_mobile_inspector/logic.dart'; +import 'package:supervision/presentation/add_mobile_inspector/view.dart'; import 'package:supervision/presentation/add_supervision/logic.dart'; import 'package:supervision/presentation/add_supervision/view.dart'; import 'package:supervision/presentation/display_information/logic.dart'; @@ -58,5 +60,10 @@ sealed class SupervisionPages { page: () => ProfilePage(), binding: BindingsBuilder.put(() => ProfileLogic()), ), + GetPage( + name: SupervisionRoutes.supervisionAddMobileInspector, + page: () => AddMobileInspectorPage(), + binding: BindingsBuilder.put(() => AddMobileInspectorLogic()), + ), ]; } diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart index 6397834..8693dc5 100644 --- a/features/supervision/lib/presentation/routes/app_routes.dart +++ b/features/supervision/lib/presentation/routes/app_routes.dart @@ -5,9 +5,12 @@ sealed class SupervisionRoutes { static const supervisionAction = '$supervision/action'; static const supervisionUserProfile = '$supervision/userSettings'; static const supervisionLocationDetails = '$supervision/locationDetails'; - static const supervisionAddSupervision = '$supervisionLocationDetails/addSupervision'; - static const supervisionRegistrationOfViolation = '$supervisionAddSupervision/RegistrationOfViolation'; - static const supervisionDisplayInformation = '$supervisionRegistrationOfViolation/DisplayInformation'; - - + static const supervisionAddSupervision = + '$supervisionLocationDetails/addSupervision'; + static const supervisionAddMobileInspector = + '$supervisionLocationDetails/addMobileInspector'; + static const supervisionRegistrationOfViolation = + '$supervisionAddSupervision/RegistrationOfViolation'; + static const supervisionDisplayInformation = + '$supervisionRegistrationOfViolation/DisplayInformation'; } From a45c0807d1eaf53afbd3a73cf1ea7a616a9f3868 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 22 Apr 2025 15:08:01 +0330 Subject: [PATCH 028/256] fix : some ui bug --- android/app/src/main/AndroidManifest.xml | 1 + .../presentation/display_information/view.dart | 2 +- .../supervision/lib/presentation/filter/view.dart | 2 +- .../lib/presentation/profile/view.dart | 13 ++++++------- .../draggable_bottom_sheet_controller.dart | 15 ++++++++------- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 94398a7..1e152ab 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ android:exported="true" android:launchMode="singleTop" android:taskAffinity="" + android:enableOnBackInvokedCallback="true" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" diff --git a/features/supervision/lib/presentation/display_information/view.dart b/features/supervision/lib/presentation/display_information/view.dart index 9b4ddca..a48da49 100644 --- a/features/supervision/lib/presentation/display_information/view.dart +++ b/features/supervision/lib/presentation/display_information/view.dart @@ -78,7 +78,7 @@ class DisplayInformationPage extends GetView { Expanded(child: ROutlinedElevated( height: 40, text: 'انصراف', onPressed: (){ - Get.offAllNamed(SupervisionRoutes.supervision); + Get.until((route) => route.isFirst); })) ], ) diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/supervision/lib/presentation/filter/view.dart index 49ca869..77f8e7f 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/supervision/lib/presentation/filter/view.dart @@ -23,7 +23,7 @@ class SupervisionFilterPage extends GetView { @override Widget build(BuildContext context) { return PopScope( - canPop: controller.sheetController.value.handleBack(), + canPop: controller.sheetController.value.handleBack, onPopInvokedWithResult: (didPop, result) { if (!didPop && controller.sheetController.value.bottomSheets.isNotEmpty) { diff --git a/features/supervision/lib/presentation/profile/view.dart b/features/supervision/lib/presentation/profile/view.dart index 7c2b49e..d0f417b 100644 --- a/features/supervision/lib/presentation/profile/view.dart +++ b/features/supervision/lib/presentation/profile/view.dart @@ -43,7 +43,6 @@ class ProfilePage extends GetView { Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - spacing: 16, children: [ SizedBox( @@ -77,12 +76,12 @@ class ProfilePage extends GetView { itemCount: controller.roles.length, ), ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 30, - vertical: 10, - ), - child: Expanded( + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 30, + vertical: 10, + ), child: ObxValue((data) { return switch (data.value) { 0 => userProfileInformation(), diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart index 8c57cdf..ac393f5 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart @@ -116,12 +116,13 @@ class DraggableBottomSheetController extends GetxController { }); } } - - bool handleBack() { - if (bottomSheets.isNotEmpty) { - removeLastBottomSheet(); - return true; - } - return false; + bool get handleBack{ + if (bottomSheets.isNotEmpty) { + removeLastBottomSheet(); + return true; } + return false; + } + } + From 1ad180d0b6d2411bfd1aba3fc82ee71acc42551e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 22 Apr 2025 15:51:05 +0330 Subject: [PATCH 029/256] chore : change package supervision to inspection --- .../lib/data/utils/marker_generator.dart | 0 .../lib/inspection.dart} | 0 .../lib/presentation/action/logic.dart | 0 .../lib/presentation/action/view.dart | 0 .../add_mobile_inspector/logic.dart | 0 .../add_mobile_inspector/view.dart | 4 +- .../presentation/add_supervision/logic.dart | 0 .../presentation/add_supervision/view.dart | 4 +- .../display_information/logic.dart | 0 .../display_information/view.dart | 2 +- .../lib/presentation/filter/logic.dart | 2 +- .../lib/presentation/filter/view.dart | 10 +-- .../presentation/location_details/logic.dart | 0 .../presentation/location_details/view.dart | 0 .../lib/presentation/profile/logic.dart | 0 .../lib/presentation/profile/view.dart | 0 .../registration_of_violation/logic.dart | 0 .../registration_of_violation/view.dart | 6 +- .../lib/presentation/root/logic.dart | 8 +-- .../lib/presentation/root/view.dart | 0 .../lib/presentation/routes/app_pages.dart | 69 +++++++++++++++++++ .../lib/presentation/routes/app_routes.dart | 12 ++++ .../presentation/widget/cluster_marker.dart | 0 .../{supervision => inspection}/pubspec.lock | 0 .../{supervision => inspection}/pubspec.yaml | 4 +- .../lib/presentation/routes/app_pages.dart | 69 ------------------- .../lib/presentation/routes/app_routes.dart | 16 ----- .../auth/auth_with_use_and_pass/view.dart | 8 +-- lib/presentation/pages/splash/logic.dart | 4 +- lib/presentation/routes/app_pages.dart | 4 +- pubspec.lock | 22 +++--- pubspec.yaml | 4 +- 32 files changed, 121 insertions(+), 127 deletions(-) rename features/{supervision => inspection}/lib/data/utils/marker_generator.dart (100%) rename features/{supervision/lib/supervision.dart => inspection/lib/inspection.dart} (100%) rename features/{supervision => inspection}/lib/presentation/action/logic.dart (100%) rename features/{supervision => inspection}/lib/presentation/action/view.dart (100%) rename features/{supervision => inspection}/lib/presentation/add_mobile_inspector/logic.dart (100%) rename features/{supervision => inspection}/lib/presentation/add_mobile_inspector/view.dart (96%) rename features/{supervision => inspection}/lib/presentation/add_supervision/logic.dart (100%) rename features/{supervision => inspection}/lib/presentation/add_supervision/view.dart (97%) rename features/{supervision => inspection}/lib/presentation/display_information/logic.dart (100%) rename features/{supervision => inspection}/lib/presentation/display_information/view.dart (99%) rename features/{supervision => inspection}/lib/presentation/filter/logic.dart (98%) rename features/{supervision => inspection}/lib/presentation/filter/view.dart (98%) rename features/{supervision => inspection}/lib/presentation/location_details/logic.dart (100%) rename features/{supervision => inspection}/lib/presentation/location_details/view.dart (100%) rename features/{supervision => inspection}/lib/presentation/profile/logic.dart (100%) rename features/{supervision => inspection}/lib/presentation/profile/view.dart (100%) rename features/{supervision => inspection}/lib/presentation/registration_of_violation/logic.dart (100%) rename features/{supervision => inspection}/lib/presentation/registration_of_violation/view.dart (94%) rename features/{supervision => inspection}/lib/presentation/root/logic.dart (64%) rename features/{supervision => inspection}/lib/presentation/root/view.dart (100%) create mode 100644 features/inspection/lib/presentation/routes/app_pages.dart create mode 100644 features/inspection/lib/presentation/routes/app_routes.dart rename features/{supervision => inspection}/lib/presentation/widget/cluster_marker.dart (100%) rename features/{supervision => inspection}/pubspec.lock (100%) rename features/{supervision => inspection}/pubspec.yaml (81%) delete mode 100644 features/supervision/lib/presentation/routes/app_pages.dart delete mode 100644 features/supervision/lib/presentation/routes/app_routes.dart diff --git a/features/supervision/lib/data/utils/marker_generator.dart b/features/inspection/lib/data/utils/marker_generator.dart similarity index 100% rename from features/supervision/lib/data/utils/marker_generator.dart rename to features/inspection/lib/data/utils/marker_generator.dart diff --git a/features/supervision/lib/supervision.dart b/features/inspection/lib/inspection.dart similarity index 100% rename from features/supervision/lib/supervision.dart rename to features/inspection/lib/inspection.dart diff --git a/features/supervision/lib/presentation/action/logic.dart b/features/inspection/lib/presentation/action/logic.dart similarity index 100% rename from features/supervision/lib/presentation/action/logic.dart rename to features/inspection/lib/presentation/action/logic.dart diff --git a/features/supervision/lib/presentation/action/view.dart b/features/inspection/lib/presentation/action/view.dart similarity index 100% rename from features/supervision/lib/presentation/action/view.dart rename to features/inspection/lib/presentation/action/view.dart diff --git a/features/supervision/lib/presentation/add_mobile_inspector/logic.dart b/features/inspection/lib/presentation/add_mobile_inspector/logic.dart similarity index 100% rename from features/supervision/lib/presentation/add_mobile_inspector/logic.dart rename to features/inspection/lib/presentation/add_mobile_inspector/logic.dart diff --git a/features/supervision/lib/presentation/add_mobile_inspector/view.dart b/features/inspection/lib/presentation/add_mobile_inspector/view.dart similarity index 96% rename from features/supervision/lib/presentation/add_mobile_inspector/view.dart rename to features/inspection/lib/presentation/add_mobile_inspector/view.dart index df7c460..87d4a82 100644 --- a/features/supervision/lib/presentation/add_mobile_inspector/view.dart +++ b/features/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -3,7 +3,7 @@ import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; -import 'package:supervision/presentation/routes/app_routes.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'logic.dart'; @@ -106,7 +106,7 @@ class AddMobileInspectorPage extends GetView { RElevated( text: 'مرحله بعد', onPressed: () { - Get.toNamed(SupervisionRoutes.supervisionRegistrationOfViolation); + Get.toNamed(InspectionRoutes.inspectionRegistrationOfViolation); }, isFullWidth: true, height: 40, diff --git a/features/supervision/lib/presentation/add_supervision/logic.dart b/features/inspection/lib/presentation/add_supervision/logic.dart similarity index 100% rename from features/supervision/lib/presentation/add_supervision/logic.dart rename to features/inspection/lib/presentation/add_supervision/logic.dart diff --git a/features/supervision/lib/presentation/add_supervision/view.dart b/features/inspection/lib/presentation/add_supervision/view.dart similarity index 97% rename from features/supervision/lib/presentation/add_supervision/view.dart rename to features/inspection/lib/presentation/add_supervision/view.dart index 2b5c68b..eb6ad50 100644 --- a/features/supervision/lib/presentation/add_supervision/view.dart +++ b/features/inspection/lib/presentation/add_supervision/view.dart @@ -3,7 +3,7 @@ import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; import 'package:rasadyar_core/presentation/widget/tabs/new_tab.dart'; -import 'package:supervision/supervision.dart'; +import 'package:inspection/inspection.dart'; import 'logic.dart'; @@ -72,7 +72,7 @@ class AddSupervisionPage extends GetView { child: RElevated( text: 'مرحله بعد', onPressed: () { - Get.toNamed(SupervisionRoutes.supervisionAddMobileInspector); + Get.toNamed(InspectionRoutes.inspectionAddMobileInspector); }, height: 40, isFullWidth: true, diff --git a/features/supervision/lib/presentation/display_information/logic.dart b/features/inspection/lib/presentation/display_information/logic.dart similarity index 100% rename from features/supervision/lib/presentation/display_information/logic.dart rename to features/inspection/lib/presentation/display_information/logic.dart diff --git a/features/supervision/lib/presentation/display_information/view.dart b/features/inspection/lib/presentation/display_information/view.dart similarity index 99% rename from features/supervision/lib/presentation/display_information/view.dart rename to features/inspection/lib/presentation/display_information/view.dart index a48da49..f2abc78 100644 --- a/features/supervision/lib/presentation/display_information/view.dart +++ b/features/inspection/lib/presentation/display_information/view.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; -import 'package:supervision/supervision.dart'; +import 'package:inspection/inspection.dart'; import 'logic.dart'; diff --git a/features/supervision/lib/presentation/filter/logic.dart b/features/inspection/lib/presentation/filter/logic.dart similarity index 98% rename from features/supervision/lib/presentation/filter/logic.dart rename to features/inspection/lib/presentation/filter/logic.dart index 4818aaa..272f63c 100644 --- a/features/supervision/lib/presentation/filter/logic.dart +++ b/features/inspection/lib/presentation/filter/logic.dart @@ -7,7 +7,7 @@ import 'package:flutter_map_animations/flutter_map_animations.dart'; import 'package:geolocator/geolocator.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:supervision/data/utils/marker_generator.dart'; +import 'package:inspection/data/utils/marker_generator.dart'; enum BottomSheetStep { filter, markerSelected, markerDetails } diff --git a/features/supervision/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart similarity index 98% rename from features/supervision/lib/presentation/filter/view.dart rename to features/inspection/lib/presentation/filter/view.dart index 77f8e7f..8477e16 100644 --- a/features/supervision/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -3,7 +3,7 @@ import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; -import 'package:supervision/presentation/routes/app_routes.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'logic.dart'; @@ -146,7 +146,7 @@ class SupervisionFilterPage extends GetView { children: [ CustomSlidableAction( onPressed: (context) { - Get.toNamed(SupervisionRoutes.supervisionLocationDetails); + Get.toNamed(InspectionRoutes.inspectionLocationDetails); }, backgroundColor: AppColor.blueNormal, foregroundColor: Colors.white, @@ -159,7 +159,7 @@ class SupervisionFilterPage extends GetView { ), CustomSlidableAction( onPressed: (context) { - Get.toNamed(SupervisionRoutes.supervisionAddSupervision); + Get.toNamed(InspectionRoutes.inspectionAddSupervision); }, backgroundColor: AppColor.greenNormal, padding: EdgeInsets.all(16), @@ -445,7 +445,7 @@ class SupervisionFilterPage extends GetView { vecWidgetWithOnTap( assets: Assets.vecMapSvg, onTap: () { - Get.toNamed(SupervisionRoutes.supervisionLocationDetails); + Get.toNamed(InspectionRoutes.inspectionLocationDetails); }, width: 24, height: 24, @@ -457,7 +457,7 @@ class SupervisionFilterPage extends GetView { height: 24, color: AppColor.greenNormal, onTap: () { - Get.toNamed(SupervisionRoutes.supervisionAddSupervision); + Get.toNamed(InspectionRoutes.inspectionAddSupervision); }, ), diff --git a/features/supervision/lib/presentation/location_details/logic.dart b/features/inspection/lib/presentation/location_details/logic.dart similarity index 100% rename from features/supervision/lib/presentation/location_details/logic.dart rename to features/inspection/lib/presentation/location_details/logic.dart diff --git a/features/supervision/lib/presentation/location_details/view.dart b/features/inspection/lib/presentation/location_details/view.dart similarity index 100% rename from features/supervision/lib/presentation/location_details/view.dart rename to features/inspection/lib/presentation/location_details/view.dart diff --git a/features/supervision/lib/presentation/profile/logic.dart b/features/inspection/lib/presentation/profile/logic.dart similarity index 100% rename from features/supervision/lib/presentation/profile/logic.dart rename to features/inspection/lib/presentation/profile/logic.dart diff --git a/features/supervision/lib/presentation/profile/view.dart b/features/inspection/lib/presentation/profile/view.dart similarity index 100% rename from features/supervision/lib/presentation/profile/view.dart rename to features/inspection/lib/presentation/profile/view.dart diff --git a/features/supervision/lib/presentation/registration_of_violation/logic.dart b/features/inspection/lib/presentation/registration_of_violation/logic.dart similarity index 100% rename from features/supervision/lib/presentation/registration_of_violation/logic.dart rename to features/inspection/lib/presentation/registration_of_violation/logic.dart diff --git a/features/supervision/lib/presentation/registration_of_violation/view.dart b/features/inspection/lib/presentation/registration_of_violation/view.dart similarity index 94% rename from features/supervision/lib/presentation/registration_of_violation/view.dart rename to features/inspection/lib/presentation/registration_of_violation/view.dart index d012467..c3afd32 100644 --- a/features/supervision/lib/presentation/registration_of_violation/view.dart +++ b/features/inspection/lib/presentation/registration_of_violation/view.dart @@ -3,8 +3,8 @@ import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; -import 'package:supervision/presentation/registration_of_violation/logic.dart'; -import 'package:supervision/presentation/routes/app_routes.dart'; +import 'package:inspection/presentation/registration_of_violation/logic.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; class RegistrationOfViolationPage extends GetView { @@ -103,7 +103,7 @@ backgroundColor:AppColor.bgLight, RElevated( text: 'مرحله بعد', onPressed: () { - Get.toNamed(SupervisionRoutes.supervisionDisplayInformation); + Get.toNamed(InspectionRoutes.inspectionDisplayInformation); }, isFullWidth: true, height: 40, diff --git a/features/supervision/lib/presentation/root/logic.dart b/features/inspection/lib/presentation/root/logic.dart similarity index 64% rename from features/supervision/lib/presentation/root/logic.dart rename to features/inspection/lib/presentation/root/logic.dart index c5d51a7..c7428af 100644 --- a/features/supervision/lib/presentation/root/logic.dart +++ b/features/inspection/lib/presentation/root/logic.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:supervision/presentation/action/view.dart'; -import 'package:supervision/presentation/filter/view.dart'; -import 'package:supervision/presentation/profile/view.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:inspection/presentation/action/view.dart'; +import 'package:inspection/presentation/filter/view.dart'; +import 'package:inspection/presentation/profile/view.dart'; class RootLogic extends GetxController { RxInt currentIndex = 0.obs; diff --git a/features/supervision/lib/presentation/root/view.dart b/features/inspection/lib/presentation/root/view.dart similarity index 100% rename from features/supervision/lib/presentation/root/view.dart rename to features/inspection/lib/presentation/root/view.dart diff --git a/features/inspection/lib/presentation/routes/app_pages.dart b/features/inspection/lib/presentation/routes/app_pages.dart new file mode 100644 index 0000000..b1ec38c --- /dev/null +++ b/features/inspection/lib/presentation/routes/app_pages.dart @@ -0,0 +1,69 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:inspection/presentation/action/logic.dart'; +import 'package:inspection/presentation/add_mobile_inspector/logic.dart'; +import 'package:inspection/presentation/add_mobile_inspector/view.dart'; +import 'package:inspection/presentation/add_supervision/logic.dart'; +import 'package:inspection/presentation/add_supervision/view.dart'; +import 'package:inspection/presentation/display_information/logic.dart'; +import 'package:inspection/presentation/display_information/view.dart'; +import 'package:inspection/presentation/filter/logic.dart'; +import 'package:inspection/presentation/location_details/logic.dart'; +import 'package:inspection/presentation/location_details/view.dart'; +import 'package:inspection/presentation/profile/logic.dart'; +import 'package:inspection/presentation/profile/view.dart'; +import 'package:inspection/presentation/registration_of_violation/logic.dart'; +import 'package:inspection/presentation/registration_of_violation/view.dart'; +import 'package:inspection/presentation/root/logic.dart'; +import 'package:inspection/presentation/root/view.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; + +sealed class InspectionPages { + InspectionPages._(); + + static final pages = [ + GetPage( + name: InspectionRoutes.inspection, + page: () => RootPage(), + binding: BindingsBuilder(() { + Get.put(RootLogic()); + Get.put(SupervisionFilterLogic()); + Get.lazyPut(() => LocationDetailsLogic(), fenix: true); + Get.lazyPut(() => ActionLogic(), fenix: true); + Get.lazyPut(() => ProfileLogic(), fenix: true); + }), + ), + + GetPage( + name: InspectionRoutes.inspectionLocationDetails, + page: () => LocationDetailsPage(), + bindings: [BindingsBuilder.put(() => LocationDetailsLogic())], + ), + + GetPage( + name: InspectionRoutes.inspectionAddSupervision, + page: () => AddSupervisionPage(), + binding: BindingsBuilder.put(() => AddSupervisionLogic()), + ), + GetPage( + name: InspectionRoutes.inspectionRegistrationOfViolation, + page: () => RegistrationOfViolationPage(), + binding: BindingsBuilder.put(() => RegistrationOfViolationLogic()), + ), + + GetPage( + name: InspectionRoutes.inspectionDisplayInformation, + page: () => DisplayInformationPage(), + binding: BindingsBuilder.put(() => DisplayInformationLogic()), + ), + GetPage( + name: InspectionRoutes.inspectionUserProfile, + page: () => ProfilePage(), + binding: BindingsBuilder.put(() => ProfileLogic()), + ), + GetPage( + name: InspectionRoutes.inspectionAddMobileInspector, + page: () => AddMobileInspectorPage(), + binding: BindingsBuilder.put(() => AddMobileInspectorLogic()), + ), + ]; +} diff --git a/features/inspection/lib/presentation/routes/app_routes.dart b/features/inspection/lib/presentation/routes/app_routes.dart new file mode 100644 index 0000000..beff1e6 --- /dev/null +++ b/features/inspection/lib/presentation/routes/app_routes.dart @@ -0,0 +1,12 @@ +sealed class InspectionRoutes { + InspectionRoutes._(); + + static const inspection = '/supervision'; + static const inspectionAction = '$inspection/action'; + static const inspectionUserProfile = '$inspection/userSettings'; + static const inspectionLocationDetails = '$inspection/locationDetails'; + static const inspectionAddSupervision = '$inspectionLocationDetails/addSupervision'; + static const inspectionAddMobileInspector = '$inspectionLocationDetails/addMobileInspector'; + static const inspectionRegistrationOfViolation = '$inspectionAddSupervision/RegistrationOfViolation'; + static const inspectionDisplayInformation = '$inspectionRegistrationOfViolation/DisplayInformation'; +} diff --git a/features/supervision/lib/presentation/widget/cluster_marker.dart b/features/inspection/lib/presentation/widget/cluster_marker.dart similarity index 100% rename from features/supervision/lib/presentation/widget/cluster_marker.dart rename to features/inspection/lib/presentation/widget/cluster_marker.dart diff --git a/features/supervision/pubspec.lock b/features/inspection/pubspec.lock similarity index 100% rename from features/supervision/pubspec.lock rename to features/inspection/pubspec.lock diff --git a/features/supervision/pubspec.yaml b/features/inspection/pubspec.yaml similarity index 81% rename from features/supervision/pubspec.yaml rename to features/inspection/pubspec.yaml index 7dd0679..cea82c7 100644 --- a/features/supervision/pubspec.yaml +++ b/features/inspection/pubspec.yaml @@ -1,5 +1,5 @@ -name: supervision -description: "A new Flutter project." +name: inspection +description: "inspection module for rasadyar" publish_to: 'none' version: 1.0.0 diff --git a/features/supervision/lib/presentation/routes/app_pages.dart b/features/supervision/lib/presentation/routes/app_pages.dart deleted file mode 100644 index de326a2..0000000 --- a/features/supervision/lib/presentation/routes/app_pages.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:rasadyar_core/core.dart'; -import 'package:supervision/presentation/action/logic.dart'; -import 'package:supervision/presentation/add_mobile_inspector/logic.dart'; -import 'package:supervision/presentation/add_mobile_inspector/view.dart'; -import 'package:supervision/presentation/add_supervision/logic.dart'; -import 'package:supervision/presentation/add_supervision/view.dart'; -import 'package:supervision/presentation/display_information/logic.dart'; -import 'package:supervision/presentation/display_information/view.dart'; -import 'package:supervision/presentation/filter/logic.dart'; -import 'package:supervision/presentation/location_details/logic.dart'; -import 'package:supervision/presentation/location_details/view.dart'; -import 'package:supervision/presentation/profile/logic.dart'; -import 'package:supervision/presentation/profile/view.dart'; -import 'package:supervision/presentation/registration_of_violation/logic.dart'; -import 'package:supervision/presentation/registration_of_violation/view.dart'; -import 'package:supervision/presentation/root/logic.dart'; -import 'package:supervision/presentation/root/view.dart'; -import 'package:supervision/presentation/routes/app_routes.dart'; - -sealed class SupervisionPages { - SupervisionPages._(); - - static final pages = [ - GetPage( - name: SupervisionRoutes.supervision, - page: () => RootPage(), - binding: BindingsBuilder(() { - Get.put(RootLogic()); - Get.put(SupervisionFilterLogic()); - Get.lazyPut(() => LocationDetailsLogic(), fenix: true); - Get.lazyPut(() => ActionLogic(), fenix: true); - Get.lazyPut(() => ProfileLogic(), fenix: true); - }), - ), - - GetPage( - name: SupervisionRoutes.supervisionLocationDetails, - page: () => LocationDetailsPage(), - bindings: [BindingsBuilder.put(() => LocationDetailsLogic())], - ), - - GetPage( - name: SupervisionRoutes.supervisionAddSupervision, - page: () => AddSupervisionPage(), - binding: BindingsBuilder.put(() => AddSupervisionLogic()), - ), - GetPage( - name: SupervisionRoutes.supervisionRegistrationOfViolation, - page: () => RegistrationOfViolationPage(), - binding: BindingsBuilder.put(() => RegistrationOfViolationLogic()), - ), - - GetPage( - name: SupervisionRoutes.supervisionDisplayInformation, - page: () => DisplayInformationPage(), - binding: BindingsBuilder.put(() => DisplayInformationLogic()), - ), - GetPage( - name: SupervisionRoutes.supervisionUserProfile, - page: () => ProfilePage(), - binding: BindingsBuilder.put(() => ProfileLogic()), - ), - GetPage( - name: SupervisionRoutes.supervisionAddMobileInspector, - page: () => AddMobileInspectorPage(), - binding: BindingsBuilder.put(() => AddMobileInspectorLogic()), - ), - ]; -} diff --git a/features/supervision/lib/presentation/routes/app_routes.dart b/features/supervision/lib/presentation/routes/app_routes.dart deleted file mode 100644 index 8693dc5..0000000 --- a/features/supervision/lib/presentation/routes/app_routes.dart +++ /dev/null @@ -1,16 +0,0 @@ -sealed class SupervisionRoutes { - SupervisionRoutes._(); - - static const supervision = '/supervision'; - static const supervisionAction = '$supervision/action'; - static const supervisionUserProfile = '$supervision/userSettings'; - static const supervisionLocationDetails = '$supervision/locationDetails'; - static const supervisionAddSupervision = - '$supervisionLocationDetails/addSupervision'; - static const supervisionAddMobileInspector = - '$supervisionLocationDetails/addMobileInspector'; - static const supervisionRegistrationOfViolation = - '$supervisionAddSupervision/RegistrationOfViolation'; - static const supervisionDisplayInformation = - '$supervisionRegistrationOfViolation/DisplayInformation'; -} diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart index e92376c..33d73d8 100644 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart @@ -2,15 +2,14 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:logger/logger.dart'; -import 'package:rasadyar_app/infrastructure/di/di.dart'; +import 'package:inspection/inspection.dart'; import 'package:rasadyar_app/presentation/common/app_color.dart'; import 'package:rasadyar_app/presentation/common/app_fonts.dart'; import 'package:rasadyar_app/presentation/common/assets.dart'; import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart'; import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; -import 'package:supervision/supervision.dart'; + import 'logic.dart'; class AuthWithUseAndPassPage extends GetView { @@ -234,10 +233,9 @@ class AuthWithUseAndPassPage extends GetView { RElevated( text: 'ورود', onPressed: () { - if (data.value.currentState?.validate() == true && controller.captchaController.validate()) { - Get.toNamed(SupervisionRoutes.supervision); + Get.toNamed(InspectionRoutes.inspection); } }, width: Get.width, diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 1f47f60..7542f46 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -1,7 +1,7 @@ import 'package:flutter/animation.dart'; import 'package:get/get.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import 'package:supervision/supervision.dart'; +import 'package:inspection/inspection.dart'; class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController scaleController; @@ -55,7 +55,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { void onReady() { super.onReady(); Future.delayed(const Duration(seconds: 1), () { - Get.offAllNamed(SupervisionRoutes.supervision); + Get.offAllNamed(InspectionRoutes.inspection); }); } diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index e3b62ae..ab5cb96 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -1,10 +1,10 @@ import 'package:get/get.dart'; +import 'package:inspection/presentation/routes/app_pages.dart'; import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logic.dart'; import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; import 'package:rasadyar_app/presentation/pages/splash/view.dart'; import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; -import 'package:supervision/supervision.dart'; part 'app_paths.dart'; @@ -27,6 +27,6 @@ sealed class AppPages { binding: BindingsBuilder.put(() => AuthWithUseAndPassLogic()), ), - ...SupervisionPages.pages, + ...InspectionPages.pages, ]; } diff --git a/pubspec.lock b/pubspec.lock index 747dc7c..edfdacd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -29,10 +29,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -213,10 +213,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -477,6 +477,13 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + inspection: + dependency: "direct main" + description: + path: "features/inspection" + relative: true + source: path + version: "1.0.0" intl: dependency: transitive description: @@ -1017,13 +1024,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" - supervision: - dependency: "direct main" - description: - path: "features/supervision" - relative: true - source: path - version: "1.0.0" term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 97afd30..51aeb2e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,8 +36,8 @@ dependencies: get_it: ^8.0.3 - supervision: - path: ./features/supervision + inspection: + path: ./features/inspection rasadyar_core: path: ./packages/core From 72d24f711eef72a5a43fce33f95cfcacb65c4010 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 23 Apr 2025 08:33:50 +0330 Subject: [PATCH 030/256] fix : profile page --- features/inspection/lib/presentation/filter/view.dart | 1 - features/inspection/lib/presentation/profile/view.dart | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index 8477e16..486d9a8 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -60,7 +60,6 @@ class SupervisionFilterPage extends GetView { ], ); }, controller.currentLocation), - Positioned( right: 10, bottom: 150, diff --git a/features/inspection/lib/presentation/profile/view.dart b/features/inspection/lib/presentation/profile/view.dart index d0f417b..c6a321b 100644 --- a/features/inspection/lib/presentation/profile/view.dart +++ b/features/inspection/lib/presentation/profile/view.dart @@ -128,6 +128,10 @@ class ProfilePage extends GetView { ), ); }, controller.selectedInformationType), + + SizedBox( + height: 100, + ) ], ), ), From 898d610a29c86e094bf4e8eddb53ce41c8aeb6aa Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 26 Apr 2025 08:52:42 +0330 Subject: [PATCH 031/256] chore : persian_datetime_picker lib --- packages/core/pubspec.lock | 24 ++++++++++++++++++++---- packages/core/pubspec.yaml | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 31270d6..6ce6b21 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -29,10 +29,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -632,6 +632,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" + persian_datetime_picker: + dependency: "direct main" + description: + name: persian_datetime_picker + sha256: "7ccbfd3a68dc89d405550f624e9fa590c914fed2aa2d48973c4f4400baab2e06" + url: "https://pub.dev" + source: hosted + version: "3.1.0" petitparser: dependency: transitive description: @@ -688,6 +696,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.28.0" + shamsi_date: + dependency: transitive + description: + name: shamsi_date + sha256: "4614789ed11bfffe5ba0aa157a20f2857ab6328528401766e0d924e453c866bd" + url: "https://pub.dev" + source: hosted + version: "1.0.4" shelf: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 724acd2..e1795ee 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: get_it: ^8.0.3 permission_handler: ^11.4.0 + persian_datetime_picker: ^3.1.0 From 12be91d7f81bbacb1ab4a7117840857774047daf Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 26 Apr 2025 09:25:49 +0330 Subject: [PATCH 032/256] chore : remove duplicate code in lib and core --- lib/main.dart | 3 +- lib/presentation/common/app_color.dart | 368 -------- lib/presentation/common/app_fonts.dart | 169 ---- lib/presentation/common/assets.dart | 72 -- .../auth/auth_with_use_and_pass/logic.dart | 3 +- .../auth/auth_with_use_and_pass/view.dart | 9 +- lib/presentation/pages/splash/view.dart | 5 +- .../pages/system_design/system_design.dart | 14 +- lib/presentation/widget/buttons/elevated.dart | 56 -- lib/presentation/widget/buttons/fab.dart | 234 ------ .../widget/buttons/fab_outlined.dart | 607 -------------- .../widget/buttons/outline_elevated.dart | 101 --- .../widget/buttons/outline_elevated_icon.dart | 103 --- .../widget/buttons/text_button.dart | 77 -- .../widget/captcha/captcha_widget.dart | 266 ------ lib/presentation/widget/inputs/r_input.dart | 216 ----- .../pagination/pagination_from_until.dart | 255 ------ .../widget/pagination/show_more.dart | 78 -- lib/presentation/widget/tabs/new_tab.dart | 784 ------------------ lib/presentation/widget/tabs/tab.dart | 115 --- lib/presentation/widget/vec_widget.dart | 133 --- .../core/lib/presentation/utils/utils.dart | 2 +- .../core/lib/presentation/widget/widget.dart | 10 + pubspec.lock | 376 +-------- pubspec.yaml | 37 - 25 files changed, 43 insertions(+), 4050 deletions(-) delete mode 100644 lib/presentation/common/app_color.dart delete mode 100644 lib/presentation/common/app_fonts.dart delete mode 100644 lib/presentation/common/assets.dart delete mode 100644 lib/presentation/widget/buttons/elevated.dart delete mode 100644 lib/presentation/widget/buttons/fab.dart delete mode 100644 lib/presentation/widget/buttons/fab_outlined.dart delete mode 100644 lib/presentation/widget/buttons/outline_elevated.dart delete mode 100644 lib/presentation/widget/buttons/outline_elevated_icon.dart delete mode 100644 lib/presentation/widget/buttons/text_button.dart delete mode 100644 lib/presentation/widget/captcha/captcha_widget.dart delete mode 100644 lib/presentation/widget/inputs/r_input.dart delete mode 100644 lib/presentation/widget/pagination/pagination_from_until.dart delete mode 100644 lib/presentation/widget/pagination/show_more.dart delete mode 100644 lib/presentation/widget/tabs/new_tab.dart delete mode 100644 lib/presentation/widget/tabs/tab.dart delete mode 100644 lib/presentation/widget/vec_widget.dart diff --git a/lib/main.dart b/lib/main.dart index 6e2dc9d..840ae0c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,8 @@ import 'package:device_preview/device_preview.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; import 'package:rasadyar_app/domain/service/user/user_service.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/infrastructure/di/di.dart'; void main() async { diff --git a/lib/presentation/common/app_color.dart b/lib/presentation/common/app_color.dart deleted file mode 100644 index 6505e83..0000000 --- a/lib/presentation/common/app_color.dart +++ /dev/null @@ -1,368 +0,0 @@ -import 'package:flutter/material.dart'; - -class AppColor { - AppColor._(); - - //region --- Blue Colors --- - static const Color blueLight = Color( - 0xFFeaefff, - ); // #eaefff rgb(234, 239, 255) - static const Color blueLightHover = Color( - 0xFFe0e7ff, - ); // #e0e7ff rgb(224, 231, 255) - static const Color blueLightActive = Color( - 0xFFbecdff, - ); // #becdff rgb(190, 205, 255) - static const Color blueNormal = Color(0xFF2d5fff); // #2d5fff rgb(45, 95, 255) - static const Color blueNormalHover = Color( - 0xFF2956e6, - ); // #2956e6 rgb(41, 86, 230) - static const Color blueNormalActive = Color( - 0xFF244ccc, - ); // #244ccc rgb(36, 76, 204) - static const Color blueDark = Color(0xFF2247bf); // #2247bf rgb(34, 71, 191) - static const Color blueDarkHover = Color( - 0xFF1b3999, - ); // #1b3999 rgb(27, 57, 153) - static const Color blueDarkActive = Color( - 0xFF142b73, - ); // #142b73 rgb(20, 43, 115) - static const Color blueDarker = Color(0xFF102159); // #102159 rgb(16, 33, 89) - //endregion - - //region --- Green Colors --- - static const Color greenLight = Color( - 0xFFe6faf5, - ); // #e6faf5 rgb(230, 250, 245) - static const Color greenLightHover = Color( - 0xFFd9f7f0, - ); // #d9f7f0 rgb(217, 247, 240) - static const Color greenLightActive = Color( - 0xFFb0efdf, - ); // #b0efdf rgb(176, 239, 223) - static const Color greenNormal = Color( - 0xFF00cc99, - ); // #00cc99 rgb(0, 204, 153) - static const Color greenNormalHover = Color( - 0xFF00b88a, - ); // #00b88a rgb(0, 184, 138) - static const Color greenNormalActive = Color( - 0xFF00a37a, - ); // #00a37a rgb(0, 163, 122) - static const Color greenDark = Color(0xFF009973); // #009973 rgb(0, 153, 115) - static const Color greenDarkHover = Color( - 0xFF007a5c, - ); // #007a5c rgb(0, 122, 92) - static const Color greenDarkActive = Color( - 0xFF005c45, - ); // #005c45 rgb(0, 92, 69) - static const Color greenDarker = Color(0xFF004736); // #004736 rgb(0, 71, 54) - //endregion - - //region --- Black Colors --- - static const Color blackLight = Color( - 0xFFe6e6e6, - ); // #e6e6e6 rgb(230, 230, 230) - static const Color blackLightHover = Color( - 0xFFd9d9d9, - ); // #d9d9d9 rgb(217, 217, 217) - static const Color blackLightActive = Color( - 0xFFb0b0b0, - ); // #b0b0b0 rgb(176, 176, 176) - static const Color blackNormal = Color(0xFF000000); // #000000 rgb(0, 0, 0) - static const Color blackNormalHover = Color( - 0xFF000000, - ); // #000000 rgb(0, 0, 0) - static const Color blackNormalActive = Color( - 0xFF000000, - ); // #000000 rgb(0, 0, 0) - static const Color blackDark = Color(0xFF000000); // #000000 rgb(0, 0, 0) - static const Color blackDarkHover = Color(0xFF000000); // #000000 rgb(0, 0, 0) - static const Color blackDarkActive = Color( - 0xFF000000, - ); // #000000 rgb(0, 0, 0) - static const Color blackDarker = Color(0xFF000000); // #000000 rgb(0, 0, 0) - //endregion - - //region ---Dark Grey Colors --- - static const Color darkGreyLight = Color( - 0xFFeaeaea, - ); // #eaeaea rgb(234, 234, 234) - static const Color darkGreyLightHover = Color( - 0xFFdfdfdf, - ); // #dfdfdf rgb(223, 223, 223) - static const Color darkGreyLightActive = Color( - 0xFFbdbdbd, - ); // #bdbdbd rgb(189, 189, 189) - static const Color darkGreyNormal = Color( - 0xFF2a2a2a, - ); // #2a2a2a rgb(42, 42, 42) - static const Color darkGreyNormalHover = Color( - 0xFF262626, - ); // #262626 rgb(38, 38, 38) - static const Color darkGreyNormalActive = Color( - 0xFF222222, - ); // #222222 rgb(34, 34, 34) - static const Color darkGreyDark = Color( - 0xFF202020, - ); // #202020 rgb(32, 32, 32) - static const Color darkGreyDarkHover = Color( - 0xFF191919, - ); // #191919 rgb(25, 25, 25) - static const Color darkGreyDarkActive = Color( - 0xFF131313, - ); // #131313 rgb(19, 19, 19) - static const Color darkGreyDarker = Color( - 0xFF0f0f0f, - ); // #0f0f0f rgb(15, 15, 15) - //endregion - - //region ---Medium Grey Colors --- - static const Color mediumGreyLight = Color( - 0xFFf4f4f4, - ); // #f4f4f4 rgb(244, 244, 244) - static const Color mediumGreyLightHover = Color( - 0xFFeeeeee, - ); // #eeeeee rgb(238, 238, 238) - static const Color mediumGreyLightActive = Color( - 0xFFdcdcdc, - ); // #dcdcdc rgb(220, 220, 220) - static const Color mediumGreyNormal = Color( - 0xFF8f8f8f, - ); // #8f8f8f rgb(143, 143, 143) - static const Color mediumGreyNormalHover = Color( - 0xFF818181, - ); // #818181 rgb(129, 129, 129) - static const Color mediumGreyNormalActive = Color( - 0xFF727272, - ); // #727272 rgb(114, 114, 114) - static const Color mediumGreyDark = Color( - 0xFF6b6b6b, - ); // #6b6b6b rgb(107, 107, 107) - static const Color mediumGreyDarkHover = Color( - 0xFF565656, - ); // #565656 rgb(86, 86, 86) - static const Color mediumGreyDarkActive = Color( - 0xFF404040, - ); // #404040 rgb(64, 64, 64) - static const Color mediumGreyDarker = Color( - 0xFF323232, - ); // #323232 rgb(50, 50, 50) - //endregion - - //region ---Light Grey Colors --- - static const Color lightGreyLight = Color( - 0xFFfdfdfd, - ); // #fdfdfd rgb(253, 253, 253) - static const Color lightGreyLightHover = Color( - 0xFFfcfcfc, - ); // #fcfcfc rgb(252, 252, 252) - static const Color lightGreyLightActive = Color( - 0xFFfafafa, - ); // #fafafa rgb(250, 250, 250) - static const Color lightGreyNormal = Color( - 0xFFeeeeee, - ); // #eeeeee rgb(238, 238, 238) - static const Color lightGreyNormalHover = Color( - 0xFFd6d6d6, - ); // #d6d6d6 rgb(214, 214, 214) - static const Color lightGreyNormalActive = Color( - 0xFFbebebe, - ); // #bebebe rgb(190, 190, 190) - static const Color lightGreyDark = Color( - 0xFFb3b3b3, - ); // #b3b3b3 rgb(179, 179, 179) - static const Color lightGreyDarkHover = Color( - 0xFF8f8f8f, - ); // #8f8f8f rgb(143, 143, 143) - static const Color lightGreyDarkActive = Color( - 0xFF6b6b6b, - ); // #6b6b6b rgb(107, 107, 107) - static const Color lightGreyDarker = Color( - 0xFF535353, - ); // #535353 rgb(83, 83, 83) - //endregion - - //region ---WhiteGrey Colors --- - static const Color whiteGreyLight = Color( - 0xFFfefefe, - ); // #fefefe rgb(254, 254, 254) - static const Color whiteGreyLightHover = Color( - 0xFFfefefe, - ); // #fefefe rgb(254, 254, 254) - static const Color whiteGreyLightActive = Color( - 0xFFfdfdfd, - ); // #fdfdfd rgb(253, 253, 253) - static const Color whiteGreyNormal = Color( - 0xFFf9f9f9, - ); // #f9f9f9 rgb(249, 249, 249) - static const Color whiteGreyNormalHover = Color( - 0xFFe0e0e0, - ); // #e0e0e0 rgb(224, 224, 224) - static const Color whiteGreyNormalActive = Color( - 0xFFc7c7c7, - ); // #c7c7c7 rgb(199, 199, 199) - static const Color whiteGreyDark = Color( - 0xFFbbbbbb, - ); // #bbbbbb rgb(187, 187, 187) - static const Color whiteGreyDarkHover = Color( - 0xFF959595, - ); // #959595 rgb(149, 149, 149) - static const Color whiteGreyDarkActive = Color( - 0xFF707070, - ); // #707070 rgb(112, 112, 112) - static const Color whiteGreyDarker = Color( - 0xFF575757, - ); // #575757 rgb(87, 87, 87) - //endregion - - //region ---White Colors --- - static const Color whiteLight = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteLightHover = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteLightActive = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteNormal = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteNormalHover = Color( - 0xFFe6e6e6, - ); // #e6e6e6 rgb(230, 230, 230) - static const Color whiteNormalActive = Color( - 0xFFcccccc, - ); // #cccccc rgb(204, 204, 204) - static const Color whiteDark = Color( - 0xFFbfbfbf, - ); // #bfbfbf rgb(191, 191, 191) - static const Color whiteDarkHover = Color( - 0xFF999999, - ); // #999999 rgb(153, 153, 153) - static const Color whiteDarkActive = Color( - 0xFF737373, - ); // #737373 rgb(115, 115, 115) - static const Color whiteDarker = Color(0xFF595959); // #595959 rgb(89, 89, 89) - //endregion - - //region --- green1 Colors --- - static const Color green1Light = Color( - 0xFFe6f6f4, - ); // #e6f6f4 rgb(230, 246, 244) - static const Color green1LightHover = Color( - 0xFFd9f2ef, - ); // #d9f2ef rgb(217, 242, 239) - static const Color green1LightActive = Color( - 0xFFb0e4dd, - ); // #b0e4dd rgb(176, 228, 221) - static const Color green1Normal = Color( - 0xFF00a991, - ); // #00a991 rgb(0, 169, 145) - static const Color green1NormalHover = Color( - 0xFF009883, - ); // #009883 rgb(0, 152, 131) - static const Color green1NormalActive = Color( - 0xFF008774, - ); // #008774 rgb(0, 135, 116) - static const Color green1Dark = Color(0xFF007f6d); // #007f6d rgb(0, 127, 109) - static const Color green1DarkHover = Color( - 0xFF006557, - ); // #006557 rgb(0, 101, 87) - static const Color green1DarkActive = Color( - 0xFF004c41, - ); // #004c41 rgb(0, 76, 65) - static const Color green1Darker = Color(0xFF003b33); // #003b33 rgb(0, 59, 51) - //endregion - - //region --- Yellow Colors --- - static const Color yellowLight = Color( - 0xFFfff9e6, - ); // #fff9e6 rgb(255, 249, 230) - static const Color yellowLightHover = Color( - 0xFFfff6da, - ); // #fff6da rgb(255, 246, 218) - static const Color yellowLightActive = Color( - 0xFFffecb2, - ); // #ffecb2 rgb(255, 236, 178) - static const Color yellowNormal = Color( - 0xFFffc107, - ); // #ffc107 rgb(255, 193, 7) - static const Color yellowNormalHover = Color( - 0xFFe6ae06, - ); // #e6ae06 rgb(230, 174, 6) - static const Color yellowNormalActive = Color( - 0xFFcc9a06, - ); // #cc9a06 rgb(204, 154, 6) - static const Color yellowDark = Color(0xFFbf9105); // #bf9105 rgb(191, 145, 5) - static const Color yellowDarkHover = Color( - 0xFF997404, - ); // #997404 rgb(153, 116, 4) - static const Color yellowDarkActive = Color( - 0xFF735703, - ); // #735703 rgb(115, 87, 3) - static const Color yellowDarker = Color(0xFF594402); // #594402 rgb(89, 68, 2) - //endregion - - //region --- red Colors --- - static const Color redLight = Color(0xFFfdeeee); // #fdeeee rgb(253, 238, 238) - static const Color redLightHover = Color( - 0xFFfce6e6, - ); // #fce6e6 rgb(252, 230, 230) - static const Color redLightActive = Color( - 0xFFf9cbcb, - ); // #f9cbcb rgb(249, 203, 203) - static const Color redNormal = Color(0xFFeb5757); // #eb5757 rgb(235, 87, 87) - static const Color redNormalHover = Color( - 0xFFd44e4e, - ); // #d44e4e rgb(212, 78, 78) - static const Color redNormalActive = Color( - 0xFFbc4646, - ); // #bc4646 rgb(188, 70, 70) - static const Color redDark = Color(0xFFb04141); // #b04141 rgb(176, 65, 65) - static const Color redDarkHover = Color( - 0xFF8d3434, - ); // #8d3434 rgb(141, 52, 52) - static const Color redDarkActive = Color( - 0xFF6a2727, - ); // #6a2727 rgb(106, 39, 39) - static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30) - //endregion - - //region --- Teal Colors --- - static const Color tealLight = Color( - 0xFFe8f6f8, - ); // #e8f6f8 rgb(232, 246, 248) - static const Color tealLightHover = Color( - 0xFFdcf1f4, - ); // #dcf1f4 rgb(220, 241, 244) - static const Color tealLightActive = Color( - 0xFFb7e2e9, - ); // #b7e2e9 rgb(183, 226, 233) - static const Color tealNormal = Color( - 0xFF17a2b8, - ); // #17a2b8 rgb(23, 162, 184) - static const Color tealNormalHover = Color( - 0xFF1592a6, - ); // #1592a6 rgb(21, 146, 166) - static const Color tealNormalActive = Color( - 0xFF128293, - ); // #128293 rgb(18, 130, 147) - static const Color tealDark = Color(0xFF117a8a); // #117a8a rgb(17, 122, 138) - static const Color tealDarkHover = Color( - 0xFF0e616e, - ); // #0e616e rgb(14, 97, 110) - static const Color tealDarkActive = Color( - 0xFF0a4953, - ); // #0a4953 rgb(10, 73, 83) - static const Color tealDarker = Color(0xFF083940); // #083940 rgb(8, 57, 64) - //endregion - - //region --- category Colors --- - static const Color confirm = greenNormalActive; - static const Color warning =yellowNormal; - static const Color error =redNormal; - static const Color info = tealNormal; - //endregion -} diff --git a/lib/presentation/common/app_fonts.dart b/lib/presentation/common/app_fonts.dart deleted file mode 100644 index 65be3b0..0000000 --- a/lib/presentation/common/app_fonts.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:flutter/material.dart'; - -class AppFonts { - AppFonts._(); // Private constructor to prevent instantiation - - // --- Font Families --- - static const String yekan = 'yekan'; - - // --- Font Weights --- - static const FontWeight regular = FontWeight.w400; - static const FontWeight bold = FontWeight.w600; - static const double _height = 1.20; - - static const TextStyle yekan61 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 61, - height: _height, - ); - - static const TextStyle yekan49 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 48, - height: _height, - ); - - static const TextStyle yekan39 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 39, - height: _height, - ); - - static const TextStyle yekan31 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 31, - height: _height, - ); - - static const TextStyle yekan25 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 25, - height: _height, - ); - - static const TextStyle yekan24 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 24, - height: _height, - ); - - static const TextStyle yekan20 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 20, - height: _height, - ); - - static const TextStyle yekan18 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 18, - height: _height, - ); - - static const TextStyle yekan16 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 16, - height: _height, - ); - - static const TextStyle yekan14 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 13, - height: _height, - ); - - static const TextStyle yekan13 = TextStyle( - fontFamily: yekan, - fontWeight: regular, - fontSize: 13, - height: _height, - ); - - static const TextStyle yekan10 = TextStyle( - // Rounded from 10.24 - fontFamily: yekan, - fontWeight: regular, - fontSize: 10, - height: _height, - ); - - static const TextStyle yekan61Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 61, - height: _height, - ); - - static const TextStyle yekan49Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 48, - height: _height, - ); - - static const TextStyle yekan39Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 39, - height: _height, - ); - - static const TextStyle yekan31Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 31, - height: _height, - ); - - static const TextStyle yekan25Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 25, - height: _height, - ); - - static const TextStyle yekan24Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 24, - height: _height, - ); - - static const TextStyle yekan20Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 20, - height: _height, - ); - - static const TextStyle yekan16Bold = TextStyle( - // Base size bold - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 16, - height: _height, - ); - - static const TextStyle yekan13Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 13, - height: _height, - ); - - static const TextStyle yekan10Bold = TextStyle( - fontFamily: yekan, - fontWeight: bold, // Use bold weight - fontSize: 10, - height: _height, - ); -} diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart deleted file mode 100644 index 0e70b14..0000000 --- a/lib/presentation/common/assets.dart +++ /dev/null @@ -1,72 +0,0 @@ -///This file is automatically generated. DO NOT EDIT, all your changes would be lost. -class Assets { - Assets._(); - - static const String iconsAdd = 'assets/icons/add.svg'; - static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; - static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; - static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg'; - static const String iconsCalendar = 'assets/icons/calendar.svg'; - static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; - static const String iconsCall = 'assets/icons/call.svg'; - static const String iconsDiagram = 'assets/icons/diagram.svg'; - static const String iconsDownload = 'assets/icons/download.svg'; - static const String iconsEdit = 'assets/icons/edit.svg'; - static const String iconsExcelDownload = 'assets/icons/excel_download.svg'; - static const String iconsFilter = 'assets/icons/filter.svg'; - static const String iconsGps = 'assets/icons/gps.svg'; - static const String iconsInformation = 'assets/icons/information.svg'; - static const String iconsKey = 'assets/icons/key.svg'; - static const String iconsLogout = 'assets/icons/logout.svg'; - static const String iconsMap = 'assets/icons/map.svg'; - static const String iconsMapMarker = 'assets/icons/map_marker.svg'; - static const String iconsMessageAdd = 'assets/icons/message_add.svg'; - static const String iconsPdfDownload = 'assets/icons/pdf_download.svg'; - static const String iconsPictureFrame = 'assets/icons/picture_frame.svg'; - static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; - static const String iconsProfileUser = 'assets/icons/profile_user.svg'; - static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg'; - static const String iconsScan = 'assets/icons/scan.svg'; - static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; - static const String iconsSecurityTime = 'assets/icons/security_time.svg'; - static const String iconsSetting = 'assets/icons/setting.svg'; - static const String iconsTagUser = 'assets/icons/tag_user.svg'; - static const String iconsTrash = 'assets/icons/trash.svg'; - static const String iconsUser = 'assets/icons/user.svg'; - static const String iconsUserSquare = 'assets/icons/user_square.svg'; - static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; - static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; - static const String vecAddSvg = 'assets/vec/add.svg.vec'; - static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; - static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; - static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec'; - static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; - static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; - static const String vecCallSvg = 'assets/vec/call.svg.vec'; - static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; - static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; - static const String vecEditSvg = 'assets/vec/edit.svg.vec'; - static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec'; - static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; - static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; - static const String vecInformationSvg = 'assets/vec/information.svg.vec'; - static const String vecKeySvg = 'assets/vec/key.svg.vec'; - static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; - static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; - static const String vecMapSvg = 'assets/vec/map.svg.vec'; - static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; - static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec'; - static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec'; - static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; - static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; - static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec'; - static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; - static const String vecScanSvg = 'assets/vec/scan.svg.vec'; - static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; - static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; - static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec'; - static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; - static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec'; - static const String vecUserSvg = 'assets/vec/user.svg.vec'; - -} diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart index d5ac08e..580413d 100644 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart @@ -1,8 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart'; +import 'package:rasadyar_core/core.dart'; enum AuthType { useAndPass, otp } diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart index 33d73d8..dd0b469 100644 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart @@ -1,14 +1,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; import 'package:inspection/inspection.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; -import 'package:rasadyar_app/presentation/common/assets.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; -import 'package:rasadyar_app/presentation/widget/captcha/captcha_widget.dart'; -import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/captcha/captcha_widget.dart'; import 'logic.dart'; diff --git a/lib/presentation/pages/splash/view.dart b/lib/presentation/pages/splash/view.dart index 75f37c3..bffd309 100644 --- a/lib/presentation/pages/splash/view.dart +++ b/lib/presentation/pages/splash/view.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/assets.dart'; +import 'package:rasadyar_core/core.dart'; + import 'logic.dart'; diff --git a/lib/presentation/pages/system_design/system_design.dart b/lib/presentation/pages/system_design/system_design.dart index 6c5c04d..f53eb75 100644 --- a/lib/presentation/pages/system_design/system_design.dart +++ b/lib/presentation/pages/system_design/system_design.dart @@ -1,16 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; -import 'package:rasadyar_app/presentation/utils/color_utils.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/elevated.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/fab.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/fab_outlined.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/outline_elevated.dart'; -import 'package:rasadyar_app/presentation/widget/buttons/text_button.dart'; -import 'package:rasadyar_app/presentation/widget/inputs/r_input.dart'; -import 'package:rasadyar_app/presentation/widget/pagination/pagination_from_until.dart'; -import 'package:rasadyar_app/presentation/widget/pagination/show_more.dart'; -import 'package:rasadyar_app/presentation/widget/tabs/tab.dart'; +import 'package:rasadyar_core/core.dart'; + class SystemDesignPage extends StatefulWidget { const SystemDesignPage({super.key}); diff --git a/lib/presentation/widget/buttons/elevated.dart b/lib/presentation/widget/buttons/elevated.dart deleted file mode 100644 index 934bf4f..0000000 --- a/lib/presentation/widget/buttons/elevated.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; - -class RElevated extends StatefulWidget { - RElevated({ - super.key, - required this.text, - required this.onPressed, - foregroundColor, - backgroundColor, - disabledBackgroundColor, - disabledForegroundColor, - radius, - textStyle, - this.width = 150.0, - this.height = 56.0, - }); - - final String text; - final VoidCallback? onPressed; - final double width; - final double height; - Color? foregroundColor; - Color? backgroundColor; - Color? disabledForegroundColor; - Color? disabledBackgroundColor; - double? radius; - TextStyle? textStyle; - - @override - State createState() => _RElevatedState(); -} - -class _RElevatedState extends State { - @override - Widget build(BuildContext context) { - return ElevatedButton( - onPressed: widget.onPressed, - style: ElevatedButton.styleFrom( - backgroundColor: widget.backgroundColor ?? AppColor.blueNormal, - foregroundColor: widget.foregroundColor ?? Colors.white, - disabledBackgroundColor: - widget.disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38), - disabledForegroundColor: widget.disabledForegroundColor ?? Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(widget.radius ?? 8), - ), - fixedSize: Size(widget.width, widget.height), - padding: EdgeInsets.zero, - textStyle: widget.textStyle ?? AppFonts.yekan24, - ), - child: Text(widget.text), - ); - } -} diff --git a/lib/presentation/widget/buttons/fab.dart b/lib/presentation/widget/buttons/fab.dart deleted file mode 100644 index 360b850..0000000 --- a/lib/presentation/widget/buttons/fab.dart +++ /dev/null @@ -1,234 +0,0 @@ -/* -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/assets.dart'; -import 'package:rasadyar_app/presentation/utils/color_utils.dart'; -import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; - -class RFab extends StatefulWidget { - - - final VoidCallback? onPressed; - Color? foregroundColor; - Color? backgroundColor; - Color? disabledForegroundColor; - Color? disabledBackgroundColor; - double? radius; - ShapeBorder? shapeBorder; - Widget? icon; - - @override - State createState() => _RFabState(); - - //region Add - RFab.smallAdd({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecAddSvg), - backgroundColor: AppColor.greenNormal, - key: key, - ); - - RFab.add({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecAddSvg), - backgroundColor: AppColor.greenNormal, - key: key, - ); - - //endregion - - //region Edit - RFab.smallEdit({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecEditSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - RFab.edit({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecEditSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - //endregion - - //region delete - RFab.smallDelete({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecTrashSvg), - backgroundColor: AppColor.redNormal, - key: key, - ); - - RFab.delete({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecTrashSvg), - backgroundColor: AppColor.redNormal, - key: key, - ); - - //endregion - - //region action - RFab.smallAction({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecScanSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - RFab.action({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecScanSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - //endregion - - //region filter - RFab.smallFilter({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecFilterSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - RFab.filter({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecFilterSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - //endregion - - //region download - RFab.smallDownload({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - RFab.download({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - //endregion - - //region Excel - RFab.smallExcel({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), - backgroundColor: AppColor.greenDark, - key: key, - ); - - RFab.excel({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), - backgroundColor: AppColor.greenDark, - key: key, - ); - - //endregion - - //region Back - RFab.smallBack({required VoidCallback? onPressed, Key? key}) - : this.small( - onPressed: onPressed, - icon: vecWidget(Assets.vecArrowLeftSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - RFab.back({required VoidCallback? onPressed, Key? key}) - : this( - onPressed: onPressed, - icon: vecWidget(Assets.vecArrowLeftSvg), - backgroundColor: AppColor.blueNormal, - key: key, - ); - - //endregion - - //region General - RFab.small({ - required this.onPressed, - required this.icon, - required this.backgroundColor, - super.key, - }) : radius = 40.0, - foregroundColor = Colors.white; - - RFab({ - required this.onPressed, - required this.icon, - required this.backgroundColor, - super.key, - }) : radius = 56.0, - foregroundColor = Colors.white; - - //endregion -} - -class _RFabState extends State { - @override - Widget build(BuildContext context) { - return ElevatedButton( - onPressed: widget.onPressed, - style: ButtonStyle( - side: WidgetStateProperty.all(BorderSide.none), - backgroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return widget.backgroundColor?.pressedColor ?? - AppColor.blueNormalActive; - } else if (states.contains(WidgetState.hovered)) { - return widget.backgroundColor?.hoverColor ?? - AppColor.blueNormalHover; - } else if (states.contains(WidgetState.disabled)) { - return widget.backgroundColor?.disabledColor ?? - AppColor.blueNormal.disabledColor; - } - return widget.backgroundColor ?? AppColor.blueNormal; - }), - foregroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.disabled)) { - return widget.foregroundColor?.disabledColor; - } - return widget.foregroundColor; - }), - - shape: WidgetStatePropertyAll( - CircleBorder(side: BorderSide(width: 1, color: Colors.transparent)), - ), - fixedSize: WidgetStatePropertyAll( - Size(widget.radius ?? 56, widget.radius ?? 56), - ), - padding: WidgetStatePropertyAll(EdgeInsets.zero), - ), - child: widget.icon, - ); - } -} -*/ diff --git a/lib/presentation/widget/buttons/fab_outlined.dart b/lib/presentation/widget/buttons/fab_outlined.dart deleted file mode 100644 index ab6a1ba..0000000 --- a/lib/presentation/widget/buttons/fab_outlined.dart +++ /dev/null @@ -1,607 +0,0 @@ -/* -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/assets.dart'; -import 'package:rasadyar_app/presentation/utils/color_utils.dart'; -import 'package:rasadyar_app/presentation/widget/vec_widget.dart'; - -class RFabOutlined extends StatefulWidget { - final Widget icon; - VoidCallback? onPressed; - final Color backgroundColor; - final Color? borderColor; - final double? radius; - OutlinedBorder? shapeBorder; - - @override - State createState() => _RFabOutlinedState(); - - //region General - RFabOutlined({ - required this.icon, - required this.onPressed, - required this.backgroundColor, - required this.borderColor, - this.radius = 56.0, - super.key, - }) : shapeBorder = CircleBorder( - side: BorderSide(color: borderColor ?? Colors.transparent), - ); - - RFabOutlined.noBorder({ - required this.icon, - required this.onPressed, - required this.backgroundColor, - super.key, - }) : borderColor = Colors.transparent, - radius = 56.0, - shapeBorder = CircleBorder( - side: BorderSide(color: Colors.transparent, width: 1), - ); - - RFabOutlined.small({ - required this.icon, - required this.onPressed, - required this.backgroundColor, - required this.borderColor, - super.key, - }) : radius = 40.0, - shapeBorder = CircleBorder( - side: BorderSide(color: borderColor ?? Colors.transparent, width: 1), - ); - - RFabOutlined.smallNoBorder({ - required this.icon, - required this.onPressed, - required this.backgroundColor, - super.key, - }) : borderColor = Colors.transparent, - radius = 40.0, - shapeBorder = CircleBorder( - side: BorderSide(color: Colors.transparent, width: 1), - ); - - //endregion - - //region Add - RFabOutlined.smallAdd({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenNormal, - borderColor: AppColor.greenNormal, - icon: vecWidget2( - Assets.vecAddSvg, - - color: AppColor.greenNormal, - ), - ); - - RFabOutlined.smallAddNoBorder({VoidCallback? onPressed, Key? key}) - : this.smallNoBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenNormal, - icon: vecWidget( - Assets.vecAddSvg, - color: - onPressed != null - ? AppColor.greenNormal - : AppColor.greenNormal.disabledColor, - ), - ); - - RFabOutlined.add({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenNormal, - borderColor: AppColor.greenNormal, - icon: vecWidget( - Assets.vecAddSvg, - color: - onPressed != null - ? AppColor.greenNormal - : AppColor.greenNormal.disabledColor, - ), - ); - - RFabOutlined.addNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenNormal, - icon: vecWidget( - Assets.vecAddSvg, - color: - onPressed != null - ? AppColor.greenNormal - : AppColor.greenNormal.disabledColor, - ), - ); - - //endregion - - //region Edit - RFabOutlined.smallEdit({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.smallEditNoBorder({VoidCallback? onPressed, Key? key}) - : this.smallNoBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.edit({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.editNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - //endregion - - //region Delete - RFabOutlined.smallDelete({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.redNormal, - borderColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, - ), - ); - - RFabOutlined.smallDeleteNoBorder({VoidCallback? onPressed, Key? key}) - : this.smallNoBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, - ), - ); - - RFabOutlined.delete({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.redNormal, - borderColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, - ), - ); - - RFabOutlined.deleteNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, - ), - ); - - //endregion - - //region Action - RFabOutlined.smallAction({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.smallActionNoBorder({VoidCallback? onPressed, Key? key}) - : this.smallNoBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.action({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.actionNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - //endregion - - //region Filter - RFabOutlined.smallFilter({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.smallFilterNoBorder({VoidCallback? onPressed, Key? key}) - : this.smallNoBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.filter({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.filterNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - //endregion - - //region Download - RFabOutlined.smallDownload({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - RFabOutlined.smallDownloadNoBorder({VoidCallback? onPressed, Key? key}) - : this.smallNoBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - RFabOutlined.download({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - RFabOutlined.downloadNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - //endregion - - //region Excel - RFabOutlined.smallExcel({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenDark, - borderColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - RFabOutlined.smallExcelNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - RFabOutlined.excel({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenDark, - borderColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - RFabOutlined.excelNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, - ), - ); - - //endregion - - //region Back - RFabOutlined.smallBack({VoidCallback? onPressed, Key? key}) - : this.small( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.smallBackNoBorder({VoidCallback? onPressed, Key? key}) - : this.smallNoBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.back({VoidCallback? onPressed, Key? key}) - : this( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - RFabOutlined.backNoBorder({VoidCallback? onPressed, Key? key}) - : this.noBorder( - key: key, - onPressed: onPressed, - backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, - ), - ); - - //endregion -} - -class _RFabOutlinedState extends State { - bool isOnPressed =false; - @override - Widget build(BuildContext context) { - return OutlinedButton( - onPressed:widget.onPressed , - style: ButtonStyle( - side: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.disabled)) { - return BorderSide( - color: - widget.borderColor?.disabledColor ?? - AppColor.blueNormal.disabledColor, - width: 2, - ); - } - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal, - width: 2, - ); - }), - backgroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return widget.backgroundColor; - } else if (states.contains(WidgetState.hovered)) { - return widget.backgroundColor.hoverColor ?? - AppColor.blueNormal.hoverColor; - } else if (states.contains(WidgetState.disabled)) { - return widget.backgroundColor.disabledColor ?? - AppColor.blueNormal.disabledColor; - } - return Colors.transparent; - }), - foregroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return Colors.white; - } else if (states.contains(WidgetState.disabled)) { - return widget.backgroundColor.disabledColor ?? - AppColor.blueNormal.disabledColor; - } - return widget.backgroundColor; - }), - - shape: WidgetStatePropertyAll(widget.shapeBorder), - fixedSize: WidgetStatePropertyAll( - Size(widget.radius ?? 56, widget.radius ?? 56), - ), - padding: WidgetStatePropertyAll(EdgeInsets.zero), - ), - child: widget.icon - ); - } -} - -*/ diff --git a/lib/presentation/widget/buttons/outline_elevated.dart b/lib/presentation/widget/buttons/outline_elevated.dart deleted file mode 100644 index db7b7bb..0000000 --- a/lib/presentation/widget/buttons/outline_elevated.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; -import 'package:rasadyar_app/presentation/utils/color_utils.dart'; - -class ROutlinedElevated extends StatefulWidget { - ROutlinedElevated({ - super.key, - required this.text, - required this.onPressed, - this.foregroundColor, - this.backgroundColor, - this.borderColor, - this.disabledBackgroundColor, - this.pressedBackgroundColor, - this.radius, - this.textStyle, - this.width = 150.0, - this.height = 56.0, - }); - - final String text; - final VoidCallback? onPressed; - final double width; - final double height; - Color? foregroundColor; - Color? backgroundColor; - - Color? borderColor; - - Color? disabledBackgroundColor; - Color? pressedBackgroundColor; - double? radius; - TextStyle? textStyle; - - @override - State createState() => _ROutlinedElevatedState(); -} - -class _ROutlinedElevatedState extends State { - @override - Widget build(BuildContext context) { - return OutlinedButton( - onPressed: widget.onPressed, - style: ButtonStyle( - side: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal, - width: 2, - ); - } else if (states.contains(WidgetState.disabled)) { - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), - width: 2, - ); - } - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal, - width: 2, - ); - }), - backgroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - if (widget.pressedBackgroundColor != null) { - return widget.pressedBackgroundColor; - } - return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal; - } else if (states.contains(WidgetState.hovered)) { - return widget.backgroundColor?.hoverColor ?? - AppColor.blueNormal.hoverColor; - } else if (states.contains(WidgetState.disabled)) { - return widget.backgroundColor?.disabledColor ?? Colors.transparent; - } - return widget.backgroundColor; - }), - foregroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return Colors.white; - } else if (states.contains(WidgetState.disabled)) { - return AppColor.blueNormal.withAlpha(38); - } - return AppColor.blueNormal; - }), - - shape: WidgetStatePropertyAll( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(widget.radius ?? 8), - ), - ), - fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), - padding: WidgetStatePropertyAll(EdgeInsets.zero), - textStyle: WidgetStatePropertyAll( - widget.textStyle ?? - AppFonts.yekan24.copyWith(color: AppColor.blueNormal), - ), - ), - child: Text(widget.text), - ); - } -} diff --git a/lib/presentation/widget/buttons/outline_elevated_icon.dart b/lib/presentation/widget/buttons/outline_elevated_icon.dart deleted file mode 100644 index 8753779..0000000 --- a/lib/presentation/widget/buttons/outline_elevated_icon.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; -import 'package:rasadyar_app/presentation/utils/color_utils.dart'; - -class ROutlinedElevatedIcon extends StatefulWidget { - ROutlinedElevatedIcon({ - super.key, - required this.text, - required this.onPressed, - this.foregroundColor, - this.backgroundColor, - this.borderColor, - this.disabledBackgroundColor, - this.pressedBackgroundColor, - this.radius, - this.textStyle, - this.width = 150.0, - this.height = 56.0, - }); - - final String text; - final VoidCallback? onPressed; - final double width; - final double height; - Color? foregroundColor; - Color? backgroundColor; - - Color? borderColor; - - Color? disabledBackgroundColor; - Color? pressedBackgroundColor; - double? radius; - TextStyle? textStyle; - Widget? icon; - - @override - State createState() => _ROutlinedElevatedStateIcon(); -} - -class _ROutlinedElevatedStateIcon extends State { - @override - Widget build(BuildContext context) { - return OutlinedButton.icon( - icon: widget.icon, - label: Text(widget.text), - onPressed: widget.onPressed, - style: ButtonStyle( - side: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal, - width: 2, - ); - } else if (states.contains(WidgetState.disabled)) { - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), - width: 2, - ); - } - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal, - width: 2, - ); - }), - backgroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - if (widget.pressedBackgroundColor != null) { - return widget.pressedBackgroundColor; - } - return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal; - } else if (states.contains(WidgetState.hovered)) { - return widget.backgroundColor?.hoverColor ?? - AppColor.blueNormal.hoverColor; - } else if (states.contains(WidgetState.disabled)) { - return widget.backgroundColor?.disabledColor ?? Colors.transparent; - } - return widget.backgroundColor; - }), - foregroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return Colors.white; - } else if (states.contains(WidgetState.disabled)) { - return AppColor.blueNormal.withAlpha(38); - } - return AppColor.blueNormal; - }), - - shape: WidgetStatePropertyAll( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(widget.radius ?? 8), - ), - ), - fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), - padding: WidgetStatePropertyAll(EdgeInsets.zero), - textStyle: WidgetStatePropertyAll( - widget.textStyle ?? - AppFonts.yekan24.copyWith(color: AppColor.blueNormal), - ), - ), - ); - } -} diff --git a/lib/presentation/widget/buttons/text_button.dart b/lib/presentation/widget/buttons/text_button.dart deleted file mode 100644 index ba67892..0000000 --- a/lib/presentation/widget/buttons/text_button.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; - -class RTextButton extends StatefulWidget { - RTextButton({ - super.key, - required this.text, - required this.onPressed, - this.foregroundColor, - this.backgroundColor, - this.borderColor, - this.disabledBackgroundColor, - this.radius, - this.textStyle, - this.width = 150.0, - this.height = 56.0, - }); - - final String text; - final VoidCallback? onPressed; - final double width; - final double height; - Color? foregroundColor; - Color? backgroundColor; - Color? borderColor; - - Color? disabledBackgroundColor; - double? radius; - TextStyle? textStyle; - - @override - State createState() => _RTextButtonState(); -} - -class _RTextButtonState extends State { - @override - Widget build(BuildContext context) { - return TextButton( - style: ButtonStyle( - side: WidgetStatePropertyAll(BorderSide.none), - backgroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return widget.backgroundColor ?? AppColor.blueNormal; - } else if (states.contains(WidgetState.hovered)) { - return widget.backgroundColor?.withAlpha(38) ?? AppColor.blueNormal.withAlpha(38); - } else if (states.contains(WidgetState.disabled)) { - return widget.disabledBackgroundColor ?? Colors.transparent; - } - return Colors.transparent; - }), - foregroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return Colors.white; - } else if (states.contains(WidgetState.disabled)) { - return AppColor.blueNormal.withAlpha(38); - } - return AppColor.blueNormal; - }), - - shape: WidgetStatePropertyAll( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(widget.radius ?? 8), - ), - ), - fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), - padding: WidgetStatePropertyAll(EdgeInsets.zero), - textStyle: WidgetStatePropertyAll( - widget.textStyle ?? - AppFonts.yekan24.copyWith(color: AppColor.blueNormal), - ), - ), - onPressed:widget.onPressed, - child: Text(widget.text), - ); - } -} diff --git a/lib/presentation/widget/captcha/captcha_widget.dart b/lib/presentation/widget/captcha/captcha_widget.dart deleted file mode 100644 index 55b85f3..0000000 --- a/lib/presentation/widget/captcha/captcha_widget.dart +++ /dev/null @@ -1,266 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; - -class CaptchaController { - int? captchaCode; - TextEditingController textController = TextEditingController(); - GlobalKey formKey = GlobalKey(); - - late Function() refreshCaptcha; - - bool validate() { - if (formKey.currentState?.validate() == true) { - return true; - } - return false; - } - - String get enteredText => textController.text; - - bool isCorrect() { - return textController.text == captchaCode.toString(); - } - - void clear() { - textController.clear(); - } -} - -class RandomLinePainter extends CustomPainter { - final Random random = Random(); - final Paint linePaint; - final List points; - - RandomLinePainter({ - required this.points, - required Color lineColor, - double strokeWidth = 2.0, - }) : linePaint = - Paint() - ..color = lineColor - ..strokeWidth = strokeWidth - ..strokeCap = StrokeCap.round - ..style = PaintingStyle.stroke; - - @override - void paint(Canvas canvas, Size size) { - final path = Path(); - - if (points.isNotEmpty) { - path.moveTo(points[0].dx, points[0].dy); - - for (int i = 1; i < points.length; i++) { - path.lineTo(points[i].dx, points[i].dy); - } - - canvas.drawPath(path, linePaint); - } - } - - @override - bool shouldRepaint(RandomLinePainter oldDelegate) => true; -} - -class CaptchaWidget extends StatefulWidget { - final CaptchaController controller; - final bool autoValidateMode; - - const CaptchaWidget({ - required this.controller, - this.autoValidateMode = false, - super.key, - }); - - @override - _CaptchaWidgetState createState() => _CaptchaWidgetState(); -} - -class _CaptchaWidgetState extends State { - late List points; - late List points1; - late List points2; - bool isOnError = false; - - @override - void initState() { - super.initState(); - generateLines(); - getRandomSixDigitNumber(); - - // Set the refresh function in the controller - widget.controller.refreshCaptcha = () { - getRandomSixDigitNumber(); - generateLines(); - setState(() {}); - }; - } - - void generateLines() { - points = generateRandomLine(); - points1 = generateRandomLine(); - points2 = generateRandomLine(); - setState(() {}); - } - - List generateRandomLine() { - final random = Random(); - int pointCount = random.nextInt(10) + 5; - List points = []; - - double previousY = 0; - - for (int i = 0; i < pointCount; i++) { - double x = (i / (pointCount - 1)) * 135; - - if (i == 0) { - previousY = 24; - } else { - double change = (random.nextDouble() * 20) - 10; - previousY = max(5, min(43, previousY + change)); - } - - points.add(Offset(x, previousY)); - } - - return points; - } - - void getRandomSixDigitNumber() { - final random = Random(); - widget.controller.captchaCode = random.nextInt(900000) + 100000; - setState(() {}); - } - - @override - Widget build(BuildContext context) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - width: 135, - height: 48, - decoration: BoxDecoration( - color: AppColor.whiteNormalHover, - border: Border.all(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(8), - ), - child: Stack( - alignment: AlignmentDirectional.center, - children: [ - CustomPaint( - painter: RandomLinePainter( - points: points, - lineColor: Colors.blue, - strokeWidth: 1.0, - ), - size: const Size(double.infinity, double.infinity), - ), - CustomPaint( - painter: RandomLinePainter( - points: points1, - lineColor: Colors.green, - strokeWidth: 1.0, - ), - size: const Size(double.infinity, double.infinity), - ), - CustomPaint( - painter: RandomLinePainter( - points: points2, - lineColor: Colors.red, - strokeWidth: 1.0, - ), - size: const Size(double.infinity, double.infinity), - ), - Text( - widget.controller.captchaCode.toString(), - style: AppFonts.yekan24, - ), - ], - ), - ), - const SizedBox(height: 20), - IconButton( - padding: EdgeInsets.zero, - onPressed: widget.controller.refreshCaptcha, - icon: Icon(CupertinoIcons.refresh, size: 16), - ), - Expanded( - child: Form( - key: widget.controller.formKey, - autovalidateMode: - widget.autoValidateMode - ? AutovalidateMode.onUserInteraction - : AutovalidateMode.disabled, - child: TextFormField( - controller: widget.controller.textController, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'کد امنیتی', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan10.copyWith( - color: AppColor.redNormal, - fontSize: 8, - ), - suffixIconConstraints: BoxConstraints( - maxHeight: 24, - minHeight: 24, - maxWidth: 24, - minWidth: 24, - ), - - suffix: - widget.controller.textController.text.trim().isNotEmpty - ? clearButton(() { - widget.controller.textController.clear(); - setState(() {}); - }) - : null, - counterText: '', - ), - keyboardType: TextInputType.numberWithOptions( - decimal: false, - signed: false, - ), - maxLines: 1, - maxLength: 6, - onChanged: (value) { - if (isOnError) { - isOnError = !isOnError; - widget.controller.formKey.currentState?.reset(); - widget.controller.textController.text = value; - } - setState(() {}); - }, - validator: (value) { - if (value == null || value.isEmpty) { - isOnError = true; - return 'کد امنیتی را وارد کنید'; - } - if (value != widget.controller.captchaCode.toString()) { - isOnError = true; - return '⚠️کد امنیتی وارد شده اشتباه است'; - } - return null; - }, - style: AppFonts.yekan13, - ), - ), - ), - ], - ); - } - - Widget clearButton(VoidCallback onTap) { - return GestureDetector( - onTap: onTap, - child: Icon(CupertinoIcons.multiply_circle, size: 18), - ); - } -} diff --git a/lib/presentation/widget/inputs/r_input.dart b/lib/presentation/widget/inputs/r_input.dart deleted file mode 100644 index 07edc2b..0000000 --- a/lib/presentation/widget/inputs/r_input.dart +++ /dev/null @@ -1,216 +0,0 @@ - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -@immutable -class RTextField extends StatefulWidget { - RTextField( - {super.key, - this.maxLines, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.isForNumber = false, - this.style, - this.hintStyle, - this.suffixIcon, - this.prefixIcon, - this.validator, - this.readonly = false, - this.boxConstraints, - this.minLines, - this.radius, - this.filled, - this.enabled, - this.errorStyle, - this.labelStyle, - this.label}) { - filled = filled ?? false; - obscure = false; - _inputBorder = OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(radius ?? 16)); - } - - RTextField.noBorder( - {super.key, - this.maxLines, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.style, - this.hintStyle, - this.suffixIcon, - this.radius, - this.validator, - this.boxConstraints, - this.minLines, - this.isForNumber = false, - this.readonly = false, - this.label, - this.filled, - this.errorStyle, - this.labelStyle, - this.enabled}) { - _inputBorder = OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(radius ?? 16)); - obscure = false; - filled = filled ?? true; - } - - RTextField.password( - {super.key, - this.maxLines = 1, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.style, - this.hintStyle, - this.suffixIcon, - this.prefixIcon, - this.radius, - this.validator, - this.boxConstraints, - this.minLines, - this.isForNumber = false, - this.readonly = false, - this.label, - this.filled, - this.errorStyle, - this.labelStyle, - this.enabled}) { - _inputBorder = OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(radius ?? 16)); - filled = filled ?? true; - obscure = true; - _isPassword = true; - prefixIcon = prefixIcon ?? const Icon(CupertinoIcons.person); - } - - final int? maxLines; - final int? minLines; - final int? maxLength; - final String? hintText; - final String? label; - final EdgeInsets? padding; - final TextStyle? style; - final TextStyle? errorStyle; - final TextStyle? hintStyle; - final TextStyle? labelStyle; - final bool showCounter; - final bool? isDense; - final bool? isForNumber; - final bool readonly; - bool? obscure; - final bool? enabled; - final double? radius; - final TextInputType? keyboardType; - final Function(String)? onChanged; - final Function(String)? onSubmitted; - final FormFieldValidator? validator; - final String? initText; - Widget? suffixIcon; - Widget? prefixIcon; - bool? filled; - bool _isPassword = false; - - final BoxConstraints? boxConstraints; - late final InputBorder? _inputBorder; - - @override - State createState() => _RTextFieldState(); -} - -class _RTextFieldState extends State { - final TextEditingController _controller = TextEditingController(); - bool? obscure; - - @override - void initState() { - super.initState(); - if (widget.initText != null) { - _controller.text = widget.initText!; - } - obscure = widget.obscure; - } - - @override - void didUpdateWidget(covariant RTextField oldWidget) { - super.didUpdateWidget(oldWidget); - if (widget.initText != oldWidget.initText) { - _controller.text = widget.initText ?? ''; - } - } - - @override - Widget build(BuildContext context) { - return Padding( - padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 6.0), - child: TextFormField( - controller: _controller, - readOnly: widget.readonly, - minLines: widget.minLines, - maxLines: widget.maxLines, - onChanged: widget.onChanged, - validator: widget.validator, - enabled: widget.enabled, - obscureText: obscure ?? false, - onTapOutside: (event) { - FocusScope.of(context).unfocus(); - }, - onFieldSubmitted: widget.onSubmitted, - maxLength: widget.maxLength, - textDirection: TextDirection.rtl, - style: widget.style , - keyboardType: widget.keyboardType, - decoration: InputDecoration( - errorStyle: widget.errorStyle, - errorMaxLines: 1, - isDense: widget.isDense, - suffixIcon: widget.suffixIcon ?? - (widget._isPassword - ? IconButton( - onPressed: () { - setState(() { - obscure = !obscure!; - }); - }, - icon: Icon(!obscure! - ? CupertinoIcons.eye_slash - : CupertinoIcons.eye)) - : null), - suffixIconConstraints: widget.boxConstraints, - prefixIcon: widget.prefixIcon, - prefixIconConstraints: widget.boxConstraints, - hintText: widget.hintText, - labelText: widget.label, - labelStyle: widget.labelStyle, - filled: widget.filled, - counter: widget.showCounter ? null : const SizedBox(), - hintStyle: widget.hintStyle, - enabledBorder: widget._inputBorder, - focusedBorder: widget._inputBorder, - border: widget._inputBorder), - )); - } -} \ No newline at end of file diff --git a/lib/presentation/widget/pagination/pagination_from_until.dart b/lib/presentation/widget/pagination/pagination_from_until.dart deleted file mode 100644 index 88d7429..0000000 --- a/lib/presentation/widget/pagination/pagination_from_until.dart +++ /dev/null @@ -1,255 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; - -class PaginationFromUntil extends StatefulWidget { - const PaginationFromUntil({super.key}); - - @override - State createState() => _PaginationFromUntilState(); -} - -class _PaginationFromUntilState extends State { - int current = 1; - int total = 10; - - @override - Widget build(BuildContext context) { - return Container( - width: 164, - height: 47, - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color(0xFFEAEFFF), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)), - ), - child: Row( - children: [ - FloatingActionButton.small( - onPressed: () { - if(current>1){ - setState(() { - current--; - }); - } - - }, - shape: CircleBorder(), - elevation: 0, - backgroundColor: Colors.white, - child: Icon(CupertinoIcons.arrow_left, color: AppColor.blueNormal), - ), - Expanded( - child: Text( - '$current از $total', - textAlign: TextAlign.center, - textDirection: TextDirection.rtl, - style: AppFonts.yekan16.copyWith( - color: AppColor.blueNormal, - ), - ), - ), - FloatingActionButton.small( - - onPressed:() { - if (current < total) { - setState(() { - current++; - }); - } - }, - shape: CircleBorder(), - elevation: 0, - backgroundColor: AppColor.blueNormal, - child: Icon(CupertinoIcons.arrow_right, color: Colors.white), - ), - ], - ), - ); - } - - Stack buildStack() { - return Stack( - children: [ - Positioned( - left: 4, - top: 4, - child: Container( - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 40, - top: 40, - child: Container( - transform: - Matrix4.identity() - ..translate(0.0, 0.0) - ..rotateZ(-3.14), - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 0, - top: 0, - child: Container( - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 0, - top: 0, - child: Container( - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 0, - top: 0, - child: Container( - width: 40, - height: 40, - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: - Colors.white /* Secondary */, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1, - color: - Colors - .white /* Secondary */, - ), - borderRadius: - BorderRadius.circular(50), - ), - ), - child: Stack(), - ), - ), - ], - ), - ), - ), - ], - ), - ), - ), - ], - ), - ), - ), - Positioned( - left: 8, - top: 8, - child: Container(width: 24, height: 24, child: Stack()), - ), - ], - ), - ), - ), - Positioned( - left: 120, - top: 3, - child: Container( - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 40, - top: 40, - child: Container( - transform: - Matrix4.identity() - ..translate(0.0, 0.0) - ..rotateZ(-3.14), - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 0, - top: 0, - child: Container( - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 0, - top: 0, - child: Container( - width: 40, - height: 40, - child: Stack( - children: [ - Positioned( - left: 0, - top: 0, - child: Container( - width: 40, - height: 40, - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: const Color( - 0xFF2D5FFF, - ) /* Primary */, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1, - color: const Color( - 0xFF2D5FFF, - ) /* Primary */, - ), - borderRadius: - BorderRadius.circular(50), - ), - ), - child: Stack(), - ), - ), - ], - ), - ), - ), - ], - ), - ), - ), - ], - ), - ), - ), - Positioned( - left: 8, - top: 8, - child: Container(width: 24, height: 24, child: Stack()), - ), - ], - ), - ), - ), - Positioned( - left: 63, - top: 9, - child: Text( - '1 از 17', - style: TextStyle( - color: const Color(0xFF2D5FFF) /* Primary */, - fontSize: 16, - fontFamily: 'IRANYekanFN', - fontWeight: FontWeight.w400, - height: 1.75, - ), - ), - ), - ], - ); - } -} diff --git a/lib/presentation/widget/pagination/show_more.dart b/lib/presentation/widget/pagination/show_more.dart deleted file mode 100644 index bdaf713..0000000 --- a/lib/presentation/widget/pagination/show_more.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; - -class RShowMore extends StatefulWidget { - const RShowMore({super.key}); - - @override - State createState() => _RShowMoreState(); -} - -class _RShowMoreState extends State - with SingleTickerProviderStateMixin { - bool _toggled = false; - late final AnimationController _controller; - late final Animation _iconRotation; - - @override - void initState() { - super.initState(); - - _controller = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 500), - ); - _iconRotation = Tween( - begin: 0, - end: 0.50, - ) // 90 degrees (quarter turn) - .animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut)); - } - - void _toggle() { - setState(() => _toggled = !_toggled); - _toggled ? _controller.forward() : _controller.reverse(); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: _toggle, - behavior: HitTestBehavior.opaque, - child: Row( - mainAxisSize: MainAxisSize.min, - spacing: 8, - children: [ - RotationTransition( - turns: _iconRotation, - child: const Icon(CupertinoIcons.chevron_down, size: 12,color:AppColor.blueNormal ,), - ), - - AnimatedSwitcher( - duration: const Duration(milliseconds: 500), - transitionBuilder: - (child, animation) => - FadeTransition(opacity: animation, child: child), - child: Text( - _toggled ? 'کمتر' : 'مشاهده بیشتر', - key: ValueKey(_toggled), - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(height: 50,) - ], - - - - ), - ); - } -} diff --git a/lib/presentation/widget/tabs/new_tab.dart b/lib/presentation/widget/tabs/new_tab.dart deleted file mode 100644 index c6e73c4..0000000 --- a/lib/presentation/widget/tabs/new_tab.dart +++ /dev/null @@ -1,784 +0,0 @@ -// 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. - -/// @docImport 'switch.dart'; -library; - -import 'dart:collection'; -import 'dart:math' as math; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/rendering.dart'; - -// Minimum padding from edges of the segmented control to edges of -// encompassing widget. -const EdgeInsetsGeometry _kHorizontalItemPadding = EdgeInsets.symmetric( - horizontal: 16.0, -); - -// Minimum height of the segmented control. -const double _kMinSegmentedControlHeight = 28.0; - -// The default color used for the text of the disabled segment. -const Color _kDisableTextColor = Color.fromARGB(115, 122, 122, 122); - -// The duration of the fade animation used to transition when a new widget -// is selected. -const Duration _kFadeDuration = Duration(milliseconds: 165); - -class NewCupertinoSegmentedControl extends StatefulWidget { - /// Creates an iOS-style segmented control bar. - /// - /// The [children] argument must be an ordered [Map] such as a - /// [LinkedHashMap]. Further, the length of the [children] list must be - /// greater than one. - /// - /// Each widget value in the map of [children] must have an associated key - /// that uniquely identifies this widget. This key is what will be returned - /// in the [onValueChanged] callback when a new value from the [children] map - /// is selected. - /// - /// The [groupValue] is the currently selected value for the segmented control. - /// If no [groupValue] is provided, or the [groupValue] is null, no widget will - /// appear as selected. The [groupValue] must be either null or one of the keys - /// in the [children] map. - NewCupertinoSegmentedControl({ - super.key, - required this.children, - required this.onValueChanged, - this.groupValue, - this.unselectedColor, - this.selectedColor, - this.borderColor, - this.pressedColor, - this.disabledColor, - this.disabledTextColor, - this.padding, - this.disabledChildren = const {}, - }) : assert(children.length >= 2), - assert( - groupValue == null || - children.keys.any((T child) => child == groupValue), - 'The groupValue must be either null or one of the keys in the children map.', - ); - - /// The identifying keys and corresponding widget values in the - /// segmented control. - /// - /// The map must have more than one entry. - /// This attribute must be an ordered [Map] such as a [LinkedHashMap]. - final Map children; - - /// The identifier of the widget that is currently selected. - /// - /// This must be one of the keys in the [Map] of [children]. - /// If this attribute is null, no widget will be initially selected. - final T? groupValue; - - /// The callback that is called when a new option is tapped. - /// - /// The segmented control passes the newly selected widget's associated key - /// to the callback but does not actually change state until the parent - /// widget rebuilds the segmented control with the new [groupValue]. - final ValueChanged onValueChanged; - - /// The color used to fill the backgrounds of unselected widgets and as the - /// text color of the selected widget. - /// - /// Defaults to [CupertinoTheme]'s `primaryContrastingColor` if null. - final Color? unselectedColor; - - /// The color used to fill the background of the selected widget and as the text - /// color of unselected widgets. - /// - /// Defaults to [CupertinoTheme]'s `primaryColor` if null. - final Color? selectedColor; - - /// The color used as the border around each widget. - /// - /// Defaults to [CupertinoTheme]'s `primaryColor` if null. - final Color? borderColor; - - /// The color used to fill the background of the widget the user is - /// temporarily interacting with through a long press or drag. - /// - /// Defaults to the selectedColor at 20% opacity if null. - final Color? pressedColor; - - /// The color used to fill the background of the segment when it is disabled. - /// - /// If null, this color will be 50% opacity of the [selectedColor] when - /// the segment is selected. If the segment is unselected, this color will be - /// set to [unselectedColor]. - final Color? disabledColor; - - /// The color used for the text of the segment when it is disabled. - final Color? disabledTextColor; - - /// The CupertinoSegmentedControl will be placed inside this padding. - /// - /// Defaults to EdgeInsets.symmetric(horizontal: 16.0) - final EdgeInsetsGeometry? padding; - - /// The set of identifying keys that correspond to the segments that should be disabled. - /// - /// All segments are enabled by default. - final Set disabledChildren; - - @override - State> createState() => - _SegmentedControlState(); -} - -class _SegmentedControlState - extends State> - with TickerProviderStateMixin> { - T? _pressedKey; - - final List _selectionControllers = - []; - final List _childTweens = []; - - late ColorTween _forwardBackgroundColorTween; - late ColorTween _reverseBackgroundColorTween; - late ColorTween _textColorTween; - - Color? _selectedColor; - Color? _unselectedColor; - Color? _borderColor; - Color? _pressedColor; - Color? _selectedDisabledColor; - Color? _unselectedDisabledColor; - Color? _disabledTextColor; - - AnimationController createAnimationController() { - return AnimationController(duration: _kFadeDuration, vsync: this) - ..addListener(() { - setState(() { - // State of background/text colors has changed - }); - }); - } - - bool _updateColors() { - assert(mounted, 'This should only be called after didUpdateDependencies'); - bool changed = false; - final Color disabledTextColor = - widget.disabledTextColor ?? _kDisableTextColor; - if (_disabledTextColor != disabledTextColor) { - changed = true; - _disabledTextColor = disabledTextColor; - } - final Color selectedColor = - widget.selectedColor ?? CupertinoTheme.of(context).primaryColor; - if (_selectedColor != selectedColor) { - changed = true; - _selectedColor = selectedColor; - } - final Color unselectedColor = - widget.unselectedColor ?? - CupertinoTheme.of(context).primaryContrastingColor; - if (_unselectedColor != unselectedColor) { - changed = true; - _unselectedColor = unselectedColor; - } - final Color selectedDisabledColor = - widget.disabledColor ?? selectedColor.withOpacity(0.5); - final Color unselectedDisabledColor = - widget.disabledColor ?? unselectedColor; - if (_selectedDisabledColor != selectedDisabledColor || - _unselectedDisabledColor != unselectedDisabledColor) { - changed = true; - _selectedDisabledColor = selectedDisabledColor; - _unselectedDisabledColor = unselectedDisabledColor; - } - final Color borderColor = - widget.borderColor ?? CupertinoTheme.of(context).primaryColor; - if (_borderColor != borderColor) { - changed = true; - _borderColor = borderColor; - } - final Color pressedColor = - widget.pressedColor ?? - CupertinoTheme.of(context).primaryColor.withOpacity(0.2); - if (_pressedColor != pressedColor) { - changed = true; - _pressedColor = pressedColor; - } - - _forwardBackgroundColorTween = ColorTween( - begin: _pressedColor, - end: _selectedColor, - ); - _reverseBackgroundColorTween = ColorTween( - begin: _unselectedColor, - end: _selectedColor, - ); - _textColorTween = ColorTween(begin: _selectedColor, end: _unselectedColor); - return changed; - } - - void _updateAnimationControllers() { - assert(mounted, 'This should only be called after didUpdateDependencies'); - for (final AnimationController controller in _selectionControllers) { - controller.dispose(); - } - _selectionControllers.clear(); - _childTweens.clear(); - - for (final T key in widget.children.keys) { - final AnimationController animationController = - createAnimationController(); - if (widget.groupValue == key) { - _childTweens.add(_reverseBackgroundColorTween); - animationController.value = 1.0; - } else { - _childTweens.add(_forwardBackgroundColorTween); - } - _selectionControllers.add(animationController); - } - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - - if (_updateColors()) { - _updateAnimationControllers(); - } - } - - @override - void didUpdateWidget(NewCupertinoSegmentedControl oldWidget) { - super.didUpdateWidget(oldWidget); - - if (_updateColors() || - oldWidget.children.length != widget.children.length) { - _updateAnimationControllers(); - } - - if (oldWidget.groupValue != widget.groupValue) { - int index = 0; - for (final T key in widget.children.keys) { - if (widget.groupValue == key) { - _childTweens[index] = _forwardBackgroundColorTween; - _selectionControllers[index].forward(); - } else { - _childTweens[index] = _reverseBackgroundColorTween; - _selectionControllers[index].reverse(); - } - index += 1; - } - } - } - - @override - void dispose() { - for (final AnimationController animationController - in _selectionControllers) { - animationController.dispose(); - } - super.dispose(); - } - - void _onTapDown(T currentKey) { - if (_pressedKey == null && currentKey != widget.groupValue) { - setState(() { - _pressedKey = currentKey; - }); - } - } - - void _onTapCancel() { - setState(() { - _pressedKey = null; - }); - } - - void _onTap(T currentKey) { - if (currentKey != _pressedKey) { - return; - } - if (!widget.disabledChildren.contains(currentKey)) { - if (currentKey != widget.groupValue) { - widget.onValueChanged(currentKey); - } - } - _pressedKey = null; - } - - Color? getTextColor(int index, T currentKey) { - if (widget.disabledChildren.contains(currentKey)) { - return _disabledTextColor; - } - if (_selectionControllers[index].isAnimating) { - return _textColorTween.evaluate(_selectionControllers[index]); - } - if (widget.groupValue == currentKey) { - return _unselectedColor; - } - return _selectedColor; - } - - Color? getBackgroundColor(int index, T currentKey) { - if (widget.disabledChildren.contains(currentKey)) { - return widget.groupValue == currentKey - ? _selectedDisabledColor - : _unselectedDisabledColor; - } - if (_selectionControllers[index].isAnimating) { - return _childTweens[index].evaluate(_selectionControllers[index]); - } - if (widget.groupValue == currentKey) { - return _selectedColor; - } - if (_pressedKey == currentKey) { - return _pressedColor; - } - return _unselectedColor; - } - - @override - Widget build(BuildContext context) { - final List gestureChildren = []; - final List backgroundColors = []; - int index = 0; - int? selectedIndex; - int? pressedIndex; - for (final T currentKey in widget.children.keys) { - selectedIndex = (widget.groupValue == currentKey) ? index : selectedIndex; - pressedIndex = (_pressedKey == currentKey) ? index : pressedIndex; - - final TextStyle textStyle = DefaultTextStyle.of( - context, - ).style.copyWith(color: getTextColor(index, currentKey)); - final IconThemeData iconTheme = IconThemeData( - color: getTextColor(index, currentKey), - ); - - Widget child = Center(child: widget.children[currentKey]); - - child = MouseRegion( - cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTapDown: - widget.disabledChildren.contains(currentKey) - ? null - : (TapDownDetails event) { - _onTapDown(currentKey); - }, - onTapCancel: - widget.disabledChildren.contains(currentKey) - ? null - : _onTapCancel, - onTap: () { - _onTap(currentKey); - }, - child: IconTheme( - data: iconTheme, - child: DefaultTextStyle( - style: textStyle, - child: Semantics( - button: true, - inMutuallyExclusiveGroup: true, - selected: widget.groupValue == currentKey, - child: child, - ), - ), - ), - ), - ); - - backgroundColors.add(getBackgroundColor(index, currentKey)!); - gestureChildren.add(child); - index += 1; - } - - final Widget box = _SegmentedControlRenderWidget( - selectedIndex: selectedIndex, - pressedIndex: pressedIndex, - backgroundColors: backgroundColors, - borderColor: _borderColor!, - children: gestureChildren, - ); - - return Padding( - padding: widget.padding ?? _kHorizontalItemPadding, - child: UnconstrainedBox(constrainedAxis: Axis.horizontal, child: box), - ); - } -} - -class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { - const _SegmentedControlRenderWidget({ - super.key, - super.children, - required this.selectedIndex, - required this.pressedIndex, - required this.backgroundColors, - required this.borderColor, - }); - - final int? selectedIndex; - final int? pressedIndex; - final List backgroundColors; - final Color borderColor; - - @override - RenderObject createRenderObject(BuildContext context) { - return _RenderSegmentedControl( - textDirection: Directionality.of(context), - selectedIndex: selectedIndex, - pressedIndex: pressedIndex, - backgroundColors: backgroundColors, - borderColor: borderColor, - ); - } - - @override - void updateRenderObject( - BuildContext context, - _RenderSegmentedControl renderObject, - ) { - renderObject - ..textDirection = Directionality.of(context) - ..selectedIndex = selectedIndex - ..pressedIndex = pressedIndex - ..backgroundColors = backgroundColors - ..borderColor = borderColor; - } -} - -class _SegmentedControlContainerBoxParentData - extends ContainerBoxParentData { - RRect? surroundingRect; -} - -typedef _NextChild = RenderBox? Function(RenderBox child); - -class _RenderSegmentedControl extends RenderBox - with - ContainerRenderObjectMixin< - RenderBox, - ContainerBoxParentData - >, - RenderBoxContainerDefaultsMixin< - RenderBox, - ContainerBoxParentData - > { - _RenderSegmentedControl({ - required int? selectedIndex, - required int? pressedIndex, - required TextDirection textDirection, - required List backgroundColors, - required Color borderColor, - }) : _textDirection = textDirection, - _selectedIndex = selectedIndex, - _pressedIndex = pressedIndex, - _backgroundColors = backgroundColors, - _borderColor = borderColor; - - int? get selectedIndex => _selectedIndex; - int? _selectedIndex; - - set selectedIndex(int? value) { - if (_selectedIndex == value) { - return; - } - _selectedIndex = value; - markNeedsPaint(); - } - - int? get pressedIndex => _pressedIndex; - int? _pressedIndex; - - set pressedIndex(int? value) { - if (_pressedIndex == value) { - return; - } - _pressedIndex = value; - markNeedsPaint(); - } - - TextDirection get textDirection => _textDirection; - TextDirection _textDirection; - - set textDirection(TextDirection value) { - if (_textDirection == value) { - return; - } - _textDirection = value; - markNeedsLayout(); - } - - List get backgroundColors => _backgroundColors; - List _backgroundColors; - - set backgroundColors(List value) { - if (_backgroundColors == value) { - return; - } - _backgroundColors = value; - markNeedsPaint(); - } - - Color get borderColor => _borderColor; - Color _borderColor; - - set borderColor(Color value) { - if (_borderColor == value) { - return; - } - _borderColor = value; - markNeedsPaint(); - } - - @override - double computeMinIntrinsicWidth(double height) { - RenderBox? child = firstChild; - double minWidth = 0.0; - while (child != null) { - final _SegmentedControlContainerBoxParentData childParentData = - child.parentData! as _SegmentedControlContainerBoxParentData; - final double childWidth = child.getMinIntrinsicWidth(height); - minWidth = math.max(minWidth, childWidth); - child = childParentData.nextSibling; - } - return minWidth * childCount; - } - - @override - double computeMaxIntrinsicWidth(double height) { - RenderBox? child = firstChild; - double maxWidth = 0.0; - while (child != null) { - final _SegmentedControlContainerBoxParentData childParentData = - child.parentData! as _SegmentedControlContainerBoxParentData; - final double childWidth = child.getMaxIntrinsicWidth(height); - maxWidth = math.max(maxWidth, childWidth); - child = childParentData.nextSibling; - } - return maxWidth * childCount; - } - - @override - double computeMinIntrinsicHeight(double width) { - RenderBox? child = firstChild; - double minHeight = 0.0; - while (child != null) { - final _SegmentedControlContainerBoxParentData childParentData = - child.parentData! as _SegmentedControlContainerBoxParentData; - final double childHeight = child.getMinIntrinsicHeight(width); - minHeight = math.max(minHeight, childHeight); - child = childParentData.nextSibling; - } - return minHeight; - } - - @override - double computeMaxIntrinsicHeight(double width) { - RenderBox? child = firstChild; - double maxHeight = 0.0; - while (child != null) { - final _SegmentedControlContainerBoxParentData childParentData = - child.parentData! as _SegmentedControlContainerBoxParentData; - final double childHeight = child.getMaxIntrinsicHeight(width); - maxHeight = math.max(maxHeight, childHeight); - child = childParentData.nextSibling; - } - return maxHeight; - } - - @override - double? computeDistanceToActualBaseline(TextBaseline baseline) { - return defaultComputeDistanceToHighestActualBaseline(baseline); - } - - @override - void setupParentData(RenderBox child) { - if (child.parentData is! _SegmentedControlContainerBoxParentData) { - child.parentData = _SegmentedControlContainerBoxParentData(); - } - } - - void _layoutRects( - _NextChild nextChild, - RenderBox? leftChild, - RenderBox? rightChild, - ) { - RenderBox? child = leftChild; - double start = 0.0; - while (child != null) { - final _SegmentedControlContainerBoxParentData childParentData = - child.parentData! as _SegmentedControlContainerBoxParentData; - final Offset childOffset = Offset(start, 0.0); - childParentData.offset = childOffset; - final Rect childRect = Rect.fromLTWH( - start, - 0.0, - child.size.width, - child.size.height, - ); - final RRect rChildRect; - if (child == leftChild) { - rChildRect = RRect.fromRectAndCorners( - childRect, - topLeft: const Radius.circular(10.0), - bottomLeft: const Radius.circular(10.0), - ); - } else if (child == rightChild) { - rChildRect = RRect.fromRectAndCorners( - childRect, - topRight: const Radius.circular(10.0), - bottomRight: const Radius.circular(10.0), - ); - } else { - rChildRect = RRect.fromRectAndCorners(childRect); - } - childParentData.surroundingRect = rChildRect; - start += child.size.width; - child = nextChild(child); - } - } - - Size _calculateChildSize(BoxConstraints constraints) { - double maxHeight = _kMinSegmentedControlHeight; - double childWidth = constraints.minWidth / childCount; - RenderBox? child = firstChild; - while (child != null) { - childWidth = math.max( - childWidth, - child.getMaxIntrinsicWidth(double.infinity), - ); - child = childAfter(child); - } - childWidth = math.min(childWidth, constraints.maxWidth / childCount); - child = firstChild; - while (child != null) { - final double boxHeight = child.getMaxIntrinsicHeight(childWidth); - maxHeight = math.max(maxHeight, boxHeight); - child = childAfter(child); - } - return Size(childWidth, maxHeight); - } - - Size _computeOverallSizeFromChildSize(Size childSize) { - return constraints.constrain( - Size(childSize.width * childCount, childSize.height), - ); - } - - @override - double? computeDryBaseline( - covariant BoxConstraints constraints, - TextBaseline baseline, - ) { - final Size childSize = _calculateChildSize(constraints); - final BoxConstraints childConstraints = BoxConstraints.tight(childSize); - - BaselineOffset baselineOffset = BaselineOffset.noBaseline; - for ( - RenderBox? child = firstChild; - child != null; - child = childAfter(child) - ) { - baselineOffset = baselineOffset.minOf( - BaselineOffset(child.getDryBaseline(childConstraints, baseline)), - ); - } - return baselineOffset.offset; - } - - @override - Size computeDryLayout(BoxConstraints constraints) { - final Size childSize = _calculateChildSize(constraints); - return _computeOverallSizeFromChildSize(childSize); - } - - @override - void performLayout() { - final BoxConstraints constraints = this.constraints; - final Size childSize = _calculateChildSize(constraints); - - final BoxConstraints childConstraints = BoxConstraints.tightFor( - width: childSize.width, - height: childSize.height, - ); - - RenderBox? child = firstChild; - while (child != null) { - child.layout(childConstraints, parentUsesSize: true); - child = childAfter(child); - } - - switch (textDirection) { - case TextDirection.rtl: - _layoutRects(childBefore, lastChild, firstChild); - case TextDirection.ltr: - _layoutRects(childAfter, firstChild, lastChild); - } - - size = _computeOverallSizeFromChildSize(childSize); - } - - @override - void paint(PaintingContext context, Offset offset) { - RenderBox? child = firstChild; - int index = 0; - while (child != null) { - _paintChild(context, offset, child, index); - child = childAfter(child); - index += 1; - } - } - - void _paintChild( - PaintingContext context, - Offset offset, - RenderBox child, - int childIndex, - ) { - final _SegmentedControlContainerBoxParentData childParentData = - child.parentData! as _SegmentedControlContainerBoxParentData; - - context.canvas.drawRRect( - childParentData.surroundingRect!.shift(offset), - Paint() - ..color = backgroundColors[childIndex] - ..style = PaintingStyle.fill, - ); - context.canvas.drawRRect( - childParentData.surroundingRect!.shift(offset), - Paint() - ..color = borderColor - ..strokeWidth = 1.0 - ..style = PaintingStyle.stroke, - ); - - context.paintChild(child, childParentData.offset + offset); - } - - @override - bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { - RenderBox? child = lastChild; - while (child != null) { - final _SegmentedControlContainerBoxParentData childParentData = - child.parentData! as _SegmentedControlContainerBoxParentData; - if (childParentData.surroundingRect!.contains(position)) { - return result.addWithPaintOffset( - offset: childParentData.offset, - position: position, - hitTest: (BoxHitTestResult result, Offset localOffset) { - assert(localOffset == position - childParentData.offset); - return child!.hitTest(result, position: localOffset); - }, - ); - } - child = childParentData.previousSibling; - } - return false; - } -} diff --git a/lib/presentation/widget/tabs/tab.dart b/lib/presentation/widget/tabs/tab.dart deleted file mode 100644 index 4b961ad..0000000 --- a/lib/presentation/widget/tabs/tab.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:rasadyar_app/presentation/common/app_fonts.dart'; - -import 'new_tab.dart'; - -class CupertinoSegmentedControlDemo extends StatefulWidget { - const CupertinoSegmentedControlDemo({super.key}); - - @override - State createState() => - _CupertinoSegmentedControlDemoState(); -} - -class _CupertinoSegmentedControlDemoState - extends State { - int _selectedSegment = 0; - - // The data for the segments - final Map _segments = const { - 0: Text('Segment 1'), - 1: Text('Segment 2'), - 2: Text('Segment 3'), - }; - - @override - Widget build(BuildContext context) { - return SafeArea( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CupertinoSlidingSegmentedControl( - children: _segments, - groupValue: _selectedSegment, - - onValueChanged: (int? value) { - setState(() { - _selectedSegment = value!; - }); - }, - ), - const SizedBox(height: 20), - Text( - 'Selected Segment: ${_selectedSegment + 1}', - style: const TextStyle(fontSize: 24), - ), - ], - ), - ); - } -} - -class CupertinoSegmentedControlDemo2 extends StatefulWidget { - const CupertinoSegmentedControlDemo2({super.key}); - - @override - State createState() => - _CupertinoSegmentedControlDemoState2(); -} - -class _CupertinoSegmentedControlDemoState2 - extends State { - int _selectedSegment = 0; - - // The data for the segments - final Map _segments = { - 0:Container( - padding: EdgeInsets.all(10), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(50) - ), - child: Text('لاشه', style: AppFonts.yekan13), - ), - 1: Container( - padding: EdgeInsets.all(10), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(50) - ), - child: Text('زنده', style: AppFonts.yekan13), - ), - }; - - @override - Widget build(BuildContext context) { - return SafeArea( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - NewCupertinoSegmentedControl( - padding: EdgeInsetsDirectional.symmetric( - horizontal: 20, - vertical: 10, - ), - children: _segments, - groupValue: _selectedSegment, - selectedColor: AppColor.blueNormal, - unselectedColor: Colors.white, - borderColor: Colors.grey.shade300, - onValueChanged: (int value) { - setState(() { - _selectedSegment = value; - }); - }, - ), - const SizedBox(height: 20), - Text( - 'Selected Segment: ${_selectedSegment + 1}', - style: const TextStyle(fontSize: 24), - ), - ], - ), - ); - } -} diff --git a/lib/presentation/widget/vec_widget.dart b/lib/presentation/widget/vec_widget.dart deleted file mode 100644 index a85e527..0000000 --- a/lib/presentation/widget/vec_widget.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:rasadyar_app/presentation/common/app_color.dart'; -import 'package:vector_graphics/vector_graphics.dart'; - -SvgPicture vecWidget( - String assets, { - double? width, - double? height, - BoxFit? fit, - Color? color, -}) { - return SvgPicture( - AssetBytesLoader(assets), - width: width, - height: height, - fit: fit ?? BoxFit.contain, - colorFilter: - color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, - ); -} - -SvgPicture svgWidget( - String assets, { - double? width, - double? height, - BoxFit? fit, - Color? color, - }) { - return SvgPicture.asset( - assets, - width: width, - height: height, - fit: fit ?? BoxFit.contain, - colorFilter: - color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, - ); -} - - -Widget vecWidget2( - String assets, { - double? width, - double? height, - BoxFit? fit, - Color? color, - }) { - final resolvedColor = WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return Colors.white; - } - return color; - }).resolve({}); // You can pass actual states if needed - - return IconTheme( - data: IconThemeData(color: resolvedColor), - child: SvgPicture( - AssetBytesLoader(assets), - width: width, - height: height, - fit: fit ?? BoxFit.contain, - colorFilter: resolvedColor != null - ? ColorFilter.mode(resolvedColor, BlendMode.srcIn) - : null, - ), - ); -} - - -class ColoredSvgButton extends StatefulWidget { - final String svgPath; - final String text; - final VoidCallback? onPressed; - - const ColoredSvgButton({ - required this.svgPath, - required this.text, - this.onPressed, - super.key, - }); - - @override - State createState() => _ColoredSvgButtonState(); -} - -class _ColoredSvgButtonState extends State { - bool _isPressed = false; - bool _isHovered = false; - - Color _getIconColor() { - if (_isPressed) return Colors.white; - if (_isHovered) return AppColor.blueNormal.withAlpha(50); - return AppColor.blueNormal; - } - - @override - Widget build(BuildContext context) { - return MouseRegion( - onEnter: (_) => setState(() => _isHovered = true), - onExit: (_) => setState(() { - _isHovered = false; - _isPressed = false; - }), - child: GestureDetector( - onTapDown: (_) => setState(() => _isPressed = true), - onTapUp: (_) => setState(() => _isPressed = false), - onTapCancel: () => setState(() => _isPressed = false), - child: OutlinedButton.icon( - icon: SvgPicture.asset( - widget.svgPath, - width: 24, - height: 24, - color: _getIconColor(), - ), - label: Text(widget.text), - onPressed: widget.onPressed, - style: OutlinedButton.styleFrom( - side: BorderSide( - color: AppColor.blueNormal, - width: 2, - ), - foregroundColor: AppColor.blueNormal, - backgroundColor: _isPressed ? AppColor.blueNormal : null, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - ), - ), - ), - ); - } -} - diff --git a/packages/core/lib/presentation/utils/utils.dart b/packages/core/lib/presentation/utils/utils.dart index 7eb0ee4..1a49d0f 100644 --- a/packages/core/lib/presentation/utils/utils.dart +++ b/packages/core/lib/presentation/utils/utils.dart @@ -1 +1 @@ -import 'color_utils.dart'; \ No newline at end of file +export 'color_utils.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index ec3894b..0df4a98 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -4,5 +4,15 @@ export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; export 'buttons/outline_elevated_icon.dart'; export 'buttons/outline_elevated.dart'; +export 'buttons/text_button.dart'; export 'app_bar/r_app_bar.dart'; +export 'captcha/captcha_widget.dart'; +export 'buttons/elevated.dart'; +export 'inputs/r_input.dart'; +export 'tabs/new_tab.dart'; +export 'tabs/tab.dart'; +export 'pagination/pagination_from_until.dart'; +export 'pagination/show_more.dart'; + + diff --git a/pubspec.lock b/pubspec.lock index edfdacd..24a9efa 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,22 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 - url: "https://pub.dev" - source: hosted - version: "80.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" - url: "https://pub.dev" - source: hosted - version: "7.3.0" args: dependency: transitive description: @@ -41,70 +25,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" - build: - dependency: transitive - description: - name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - build_config: - dependency: transitive - description: - name: build_config - sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" - url: "https://pub.dev" - source: hosted - version: "1.1.2" - build_daemon: - dependency: transitive - description: - name: build_daemon - sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" - url: "https://pub.dev" - source: hosted - version: "4.0.4" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 - url: "https://pub.dev" - source: hosted - version: "2.4.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" - url: "https://pub.dev" - source: hosted - version: "2.4.15" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" - url: "https://pub.dev" - source: hosted - version: "8.0.0" - built_collection: - dependency: transitive - description: - name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" - source: hosted - version: "5.1.1" - built_value: - dependency: transitive - description: - name: built_value - sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 - url: "https://pub.dev" - source: hosted - version: "8.9.5" characters: dependency: transitive description: @@ -113,14 +33,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" clock: dependency: transitive description: @@ -129,14 +41,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" - code_builder: - dependency: transitive - description: - name: code_builder - sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" - url: "https://pub.dev" - source: hosted - version: "4.10.1" collection: dependency: transitive description: @@ -145,14 +49,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" - convert: - dependency: transitive - description: - name: convert - sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev" - source: hosted - version: "3.1.2" crypto: dependency: transitive description: @@ -177,16 +73,8 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - dart_style: - dependency: transitive - description: - name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" - url: "https://pub.dev" - source: hosted - version: "3.0.1" dartx: - dependency: "direct main" + dependency: transitive description: name: dartx sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" @@ -292,7 +180,7 @@ packages: source: hosted version: "4.0.0" flutter_svg: - dependency: "direct main" + dependency: transitive description: name: flutter_svg sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b @@ -317,14 +205,6 @@ packages: url: "https://pub.dev" source: hosted version: "10.8.0" - freezed: - dependency: "direct dev" - description: - name: freezed - sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" - url: "https://pub.dev" - source: hosted - version: "3.0.6" freezed_annotation: dependency: "direct overridden" description: @@ -333,14 +213,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.4" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" - source: hosted - version: "4.0.0" geolocator: dependency: transitive description: @@ -390,7 +262,7 @@ packages: source: hosted version: "0.2.5" get: - dependency: "direct main" + dependency: transitive description: name: get sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 @@ -398,39 +270,15 @@ packages: source: hosted version: "4.7.2" get_it: - dependency: "direct main" + dependency: transitive description: name: get_it sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 url: "https://pub.dev" source: hosted version: "8.0.3" - get_test: - dependency: "direct dev" - description: - name: get_test - sha256: "558c39cb35fb37bd501f337dc143de60a4314d5ef3b75f4b0551d6741634995b" - url: "https://pub.dev" - source: hosted - version: "4.0.1" - glob: - dependency: transitive - description: - name: glob - sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.dev" - source: hosted - version: "2.1.3" - graphs: - dependency: transitive - description: - name: graphs - sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.dev" - source: hosted - version: "2.3.2" hive_ce: - dependency: "direct main" + dependency: transitive description: name: hive_ce sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f @@ -438,21 +286,13 @@ packages: source: hosted version: "2.10.1" hive_ce_flutter: - dependency: "direct main" + dependency: transitive description: name: hive_ce_flutter sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877" url: "https://pub.dev" source: hosted version: "2.2.0" - hive_ce_generator: - dependency: "direct dev" - description: - name: hive_ce_generator - sha256: "0b1c750e2d10c55a14cde16d479ada42704be6cef43c54b728ed0e4e02f7d808" - url: "https://pub.dev" - source: hosted - version: "1.8.2" http: dependency: transitive description: @@ -461,14 +301,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.dev" - source: hosted - version: "3.2.2" http_parser: dependency: transitive description: @@ -492,22 +324,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" - io: - dependency: transitive - description: - name: io - sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b - url: "https://pub.dev" - source: hosted - version: "1.0.5" - js: - dependency: transitive - description: - name: js - sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" - url: "https://pub.dev" - source: hosted - version: "0.7.2" json_annotation: dependency: transitive description: @@ -516,14 +332,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.9.0" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a" - url: "https://pub.dev" - source: hosted - version: "6.9.4" latlong2: dependency: transitive description: @@ -597,21 +405,13 @@ packages: source: hosted version: "6.0.0" logger: - dependency: "direct main" + dependency: transitive description: name: logger sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 url: "https://pub.dev" source: hosted version: "2.5.0" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" matcher: dependency: transitive description: @@ -644,30 +444,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - mockito: - dependency: transitive - description: - name: mockito - sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6 - url: "https://pub.dev" - source: hosted - version: "5.4.5" - mocktail: - dependency: "direct dev" - description: - name: mocktail - sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" - url: "https://pub.dev" - source: hosted - version: "1.0.4" nested: dependency: transitive description: @@ -676,14 +452,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" - package_config: - dependency: transitive - description: - name: package_config - sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" - source: hosted - version: "2.2.0" path: dependency: transitive description: @@ -796,6 +564,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" + persian_datetime_picker: + dependency: transitive + description: + name: persian_datetime_picker + sha256: "7ccbfd3a68dc89d405550f624e9fa590c914fed2aa2d48973c4f4400baab2e06" + url: "https://pub.dev" + source: hosted + version: "3.1.0" petitparser: dependency: transitive description: @@ -828,14 +604,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" proj4dart: dependency: transitive description: @@ -852,22 +620,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.dev" - source: hosted - version: "1.5.0" rasadyar_core: dependency: "direct main" description: @@ -876,13 +628,21 @@ packages: source: path version: "1.0.0+1" rxdart: - dependency: "direct main" + dependency: transitive description: name: rxdart sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" url: "https://pub.dev" source: hosted version: "0.28.0" + shamsi_date: + dependency: transitive + description: + name: shamsi_date + sha256: "4614789ed11bfffe5ba0aa157a20f2857ab6328528401766e0d924e453c866bd" + url: "https://pub.dev" + source: hosted + version: "1.0.4" shared_preferences: dependency: transitive description: @@ -939,43 +699,11 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.1" - shelf: - dependency: transitive - description: - name: shelf - sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.dev" - source: hosted - version: "1.4.2" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" - url: "https://pub.dev" - source: hosted - version: "3.0.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.0" - source_gen: - dependency: transitive - description: - name: source_gen - sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - source_helper: - dependency: transitive - description: - name: source_helper - sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" - url: "https://pub.dev" - source: hosted - version: "1.3.5" source_span: dependency: transitive description: @@ -1008,14 +736,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - stream_transform: - dependency: transitive - description: - name: stream_transform - sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev" - source: hosted - version: "2.1.1" string_scanner: dependency: transitive description: @@ -1048,14 +768,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.5" - timing: - dependency: transitive - description: - name: timing - sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" - url: "https://pub.dev" - source: hosted - version: "1.0.2" typed_data: dependency: transitive description: @@ -1120,14 +832,6 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.1" - watcher: - dependency: transitive - description: - name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" - url: "https://pub.dev" - source: hosted - version: "1.1.1" web: dependency: transitive description: @@ -1136,22 +840,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" - url: "https://pub.dev" - source: hosted - version: "0.1.6" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" - url: "https://pub.dev" - source: hosted - version: "3.0.2" wkt_parser: dependency: transitive description: @@ -1176,22 +864,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" - yaml_writer: - dependency: transitive - description: - name: yaml_writer - sha256: "69651cd7238411179ac32079937d4aa9a2970150d6b2ae2c6fe6de09402a5dc5" - url: "https://pub.dev" - source: hosted - version: "2.1.0" sdks: dart: ">=3.7.0 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 51aeb2e..c2725ef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,32 +10,8 @@ dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - ##Log - logger: ^2.5.0 - - ## reactive - dartx: ^1.2.0 - rxdart: ^0.28.0 - - ## local storage - hive_ce: ^2.10.1 - hive_ce_flutter: ^2.2.0 - - - - #SVG - flutter_svg: ^2.0.17 - - ##state manger - get: ^4.7.2 - - ##Di - get_it: ^8.0.3 - - inspection: path: ./features/inspection @@ -51,19 +27,6 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 - ##code generation - build_runner: ^2.4.15 - hive_ce_generator: ^1.8.2 - freezed: ^3.0.3 - json_serializable: ^6.9.4 - - ##test - mocktail: ^1.0.4 - get_test: ^4.0.1 - - - - flutter: From 6e6d2b22f6d7d44d0a10460f72e4786e47096a7e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 26 Apr 2025 09:45:28 +0330 Subject: [PATCH 033/256] fix : change map to openStreet --- .../lib/presentation/filter/view.dart | 84 ++++++----- features/inspection/pubspec.lock | 36 +++-- lib/main.dart | 4 +- packages/core/pubspec.lock | 44 +++--- packages/core/pubspec.yaml | 2 +- pubspec.lock | 131 ++---------------- pubspec.yaml | 3 - 7 files changed, 106 insertions(+), 198 deletions(-) diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index 486d9a8..65c8dbe 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; import 'logic.dart'; @@ -46,15 +46,13 @@ class SupervisionFilterPage extends GetView { ), children: [ TileLayer( - urlTemplate: - "https://map.ir/shiveh/xyz/1.0.0/Shiveh:Shiveh@EPSG:3857@png/{z}/{x}/{y}.png" - "?x-api-key=$token", + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', ), ObxValue((markers) { return MarkerLayer( markers: - markers.map((marker) => markerWidget(marker)).toList(), + markers.map((marker) => markerWidget(marker)).toList(), ); }, controller.markers), ], @@ -71,9 +69,9 @@ class SupervisionFilterPage extends GetView { onPressed: () { controller.isLoading.value = true; controller.determineCurrentPosition().then( - (value) => - controller.isLoading.value = - !controller.isLoading.value, + (value) => + controller.isLoading.value = + !controller.isLoading.value, ); }, ); @@ -86,21 +84,22 @@ class SupervisionFilterPage extends GetView { backgroundColor: AppColor.blueNormal, icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), onPressed: () { - controller.sheetController.value.addBottomSheet(child: filterWidget(), - initHeight: 400, - maxHeight: 470, - minHeight: 350); + controller.sheetController.value.addBottomSheet( + child: filterWidget(), + initHeight: 400, + maxHeight: 470, + minHeight: 350, + ); }, ), ), Obx( - () => - Stack( - children: + () => Stack( + children: controller.sheetController.value.bottomSheets .map((sheet) => sheet) .toList(), - ), + ), ), ], ), @@ -566,28 +565,27 @@ class SupervisionFilterPage extends GetView { ...List.generate( 5, - (index) => - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'فروش رفته', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), ), ], ), @@ -611,21 +609,19 @@ class SupervisionFilterPage extends GetView { color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, borderRadius: BorderRadius.circular(8), border: - isSelected - ? Border.fromBorderSide(BorderSide.none) - : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + isSelected + ? Border.fromBorderSide(BorderSide.none) + : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), ), child: Text( title, textAlign: TextAlign.center, style: - isSelected - ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) - : AppFonts.yekan10, + isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) + : AppFonts.yekan10, ), ), ); } - - } diff --git a/features/inspection/pubspec.lock b/features/inspection/pubspec.lock index fa96362..415d395 100644 --- a/features/inspection/pubspec.lock +++ b/features/inspection/pubspec.lock @@ -130,10 +130,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.1.0" flutter_web_plugins: dependency: transitive description: flutter @@ -367,10 +367,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.dev" source: hosted - version: "2.2.16" + version: "2.2.17" path_provider_foundation: dependency: transitive description: @@ -407,26 +407,26 @@ packages: dependency: transitive description: name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "12.0.0+1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" url: "https://pub.dev" source: hosted - version: "12.1.0" + version: "13.0.1" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 url: "https://pub.dev" source: hosted - version: "9.4.6" + version: "9.4.7" permission_handler_html: dependency: transitive description: @@ -451,6 +451,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" + persian_datetime_picker: + dependency: transitive + description: + name: persian_datetime_picker + sha256: "7ccbfd3a68dc89d405550f624e9fa590c914fed2aa2d48973c4f4400baab2e06" + url: "https://pub.dev" + source: hosted + version: "3.1.0" petitparser: dependency: transitive description: @@ -506,6 +514,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.28.0" + shamsi_date: + dependency: transitive + description: + name: shamsi_date + sha256: "4614789ed11bfffe5ba0aa157a20f2857ab6328528401766e0d924e453c866bd" + url: "https://pub.dev" + source: hosted + version: "1.0.4" sky_engine: dependency: transitive description: flutter diff --git a/lib/main.dart b/lib/main.dart index 840ae0c..9828e1c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,7 +17,7 @@ void main() async { -class ForDevicePreview extends StatelessWidget { +/*class ForDevicePreview extends StatelessWidget { const ForDevicePreview({super.key}); @override @@ -35,7 +35,7 @@ class ForDevicePreview extends StatelessWidget { getPages: AppPages.pages, ); } -} +}*/ class MyApp extends StatelessWidget { const MyApp({super.key}); diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 6ce6b21..deedfa1 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f url: "https://pub.dev" source: hosted - version: "80.0.0" + version: "82.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + sha256: "13c1e6c6fd460522ea840abec3f677cc226f5fec7872c04ad7b425517ccf54f7" url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.4.4" args: dependency: transitive description: @@ -250,10 +250,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -412,10 +412,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a" + sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c url: "https://pub.dev" source: hosted - version: "6.9.4" + version: "6.9.5" leak_tracker: dependency: transitive description: @@ -500,10 +500,10 @@ packages: dependency: transitive description: name: mockito - sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6 + sha256: "4546eac99e8967ea91bae633d2ca7698181d008e95fa4627330cf903d573277a" url: "https://pub.dev" source: hosted - version: "5.4.5" + version: "5.4.6" mocktail: dependency: "direct dev" description: @@ -548,10 +548,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.dev" source: hosted - version: "2.2.16" + version: "2.2.17" path_provider_foundation: dependency: transitive description: @@ -588,26 +588,26 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "12.0.0+1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" url: "https://pub.dev" source: hosted - version: "12.1.0" + version: "13.0.1" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 url: "https://pub.dev" source: hosted - version: "9.4.6" + version: "9.4.7" permission_handler_html: dependency: transitive description: @@ -881,18 +881,18 @@ packages: dependency: transitive description: name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + sha256: bfe6f435f6ec49cb6c01da1e275ae4228719e59a6b067048c51e72d9d63bcc4b url: "https://pub.dev" source: hosted - version: "0.1.6" + version: "1.0.0" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" xdg_directories: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index e1795ee..88133be 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: ##Di get_it: ^8.0.3 - permission_handler: ^11.4.0 + permission_handler: ^12.0.0+1 persian_datetime_picker: ^3.1.0 diff --git a/pubspec.lock b/pubspec.lock index 24a9efa..c5248f3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -81,22 +81,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - device_frame: - dependency: transitive - description: - name: device_frame - sha256: d031a06f5d6f4750009672db98a5aa1536aa4a231713852469ce394779a23d75 - url: "https://pub.dev" - source: hosted - version: "1.2.0" - device_preview: - dependency: "direct main" - description: - name: device_preview - sha256: a694acdd3894b4c7d600f4ee413afc4ff917f76026b97ab06575fe886429ef19 - url: "https://pub.dev" - source: hosted - version: "1.2.0" fake_async: dependency: transitive description: @@ -113,14 +97,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" fixnum: dependency: transitive description: @@ -142,11 +118,6 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" flutter_map: dependency: transitive description: @@ -183,10 +154,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -206,13 +177,13 @@ packages: source: hosted version: "10.8.0" freezed_annotation: - dependency: "direct overridden" + dependency: transitive description: name: freezed_annotation - sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "3.0.0" geolocator: dependency: transitive description: @@ -320,10 +291,10 @@ packages: dependency: transitive description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" json_annotation: dependency: transitive description: @@ -444,14 +415,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" path: dependency: transitive description: @@ -480,10 +443,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.dev" source: hosted - version: "2.2.16" + version: "2.2.17" path_provider_foundation: dependency: transitive description: @@ -520,26 +483,26 @@ packages: dependency: transitive description: name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "12.0.0+1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" url: "https://pub.dev" source: hosted - version: "12.1.0" + version: "13.0.1" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 url: "https://pub.dev" source: hosted - version: "9.4.6" + version: "9.4.7" permission_handler_html: dependency: transitive description: @@ -612,14 +575,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" - provider: - dependency: transitive - description: - name: provider - sha256: "489024f942069c2920c844ee18bb3d467c69e48955a4f32d1677f71be103e310" - url: "https://pub.dev" - source: hosted - version: "6.1.4" rasadyar_core: dependency: "direct main" description: @@ -643,62 +598,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" - shared_preferences: - dependency: transitive - description: - name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.dev" - source: hosted - version: "2.5.3" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" - url: "https://pub.dev" - source: hosted - version: "2.4.10" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.dev" - source: hosted - version: "2.5.4" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" - source: hosted - version: "2.4.3" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index c2725ef..6916a57 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,10 +18,7 @@ dependencies: rasadyar_core: path: ./packages/core - device_preview: ^1.2.0 -dependency_overrides: - freezed_annotation: ^2.4.1 dev_dependencies: flutter_test: From c10ddaf0d5fec490e8a35280f95042b35fc4b644 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 26 Apr 2025 16:50:19 +0330 Subject: [PATCH 034/256] feat : dynamic form navigation --- .../add_mobile_inspector/view.dart | 154 ++++----- .../presentation/add_supervision/logic.dart | 36 ++- .../presentation/add_supervision/view.dart | 259 +++++++++++----- .../presentation/location_details/view.dart | 17 +- .../registration_of_violation/view.dart | 136 ++++---- lib/main.dart | 9 +- packages/core/lib/core.dart | 4 +- .../presentation/utils/list_extensions.dart | 26 ++ .../core/lib/presentation/utils/utils.dart | 3 +- .../widget/buttons/outline_elevated_icon.dart | 2 +- .../presentation/widget/inputs/r_input.dart | 291 +++++++++--------- 11 files changed, 568 insertions(+), 369 deletions(-) create mode 100644 packages/core/lib/presentation/utils/list_extensions.dart diff --git a/features/inspection/lib/presentation/add_mobile_inspector/view.dart b/features/inspection/lib/presentation/add_mobile_inspector/view.dart index 87d4a82..89260e3 100644 --- a/features/inspection/lib/presentation/add_mobile_inspector/view.dart +++ b/features/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -26,96 +26,100 @@ class AddMobileInspectorPage extends GetView { RFab.smallAdd(onPressed: () => controller.countInspector.value++), ], ), - body: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - child: Column( - children: [ - Expanded( - child: ObxValue((data) { - return ListView.separated( - itemBuilder: - (context, index) => Container( - padding: EdgeInsets.symmetric( - horizontal: 12, - vertical: 16, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.bgDark), - ), - child: Column( - spacing: 16, - children: [ - RTextField( - label: 'نام و نام خانوادگی', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), - RTextField( - label: 'شماره مجوز', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), - RTextField( - label: 'شماره ثبت', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), - RTextField( - label: 'کد اقتصادی', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), + body: Column( + children: [ + Expanded( + child: ObxValue((data) { + return ListView.separated( + padding: const EdgeInsets.fromLTRB(25, 10, 25, 0), + itemBuilder: + (context, index) => + Container( + padding: EdgeInsets.symmetric( + horizontal: 12, + vertical: 16, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.7, color: AppColor.bgDark), + ), + child: Column( + spacing: 16, + children: [ + RTextField( + label: 'نام و نام خانوادگی', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'شماره مجوز', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'شماره ثبت', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'کد اقتصادی', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 12), - child: SizedBox( - height: 40, - child: Row( - spacing: 16, - children: [ - Expanded( - child: RElevated( - text: 'ثبت', - onPressed: () {}, - ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: SizedBox( + height: 40, + child: Row( + spacing: 16, + children: [ + Expanded( + child: RElevated( + text: 'ثبت', + textStyle:AppFonts.yekan16.copyWith(color: Colors.white), + onPressed: () {}, ), - Expanded( - child: ROutlinedElevated( - text: 'انصراف', - onPressed: () {}, - ), + ), + Expanded( + child: ROutlinedElevated( + text: 'انصراف', + textStyle:AppFonts.yekan16, + onPressed: () {}, ), - ], - ), + ), + ], ), ), - ], - ), + ), + ], ), - separatorBuilder: (context, index) => SizedBox(height: 15), - itemCount: data.value, - ); - }, controller.countInspector), - ), + ), + separatorBuilder: (context, index) => SizedBox(height: 15), + itemCount: data.value, + ); + }, controller.countInspector), + ), - RElevated( + + Padding( + padding: const EdgeInsets.fromLTRB(20, 4, 20, 20), + child: RElevated( text: 'مرحله بعد', onPressed: () { Get.toNamed(InspectionRoutes.inspectionRegistrationOfViolation); }, + height: 50, isFullWidth: true, - height: 40, backgroundColor: AppColor.greenNormal, textStyle: AppFonts.yekan16.copyWith(color: Colors.white), ), - SizedBox(height: 25), - ], - ), + ), + ], ), ); } diff --git a/features/inspection/lib/presentation/add_supervision/logic.dart b/features/inspection/lib/presentation/add_supervision/logic.dart index 9717b08..4aee4ec 100644 --- a/features/inspection/lib/presentation/add_supervision/logic.dart +++ b/features/inspection/lib/presentation/add_supervision/logic.dart @@ -1,11 +1,19 @@ import 'package:flutter/material.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; class AddSupervisionLogic extends GetxController { RxInt selectedSegment = 0.obs; + RxInt violationSegmentsSelected = 0.obs; RxInt selectedTypeOfOwnership = 0.obs; RxInt selectedUnitType = 0.obs; - RxInt selectedAccompanyingInspectors = 0.obs; + RxList selectedAccompanyingInspectors = RxList([0]); + + Map> tmpData = { + 'نوع مالکیت': ['دولتی', 'غیر دولتی', 'استیجاری', 'شخصی', 'سایر'], + 'نوع واحد': ['دولتی', 'غیر دولتی', 'استیجاری', 'شخصی', 'سایر'], + 'بازرسان همراه': ['ندارد','دولتی', 'غیر دولتی', 'استیجاری', 'شخصی', 'سایر'], + }; List tmpLs = ['دولتی', 'غیر دولتی', 'استیجاری', 'شخصی', 'سایر']; @@ -23,10 +31,34 @@ class AddSupervisionLogic extends GetxController { ), }; + // The data for the segments + final Map violationSegments = { + 0: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(50)), + child: Text('دارد', style: AppFonts.yekan13), + ), + 1: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(50)), + child: Text('ندارد', style: AppFonts.yekan13), + ), + }; + + +List routes = [ + InspectionRoutes.inspectionRegistrationOfViolation, + InspectionRoutes.inspectionDisplayInformation +]; + + + @override void onReady() { - // TODO: implement onReady + super.onReady(); + + } @override diff --git a/features/inspection/lib/presentation/add_supervision/view.dart b/features/inspection/lib/presentation/add_supervision/view.dart index eb6ad50..01e7cb5 100644 --- a/features/inspection/lib/presentation/add_supervision/view.dart +++ b/features/inspection/lib/presentation/add_supervision/view.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; -import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; -import 'package:rasadyar_core/presentation/widget/tabs/new_tab.dart'; import 'package:inspection/inspection.dart'; +import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -23,111 +20,221 @@ class AddSupervisionPage extends GetView { height: 16, ), ), - body: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 16, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + Expanded( + child: SingleChildScrollView( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 12, children: [ - Text( - 'نوع پروانه کسب', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.blueNormal, + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 10, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + Text( + 'نوع پروانه کسب', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + ), + ), + SizedBox(height: 16), + ObxValue((data) { + return NewCupertinoSegmentedControl( + padding: EdgeInsets.zero, + children: controller.segments, + groupValue: data.value, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + data.value = value; + }, + ); + }, controller.selectedSegment), + SizedBox(height: 16), + Text( + 'تخلف', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + ), + ), + SizedBox(height: 16), + ObxValue((data) { + return NewCupertinoSegmentedControl( + padding: EdgeInsets.zero, + children: controller.violationSegments, + groupValue: data.value, + selectedColor: AppColor.blueNormal, + unselectedColor: Colors.white, + borderColor: Colors.grey.shade300, + onValueChanged: (int value) { + if(value == 0) { + controller.routes.ensureContainsAtStart(InspectionRoutes.inspectionRegistrationOfViolation); + } else { + controller.routes.remove(InspectionRoutes.inspectionRegistrationOfViolation); + } + data.value = value; + }, + ); + }, controller.violationSegmentsSelected), + SizedBox(height: 8), + RTextField(label: 'صادر کننده پروانه'), + SizedBox(height: 8), + RTextField(label: 'شماره مجوز'), + SizedBox(height: 8), + RTextField(label: 'شماره ثبت'), + SizedBox(height: 8), + RTextField(label: 'کد اقتصادی'), + ], ), ), + SizedBox(height: 10), + optionWidget( + selected: controller.selectedTypeOfOwnership, + options: controller.tmpData.entries.elementAt(0), + onSelected: + (index) => + controller.selectedTypeOfOwnership.value = index, + ), + SizedBox(height: 18), + optionWidget( + selected: controller.selectedUnitType, + options: controller.tmpData.entries.elementAt(1), + onSelected: + (index) => controller.selectedUnitType.value = index, + ), + SizedBox(height: 18), + optionWidget( + selectedList: controller.selectedAccompanyingInspectors, + options: controller.tmpData.entries.elementAt(2), + onSelected: (data) { + final selected = controller.selectedAccompanyingInspectors; + final route = InspectionRoutes.inspectionAddMobileInspector; - ObxValue((data) { - return NewCupertinoSegmentedControl( - padding: EdgeInsets.zero, - children: controller.segments, - groupValue: data.value, - selectedColor: AppColor.blueNormal, - unselectedColor: Colors.white, - borderColor: Colors.grey.shade300, - onValueChanged: (int value) { - data.value = value; - }, - ); - }, controller.selectedSegment), + if (data == 0) { + selected.resetWith(0); + controller.routes.remove(route); + return; + } - RTextField(label: 'صادر کننده پروانه'), - RTextField(label: 'شماره مجوز'), - RTextField(label: 'شماره ثبت'), - RTextField(label: 'کد اقتصادی'), + controller.routes.ensureContainsAtStart(route); + selected.removeIfPresent(0); + selected.toggle(data); + }, + ), ], ), ), - optionWidget(controller.selectedTypeOfOwnership), - optionWidget(controller.selectedAccompanyingInspectors), - optionWidget(controller.selectedUnitType), + ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: RElevated( - text: 'مرحله بعد', - onPressed: () { - Get.toNamed(InspectionRoutes.inspectionAddMobileInspector); - }, - height: 40, - isFullWidth: true, - backgroundColor: AppColor.greenNormal, - textStyle: AppFonts.yekan16.copyWith(color: Colors.white), - ), + Padding( + padding: const EdgeInsets.fromLTRB(20, 0, 20, 20), + child: RElevated( + text: 'مرحله بعد', + onPressed: () { + Get.toNamed(controller.routes.first); + + }, + height: 50, + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), ), - ], - ), + ), + ], ), ); } - Column optionWidget(RxInt selected) { + Column optionWidget({ + RxInt? selected, + RxList? selectedList, + required MapEntry> options, + required void Function(int index) onSelected, + }) { + assert( + (selected != null) != (selectedList != null), + 'Exactly one of selected or selectedList must be provided', + ); + return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: Text( - 'نوع پروانه کسب', + options.key, textAlign: TextAlign.center, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), ), SizedBox( - height: 75, + height: 50, child: ListView.separated( shrinkWrap: true, - padding: EdgeInsets.all(20), + padding: EdgeInsets.symmetric(horizontal: 20), scrollDirection: Axis.horizontal, itemBuilder: - (context, index) => ObxValue((data) { - return ChoiceChip( - onSelected: (value) { - selected.value = index; - }, - selectedColor: AppColor.blueNormal, - labelStyle: - data.value == index - ? AppFonts.yekan13.copyWith( - color: AppColor.whiteLight, - ) - : AppFonts.yekan12.copyWith( - color: AppColor.darkGreyNormalActive, - ), - checkmarkColor: Colors.white, - label: Text(controller.tmpLs[index]), - selected: index == data.value, - ); - }, selected), + (context, index) => + selected != null + ? ObxValue((data) { + return ChoiceChip( + onSelected: (_) => onSelected(index), + color: WidgetStateProperty.resolveWith((data,) { + if (selected.value == index) { + return AppColor.blueNormal; + } else { + return Colors.white; + } + }), + labelStyle: + data.value == index + ? AppFonts.yekan13.copyWith( + color: AppColor.whiteLight, + ) + : AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormalActive, + ), + checkmarkColor: Colors.white, + label: Text(options.value[index]), + selected: index == data.value, + ); + }, selected) + : ObxValue((data) { + return ChoiceChip( + onSelected: (value) => onSelected.call(index), + color: WidgetStateProperty.resolveWith((states,) { + if (data.contains(index)) { + return AppColor.blueNormal; + } else { + return Colors.white; + } + }), + labelStyle: + data.contains(index) + ? AppFonts.yekan13.copyWith( + color: AppColor.whiteLight, + ) + : AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormalActive, + ), + checkmarkColor: Colors.white, + label: Text(options.value[index]), + selected: data.contains(index), + ); + }, selectedList!), separatorBuilder: (context, index) => SizedBox(width: 8), - itemCount: controller.tmpLs.length, + itemCount: options.value.length, ), ), ], diff --git a/features/inspection/lib/presentation/location_details/view.dart b/features/inspection/lib/presentation/location_details/view.dart index 6b19305..0a6c17a 100644 --- a/features/inspection/lib/presentation/location_details/view.dart +++ b/features/inspection/lib/presentation/location_details/view.dart @@ -80,7 +80,18 @@ class LocationDetailsPage extends GetView { Expanded( child: ROutlinedElevatedIcon( icon: FaIcon(FontAwesomeIcons.calendar), - onPressed: () {}, + onPressed: () async { + Jalali? picked = await showPersianDatePicker( + context: context, + initialDate: Jalali.now(), + firstDate: Jalali(1385, 8), + lastDate: Jalali(1450, 9), + initialEntryMode: + PersianDatePickerEntryMode.calendarOnly, + initialDatePickerMode: PersianDatePickerMode.day, + ); + var label = picked?.formatFullDate(); + }, text: 'تا تاریخ', textStyle: AppFonts.yekan16.copyWith( color: AppColor.blueNormal, @@ -140,7 +151,7 @@ class LocationDetailsPage extends GetView { child: Padding( padding: const EdgeInsets.symmetric( horizontal: 22, - vertical: 25, + vertical: 21, ), child: Column( spacing: 6, @@ -154,7 +165,7 @@ class LocationDetailsPage extends GetView { ), SizedBox(height: 2), Text( - '1043/12/12', + '1403/12/12', textAlign: TextAlign.center, style: AppFonts.yekan12, ), diff --git a/features/inspection/lib/presentation/registration_of_violation/view.dart b/features/inspection/lib/presentation/registration_of_violation/view.dart index c3afd32..dba41de 100644 --- a/features/inspection/lib/presentation/registration_of_violation/view.dart +++ b/features/inspection/lib/presentation/registration_of_violation/view.dart @@ -1,10 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; -import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; import 'package:inspection/presentation/registration_of_violation/logic.dart'; import 'package:inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; class RegistrationOfViolationPage extends GetView { @@ -13,7 +11,7 @@ class RegistrationOfViolationPage @override Widget build(BuildContext context) { return Scaffold( -backgroundColor:AppColor.bgLight, + backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'ثبت تخلف', leading: vecWidget( @@ -27,77 +25,83 @@ backgroundColor:AppColor.bgLight, ], ), body: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20,vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), child: Column( children: [ Expanded( child: ObxValue((data) { return ListView.separated( - itemBuilder: (context, index) =>Container( - padding:EdgeInsets.symmetric(horizontal: 8,vertical: 12), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1,color: AppColor.bgDark), - - ), - child: Column( - spacing:16 , - children: [ - - RTextField( - label: 'عنوان تخلف', - filled: true, - filledColor: AppColor.whiteLight, - + itemBuilder: + (context, index) => Container( + padding: EdgeInsets.symmetric( + horizontal: 8, + vertical: 12, ), - RTextField( - label: 'توضیحات تخلف', - filled: true, - filledColor: AppColor.whiteLight, - maxLines: 5, - minLines: 5, - + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.75, color: AppColor.bgDark), ), - RTextField( - label: 'عنوان تخلف', - filled: true, - filledColor: AppColor.whiteLight, + child: Column( + spacing: 16, + children: [ + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 3, + minLines: 3, + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 3, + minLines: 3, + ), + + SizedBox( + height: 40, + child: Row( + spacing: 16, + children: [ + Expanded( + child: RElevated( + text: 'ثبت', + onPressed: () {}, + ), + ), + Expanded( + child: ROutlinedElevated( + text: 'انصراف', + onPressed: () {}, + ), + ), + ], + ), + ), + ], ), - RTextField( - label: 'عنوان تخلف', - filled: true, - filledColor: AppColor.whiteLight, - - ), - RTextField( - label: 'توضیحات تخلف', - filled: true, - filledColor: AppColor.whiteLight, - maxLines: 5, - minLines: 5, - - ), - - SizedBox( - height: 40, - child: Row( - spacing: 16, - children: [ - Expanded(child: RElevated(text: 'ثبت', onPressed: (){})), - Expanded(child:ROutlinedElevated(text: 'انصراف',onPressed: (){},) ), - - ], - ), - ) - - ], - ), - ) , - separatorBuilder: (context, index) => SizedBox(height: 15,), + ), + separatorBuilder: (context, index) => SizedBox(height: 15), itemCount: data.value, ); - },controller.countViolation), + }, controller.countViolation), ), RElevated( @@ -110,7 +114,7 @@ backgroundColor:AppColor.bgLight, backgroundColor: AppColor.greenNormal, textStyle: AppFonts.yekan16.copyWith(color: Colors.white), ), - SizedBox(height: 25,) + SizedBox(height: 25), ], ), ), diff --git a/lib/main.dart b/lib/main.dart index 9828e1c..cb30700 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,3 @@ -import 'package:device_preview/device_preview.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_app/domain/service/user/user_service.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; @@ -12,11 +11,9 @@ void main() async { await setupAllProvider(); runApp(MyApp()); - // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); + // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); } - - /*class ForDevicePreview extends StatelessWidget { const ForDevicePreview({super.key}); @@ -51,6 +48,10 @@ class MyApp extends StatelessWidget { initialBinding: BindingsBuilder.put(() => UserService()), getPages: AppPages.pages, locale: Locale('fa'), + localizationsDelegates: [ + PersianMaterialLocalizations.delegate, + PersianCupertinoLocalizations.delegate, + ], ); } } diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index d3ea5ec..67a5d70 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -9,5 +9,5 @@ export 'package:rasadyar_core/presentation/widget/widget.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:flutter_rating_bar/flutter_rating_bar.dart'; - - +export 'package:persian_datetime_picker/persian_datetime_picker.dart'; +import 'package:dartx/dartx.dart' as dartx; diff --git a/packages/core/lib/presentation/utils/list_extensions.dart b/packages/core/lib/presentation/utils/list_extensions.dart new file mode 100644 index 0000000..746a00c --- /dev/null +++ b/packages/core/lib/presentation/utils/list_extensions.dart @@ -0,0 +1,26 @@ +extension ListExtensions on List { + void toggle(T item) { + if (contains(item)) { + if (length > 1) { + remove(item); + } + } else { + add(item); + } + } + + void ensureContainsAtStart(T item) { + if (!contains(item)) { + insert(0, item); + } + } + + void removeIfPresent(T item) { + remove(item); + } + + void resetWith(T item) { + clear(); + add(item); + } +} diff --git a/packages/core/lib/presentation/utils/utils.dart b/packages/core/lib/presentation/utils/utils.dart index 1a49d0f..edfacc8 100644 --- a/packages/core/lib/presentation/utils/utils.dart +++ b/packages/core/lib/presentation/utils/utils.dart @@ -1 +1,2 @@ -export 'color_utils.dart'; \ No newline at end of file +export 'color_utils.dart'; +export 'list_extensions.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart index 2503575..3060019 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart @@ -43,7 +43,7 @@ class _ROutlinedElevatedStateIcon extends State { return OutlinedButton.icon( icon: widget.icon, label: Text(widget.text), - onPressed: () {}, + onPressed: widget.onPressed, style: ButtonStyle( side: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.pressed)) { diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 2d1b0f6..c6b9d9a 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -1,110 +1,115 @@ - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; @immutable class RTextField extends StatefulWidget { - RTextField( - {super.key, - this.maxLines, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.isForNumber = false, - this.style, - this.hintStyle, - this.suffixIcon, - this.prefixIcon, - this.validator, - this.readonly = false, - this.boxConstraints, - this.minLines, - this.radius, - this.filled, - this.filledColor, - this.enabled, - this.errorStyle, - this.labelStyle, - this.label}) { + RTextField({ + super.key, + this.maxLines, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.isForNumber = false, + this.style, + this.hintStyle, + this.suffixIcon, + this.prefixIcon, + this.validator, + this.readonly = false, + this.boxConstraints, + this.minLines, + this.radius, + this.filled, + this.filledColor, + this.enabled, + this.errorStyle, + this.labelStyle, + this.label, + }) { filled = filled ?? false; obscure = false; _inputBorder = OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(radius ?? 16)); + borderSide: BorderSide(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(radius ?? 8), + ); } - RTextField.noBorder( - {super.key, - this.maxLines, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.style, - this.hintStyle, - this.suffixIcon, - this.radius, - this.validator, - this.boxConstraints, - this.minLines, - this.isForNumber = false, - this.readonly = false, - this.label, - this.filled, - this.filledColor, - this.errorStyle, - this.labelStyle, - this.enabled}) { + RTextField.noBorder({ + super.key, + this.maxLines, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.style, + this.hintStyle, + this.suffixIcon, + this.radius, + this.validator, + this.boxConstraints, + this.minLines, + this.isForNumber = false, + this.readonly = false, + this.label, + this.filled, + this.filledColor, + this.errorStyle, + this.labelStyle, + this.enabled, + }) { _inputBorder = OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(radius ?? 16)); + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(radius ?? 16), + ); obscure = false; filled = filled ?? true; } - RTextField.password( - {super.key, - this.maxLines = 1, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.style, - this.hintStyle, - this.suffixIcon, - this.prefixIcon, - this.radius, - this.validator, - this.boxConstraints, - this.minLines, - this.isForNumber = false, - this.readonly = false, - this.label, - this.filled, - this.filledColor, - this.errorStyle, - this.labelStyle, - this.enabled}) { + RTextField.password({ + super.key, + this.maxLines = 1, + this.maxLength, + this.hintText, + this.padding, + this.onChanged, + this.onSubmitted, + this.keyboardType, + this.showCounter = false, + this.isDense, + this.initText, + this.style, + this.hintStyle, + this.suffixIcon, + this.prefixIcon, + this.radius, + this.validator, + this.boxConstraints, + this.minLines, + this.isForNumber = false, + this.readonly = false, + this.label, + this.filled, + this.filledColor, + this.errorStyle, + this.labelStyle, + this.enabled, + }) { _inputBorder = OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(radius ?? 16)); + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(radius ?? 16), + ); filled = filled ?? true; obscure = true; _isPassword = true; @@ -170,53 +175,61 @@ class _RTextFieldState extends State { @override Widget build(BuildContext context) { return Padding( - padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 6.0), - child: TextFormField( - controller: _controller, - readOnly: widget.readonly, - minLines: widget.minLines, - maxLines: widget.maxLines, - onChanged: widget.onChanged, - validator: widget.validator, - enabled: widget.enabled, - obscureText: obscure ?? false, - onTapOutside: (event) { - FocusScope.of(context).unfocus(); - }, - onFieldSubmitted: widget.onSubmitted, - maxLength: widget.maxLength, - textDirection: TextDirection.rtl, - style: widget.style , - keyboardType: widget.keyboardType, - decoration: InputDecoration( - errorStyle: widget.errorStyle, - errorMaxLines: 1, - isDense: widget.isDense, - suffixIcon: widget.suffixIcon ?? - (widget._isPassword - ? IconButton( - onPressed: () { - setState(() { - obscure = !obscure!; - }); - }, - icon: Icon(!obscure! - ? CupertinoIcons.eye_slash - : CupertinoIcons.eye)) - : null), - suffixIconConstraints: widget.boxConstraints, - prefixIcon: widget.prefixIcon, - prefixIconConstraints: widget.boxConstraints, - hintText: widget.hintText, - labelText: widget.label, - labelStyle: widget.labelStyle??AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarkActive), - filled: widget.filled, - fillColor: widget.filledColor, - counter: widget.showCounter ? null : const SizedBox(), - hintStyle: widget.hintStyle, - enabledBorder: widget._inputBorder, - focusedBorder: widget._inputBorder, - border: widget._inputBorder), - )); + padding: widget.padding ?? EdgeInsets.zero, + child: TextFormField( + controller: _controller, + readOnly: widget.readonly, + minLines: widget.minLines, + maxLines: widget.maxLines, + onChanged: widget.onChanged, + validator: widget.validator, + enabled: widget.enabled, + obscureText: obscure ?? false, + onTapOutside: (event) { + FocusScope.of(context).unfocus(); + }, + onFieldSubmitted: widget.onSubmitted, + maxLength: widget.maxLength, + textDirection: TextDirection.rtl, + style: widget.style, + keyboardType: widget.keyboardType, + decoration: InputDecoration( + contentPadding: EdgeInsets.symmetric(horizontal: 16), + errorStyle: widget.errorStyle, + errorMaxLines: 1, + isDense: widget.isDense, + suffixIcon: + widget.suffixIcon ?? + (widget._isPassword + ? IconButton( + onPressed: () { + setState(() { + obscure = !obscure!; + }); + }, + icon: Icon( + !obscure! ? CupertinoIcons.eye_slash : CupertinoIcons.eye, + ), + ) + : null), + suffixIconConstraints: widget.boxConstraints, + prefixIcon: widget.prefixIcon, + prefixIconConstraints: widget.boxConstraints, + hintText: widget.hintText, + labelText: widget.label, + alignLabelWithHint: true, + labelStyle: AppFonts.yekan14 + .copyWith(color: AppColor.lightGreyDarkActive) + .merge(widget.labelStyle), + filled: widget.filled, + fillColor: widget.filledColor, + counter: widget.showCounter ? null : const SizedBox(), + hintStyle: widget.hintStyle, + enabledBorder: widget._inputBorder, + focusedBorder: widget._inputBorder, + border: widget._inputBorder, + ), + ), + ); } -} \ No newline at end of file +} From b77e4e9095ca506e6e351d0def57377b9e8bd9c9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 27 Apr 2025 09:39:58 +0330 Subject: [PATCH 035/256] feat : persian calendar and date picker --- .../presentation/location_details/view.dart | 17 +++++++++++++++-- lib/main.dart | 9 ++++++++- .../auth/auth_with_use_and_pass/view.dart | 18 ++++++++++++------ packages/core/lib/core.dart | 1 + packages/core/pubspec.lock | 13 +++++++++++++ packages/core/pubspec.yaml | 6 +++++- pubspec.lock | 9 +++++++-- copyAssets.sh => tools/copyAssets.sh | 0 runner.sh => tools/runner.sh | 0 vecGeneratoe.sh => tools/vecGeneratoe.sh | 0 10 files changed, 61 insertions(+), 12 deletions(-) rename copyAssets.sh => tools/copyAssets.sh (100%) rename runner.sh => tools/runner.sh (100%) rename vecGeneratoe.sh => tools/vecGeneratoe.sh (100%) diff --git a/features/inspection/lib/presentation/location_details/view.dart b/features/inspection/lib/presentation/location_details/view.dart index 0a6c17a..559508c 100644 --- a/features/inspection/lib/presentation/location_details/view.dart +++ b/features/inspection/lib/presentation/location_details/view.dart @@ -70,7 +70,19 @@ class LocationDetailsPage extends GetView { Expanded( child: ROutlinedElevatedIcon( icon: FaIcon(FontAwesomeIcons.calendar), - onPressed: () {}, + onPressed:() async { + + Jalali? picked = await showPersianDatePicker( + context: context, + initialDate: Jalali.now(), + firstDate: Jalali(1385, 8), + lastDate: Jalali(1450, 9), + + initialEntryMode: + PersianDatePickerEntryMode.calendarOnly, + initialDatePickerMode: PersianDatePickerMode.day, + ); + }, text: 'از تاریخ', textStyle: AppFonts.yekan16.copyWith( color: AppColor.blueNormal, @@ -81,16 +93,17 @@ class LocationDetailsPage extends GetView { child: ROutlinedElevatedIcon( icon: FaIcon(FontAwesomeIcons.calendar), onPressed: () async { + Jalali? picked = await showPersianDatePicker( context: context, initialDate: Jalali.now(), firstDate: Jalali(1385, 8), lastDate: Jalali(1450, 9), + initialEntryMode: PersianDatePickerEntryMode.calendarOnly, initialDatePickerMode: PersianDatePickerMode.day, ); - var label = picked?.formatFullDate(); }, text: 'تا تاریخ', textStyle: AppFonts.yekan16.copyWith( diff --git a/lib/main.dart b/lib/main.dart index cb30700..4eeebaa 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -42,15 +42,22 @@ class MyApp extends StatelessWidget { return GetMaterialApp( title: 'رصدیار', theme: ThemeData( + fontFamily: 'yekan', colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal), ), initialRoute: AppPages.initRoutes, initialBinding: BindingsBuilder.put(() => UserService()), getPages: AppPages.pages, - locale: Locale('fa'), + locale: const Locale("fa", "IR"), + supportedLocales: const [ + Locale("fa", "IR"), + ], localizationsDelegates: [ PersianMaterialLocalizations.delegate, PersianCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, ], ); } diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart index dd0b469..f6cd2d7 100644 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart +++ b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart @@ -1,9 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:inspection/inspection.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/captcha/captcha_widget.dart'; import 'logic.dart'; @@ -227,11 +225,19 @@ class AuthWithUseAndPassPage extends GetView { SizedBox(height: 23), RElevated( text: 'ورود', - onPressed: () { + onPressed: () async { + Jalali? picked = await showPersianDatePicker( + context: Get.context!, + + initialDate: Jalali.now(), + firstDate: Jalali(1385, 8), + lastDate: Jalali(1450, 9), + initialEntryMode: PersianDatePickerEntryMode.calendarOnly, + initialDatePickerMode: PersianDatePickerMode.year, + ); + if (data.value.currentState?.validate() == true && - controller.captchaController.validate()) { - Get.toNamed(InspectionRoutes.inspection); - } + controller.captchaController.validate()) {} }, width: Get.width, height: 48, diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 67a5d70..409edfe 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -6,6 +6,7 @@ export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; //other packages +export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:flutter_rating_bar/flutter_rating_bar.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index deedfa1..f5a3aee 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -230,6 +230,11 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_rating_bar: dependency: "direct main" description: @@ -384,6 +389,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" io: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 88133be..4df8b74 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -9,6 +9,9 @@ environment: dependencies: flutter: sdk: flutter + flutter_localizations: + sdk: flutter + #UI cupertino_icons: ^1.0.8 @@ -41,9 +44,10 @@ dependencies: ##Di get_it: ^8.0.3 + #other permission_handler: ^12.0.0+1 persian_datetime_picker: ^3.1.0 - + intl: ^0.19.0 diff --git a/pubspec.lock b/pubspec.lock index c5248f3..8f91457 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -118,6 +118,11 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_map: dependency: transitive description: @@ -291,10 +296,10 @@ packages: dependency: transitive description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.19.0" json_annotation: dependency: transitive description: diff --git a/copyAssets.sh b/tools/copyAssets.sh similarity index 100% rename from copyAssets.sh rename to tools/copyAssets.sh diff --git a/runner.sh b/tools/runner.sh similarity index 100% rename from runner.sh rename to tools/runner.sh diff --git a/vecGeneratoe.sh b/tools/vecGeneratoe.sh similarity index 100% rename from vecGeneratoe.sh rename to tools/vecGeneratoe.sh From 74c56d1c10910a72bbb2453ff765aa4710d6a458 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 27 Apr 2025 12:01:32 +0330 Subject: [PATCH 036/256] feat : persian calendar and date picker --- .../add_mobile_inspector/view.dart | 147 ++++++++-------- .../presentation/add_supervision/view.dart | 6 +- .../display_information/view.dart | 164 +++++++++--------- .../registration_of_violation/view.dart | 149 ++++++++-------- .../widget/app_bar/r_app_bar.dart | 10 +- 5 files changed, 233 insertions(+), 243 deletions(-) diff --git a/features/inspection/lib/presentation/add_mobile_inspector/view.dart b/features/inspection/lib/presentation/add_mobile_inspector/view.dart index 89260e3..d6b1a0d 100644 --- a/features/inspection/lib/presentation/add_mobile_inspector/view.dart +++ b/features/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; -import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; import 'package:inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -18,7 +16,7 @@ class AddMobileInspectorPage extends GetView { title: 'افزودن بازرس همراه', leading: vecWidget( Assets.vecMessageAddSvg, - color: AppColor.blueNormal, + color: Colors.white, width: 16, height: 16, ), @@ -32,88 +30,21 @@ class AddMobileInspectorPage extends GetView { child: ObxValue((data) { return ListView.separated( padding: const EdgeInsets.fromLTRB(25, 10, 25, 0), - itemBuilder: - (context, index) => - Container( - padding: EdgeInsets.symmetric( - horizontal: 12, - vertical: 16, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.7, color: AppColor.bgDark), - ), - child: Column( - spacing: 16, - children: [ - RTextField( - label: 'نام و نام خانوادگی', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), - RTextField( - label: 'شماره مجوز', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), - RTextField( - label: 'شماره ثبت', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), - RTextField( - label: 'کد اقتصادی', - filled: true, - filledColor: AppColor.whiteLight, - padding: EdgeInsets.zero, - ), - - Padding( - padding: const EdgeInsets.symmetric(vertical: 12), - child: SizedBox( - height: 40, - child: Row( - spacing: 16, - children: [ - Expanded( - child: RElevated( - text: 'ثبت', - textStyle:AppFonts.yekan16.copyWith(color: Colors.white), - onPressed: () {}, - ), - ), - Expanded( - child: ROutlinedElevated( - text: 'انصراف', - textStyle:AppFonts.yekan16, - onPressed: () {}, - ), - ), - ], - ), - ), - ), - ], - ), - ), + itemBuilder: (context, index) => mobileInspectorWidget(), separatorBuilder: (context, index) => SizedBox(height: 15), itemCount: data.value, ); }, controller.countInspector), ), - Padding( - padding: const EdgeInsets.fromLTRB(20, 4, 20, 20), + padding: const EdgeInsets.fromLTRB(20, 4, 20, 25), child: RElevated( text: 'مرحله بعد', onPressed: () { Get.toNamed(InspectionRoutes.inspectionRegistrationOfViolation); }, - height: 50, + height: 40, isFullWidth: true, backgroundColor: AppColor.greenNormal, textStyle: AppFonts.yekan16.copyWith(color: Colors.white), @@ -123,4 +54,70 @@ class AddMobileInspectorPage extends GetView { ), ); } + + } +Container mobileInspectorWidget() { + return Container( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.7, color: AppColor.bgDark), + ), + child: Column( + spacing: 16, + children: [ + RTextField( + label: 'نام و نام خانوادگی', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'شماره مجوز', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'شماره ثبت', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + RTextField( + label: 'کد اقتصادی', + filled: true, + filledColor: AppColor.whiteLight, + padding: EdgeInsets.zero, + ), + + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: SizedBox( + height: 40, + child: Row( + spacing: 16, + children: [ + Expanded( + child: RElevated( + text: 'ثبت', + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + onPressed: () {}, + ), + ), + Expanded( + child: ROutlinedElevated( + text: 'انصراف', + textStyle: AppFonts.yekan16, + onPressed: () {}, + ), + ), + ], + ), + ), + ), + ], + ), + ); +} \ No newline at end of file diff --git a/features/inspection/lib/presentation/add_supervision/view.dart b/features/inspection/lib/presentation/add_supervision/view.dart index 01e7cb5..eb989cb 100644 --- a/features/inspection/lib/presentation/add_supervision/view.dart +++ b/features/inspection/lib/presentation/add_supervision/view.dart @@ -15,7 +15,7 @@ class AddSupervisionPage extends GetView { title: 'ایجاد بازرسی', leading: vecWidget( Assets.vecMessageAddSvg, - color: AppColor.blueNormal, + color: Colors.white, width: 16, height: 16, ), @@ -136,14 +136,14 @@ class AddSupervisionPage extends GetView { ), Padding( - padding: const EdgeInsets.fromLTRB(20, 0, 20, 20), + padding: const EdgeInsets.fromLTRB(20, 0, 20, 25), child: RElevated( text: 'مرحله بعد', onPressed: () { Get.toNamed(controller.routes.first); }, - height: 50, + height: 40, isFullWidth: true, backgroundColor: AppColor.greenNormal, textStyle: AppFonts.yekan16.copyWith(color: Colors.white), diff --git a/features/inspection/lib/presentation/display_information/view.dart b/features/inspection/lib/presentation/display_information/view.dart index f2abc78..55b52d9 100644 --- a/features/inspection/lib/presentation/display_information/view.dart +++ b/features/inspection/lib/presentation/display_information/view.dart @@ -1,8 +1,5 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; -import 'package:rasadyar_core/presentation/widget/inputs/r_input.dart'; -import 'package:inspection/inspection.dart'; import 'logic.dart'; @@ -12,6 +9,7 @@ class DisplayInformationPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'نمایش اطلاعات', leading: vecWidget( @@ -22,66 +20,77 @@ class DisplayInformationPage extends GetView { ), ), - body: SingleChildScrollView( - child: Column( - spacing: 20, - children: [ - markerDetailsWidget(), - accompanyingInspectorsWidget(), - accompanyingInspectorsWidget(), - violationWidget(), - violationWidget(), - ratingbarWidget() + body: Column( + children: [ + Expanded( + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + spacing: 20, + children: [ + ratingbarWidget(), + markerDetailsWidget(), + accompanyingInspectorsWidget(), + accompanyingInspectorsWidget(), + violationWidget(), + violationWidget(), + SizedBox(height: 30,) + ], + ), + + + ), + ), + + + Padding( + padding: const EdgeInsets.fromLTRB(20, 4, 20, 25), + child: Row( + children: [ + Expanded( + child: RElevated(height: 40, text: 'ثبت', onPressed: () {}), + ), + SizedBox(width: 8), + Expanded( + child: ROutlinedElevated( + height: 40, + text: 'انصراف', + onPressed: () { + Get.until((route) => route.isFirst); + }, + ), + ), + ], + ), + ), ], ), - ),); + ); } Widget ratingbarWidget() { return Padding( - padding: const EdgeInsets.fromLTRB(35, 5, 35, 35), + padding: const EdgeInsets.fromLTRB(35, 35, 35,0), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( - children: [ Text('به این صنف امتیاز دهید',style: AppFonts.yekan12,),], + children: [Text('به این صنف امتیاز دهید', style: AppFonts.yekan12)], ), - SizedBox(height: 12,), + SizedBox(height: 12), RatingBar.builder( - initialRating: 3, - minRating: 1, - direction: Axis.horizontal, - allowHalfRating: true, - itemCount: 5, - wrapAlignment: WrapAlignment.center, - itemPadding: EdgeInsets.symmetric(horizontal: 4.0), - itemBuilder: (context, _) => - Icon( - Icons.star, - color: Colors.amber, - ), - onRatingUpdate: (rating) { - - }, - ), - - - Row( - children: [ - Expanded( - child: RElevated( - height: 40, - text: 'ثبت', onPressed: (){})), - SizedBox(width: 8,), - Expanded(child: ROutlinedElevated( - height: 40, - text: 'انصراف', onPressed: (){ - Get.until((route) => route.isFirst); - })) - ], - ) + initialRating: 3, + minRating: 1, + direction: Axis.horizontal, + allowHalfRating: true, + itemCount: 5, + wrapAlignment: WrapAlignment.center, + itemPadding: EdgeInsets.symmetric(horizontal: 4.0), + itemBuilder: (context, _) => Icon(Icons.star, color: Colors.amber), + onRatingUpdate: (rating) {}, + ), ], ), ); @@ -94,48 +103,40 @@ Widget violationWidget() { padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.bgDark), - + border: Border.all(width: 0.7, color: AppColor.bgDark), ), child: Column( spacing: 16, children: [ - RTextField( label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, - ), RTextField( label: 'توضیحات تخلف', filled: true, filledColor: AppColor.whiteLight, - maxLines: 5, - minLines: 5, - + maxLines: 3, + minLines: 3, ), RTextField( label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, - ), RTextField( label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, - ), RTextField( label: 'توضیحات تخلف', filled: true, filledColor: AppColor.whiteLight, - maxLines: 5, - minLines: 5, - + maxLines: 3, + minLines: 3, ), - ], ), ); @@ -261,28 +262,27 @@ Widget markerDetailsWidget() { ...List.generate( 5, - (index) => - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'فروش رفته', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), ), ], ), diff --git a/features/inspection/lib/presentation/registration_of_violation/view.dart b/features/inspection/lib/presentation/registration_of_violation/view.dart index dba41de..d823a60 100644 --- a/features/inspection/lib/presentation/registration_of_violation/view.dart +++ b/features/inspection/lib/presentation/registration_of_violation/view.dart @@ -16,7 +16,7 @@ class RegistrationOfViolationPage title: 'ثبت تخلف', leading: vecWidget( Assets.vecMessageAddSvg, - color: AppColor.blueNormal, + color: Colors.white, width: 16, height: 16, ), @@ -31,93 +31,86 @@ class RegistrationOfViolationPage Expanded( child: ObxValue((data) { return ListView.separated( - itemBuilder: - (context, index) => Container( - padding: EdgeInsets.symmetric( - horizontal: 8, - vertical: 12, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.75, color: AppColor.bgDark), - ), - child: Column( - spacing: 16, - children: [ - RTextField( - label: 'عنوان تخلف', - filled: true, - filledColor: AppColor.whiteLight, - ), - RTextField( - label: 'توضیحات تخلف', - filled: true, - filledColor: AppColor.whiteLight, - maxLines: 3, - minLines: 3, - - ), - RTextField( - label: 'عنوان تخلف', - filled: true, - filledColor: AppColor.whiteLight, - ), - RTextField( - label: 'عنوان تخلف', - filled: true, - filledColor: AppColor.whiteLight, - ), - RTextField( - label: 'توضیحات تخلف', - filled: true, - filledColor: AppColor.whiteLight, - maxLines: 3, - minLines: 3, - ), - - SizedBox( - height: 40, - child: Row( - spacing: 16, - children: [ - Expanded( - child: RElevated( - text: 'ثبت', - onPressed: () {}, - ), - ), - Expanded( - child: ROutlinedElevated( - text: 'انصراف', - onPressed: () {}, - ), - ), - ], - ), - ), - ], - ), - ), + itemBuilder: (context, index) => violationWidget(), separatorBuilder: (context, index) => SizedBox(height: 15), itemCount: data.value, ); }, controller.countViolation), ), - RElevated( - text: 'مرحله بعد', - onPressed: () { - Get.toNamed(InspectionRoutes.inspectionDisplayInformation); - }, - isFullWidth: true, - height: 40, - backgroundColor: AppColor.greenNormal, - textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + Padding( + padding: const EdgeInsets.fromLTRB(0, 4, 0, 25), + child: RElevated( + text: 'مرحله بعد', + onPressed: () { + Get.toNamed(InspectionRoutes.inspectionDisplayInformation); + }, + isFullWidth: true, + height: 40, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + ), ), - SizedBox(height: 25), ], ), ), ); } } + +Container violationWidget() { + return Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.7, color: AppColor.bgDark), + ), + child: Column( + spacing: 16, + children: [ + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 3, + minLines: 3, + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + ), + RTextField( + label: 'عنوان تخلف', + filled: true, + filledColor: AppColor.whiteLight, + ), + RTextField( + label: 'توضیحات تخلف', + filled: true, + filledColor: AppColor.whiteLight, + maxLines: 3, + minLines: 3, + ), + + SizedBox( + height: 40, + child: Row( + spacing: 16, + children: [ + Expanded(child: RElevated(text: 'ثبت', onPressed: () {})), + Expanded( + child: ROutlinedElevated(text: 'انصراف', onPressed: () {}), + ), + ], + ), + ), + ], + ), + ); +} diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index 6fdecfb..47f7da9 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -16,8 +16,8 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { const RAppBar({ super.key, required this.title, - this.backgroundColor = AppColor.lightGreyLight, - this.iconColor = AppColor.blueNormal, + this.backgroundColor = AppColor.blueNormal, + this.iconColor = Colors.white, this.titleTextStyle, this.onBackPressed, this.additionalActions, @@ -34,13 +34,13 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { scrolledUnderElevation: 0, titleTextStyle: titleTextStyle ?? - AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + AppFonts.yekan16.copyWith(color:Colors.white), title: Text(title), - leading:Padding( + leading:leading!=null ? Padding( padding: const EdgeInsets.only(right: 16), child: leading, - ), + ) : null, actions: [ if (additionalActions != null) ...additionalActions!, Padding( From e9b065062a8dc539a12f040f2274b78a5e26ec3e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 28 Apr 2025 12:29:13 +0330 Subject: [PATCH 037/256] feat : new bottom sheet V1 --- .../lib/presentation/root/view.dart | 139 +++++++++++++----- features/inspection/pubspec.lock | 19 ++- features/inspection/pubspec.yaml | 4 +- packages/core/pubspec.lock | 10 +- packages/core/pubspec.yaml | 2 +- pubspec.lock | 10 +- pubspec.yaml | 2 +- tools/pubspecAll.sh | 9 ++ 8 files changed, 134 insertions(+), 61 deletions(-) create mode 100644 tools/pubspecAll.sh diff --git a/features/inspection/lib/presentation/root/view.dart b/features/inspection/lib/presentation/root/view.dart index 6d70f53..e81db3f 100644 --- a/features/inspection/lib/presentation/root/view.dart +++ b/features/inspection/lib/presentation/root/view.dart @@ -11,48 +11,42 @@ class RootPage extends GetView { return Scaffold( body: Stack( children: [ - ObxValue( - (currentIndex) => IndexedStack( - index: currentIndex.value, - children: controller.pages, - ), - controller.currentIndex, - ), - - Positioned( - bottom: 0, - left: 0, - right: 0, - child: ObxValue( - (index) => BottomNavigation1( - items: [ - BottomNavigation1Item( - icon: Assets.vecMapSvg, - label: 'نقشه', - isSelected: controller.currentIndex.value == 0, - onTap: () { - controller.changePage(0); - }, + // سایر محتواها (مثلا صفحات اصلی) + Align( + alignment: Alignment.bottomCenter, + child: Column( + children: [ + const Spacer(), + Container( + height: 100, + padding: const EdgeInsets.symmetric(vertical: 10), + decoration: const BoxDecoration( + color: AppColor.blueNormal, + borderRadius: BorderRadius.vertical( + top: Radius.circular(40), + ), ), - BottomNavigation1Item( - icon: Assets.vecSettingSvg, - label: 'اقدام', - isSelected: controller.currentIndex.value == 1, - onTap: () { - controller.changePage(1); - }, + child: SingleChildScrollView( + clipBehavior: Clip.none, + scrollDirection: Axis.horizontal, + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Row( + children: List.generate( + 50, + (index) => ObxValue((data) { + return BottomNavigation1ItemTST( + icon: Assets.vecMapSvg, + label: 'item$index', + isSelected: controller.currentIndex.value == index, + onTap: () => controller.changePage(index), + ); + }, controller.currentIndex), + ), + ), ), - BottomNavigation1Item( - icon: Assets.vecProfileCircleSvg, - label: 'پروفایل', - isSelected: controller.currentIndex.value == 2, - onTap: () { - controller.changePage(2); - }, - ), - ], - ), - controller.currentIndex, + ), + ], ), ), ], @@ -60,3 +54,68 @@ class RootPage extends GetView { ); } } + +class BottomNavigation1ItemTST extends StatelessWidget { + final String icon; + final String label; + final bool isSelected; + final Function() onTap; + + const BottomNavigation1ItemTST({ + super.key, + required this.icon, + required this.label, + required this.isSelected, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 80, + height: 130, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.bottomCenter, + children: [ + AnimatedPositioned( + duration: const Duration(milliseconds: 400), + width: 80, + height: 80, + bottom: isSelected ? 50 : 0, + child: InkWell( + splashColor: Colors.transparent, + onTap: onTap, + child: Container( + width: 80, + height: 80, + decoration: BoxDecoration( + color: isSelected ? AppColor.greenNormal : Colors.transparent, + borderRadius: BorderRadius.circular(40), + border: + isSelected + ? Border.all(width: 2, color: Colors.white) + : null, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + vecWidget(icon, width: 32, height: 32, color: Colors.white), + const SizedBox(height: 7), + Text( + label, + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} + + + diff --git a/features/inspection/pubspec.lock b/features/inspection/pubspec.lock index 415d395..eeeefab 100644 --- a/features/inspection/pubspec.lock +++ b/features/inspection/pubspec.lock @@ -94,6 +94,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_map: dependency: "direct main" description: @@ -159,18 +164,18 @@ packages: dependency: "direct main" description: name: geolocator - sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2 + sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 url: "https://pub.dev" source: hosted - version: "13.0.4" + version: "14.0.0" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d + sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" url: "https://pub.dev" source: hosted - version: "4.6.2" + version: "5.0.1+1" geolocator_apple: dependency: transitive description: @@ -255,10 +260,10 @@ packages: dependency: transitive description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.19.0" json_annotation: dependency: transitive description: @@ -656,5 +661,5 @@ packages: source: hosted version: "6.5.0" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" diff --git a/features/inspection/pubspec.yaml b/features/inspection/pubspec.yaml index cea82c7..b577dea 100644 --- a/features/inspection/pubspec.yaml +++ b/features/inspection/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0 environment: - sdk: ^3.7.0 + sdk: ^3.7.2 dependencies: flutter: @@ -15,4 +15,4 @@ dependencies: flutter_map_animations: ^0.9.0 location: ^8.0.0 latlong2: ^0.9.1 - geolocator: ^13.0.4 + geolocator: ^14.0.0 diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index f5a3aee..0bfb36b 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -29,10 +29,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.12.0" boolean_selector: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.2" ffi: dependency: transitive description: @@ -939,5 +939,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 4df8b74..edb8b47 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.7.0 + sdk: ^3.7.2 dependencies: flutter: diff --git a/pubspec.lock b/pubspec.lock index 8f91457..1f5a0d1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.12.0" boolean_selector: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.2" ffi: dependency: transitive description: @@ -769,5 +769,5 @@ packages: source: hosted version: "6.5.0" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 6916a57..200f78e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.7.0 + sdk: ^3.7.2 dependencies: flutter: diff --git a/tools/pubspecAll.sh b/tools/pubspecAll.sh new file mode 100644 index 0000000..9c22f36 --- /dev/null +++ b/tools/pubspecAll.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# Navigate to the project root (assuming tools is one level below root) +cd "$(dirname "$0")/.." + +# Find all pubspec.yaml files, print their directories, and run flutter pub get +#find . -name "pubspec.yaml" -exec sh -c 'echo "Running flutter pub get in $(dirname {}) 🙂🙂🙂🙂🙂"; cd $(dirname {}) ; flutter pub get' \; + +find . -name "pubspec.yaml" -exec sh -c 'echo "Running flutter pub get in $(dirname {}) ⬆️🆙🆙🆙⬆️"; cd $(dirname {}) ; flutter pub upgrade' \; \ No newline at end of file From caa388424221558f29c18f51a532d9f34390b85a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 28 Apr 2025 17:06:21 +0330 Subject: [PATCH 038/256] feat : new bottom sheet V2 --- .../lib/presentation/root/view.dart | 331 ++++++++++++++++-- 1 file changed, 301 insertions(+), 30 deletions(-) diff --git a/features/inspection/lib/presentation/root/view.dart b/features/inspection/lib/presentation/root/view.dart index e81db3f..b886a3f 100644 --- a/features/inspection/lib/presentation/root/view.dart +++ b/features/inspection/lib/presentation/root/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; import 'logic.dart'; @@ -14,39 +15,34 @@ class RootPage extends GetView { // سایر محتواها (مثلا صفحات اصلی) Align( alignment: Alignment.bottomCenter, - child: Column( - children: [ - const Spacer(), - Container( - height: 100, - padding: const EdgeInsets.symmetric(vertical: 10), - decoration: const BoxDecoration( - color: AppColor.blueNormal, - borderRadius: BorderRadius.vertical( - top: Radius.circular(40), - ), - ), - child: SingleChildScrollView( - clipBehavior: Clip.none, - scrollDirection: Axis.horizontal, - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - children: List.generate( - 50, - (index) => ObxValue((data) { - return BottomNavigation1ItemTST( - icon: Assets.vecMapSvg, - label: 'item$index', - isSelected: controller.currentIndex.value == index, - onTap: () => controller.changePage(index), - ); - }, controller.currentIndex), + child: Container( + height: 90, + color: AppColor.blueNormal, + clipBehavior: Clip.none, + padding: const EdgeInsets.all(10), + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + Positioned( + top: -43, + child: Container( + width: 110, + height: 110, + clipBehavior: Clip.none, + decoration: ShapeDecoration( + color:Colors.white, + + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(200), + side: BorderSide(width: 2, color: Colors.white), + ), ), ), ), - ), - ], + WavePageView(), + ], + ), ), ), ], @@ -117,5 +113,280 @@ class BottomNavigation1ItemTST extends StatelessWidget { } } +class ScrollWithCenterScaling extends StatefulWidget { + const ScrollWithCenterScaling({super.key}); + @override + State createState() => + _ScrollWithCenterScalingState(); +} +class _ScrollWithCenterScalingState extends State { + final PageController _pageController = PageController(viewportFraction: 0.3); + double currentPage = 0.0; + + @override + void initState() { + super.initState(); + _pageController.addListener(() { + setState(() { + currentPage = _pageController.page ?? 0.0; + }); + }); + } + + @override + void dispose() { + _pageController.dispose(); + super.dispose(); + } + + double _calculateScale(int index) { + final double distance = (currentPage - index).abs(); + if (distance >= 1) { + return 0.7; + } else { + return 1.3; + } + } + + bool _isSelected(int index) { + return (currentPage - index).abs() < 0.5; // دقیق وسط بودن رو بگیره + } + + @override + Widget build(BuildContext context) { + return PageView.builder( + controller: _pageController, + itemCount: 50, + clipBehavior: Clip.none, + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + final scale = _calculateScale(index); + final selected = _isSelected(index); + + return Transform.scale( + scale: scale, + child: AnimatedPadding( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + padding: EdgeInsets.only(bottom: selected ? 20 : 0), + child: InkWell( + onTap: () {}, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.map, color: Colors.white), + const SizedBox(height: 8), + Text( + 'Label $index', + style: TextStyle( + color: Colors.white, + fontSize: selected ? 18 : 0, + fontWeight: + selected ? FontWeight.bold : FontWeight.normal, + ), + ), + ], + ), + ), + ), + ); + }, + ); + } +} + +class ScrollWithCenterRotation2 extends StatefulWidget { + const ScrollWithCenterRotation2({super.key}); + + @override + State createState() => + _ScrollWithCenterRotationState2(); +} + +class _ScrollWithCenterRotationState2 extends State { + final PageController _pageController = PageController(viewportFraction: 0.3); + double currentPage = 0.0; + + @override + void initState() { + super.initState(); + _pageController.addListener(() { + setState(() { + currentPage = _pageController.page ?? 0.0; + }); + }); + } + + @override + void dispose() { + _pageController.dispose(); + super.dispose(); + } + + double _calculateScale(int index) { + final double distance = (currentPage - index).abs(); + if (distance >= 1) { + return 0.7; + } else { + return 1.2; + } + } + + double _calculateRotationY(int index) { + return (currentPage - index) * 0.5; + } + + bool _isSelected(int index) { + return (currentPage - index).abs() < 0.5; + } + + @override + Widget build(BuildContext context) { + return PageView.builder( + controller: _pageController, + itemCount: 50, + clipBehavior: Clip.none, + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + final scale = _calculateScale(index); + final rotationY = _calculateRotationY(index); + final selected = _isSelected(index); + + return AnimatedContainer( + clipBehavior: Clip.none, + height: 80, + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + margin: EdgeInsets.only( + bottom: selected ? 90 : 20, // وسطی بالاتر میاد + ), + child: Transform( + transform: + Matrix4.identity() + ..scale(scale) + ..setEntry(3, 2, 0.001), + alignment: Alignment.center, + child: InkWell( + onTap: () {}, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: selected ? 70 : 60, + height: selected ? 70 : 60, + decoration: BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + boxShadow: + selected + ? [ + BoxShadow( + color: Colors.amber, + blurRadius: 20, + spreadRadius: 5, + ), + ] + : [], + ), + alignment: Alignment.center, + child: Icon( + Icons.map, + color: Colors.white, + size: selected ? 32 : 24, + ), + ), + const SizedBox(height: 8), + Text( + 'Label $index', + style: TextStyle( + color: Colors.white, + fontSize: selected ? 18 : 14, + fontWeight: + selected ? FontWeight.bold : FontWeight.normal, + ), + ), + ], + ), + ), + ), + ); + }, + ); + } +} + +class WavePageView extends StatefulWidget { + @override + _WavePageViewState createState() => _WavePageViewState(); +} + +class _WavePageViewState extends State { + final PageController _controller = PageController(viewportFraction: 0.3); + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + double _calculateScale(double currentPage,int index) { + final double distance = (currentPage - index).abs(); + if (distance >= 1) { + return 0.7; + } else { + return 1.7; + } + } + + @override + Widget build(BuildContext context) { + return PageView.builder( + controller: _controller, + clipBehavior: Clip.none, + scrollDirection: Axis.horizontal, + itemCount: 10, + + itemBuilder: (context, index) { + return AnimatedBuilder( + animation: _controller, + builder: (context, child) { + double value = 0.0; + final scale = _calculateScale(_controller.page??0,index); + value = index - (_controller.page ?? 0); + value = (value).clamp(-1, 1); + + eLog("index = $index \n value = $value"); + + double offset = value * 30; + if (value.abs() < 0.1 || value.abs() > 0.1) { + offset = -5 * (1 - value.abs() * 5); + } + + return Transform.scale( + scale: scale, + child: Transform.translate( + offset: Offset(0, offset), + child: Column( + children: [ + Icon(Icons.map, color: value.toInt() == 0 ? AppColor.greenNormal:Colors.white, size: 32), + + Visibility( + visible: value.toInt() == 0, + child: Text( + 'بازرسی', + style: AppFonts.yekan10.copyWith(color: AppColor.greenNormal) + ), + ), + ], + ), + ), + ); + }, + ); + }, + ); + } +} From bb4eccd01dc908dd7ac158646150217c03e142c0 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 29 Apr 2025 16:11:13 +0330 Subject: [PATCH 039/256] feat : wave bottom sheet :) --- .../lib/presentation/root/view.dart | 401 ++---------------- .../wave_bottom_navigation.dart | 132 ++++++ .../core/lib/presentation/widget/widget.dart | 22 +- 3 files changed, 174 insertions(+), 381 deletions(-) create mode 100644 packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart diff --git a/features/inspection/lib/presentation/root/view.dart b/features/inspection/lib/presentation/root/view.dart index b886a3f..4ce262b 100644 --- a/features/inspection/lib/presentation/root/view.dart +++ b/features/inspection/lib/presentation/root/view.dart @@ -12,37 +12,40 @@ class RootPage extends GetView { return Scaffold( body: Stack( children: [ - // سایر محتواها (مثلا صفحات اصلی) + Align( alignment: Alignment.bottomCenter, - child: Container( - height: 90, - color: AppColor.blueNormal, - clipBehavior: Clip.none, - padding: const EdgeInsets.all(10), - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.center, - children: [ - Positioned( - top: -43, - child: Container( - width: 110, - height: 110, - clipBehavior: Clip.none, - decoration: ShapeDecoration( - color:Colors.white, - - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(200), - side: BorderSide(width: 2, color: Colors.white), - ), - ), - ), - ), - WavePageView(), - ], - ), + child: WaveBottomNavigation( + items: [ + WaveBottomNavigationItem( + title: 'خانه', + icon:Assets.vecMapSvg, + ), + WaveBottomNavigationItem( + title: 'عملیات', + icon:Assets.vecUserSvg, + ), + WaveBottomNavigationItem( + title: 'افزودن', + icon:Assets.vecAddSvg, + ), + WaveBottomNavigationItem( + title: 'آمار', + icon:Assets.vecDiagramSvg, + ), WaveBottomNavigationItem( + title: 'تماس', + icon:Assets.vecCallSvg, + ), WaveBottomNavigationItem( + title: 'مکان ', + icon:Assets.vecGpsSvg, + ), WaveBottomNavigationItem( + title: 'تاریخ', + icon:Assets.vecCalendarSvg, + ), + ], + onPageChanged: (index) { + controller.changePage(index); + }, ), ), ], @@ -50,343 +53,3 @@ class RootPage extends GetView { ); } } - -class BottomNavigation1ItemTST extends StatelessWidget { - final String icon; - final String label; - final bool isSelected; - final Function() onTap; - - const BottomNavigation1ItemTST({ - super.key, - required this.icon, - required this.label, - required this.isSelected, - required this.onTap, - }); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 80, - height: 130, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.bottomCenter, - children: [ - AnimatedPositioned( - duration: const Duration(milliseconds: 400), - width: 80, - height: 80, - bottom: isSelected ? 50 : 0, - child: InkWell( - splashColor: Colors.transparent, - onTap: onTap, - child: Container( - width: 80, - height: 80, - decoration: BoxDecoration( - color: isSelected ? AppColor.greenNormal : Colors.transparent, - borderRadius: BorderRadius.circular(40), - border: - isSelected - ? Border.all(width: 2, color: Colors.white) - : null, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - vecWidget(icon, width: 32, height: 32, color: Colors.white), - const SizedBox(height: 7), - Text( - label, - style: AppFonts.yekan14.copyWith(color: Colors.white), - ), - ], - ), - ), - ), - ), - ], - ), - ); - } -} - -class ScrollWithCenterScaling extends StatefulWidget { - const ScrollWithCenterScaling({super.key}); - - @override - State createState() => - _ScrollWithCenterScalingState(); -} - -class _ScrollWithCenterScalingState extends State { - final PageController _pageController = PageController(viewportFraction: 0.3); - double currentPage = 0.0; - - @override - void initState() { - super.initState(); - _pageController.addListener(() { - setState(() { - currentPage = _pageController.page ?? 0.0; - }); - }); - } - - @override - void dispose() { - _pageController.dispose(); - super.dispose(); - } - - double _calculateScale(int index) { - final double distance = (currentPage - index).abs(); - if (distance >= 1) { - return 0.7; - } else { - return 1.3; - } - } - - bool _isSelected(int index) { - return (currentPage - index).abs() < 0.5; // دقیق وسط بودن رو بگیره - } - - @override - Widget build(BuildContext context) { - return PageView.builder( - controller: _pageController, - itemCount: 50, - clipBehavior: Clip.none, - physics: const BouncingScrollPhysics(), - scrollDirection: Axis.horizontal, - itemBuilder: (context, index) { - final scale = _calculateScale(index); - final selected = _isSelected(index); - - return Transform.scale( - scale: scale, - child: AnimatedPadding( - duration: const Duration(milliseconds: 300), - curve: Curves.easeOut, - padding: EdgeInsets.only(bottom: selected ? 20 : 0), - child: InkWell( - onTap: () {}, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(Icons.map, color: Colors.white), - const SizedBox(height: 8), - Text( - 'Label $index', - style: TextStyle( - color: Colors.white, - fontSize: selected ? 18 : 0, - fontWeight: - selected ? FontWeight.bold : FontWeight.normal, - ), - ), - ], - ), - ), - ), - ); - }, - ); - } -} - -class ScrollWithCenterRotation2 extends StatefulWidget { - const ScrollWithCenterRotation2({super.key}); - - @override - State createState() => - _ScrollWithCenterRotationState2(); -} - -class _ScrollWithCenterRotationState2 extends State { - final PageController _pageController = PageController(viewportFraction: 0.3); - double currentPage = 0.0; - - @override - void initState() { - super.initState(); - _pageController.addListener(() { - setState(() { - currentPage = _pageController.page ?? 0.0; - }); - }); - } - - @override - void dispose() { - _pageController.dispose(); - super.dispose(); - } - - double _calculateScale(int index) { - final double distance = (currentPage - index).abs(); - if (distance >= 1) { - return 0.7; - } else { - return 1.2; - } - } - - double _calculateRotationY(int index) { - return (currentPage - index) * 0.5; - } - - bool _isSelected(int index) { - return (currentPage - index).abs() < 0.5; - } - - @override - Widget build(BuildContext context) { - return PageView.builder( - controller: _pageController, - itemCount: 50, - clipBehavior: Clip.none, - physics: const BouncingScrollPhysics(), - scrollDirection: Axis.horizontal, - itemBuilder: (context, index) { - final scale = _calculateScale(index); - final rotationY = _calculateRotationY(index); - final selected = _isSelected(index); - - return AnimatedContainer( - clipBehavior: Clip.none, - height: 80, - duration: const Duration(milliseconds: 300), - curve: Curves.easeOut, - margin: EdgeInsets.only( - bottom: selected ? 90 : 20, // وسطی بالاتر میاد - ), - child: Transform( - transform: - Matrix4.identity() - ..scale(scale) - ..setEntry(3, 2, 0.001), - alignment: Alignment.center, - child: InkWell( - onTap: () {}, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: selected ? 70 : 60, - height: selected ? 70 : 60, - decoration: BoxDecoration( - color: Colors.red, - shape: BoxShape.circle, - boxShadow: - selected - ? [ - BoxShadow( - color: Colors.amber, - blurRadius: 20, - spreadRadius: 5, - ), - ] - : [], - ), - alignment: Alignment.center, - child: Icon( - Icons.map, - color: Colors.white, - size: selected ? 32 : 24, - ), - ), - const SizedBox(height: 8), - Text( - 'Label $index', - style: TextStyle( - color: Colors.white, - fontSize: selected ? 18 : 14, - fontWeight: - selected ? FontWeight.bold : FontWeight.normal, - ), - ), - ], - ), - ), - ), - ); - }, - ); - } -} - -class WavePageView extends StatefulWidget { - @override - _WavePageViewState createState() => _WavePageViewState(); -} - -class _WavePageViewState extends State { - final PageController _controller = PageController(viewportFraction: 0.3); - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - double _calculateScale(double currentPage,int index) { - final double distance = (currentPage - index).abs(); - if (distance >= 1) { - return 0.7; - } else { - return 1.7; - } - } - - @override - Widget build(BuildContext context) { - return PageView.builder( - controller: _controller, - clipBehavior: Clip.none, - scrollDirection: Axis.horizontal, - itemCount: 10, - - itemBuilder: (context, index) { - return AnimatedBuilder( - animation: _controller, - builder: (context, child) { - double value = 0.0; - final scale = _calculateScale(_controller.page??0,index); - value = index - (_controller.page ?? 0); - value = (value).clamp(-1, 1); - - eLog("index = $index \n value = $value"); - - double offset = value * 30; - if (value.abs() < 0.1 || value.abs() > 0.1) { - offset = -5 * (1 - value.abs() * 5); - } - - return Transform.scale( - scale: scale, - child: Transform.translate( - offset: Offset(0, offset), - child: Column( - children: [ - Icon(Icons.map, color: value.toInt() == 0 ? AppColor.greenNormal:Colors.white, size: 32), - - Visibility( - visible: value.toInt() == 0, - child: Text( - 'بازرسی', - style: AppFonts.yekan10.copyWith(color: AppColor.greenNormal) - ), - ), - ], - ), - ), - ); - }, - ); - }, - ); - } -} diff --git a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart new file mode 100644 index 0000000..95b808f --- /dev/null +++ b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class WaveBottomNavigationItem { + final String title; + final String icon; + + WaveBottomNavigationItem({required this.title, required this.icon}); +} + +class WaveBottomNavigation extends StatefulWidget { + const WaveBottomNavigation({ + super.key, + required this.items, + required this.onPageChanged, + }); + + final List items; + final Function(int) onPageChanged; + + @override + State createState() => _WaveBottomNavigationState(); +} + +class _WaveBottomNavigationState extends State { + final PageController _controller = PageController(viewportFraction: 0.3); + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + double _calculateScale(double currentPage, int index) { + final double distance = (currentPage - index).abs(); + if (distance >= 1) { + return 0.9; + } else { + return 1.50; + } + } + + @override + Widget build(BuildContext context) { + return Container( + height: 68, + color: AppColor.blueNormal, + clipBehavior: Clip.none, + padding: const EdgeInsets.all(10), + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [backgroundWidget(), waveScrolledLists()], + ), + ); + } + + Widget backgroundWidget() { + return Positioned( + top: -43, + child: Container( + width: 90, + height: 90, + clipBehavior: Clip.none, + decoration: ShapeDecoration( + color: AppColor.greenNormal, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(200), + side: BorderSide(width: 5, color: Colors.white), + ), + ), + ), + ); + } + + Widget waveScrolledLists() { + return PageView.builder( + controller: _controller, + clipBehavior: Clip.none, + onPageChanged: widget.onPageChanged, + scrollDirection: Axis.horizontal, + itemCount: widget.items.length, + physics: const ClampingScrollPhysics(), + itemBuilder: (context, index) { + final WaveBottomNavigationItem item = widget.items[index]; + return Center( + child: AnimatedBuilder( + animation: _controller, + builder: (context, child) { + double value = 0.0; + final scale = _calculateScale(_controller.page ?? 0, index); + value = index - (_controller.page ?? 0); + value = (value).clamp(-1, 1); + double offset = value * 30; + if (value.abs() < 0.2 || value.abs() > 0.2) { + offset = -7 * (1 - value.abs() * 2); + } + + return Transform.scale( + scale: scale, + child: Transform.translate( + offset: Offset(0, offset), + child: Column( + children: [ + Tooltip( + message: item.title, + child: vecWidget( + item.icon, + color: Colors.white, + width: 32, + height: 32, + ), + ), + + /* Visibility( + visible: (_controller.page ?? 0) == index, + child: Text( + item.title, + style: AppFonts.yekan10.copyWith(color: Colors.white), + ), + ),*/ + ], + ), + ), + ); + }, + ), + ); + }, + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 0df4a98..4f6869c 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -1,18 +1,16 @@ -export 'vec_widget.dart'; +export 'app_bar/r_app_bar.dart'; export 'bottom_navigation/bottom_navigation_1.dart'; +export 'bottom_navigation/wave_bottom_navigation.dart'; +export 'buttons/elevated.dart'; +export 'buttons/outline_elevated.dart'; +export 'buttons/outline_elevated_icon.dart'; +export 'buttons/text_button.dart'; +export 'captcha/captcha_widget.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; -export 'buttons/outline_elevated_icon.dart'; -export 'buttons/outline_elevated.dart'; -export 'buttons/text_button.dart'; -export 'app_bar/r_app_bar.dart'; -export 'captcha/captcha_widget.dart'; -export 'buttons/elevated.dart'; export 'inputs/r_input.dart'; -export 'tabs/new_tab.dart'; -export 'tabs/tab.dart'; export 'pagination/pagination_from_until.dart'; export 'pagination/show_more.dart'; - - - +export 'tabs/new_tab.dart'; +export 'tabs/tab.dart'; +export 'vec_widget.dart'; From 2c71d72350fa5c806eadad72b0d97fd63be11f46 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 29 Apr 2025 16:56:55 +0330 Subject: [PATCH 040/256] chore : update flutter version --- pubspec.lock | 10 +++++----- pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 8f91457..1f5a0d1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.12.0" boolean_selector: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.2" ffi: dependency: transitive description: @@ -769,5 +769,5 @@ packages: source: hosted version: "6.5.0" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 6916a57..200f78e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.7.0 + sdk: ^3.7.2 dependencies: flutter: From 0361d3d6e5690336e716620afc52f0ca6b87c1a8 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 30 Apr 2025 09:24:55 +0330 Subject: [PATCH 041/256] chore : update flutter version and clean up inspector --- .../lib/presentation/filter/view.dart | 14 +- features/inspection/pubspec.lock | 19 ++- features/inspection/pubspec.yaml | 11 +- packages/core/lib/core.dart | 7 +- packages/core/pubspec.lock | 154 +++++++++++++++++- packages/core/pubspec.yaml | 11 +- pubspec.lock | 34 +--- 7 files changed, 186 insertions(+), 64 deletions(-) diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index 65c8dbe..e6d7cd9 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -1,24 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_map/flutter_map.dart'; import 'package:inspection/presentation/routes/app_routes.dart'; -import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; class SupervisionFilterPage extends GetView { - SupervisionFilterPage({super.key}); - - final Map styleTypes = { - 'satellite': 's', - 'satelliteWithLabel': 'y', - 'street': 'p', - 'streetWithTraffic': 'p,traffic', - }; - - final String token = - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjJlMGQyZTUyYzU1ZDJmMDkxNzBmNTdmM2JmOGVkODgxOTg5YTQxN2E5M2JiNDRiZTk1YzEyMjI1NzRlYWM3ZGYwOTlkNzhkNDUyMDRlMDJiIn0.eyJhdWQiOiIyODYyMiIsImp0aSI6IjJlMGQyZTUyYzU1ZDJmMDkxNzBmNTdmM2JmOGVkODgxOTg5YTQxN2E5M2JiNDRiZTk1YzEyMjI1NzRlYWM3ZGYwOTlkNzhkNDUyMDRlMDJiIiwiaWF0IjoxNzI1MTc2MDI5LCJuYmYiOjE3MjUxNzYwMjksImV4cCI6MTcyNzc2ODAyOSwic3ViIjoiIiwic2NvcGVzIjpbImJhc2ljIl19.bYQSwq48FZ9IM-Y7aTQAblEmIAz1b4m3nOWuKg-VTalx-eZqcIlzIOJI7XarBeS35CGvPbu6W9tAFoliz_HPARSMJM_Ni0YwESjscVqvPNJqV2vZlmgMj_wRDa0W5FmBipZ-AzKGcsuoMEpD8WzUgnlrhUdqVob1UHXQmZt1BFJlFHLm_grzKFf1_Lw_cHA_mRhhe36d_hU5Qg0jY3NP2NXG_TmecQcqch4YEwCh5_R_dUyMIlt70FL2OJ37ESyPYl-XMg3qOOjgI5YD8h6rciSfFsQpnOgl84HhV3aQ4MvWrIPl9ekEnwLM71He8o5KY1hhSQdOHSvO4yL6MBg9Yw"; + const SupervisionFilterPage({super.key}); @override Widget build(BuildContext context) { diff --git a/features/inspection/pubspec.lock b/features/inspection/pubspec.lock index 415d395..eeeefab 100644 --- a/features/inspection/pubspec.lock +++ b/features/inspection/pubspec.lock @@ -94,6 +94,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_map: dependency: "direct main" description: @@ -159,18 +164,18 @@ packages: dependency: "direct main" description: name: geolocator - sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2 + sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 url: "https://pub.dev" source: hosted - version: "13.0.4" + version: "14.0.0" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d + sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" url: "https://pub.dev" source: hosted - version: "4.6.2" + version: "5.0.1+1" geolocator_apple: dependency: transitive description: @@ -255,10 +260,10 @@ packages: dependency: transitive description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.19.0" json_annotation: dependency: transitive description: @@ -656,5 +661,5 @@ packages: source: hosted version: "6.5.0" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" diff --git a/features/inspection/pubspec.yaml b/features/inspection/pubspec.yaml index cea82c7..22e85bd 100644 --- a/features/inspection/pubspec.yaml +++ b/features/inspection/pubspec.yaml @@ -1,18 +1,13 @@ name: inspection description: "inspection module for rasadyar" publish_to: 'none' -version: 1.0.0 +version: 1.0.1 environment: - sdk: ^3.7.0 + sdk: ^3.7.2 dependencies: flutter: sdk: flutter rasadyar_core: - path: ./../../packages/core - flutter_map: ^8.1.1 - flutter_map_animations: ^0.9.0 - location: ^8.0.0 - latlong2: ^0.9.1 - geolocator: ^13.0.4 + path: ./../../packages/core \ No newline at end of file diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 409edfe..4d57a1b 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -11,4 +11,9 @@ export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:flutter_rating_bar/flutter_rating_bar.dart'; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; -import 'package:dartx/dartx.dart' as dartx; +//Map and location +export 'package:latlong2/latlong.dart'; +export 'package:flutter_map/flutter_map.dart'; + + + diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index f5a3aee..8e2431a 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -29,10 +29,10 @@ packages: dependency: transitive description: name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.12.0" boolean_selector: dependency: transitive description: @@ -169,6 +169,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" dart_style: dependency: transitive description: @@ -189,10 +197,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.2" ffi: dependency: transitive description: @@ -235,6 +243,22 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a + url: "https://pub.dev" + source: hosted + version: "8.1.1" + flutter_map_animations: + dependency: "direct main" + description: + name: flutter_map_animations + sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e + url: "https://pub.dev" + source: hosted + version: "0.9.0" flutter_rating_bar: dependency: "direct main" description: @@ -301,6 +325,54 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 + url: "https://pub.dev" + source: hosted + version: "14.0.0" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" + url: "https://pub.dev" + source: hosted + version: "5.0.1+1" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" + source: hosted + version: "4.2.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" get: dependency: "direct main" description: @@ -429,6 +501,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.9.5" + latlong2: + dependency: "direct main" + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" leak_tracker: dependency: transitive description: @@ -461,6 +541,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.1" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" logger: dependency: "direct main" description: @@ -501,6 +589,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" mime: dependency: transitive description: @@ -677,6 +773,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" pool: dependency: transitive description: @@ -685,6 +789,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" pub_semver: dependency: transitive description: @@ -762,6 +874,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -834,6 +954,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_graphics: dependency: transitive description: @@ -906,6 +1042,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" xdg_directories: dependency: transitive description: @@ -939,5 +1083,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 4df8b74..b3d4712 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.7.0 + sdk: ^3.7.2 dependencies: flutter: @@ -47,9 +47,18 @@ dependencies: #other permission_handler: ^12.0.0+1 persian_datetime_picker: ^3.1.0 + + #L10N tools intl: ^0.19.0 + #Map + flutter_map: ^8.1.1 + flutter_map_animations: ^0.9.0 + #location + latlong2: ^0.9.1 + geolocator: ^14.0.0 + dev_dependencies: flutter_test: diff --git a/pubspec.lock b/pubspec.lock index 1f5a0d1..5b69e4e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -193,18 +193,18 @@ packages: dependency: transitive description: name: geolocator - sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2 + sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 url: "https://pub.dev" source: hosted - version: "13.0.4" + version: "14.0.0" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d + sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" url: "https://pub.dev" source: hosted - version: "4.6.2" + version: "5.0.1+1" geolocator_apple: dependency: transitive description: @@ -291,7 +291,7 @@ packages: path: "features/inspection" relative: true source: path - version: "1.0.0" + version: "1.0.1" intl: dependency: transitive description: @@ -356,30 +356,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - location: - dependency: transitive - description: - name: location - sha256: c2c4304071ec860525d5c50d142410072f8620c1d9f74874811af2e804e1a9c8 - url: "https://pub.dev" - source: hosted - version: "8.0.0" - location_platform_interface: - dependency: transitive - description: - name: location_platform_interface - sha256: a3404ea6d74e89b121630be62ed8edcc7b39fd108bd19805d0ae55c397135dd7 - url: "https://pub.dev" - source: hosted - version: "6.0.0" - location_web: - dependency: transitive - description: - name: location_web - sha256: "744bdff53dc455a2dc9a34474c49cde364d4fbef2aee009f8b0b4b68570c27a1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" logger: dependency: transitive description: From 5770116def8e2f6c9827905251d21391939fc032 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 30 Apr 2025 12:48:55 +0330 Subject: [PATCH 042/256] feat : permission and location service sensor on\off in inspection feature --- .../lib/presentation/filter/logic.dart | 37 +---- .../lib/presentation/filter/view.dart | 2 +- .../lib/presentation/root/logic.dart | 69 +++++++++- .../lib/presentation/root/view.dart | 126 ++++++++++++++++-- .../lib/presentation/routes/app_pages.dart | 2 +- packages/core/lib/core.dart | 2 + 6 files changed, 191 insertions(+), 47 deletions(-) diff --git a/features/inspection/lib/presentation/filter/logic.dart b/features/inspection/lib/presentation/filter/logic.dart index 272f63c..949e609 100644 --- a/features/inspection/lib/presentation/filter/logic.dart +++ b/features/inspection/lib/presentation/filter/logic.dart @@ -2,16 +2,12 @@ import 'dart:async'; import 'package:flutter/animation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_map/flutter_map.dart'; -import 'package:flutter_map_animations/flutter_map_animations.dart'; -import 'package:geolocator/geolocator.dart'; -import 'package:latlong2/latlong.dart'; -import 'package:rasadyar_core/core.dart'; import 'package:inspection/data/utils/marker_generator.dart'; +import 'package:rasadyar_core/core.dart'; enum BottomSheetStep { filter, markerSelected, markerDetails } -class SupervisionFilterLogic extends GetxController +class InspectorFilterLogic extends GetxController with GetTickerProviderStateMixin { Rx currentLocation = LatLng(35.824891, 50.948025).obs; RxList allMarkers = [].obs; @@ -23,7 +19,6 @@ class SupervisionFilterLogic extends GetxController RxInt showIndex = 0.obs; bool showSlideHint = true; - Rx bottomSheetStep = BottomSheetStep.filter.obs; late Rx slidController; @@ -33,30 +28,13 @@ class SupervisionFilterLogic extends GetxController late Rx sheetController; Future determineCurrentPosition() async { - bool serviceEnabled; - LocationPermission permission; - - serviceEnabled = await Geolocator.isLocationServiceEnabled(); - if (!serviceEnabled) { - return Future.error('Location services are disabled.'); - } - - permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - if (permission == LocationPermission.denied) { - return Future.error('Location permissions are denied.'); - } - } - - if (permission == LocationPermission.deniedForever) { - return Future.error('Location permissions are permanently denied.'); - } final position = await Geolocator.getCurrentPosition( locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), ); final latLng = LatLng(position.latitude, position.longitude); + + currentLocation.value = latLng; markers.add(latLng); animatedMapController.animateTo( @@ -99,6 +77,7 @@ class SupervisionFilterLogic extends GetxController allMarkers.value = generatedMarkers; } + @override void onInit() { super.onInit(); @@ -154,9 +133,8 @@ class SupervisionFilterLogic extends GetxController @override void onReady() { super.onReady(); - determineCurrentPosition(); + // determineCurrentPosition(); generatedMarkers(); - } Future triggerSlidableAnimation() async { @@ -167,11 +145,8 @@ class SupervisionFilterLogic extends GetxController showSlideHint = !showSlideHint; } - - @override void onClose() { - super.onClose(); } } diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index e6d7cd9..2ee053c 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -5,7 +5,7 @@ import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; -class SupervisionFilterPage extends GetView { +class SupervisionFilterPage extends GetView { const SupervisionFilterPage({super.key}); @override diff --git a/features/inspection/lib/presentation/root/logic.dart b/features/inspection/lib/presentation/root/logic.dart index c7428af..bc88796 100644 --- a/features/inspection/lib/presentation/root/logic.dart +++ b/features/inspection/lib/presentation/root/logic.dart @@ -1,16 +1,83 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; import 'package:inspection/presentation/action/view.dart'; import 'package:inspection/presentation/filter/view.dart'; import 'package:inspection/presentation/profile/view.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; + +enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { RxInt currentIndex = 0.obs; List pages = [SupervisionFilterPage(), ActionPage(), ProfilePage()]; + RxList errorLocationType = RxList(); + + Stream listenToLocationServiceStatus() { + return Geolocator.getServiceStatusStream().map((status) { + return status == ServiceStatus.enabled; + }); + } + + Future locationServiceEnabled() async { + bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + return false; + } + return true; + } + + Future checkPermission({bool request = false}) async { + try { + final LocationPermission permission = await Geolocator.checkPermission(); + + switch (permission) { + case LocationPermission.denied: + final LocationPermission requestResult = await Geolocator.requestPermission(); + return requestResult != LocationPermission.denied && + requestResult != LocationPermission.deniedForever; + + case LocationPermission.deniedForever: + + return request ? await Geolocator.openAppSettings() : false; + + case LocationPermission.always: + case LocationPermission.whileInUse: + + return true; + + default: + return false; + } + } catch (e) { + + eLog(e); + return await Geolocator.openLocationSettings(); + } + } @override void onReady() { super.onReady(); + + locationServiceEnabled().then((value) { + if (!value) { + errorLocationType.add(ErrorLocationType.serviceDisabled); + } + }); + + checkPermission().then((value) { + if (!value) { + errorLocationType.add(ErrorLocationType.permissionDenied); + } + }); + + listenToLocationServiceStatus().listen((event) { + if (!event) { + errorLocationType.add(ErrorLocationType.serviceDisabled); + } else { + errorLocationType.remove(ErrorLocationType.serviceDisabled); + } + }); } void changePage(int index) { diff --git a/features/inspection/lib/presentation/root/view.dart b/features/inspection/lib/presentation/root/view.dart index 4ce262b..7693679 100644 --- a/features/inspection/lib/presentation/root/view.dart +++ b/features/inspection/lib/presentation/root/view.dart @@ -12,35 +12,135 @@ class RootPage extends GetView { return Scaffold( body: Stack( children: [ + ObxValue((errorType) { + if (errorType.isNotEmpty) { + if (errorType.contains(ErrorLocationType.serviceDisabled)) { + Future.microtask(() { + Get.defaultDialog( + title: 'خطا', + content: const Text('سرویس مکان‌یابی غیرفعال است'), + cancel: ROutlinedElevated( + text: 'بررسی مجدد', + width: 120, + textStyle: AppFonts.yekan16, + onPressed: () async { + var service = await controller.locationServiceEnabled(); + eLog(service); + if (service) { + controller.errorLocationType.remove( + ErrorLocationType.serviceDisabled, + ); + Get.back(); + } + // Don't call Get.back() if service is still disabled + }, + ), + confirm: RElevated( + text: 'روشن کردن', + textStyle: AppFonts.yekan16, + width: 120, + onPressed: () async { + var res = await Geolocator.openLocationSettings(); + if (res) { + var service = + await controller.locationServiceEnabled(); + if (service) { + controller.errorLocationType.remove( + ErrorLocationType.serviceDisabled, + ); + Get.back(); + } + } + }, + ), + + contentPadding: EdgeInsets.all(8), + onWillPop: () async { + return controller.errorLocationType.isEmpty; + }, + barrierDismissible: false, + ); + }); + } else { + Future.microtask(() { + Get.defaultDialog( + title: 'خطا', + content: const Text( + ' دسترسی به سرویس مکان‌یابی غیرفعال است', + ), + cancel: ROutlinedElevated( + text: 'بررسی مجدد', + width: 120, + textStyle: AppFonts.yekan16, + onPressed: () async { + await controller.checkPermission(); + }, + ), + confirm: RElevated( + text: 'اجازه دادن', + textStyle: AppFonts.yekan16, + width: 120, + onPressed: () async { + var res = await controller.checkPermission( + request: true, + ); + if (res) { + controller.errorLocationType.remove( + ErrorLocationType.permissionDenied, + ); + Get.back(); + } + }, + ), + + contentPadding: EdgeInsets.all(8), + onWillPop: () async { + return controller.errorLocationType.isEmpty; + }, + barrierDismissible: false, + ); + }); + } + } + return const SizedBox.shrink(); + }, controller.errorLocationType), + + ObxValue( + (currentIndex) => IndexedStack( + index: currentIndex.value, + children: controller.pages, + ), + controller.currentIndex, + ), Align( alignment: Alignment.bottomCenter, child: WaveBottomNavigation( items: [ - WaveBottomNavigationItem( - title: 'خانه', - icon:Assets.vecMapSvg, - ), + WaveBottomNavigationItem(title: 'خانه', icon: Assets.vecMapSvg), WaveBottomNavigationItem( title: 'عملیات', - icon:Assets.vecUserSvg, + icon: Assets.vecUserSvg, ), WaveBottomNavigationItem( title: 'افزودن', - icon:Assets.vecAddSvg, + icon: Assets.vecAddSvg, ), WaveBottomNavigationItem( title: 'آمار', - icon:Assets.vecDiagramSvg, - ), WaveBottomNavigationItem( + icon: Assets.vecDiagramSvg, + ), + WaveBottomNavigationItem( title: 'تماس', - icon:Assets.vecCallSvg, - ), WaveBottomNavigationItem( + icon: Assets.vecCallSvg, + ), + WaveBottomNavigationItem( title: 'مکان ', - icon:Assets.vecGpsSvg, - ), WaveBottomNavigationItem( + icon: Assets.vecGpsSvg, + ), + WaveBottomNavigationItem( title: 'تاریخ', - icon:Assets.vecCalendarSvg, + icon: Assets.vecCalendarSvg, ), ], onPageChanged: (index) { diff --git a/features/inspection/lib/presentation/routes/app_pages.dart b/features/inspection/lib/presentation/routes/app_pages.dart index b1ec38c..aeb25c4 100644 --- a/features/inspection/lib/presentation/routes/app_pages.dart +++ b/features/inspection/lib/presentation/routes/app_pages.dart @@ -26,7 +26,7 @@ sealed class InspectionPages { page: () => RootPage(), binding: BindingsBuilder(() { Get.put(RootLogic()); - Get.put(SupervisionFilterLogic()); + Get.put(InspectorFilterLogic()); Get.lazyPut(() => LocationDetailsLogic(), fenix: true); Get.lazyPut(() => ActionLogic(), fenix: true); Get.lazyPut(() => ProfileLogic(), fenix: true); diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 4d57a1b..f6d3b76 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -14,6 +14,8 @@ export 'package:persian_datetime_picker/persian_datetime_picker.dart'; //Map and location export 'package:latlong2/latlong.dart'; export 'package:flutter_map/flutter_map.dart'; +export 'package:geolocator/geolocator.dart'; +export 'package:flutter_map_animations/flutter_map_animations.dart'; From 2ba786b556603163e40da059696e0fb5e976ff4b Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 4 May 2025 08:44:39 +0330 Subject: [PATCH 043/256] feat : on Tap BottomSheet --- .../wave_bottom_navigation.dart | 83 ++++++++++--------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart index 95b808f..ddcc71f 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart @@ -83,47 +83,56 @@ class _WaveBottomNavigationState extends State { physics: const ClampingScrollPhysics(), itemBuilder: (context, index) { final WaveBottomNavigationItem item = widget.items[index]; - return Center( - child: AnimatedBuilder( - animation: _controller, - builder: (context, child) { - double value = 0.0; - final scale = _calculateScale(_controller.page ?? 0, index); - value = index - (_controller.page ?? 0); - value = (value).clamp(-1, 1); - double offset = value * 30; - if (value.abs() < 0.2 || value.abs() > 0.2) { - offset = -7 * (1 - value.abs() * 2); - } + return GestureDetector( + onTap: () { + _controller.animateToPage( + index, + duration: Duration(milliseconds: 500), + curve: Curves.easeInOut, + ); + }, + child: Center( + child: AnimatedBuilder( + animation: _controller, + builder: (context, child) { + double value = 0.0; + final scale = _calculateScale(_controller.page ?? 0, index); + value = index - (_controller.page ?? 0); + value = (value).clamp(-1, 1); + double offset = value * 30; + if (value.abs() < 0.2 || value.abs() > 0.2) { + offset = -7 * (1 - value.abs() * 2); + } - return Transform.scale( - scale: scale, - child: Transform.translate( - offset: Offset(0, offset), - child: Column( - children: [ - Tooltip( - message: item.title, - child: vecWidget( - item.icon, - color: Colors.white, - width: 32, - height: 32, + return Transform.scale( + scale: scale, + child: Transform.translate( + offset: Offset(0, offset), + child: Column( + children: [ + Tooltip( + message: item.title, + child: vecWidget( + item.icon, + color: Colors.white, + width: 32, + height: 32, + ), ), - ), - /* Visibility( - visible: (_controller.page ?? 0) == index, - child: Text( - item.title, - style: AppFonts.yekan10.copyWith(color: Colors.white), - ), - ),*/ - ], + /* Visibility( + visible: (_controller.page ?? 0) == index, + child: Text( + item.title, + style: AppFonts.yekan10.copyWith(color: Colors.white), + ), + ),*/ + ], + ), ), - ), - ); - }, + ); + }, + ), ), ); }, From 6ef1ab06c917da0ddcb6eb51f4986a294a87b6cc Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 5 May 2025 09:06:35 +0330 Subject: [PATCH 044/256] feat : BottomSheet manger and some changed in draggable bottom sheet --- .../lib/presentation/filter/logic.dart | 84 +- .../lib/presentation/filter/view.dart | 1104 ++++++++--------- .../lib/presentation/root/view.dart | 65 +- features/inspection/pubspec.lock | 52 +- .../bottom_sheet_manger.dart | 42 + .../draggable_bottom_sheet.dart | 125 +- .../draggable_bottom_sheet_controller.dart | 42 +- .../core/lib/presentation/widget/widget.dart | 1 + packages/core/pubspec.lock | 24 +- pubspec.lock | 20 +- 10 files changed, 804 insertions(+), 755 deletions(-) create mode 100644 packages/core/lib/presentation/widget/draggable_bottom_sheet/bottom_sheet_manger.dart diff --git a/features/inspection/lib/presentation/filter/logic.dart b/features/inspection/lib/presentation/filter/logic.dart index 949e609..921e045 100644 --- a/features/inspection/lib/presentation/filter/logic.dart +++ b/features/inspection/lib/presentation/filter/logic.dart @@ -1,12 +1,10 @@ import 'dart:async'; -import 'package:flutter/animation.dart'; import 'package:flutter/material.dart'; import 'package:inspection/data/utils/marker_generator.dart'; +import 'package:inspection/presentation/filter/view.dart'; import 'package:rasadyar_core/core.dart'; -enum BottomSheetStep { filter, markerSelected, markerDetails } - class InspectorFilterLogic extends GetxController with GetTickerProviderStateMixin { Rx currentLocation = LatLng(35.824891, 50.948025).obs; @@ -19,22 +17,22 @@ class InspectorFilterLogic extends GetxController RxInt showIndex = 0.obs; bool showSlideHint = true; - Rx bottomSheetStep = BottomSheetStep.filter.obs; late Rx slidController; Rx mapController = MapController().obs; late final AnimatedMapController animatedMapController; - late Rx sheetController; + late DraggableBottomSheetController filterBottomSheetController; + late DraggableBottomSheetController selectedLocationBottomSheetController; + late DraggableBottomSheetController detailsLocationBottomSheetController; + late final BottomSheetManager bottomSheetManager; Future determineCurrentPosition() async { - final position = await Geolocator.getCurrentPosition( locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), ); final latLng = LatLng(position.latitude, position.longitude); - currentLocation.value = latLng; markers.add(latLng); animatedMapController.animateTo( @@ -77,7 +75,6 @@ class InspectorFilterLogic extends GetxController allMarkers.value = generatedMarkers; } - @override void onInit() { super.onInit(); @@ -87,53 +84,43 @@ class InspectorFilterLogic extends GetxController curve: Curves.easeInOut, cancelPreviousAnimations: true, ); - sheetController = - DraggableBottomSheetController( - initialVisibility: false, - initialHeight: 300, - minHeight: 70, - maxHeight: 600, - ).obs; + + filterBottomSheetController = DraggableBottomSheetController( + initialHeight: 350, + minHeight: 200, + maxHeight: Get.height * 0.5, + ); + + selectedLocationBottomSheetController = DraggableBottomSheetController( + initialHeight: 200, + minHeight: 100, + maxHeight: 200, + ); + detailsLocationBottomSheetController = DraggableBottomSheetController( + initialHeight: Get.height * 0.5, + minHeight: Get.height * 0.37, + maxHeight: Get.height * 0.5, + ); slidController = SlidableController(this).obs; - - /*bottomSheetStep.listen((data) { - tLog('1 bottomSheetStep -> ${data.nme}'); - if (data == BottomSheetStep.filter) { - sheetController.value = DraggableBottomSheetController( - initialVisibility: true, - initialHeight: 300, - minHeight: 70, - maxHeight: 600, - ); - } else if (data == BottomSheetStep.markerSelected) { - sheetController.value = - DraggableBottomSheetController( - initialVisibility: true, - initialHeight: 250, - minHeight: 50, - maxHeight: 300, - ); - - }else if(data == BottomSheetStep.markerDetails){ - sheetController.value = - DraggableBottomSheetController( - initialVisibility: true, - initialHeight: 500, - minHeight: 50, - maxHeight: 700, - ); - } - sheetController.refresh(); - sheetController.value.toggle(); - - });*/ + bottomSheetManager = BottomSheetManager({ + filterBottomSheetController: + () => filterWidget(filterIndex: filterIndex, showIndex: showIndex), + selectedLocationBottomSheetController: + () => selectedLocationWidget( + showHint: selectedLocationBottomSheetController.isVisible.value, + sliderController: slidController.value, + trigger: triggerSlidableAnimation, + toggle: selectedLocationBottomSheetController.toggle, + ), + detailsLocationBottomSheetController: () => markerDetailsWidget(), + }); } @override void onReady() { super.onReady(); - // determineCurrentPosition(); + determineCurrentPosition(); generatedMarkers(); } @@ -147,6 +134,7 @@ class InspectorFilterLogic extends GetxController @override void onClose() { + slidController.close(); super.onClose(); } } diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index 2ee053c..f29c487 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -10,606 +11,587 @@ class SupervisionFilterPage extends GetView { @override Widget build(BuildContext context) { - return PopScope( - canPop: controller.sheetController.value.handleBack, - onPopInvokedWithResult: (didPop, result) { - if (!didPop && - controller.sheetController.value.bottomSheets.isNotEmpty) { - controller.sheetController.value.removeLastBottomSheet(); - } - }, - child: Stack( - children: [ - ObxValue((currentLocation) { - return FlutterMap( - mapController: controller.animatedMapController.mapController, - options: MapOptions( - initialCenter: currentLocation.value, - initialZoom: 18, - onPositionChanged: (camera, hasGesture) { - controller.debouncedUpdateVisibleMarkers( - center: camera.center, - ); - }, - ), - children: [ - TileLayer( - urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - ), - - ObxValue((markers) { - return MarkerLayer( - markers: - markers.map((marker) => markerWidget(marker)).toList(), - ); - }, controller.markers), - ], - ); - }, controller.currentLocation), - Positioned( - right: 10, - bottom: 150, - child: ObxValue((data) { - return RFab.small( - backgroundColor: AppColor.greenNormal, - isLoading: data.value, - icon: vecWidget(Assets.vecGpsSvg), - onPressed: () { - controller.isLoading.value = true; - controller.determineCurrentPosition().then( - (value) => - controller.isLoading.value = - !controller.isLoading.value, - ); - }, - ); - }, controller.isLoading), - ), - Positioned( - right: 10, - bottom: 100, - child: RFab.small( - backgroundColor: AppColor.blueNormal, - icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), - onPressed: () { - controller.sheetController.value.addBottomSheet( - child: filterWidget(), - initHeight: 400, - maxHeight: 470, - minHeight: 350, - ); - }, - ), - ), - Obx( - () => Stack( - children: - controller.sheetController.value.bottomSheets - .map((sheet) => sheet) - .toList(), - ), - ), - ], - ), - ); - } - - Marker markerWidget(LatLng marker) { - return Marker( - point: marker, - - child: GestureDetector( - onTap: () { - controller.sheetController.value.addBottomSheet( - child: selectedLocationWidget(), - minHeight: 0, - maxHeight: 250, - initHeight: 250, - ); + return Scaffold( + body: PopScope( + canPop: !controller.bottomSheetManager.isAnyVisible, + onPopInvokedWithResult: (didPop, result) { + controller.bottomSheetManager.closeFirstVisible(); }, - behavior: HitTestBehavior.opaque, - child: SizedBox( - width: 36, - height: 36, - child: Icon(Icons.location_on, color: Colors.red, size: 30), + child: Stack( + children: [ + _buildMap(), + _buildGpsButton(), + _buildFilterButton(), + Obx(() => controller.bottomSheetManager.buildVisibleSheet())], ), ), + ); } - Widget selectedLocationWidget() { - if (controller.showSlideHint) { - controller.triggerSlidableAnimation(); - } + Widget _buildMap() { + return ObxValue((currentLocation) { + return FlutterMap( + mapController: controller.animatedMapController.mapController, + options: MapOptions( + initialCenter: currentLocation.value, + initialZoom: 18, + onPositionChanged: (camera, hasGesture) { + controller.debouncedUpdateVisibleMarkers(center: camera.center); + }, + ), + children: [ + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + ), + ObxValue((markers) { + return MarkerLayer(markers: markers.map((e)=>markerWidget(marker: e, onTap: () { + controller.selectedLocationBottomSheetController.isVisible.value = true; - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), - child: Slidable( - key: Key('selectedLocationWidget'), - controller: controller.slidController.value, - endActionPane: ActionPane( - motion: StretchMotion(), + + })).toList()); + }, controller.markers), + ], + ); + }, controller.currentLocation); + } + + Widget _buildGpsButton() { + return Positioned( + right: 10, + bottom:83, + child: ObxValue((data) { + return RFab.small( + backgroundColor: AppColor.greenNormal, + isLoading: data.value, + icon: vecWidget(Assets.vecGpsSvg), + onPressed: () async { + controller.isLoading.value = true; + await controller.determineCurrentPosition(); + controller.isLoading.value = false; + }, + ); + }, controller.isLoading), + ); + } + + Widget _buildFilterButton() { + return Positioned( + right: 10, + bottom: 30, + child: RFab.small( + backgroundColor: AppColor.blueNormal, + icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), + onPressed: () => controller.filterBottomSheetController.toggle(), + ), + ); + } +} + +Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + return Marker( + point: marker, + child: GestureDetector( + onTap: onTap, + behavior: HitTestBehavior.opaque, + child: SizedBox( + width: 36, + height: 36, + child: Icon(Icons.location_on, color: Colors.red, size: 30), + ), + ), + ); +} + +Padding filterWidget({required RxInt filterIndex, required RxInt showIndex}) { + return Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + spacing: 16, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + spacing: 16, children: [ - CustomSlidableAction( - onPressed: (context) { - Get.toNamed(InspectionRoutes.inspectionLocationDetails); - }, - backgroundColor: AppColor.blueNormal, - foregroundColor: Colors.white, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(8), - topRight: Radius.circular(8), + Container( + width: 100, + height: 64, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), ), - child: vecWidget(Assets.vecMapSvg, width: 24, height: 24), - ), - CustomSlidableAction( - onPressed: (context) { - Get.toNamed(InspectionRoutes.inspectionAddSupervision); - }, - backgroundColor: AppColor.greenNormal, - padding: EdgeInsets.all(16), - child: vecWidget(Assets.vecMessageAddSvg), - ), - CustomSlidableAction( - onPressed: (context) {}, - backgroundColor: AppColor.warning, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(8), - topLeft: Radius.circular(8), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text('دامداران', style: AppFonts.yekan10), + Text('183 عدد', style: AppFonts.yekan13Bold), + ], + ), + ), + Container( + width: 100, + height: 64, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: AppColor.greenLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text('مرغداران', style: AppFonts.yekan10), + Text('183 عدد', style: AppFonts.yekan13Bold), + ], + ), + ), + Container( + width: 100, + height: 64, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text('اصناف', style: AppFonts.yekan10), + Text('183 عدد', style: AppFonts.yekan13Bold), + ], ), - child: vecWidget(Assets.vecSecurityTimeSvg), ), ], ), - child: GestureDetector( - onTap: () { - controller.sheetController.value.addBottomSheet( - child: markerDetailsWidget(), - minHeight: 0, - maxHeight: Get.height * 0.65, - initHeight: Get.height * 0.6, - ); - }, - child: Container( - height: 58, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), + + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'فیلتر نمایش', + textAlign: TextAlign.center, + style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'گوشت و مرغ', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - children: [ - Text( - 'باقی مانده', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - vecWidget(Assets.vecScanBarcodeSvg), - ], - ), - ), + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + customChip( + isSelected: data.value == 0, + onTap: (data) { + filterIndex.value = data; + }, + index: 0, + title: 'دامداران', + ), + customChip( + isSelected: data.value == 1, + title: 'مرغداران', + onTap: (data) { + filterIndex.value = data; + }, + index: 1, + ), + customChip( + isSelected: data.value == 2, + title: 'اصناف', + onTap: (data) { + filterIndex.value = data; + }, + index: 2, + ), + ], + ); + }, filterIndex), + ], ), - ), - ); - } - Padding filterWidget() { - return Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - spacing: 16, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - spacing: 16, - children: [ - Container( - width: 100, - height: 64, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: AppColor.blueLight, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text('دامداران', style: AppFonts.yekan10), - Text('183 عدد', style: AppFonts.yekan13Bold), - ], - ), - ), - Container( - width: 100, - height: 64, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: AppColor.greenLight, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text('مرغداران', style: AppFonts.yekan10), - Text('183 عدد', style: AppFonts.yekan13Bold), - ], - ), - ), - Container( - width: 100, - height: 64, - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: AppColor.blueLight, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text('اصناف', style: AppFonts.yekan10), - Text('183 عدد', style: AppFonts.yekan13Bold), - ], - ), - ), - ], - ), - - Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 12, - children: [ - Text( - 'فیلتر نمایش', - textAlign: TextAlign.center, - style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), - ), - ObxValue((data) { - return Row( + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'نمایش', + textAlign: TextAlign.center, + style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), + ), + ObxValue((data) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, spacing: 8, children: [ customChip( isSelected: data.value == 0, + title: 'نمایش همه', onTap: (data) { - controller.filterIndex.value = data; + showIndex.value = data; }, index: 0, - title: 'دامداران', ), customChip( isSelected: data.value == 1, - title: 'مرغداران', + title: 'دارای تراکنش', onTap: (data) { - controller.filterIndex.value = data; + showIndex.value = data; }, index: 1, ), customChip( isSelected: data.value == 2, - title: 'اصناف', + title: 'بازرسی شده ها', onTap: (data) { - controller.filterIndex.value = data; + showIndex.value = data; }, index: 2, ), + customChip( + isSelected: data.value == 3, + title: 'بازرسی نشده ها', + onTap: (data) { + showIndex.value = data; + }, + index: 3, + ), + customChip( + isSelected: data.value == 4, + title: 'متخلفین', + onTap: (data) { + showIndex.value = data; + }, + index: 4, + ), ], - ); - }, controller.filterIndex), - ], - ), - - Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 12, - children: [ - Text( - 'نمایش', - textAlign: TextAlign.center, - style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), - ), - ObxValue((data) { - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 8, - children: [ - customChip( - isSelected: data.value == 0, - title: 'نمایش همه', - onTap: (data) { - controller.showIndex.value = data; - }, - index: 0, - ), - customChip( - isSelected: data.value == 1, - title: 'دارای تراکنش', - onTap: (data) { - controller.showIndex.value = data; - }, - index: 1, - ), - customChip( - isSelected: data.value == 2, - title: 'بازرسی شده ها', - onTap: (data) { - controller.showIndex.value = data; - }, - index: 2, - ), - customChip( - isSelected: data.value == 3, - title: 'بازرسی نشده ها', - onTap: (data) { - controller.showIndex.value = data; - }, - index: 3, - ), - customChip( - isSelected: data.value == 4, - title: 'متخلفین', - onTap: (data) { - controller.showIndex.value = data; - }, - index: 4, - ), - ], - ), - ); - }, controller.showIndex), - ], - ), - ], - ), - ); - } - - Widget markerDetailsWidget() { - return Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.all(35), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - decoration: ShapeDecoration( - color: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Column( - spacing: 15, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 12, - children: [ - Text( - 'داود خرم پور', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDarkHover, ), - ), - Spacer(), - vecWidgetWithOnTap( - assets: Assets.vecMapSvg, - onTap: () { - Get.toNamed(InspectionRoutes.inspectionLocationDetails); - }, - width: 24, - height: 24, - color: AppColor.blueNormal, - ), - vecWidgetWithOnTap( - assets: Assets.vecMessageAddSvg, - width: 24, - height: 24, - color: AppColor.greenNormal, - onTap: () { - Get.toNamed(InspectionRoutes.inspectionAddSupervision); - }, - ), - - vecWidgetWithOnTap( - assets: Assets.vecSecurityTimeSvg, - color: AppColor.warning, - height: 24, - width: 24, - onTap: () {}, - ), - ], - ), - Container( - height: 32, - clipBehavior: Clip.antiAlias, - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'باقی مانده', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ), - - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'شماره همراه', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '0326598653', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'آخرین فعالیت', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - - Text( - '1409/12/12', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'موجودی', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '5کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - - ...List.generate( - 5, - (index) => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'فروش رفته', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ), - ], - ), - ); - } - - Widget customChip({ - bool isSelected = false, - required String title, - required int index, - required Function(int) onTap, - }) { - return GestureDetector( - onTap: () { - onTap.call(index); - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, - borderRadius: BorderRadius.circular(8), - border: - isSelected - ? Border.fromBorderSide(BorderSide.none) - : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + ); + }, showIndex), + ], ), - child: Text( - title, - textAlign: TextAlign.center, - style: - isSelected - ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) - : AppFonts.yekan10, - ), - ), - ); - } + ], + ), + ); +} + +Widget markerDetailsWidget() { + return Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.all(35), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'داود خرم پور', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Spacer(), + vecWidgetWithOnTap( + assets: Assets.vecMapSvg, + onTap: () { + Get.toNamed(InspectionRoutes.inspectionLocationDetails); + }, + width: 24, + height: 24, + color: AppColor.blueNormal, + ), + vecWidgetWithOnTap( + assets: Assets.vecMessageAddSvg, + width: 24, + height: 24, + color: AppColor.greenNormal, + onTap: () { + Get.toNamed(InspectionRoutes.inspectionAddSupervision); + }, + ), + + vecWidgetWithOnTap( + assets: Assets.vecSecurityTimeSvg, + color: AppColor.warning, + height: 24, + width: 24, + onTap: () {}, + ), + ], + ), + Container( + height: 32, + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'باقی مانده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + + ...List.generate( + 5, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + ], + ), + ); +} + +Widget customChip({ + bool isSelected = false, + required String title, + required int index, + required Function(int) onTap, +}) { + return GestureDetector( + onTap: () { + onTap.call(index); + }, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, + borderRadius: BorderRadius.circular(8), + border: + isSelected + ? Border.fromBorderSide(BorderSide.none) + : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + ), + child: Text( + title, + textAlign: TextAlign.center, + style: + isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) + : AppFonts.yekan10, + ), + ), + ); +} + +Widget selectedLocationWidget({ + required bool showHint, + required SlidableController sliderController, + required VoidCallback trigger, + required VoidCallback toggle, +}) { + if (showHint) { + trigger.call(); + } + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), + child: Slidable( + key: Key('selectedLocationWidget'), + controller: sliderController, + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) { + Get.toNamed(InspectionRoutes.inspectionLocationDetails); + }, + backgroundColor: AppColor.blueNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(8), + topRight: Radius.circular(8), + ), + child: vecWidget(Assets.vecMapSvg, width: 24, height: 24), + ), + CustomSlidableAction( + onPressed: (context) { + Get.toNamed(InspectionRoutes.inspectionAddSupervision); + }, + backgroundColor: AppColor.greenNormal, + padding: EdgeInsets.all(16), + child: vecWidget(Assets.vecMessageAddSvg), + ), + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.warning, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8), + topLeft: Radius.circular(8), + ), + child: vecWidget(Assets.vecSecurityTimeSvg), + ), + ], + ), + child: GestureDetector( + onTap: toggle, + child: Container( + height: 58, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + vecWidget(Assets.vecScanBarcodeSvg), + ], + ), + ), + ), + ), + ); } diff --git a/features/inspection/lib/presentation/root/view.dart b/features/inspection/lib/presentation/root/view.dart index 7693679..356a1d6 100644 --- a/features/inspection/lib/presentation/root/view.dart +++ b/features/inspection/lib/presentation/root/view.dart @@ -113,42 +113,39 @@ class RootPage extends GetView { controller.currentIndex, ), - Align( - alignment: Alignment.bottomCenter, - child: WaveBottomNavigation( - items: [ - WaveBottomNavigationItem(title: 'خانه', icon: Assets.vecMapSvg), - WaveBottomNavigationItem( - title: 'عملیات', - icon: Assets.vecUserSvg, - ), - WaveBottomNavigationItem( - title: 'افزودن', - icon: Assets.vecAddSvg, - ), - WaveBottomNavigationItem( - title: 'آمار', - icon: Assets.vecDiagramSvg, - ), - WaveBottomNavigationItem( - title: 'تماس', - icon: Assets.vecCallSvg, - ), - WaveBottomNavigationItem( - title: 'مکان ', - icon: Assets.vecGpsSvg, - ), - WaveBottomNavigationItem( - title: 'تاریخ', - icon: Assets.vecCalendarSvg, - ), - ], - onPageChanged: (index) { - controller.changePage(index); - }, - ), + ], + ), + bottomNavigationBar: WaveBottomNavigation( + items: [ + WaveBottomNavigationItem(title: 'خانه', icon: Assets.vecMapSvg), + WaveBottomNavigationItem( + title: 'عملیات', + icon: Assets.vecUserSvg, + ), + WaveBottomNavigationItem( + title: 'افزودن', + icon: Assets.vecAddSvg, + ), + WaveBottomNavigationItem( + title: 'آمار', + icon: Assets.vecDiagramSvg, + ), + WaveBottomNavigationItem( + title: 'تماس', + icon: Assets.vecCallSvg, + ), + WaveBottomNavigationItem( + title: 'مکان ', + icon: Assets.vecGpsSvg, + ), + WaveBottomNavigationItem( + title: 'تاریخ', + icon: Assets.vecCalendarSvg, ), ], + onPageChanged: (index) { + controller.changePage(index); + }, ), ); } diff --git a/features/inspection/pubspec.lock b/features/inspection/pubspec.lock index eeeefab..276fc68 100644 --- a/features/inspection/pubspec.lock +++ b/features/inspection/pubspec.lock @@ -100,7 +100,7 @@ packages: source: sdk version: "0.0.0" flutter_map: - dependency: "direct main" + dependency: transitive description: name: flutter_map sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a @@ -108,7 +108,7 @@ packages: source: hosted version: "8.1.1" flutter_map_animations: - dependency: "direct main" + dependency: transitive description: name: flutter_map_animations sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e @@ -161,7 +161,7 @@ packages: source: hosted version: "3.0.0" geolocator: - dependency: "direct main" + dependency: transitive description: name: geolocator sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 @@ -228,18 +228,18 @@ packages: dependency: transitive description: name: hive_ce - sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f + sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e url: "https://pub.dev" source: hosted - version: "2.10.1" + version: "2.11.1" hive_ce_flutter: dependency: transitive description: name: hive_ce_flutter - sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877" + sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" http: dependency: transitive description: @@ -264,6 +264,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" + isolate_channel: + dependency: transitive + description: + name: isolate_channel + sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df + url: "https://pub.dev" + source: hosted + version: "0.2.2" json_annotation: dependency: transitive description: @@ -273,7 +281,7 @@ packages: source: hosted version: "4.9.0" latlong2: - dependency: "direct main" + dependency: transitive description: name: latlong2 sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" @@ -288,30 +296,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - location: - dependency: "direct main" - description: - name: location - sha256: c2c4304071ec860525d5c50d142410072f8620c1d9f74874811af2e804e1a9c8 - url: "https://pub.dev" - source: hosted - version: "8.0.0" - location_platform_interface: - dependency: transitive - description: - name: location_platform_interface - sha256: a3404ea6d74e89b121630be62ed8edcc7b39fd108bd19805d0ae55c397135dd7 - url: "https://pub.dev" - source: hosted - version: "6.0.0" - location_web: - dependency: transitive - description: - name: location_web - sha256: "744bdff53dc455a2dc9a34474c49cde364d4fbef2aee009f8b0b4b68570c27a1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" logger: dependency: transitive description: @@ -523,10 +507,10 @@ packages: dependency: transitive description: name: shamsi_date - sha256: "4614789ed11bfffe5ba0aa157a20f2857ab6328528401766e0d924e453c866bd" + sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51 url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" sky_engine: dependency: transitive description: flutter diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/bottom_sheet_manger.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/bottom_sheet_manger.dart new file mode 100644 index 0000000..7be010e --- /dev/null +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/bottom_sheet_manger.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +import 'draggable_bottom_sheet.dart'; +import 'draggable_bottom_sheet_controller.dart'; + +class BottomSheetManager { + final Map _sheetBuilders; + + BottomSheetManager(this._sheetBuilders); + + bool get isAnyVisible => + _sheetBuilders.keys.any((controller) => controller.isVisible.value); + + void closeFirstVisible() { + for (final controller in _sheetBuilders.keys) { + if (controller.isVisible.value) { + controller.toggle(); + break; + } + } + } + + Widget buildVisibleSheet() { + for (final entry in _sheetBuilders.entries) { + if (entry.key.isVisible.value) { + return _buildDraggableSheet(entry.key, entry.value()); + } + } + return const SizedBox.shrink(); + } + + Widget _buildDraggableSheet( + DraggableBottomSheetController controller, + Widget child, + ) { + return DraggableBottomSheet( + controller: controller, + backgroundColor: Colors.white, + child: child, + ); + } +} diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart index ed56eba..b430ad6 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart @@ -4,86 +4,87 @@ import 'package:get/get.dart'; import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; class DraggableBottomSheet extends StatelessWidget { - final DraggableBottomSheetController? controller; - final bool isVisible; - final double initialHeight; - final double minHeight; - final double maxHeight; + final DraggableBottomSheetController controller; final Widget? child; final Color? backgroundColor; + const DraggableBottomSheet({ super.key, - this.controller, - this.isVisible = false, - this.backgroundColor = AppColor.lightGreyNormal, - this.initialHeight = 200, - this.minHeight = 0, - this.maxHeight = 700, + required this.controller, this.child, + this.backgroundColor = Colors.white, }); @override Widget build(BuildContext context) { - final DraggableBottomSheetController bottomSheetController = - controller ?? - Get.put( - DraggableBottomSheetController( - initialVisibility: false, - initialHeight: initialHeight, - minHeight: minHeight, - maxHeight: maxHeight, - ), - tag: 'local_$hashCode', - ); - // Optionally show after first frame if isVisible is true WidgetsBinding.instance.addPostFrameCallback((_) { - if (isVisible && !bottomSheetController.isVisible.value) { - bottomSheetController.show(); + if (controller.isVisible.value && !controller.isVisible.value) { + controller.show(); } }); - return ObxValue( - (data) => AnimatedPositioned( - duration: const Duration(milliseconds: 300), - curve: Curves.easeOut, - bottom: bottomSheetController.isVisible.value ? 0 : -maxHeight, - left: 0, - right: 0, - child: GestureDetector( - onVerticalDragUpdate: (DragUpdateDetails details) { - bottomSheetController.updateHeight(details.primaryDelta); - }, - child: Container( - height: data.value, - decoration: BoxDecoration( - color: backgroundColor, - borderRadius: BorderRadius.vertical(top: Radius.circular(50)), - ), - child: Column( - children: [ - const SizedBox(height: 10), - GestureDetector( - onTap: () { - bottomSheetController.toggle(); - }, - behavior: HitTestBehavior.opaque, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [const Icon(CupertinoIcons.chevron_down)], - ), - ), - const SizedBox(height: 10), - child ?? SizedBox.shrink(), - ], + return Obx(() { + if (!controller.isVisible.value) return SizedBox.shrink(); + return Stack( + + children: [ + // پس‌زمینه تیره + Positioned.fill( + child: GestureDetector( + onTap: controller.toggle, + child: Container(color: Colors.black54), ), ), - ), - ), - bottomSheetController.currentHeight, + // محتوای BottomSheet + AnimatedPositioned( + duration: Duration(milliseconds: 300), + curve: Curves.easeOut, + left: 0, + right: 0, + bottom: 0, + child: GestureDetector( + onVerticalDragUpdate: (details) => + controller.updateHeight(details.primaryDelta), + child: Container( + height: controller.currentHeight.value, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.vertical( + top: Radius.circular(20), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 10, + ), + ], + ), + child: Column( + children: [ + GestureDetector( + onTap: controller.toggle, + child: Container( + padding: EdgeInsets.all(10), + child: Icon(Icons.drag_handle), + ), + ), + Expanded(child: child ?? SizedBox.shrink()), + ], + ), + ), + ), + ), + ], + ); + + } + ); } -} +} \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart index ac393f5..5a1caef 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart @@ -3,7 +3,7 @@ import 'package:get/get.dart'; import 'package:rasadyar_core/core.dart'; import 'draggable_bottom_sheet.dart'; -class DraggableBottomSheetController extends GetxController { +/*class DraggableBottomSheetController extends GetxController { final RxList bottomSheets = [].obs; @@ -124,5 +124,43 @@ class DraggableBottomSheetController extends GetxController { return false; } -} +}*/ +class DraggableBottomSheetController extends GetxController { + final RxBool isVisible = false.obs; + final RxDouble currentHeight = 200.0.obs; + + late double initialHeight; + late double minHeight; + late double maxHeight; + + DraggableBottomSheetController({ + this.initialHeight = 200, + this.minHeight = 100, + this.maxHeight = 700, + }) { + currentHeight.value = initialHeight; + } + + void show() => isVisible.value = true; + + void hide() => isVisible.value = false; + + void toggle() => isVisible.value = !isVisible.value; + + void updateHeight(double? delta) { + if (delta == null) return; + final newHeight = (currentHeight.value - delta).clamp(minHeight, maxHeight); + if (newHeight <= minHeight) { + hide(); + } else { + currentHeight.value = newHeight; + } + } + + @override + void onInit() { + super.onInit(); + + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 4f6869c..f61a097 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -8,6 +8,7 @@ export 'buttons/text_button.dart'; export 'captcha/captcha_widget.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; +export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; export 'inputs/r_input.dart'; export 'pagination/pagination_from_until.dart'; export 'pagination/show_more.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 8e2431a..6b71ba8 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -417,26 +417,26 @@ packages: dependency: "direct main" description: name: hive_ce - sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f + sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e url: "https://pub.dev" source: hosted - version: "2.10.1" + version: "2.11.1" hive_ce_flutter: dependency: "direct main" description: name: hive_ce_flutter - sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877" + sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" hive_ce_generator: dependency: "direct dev" description: name: hive_ce_generator - sha256: "0b1c750e2d10c55a14cde16d479ada42704be6cef43c54b728ed0e4e02f7d808" + sha256: "84940c2fd3cb1d1eb318892cdb666bc0b8023f365f28aefe09b9e5a7222bc740" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.1" http: dependency: transitive description: @@ -477,6 +477,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + isolate_channel: + dependency: transitive + description: + name: isolate_channel + sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df + url: "https://pub.dev" + source: hosted + version: "0.2.2" js: dependency: transitive description: @@ -825,10 +833,10 @@ packages: dependency: transitive description: name: shamsi_date - sha256: "4614789ed11bfffe5ba0aa157a20f2857ab6328528401766e0d924e453c866bd" + sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51 url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" shelf: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 5b69e4e..9434345 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -257,18 +257,18 @@ packages: dependency: transitive description: name: hive_ce - sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f + sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e url: "https://pub.dev" source: hosted - version: "2.10.1" + version: "2.11.1" hive_ce_flutter: dependency: transitive description: name: hive_ce_flutter - sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877" + sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" http: dependency: transitive description: @@ -300,6 +300,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" + isolate_channel: + dependency: transitive + description: + name: isolate_channel + sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df + url: "https://pub.dev" + source: hosted + version: "0.2.2" json_annotation: dependency: transitive description: @@ -575,10 +583,10 @@ packages: dependency: transitive description: name: shamsi_date - sha256: "4614789ed11bfffe5ba0aa157a20f2857ab6328528401766e0d924e453c866bd" + sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51 url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.1.0" sky_engine: dependency: transitive description: flutter From cefe87ddda2b784079a629d769efadba29b203fb Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 5 May 2025 09:10:35 +0330 Subject: [PATCH 045/256] feat : change map marker --- .../lib/presentation/filter/view.dart | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index f29c487..05c701b 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -22,10 +21,10 @@ class SupervisionFilterPage extends GetView { _buildMap(), _buildGpsButton(), _buildFilterButton(), - Obx(() => controller.bottomSheetManager.buildVisibleSheet())], + Obx(() => controller.bottomSheetManager.buildVisibleSheet()), + ], ), ), - ); } @@ -45,11 +44,22 @@ class SupervisionFilterPage extends GetView { urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', ), ObxValue((markers) { - return MarkerLayer(markers: markers.map((e)=>markerWidget(marker: e, onTap: () { - controller.selectedLocationBottomSheetController.isVisible.value = true; - - - })).toList()); + return MarkerLayer( + markers: + markers + .map( + (e) => markerWidget( + marker: e, + onTap: () { + controller + .selectedLocationBottomSheetController + .isVisible + .value = true; + }, + ), + ) + .toList(), + ); }, controller.markers), ], ); @@ -59,7 +69,7 @@ class SupervisionFilterPage extends GetView { Widget _buildGpsButton() { return Positioned( right: 10, - bottom:83, + bottom: 83, child: ObxValue((data) { return RFab.small( backgroundColor: AppColor.greenNormal, @@ -97,7 +107,7 @@ Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { child: SizedBox( width: 36, height: 36, - child: Icon(Icons.location_on, color: Colors.red, size: 30), + child: vecWidget(Assets.vecMapMarkerSvg,width: 30,height: 30,), ), ), ); From ea2ae0f18fd4025417c80e1700ddffd446170551 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 5 May 2025 09:37:05 +0330 Subject: [PATCH 046/256] feat : change map marker fix : show hint in bottom sheet --- features/inspection/lib/presentation/filter/logic.dart | 8 ++++++-- features/inspection/lib/presentation/filter/view.dart | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/features/inspection/lib/presentation/filter/logic.dart b/features/inspection/lib/presentation/filter/logic.dart index 921e045..a8610fd 100644 --- a/features/inspection/lib/presentation/filter/logic.dart +++ b/features/inspection/lib/presentation/filter/logic.dart @@ -96,6 +96,8 @@ class InspectorFilterLogic extends GetxController minHeight: 100, maxHeight: 200, ); + + detailsLocationBottomSheetController = DraggableBottomSheetController( initialHeight: Get.height * 0.5, minHeight: Get.height * 0.37, @@ -108,7 +110,9 @@ class InspectorFilterLogic extends GetxController () => filterWidget(filterIndex: filterIndex, showIndex: showIndex), selectedLocationBottomSheetController: () => selectedLocationWidget( - showHint: selectedLocationBottomSheetController.isVisible.value, + showHint: + selectedLocationBottomSheetController.isVisible.value && + showSlideHint, sliderController: slidController.value, trigger: triggerSlidableAnimation, toggle: selectedLocationBottomSheetController.toggle, @@ -129,7 +133,7 @@ class InspectorFilterLogic extends GetxController await slidController.value.openEndActionPane(); await Future.delayed(Duration(milliseconds: 200)); await slidController.value.close(); - showSlideHint = !showSlideHint; + showSlideHint = false; } @override diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index 05c701b..1046873 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -508,6 +509,7 @@ Widget selectedLocationWidget({ required VoidCallback trigger, required VoidCallback toggle, }) { + eLog(showHint); if (showHint) { trigger.call(); } From 399eb9a5271123ca00b4ba95faf9cc476d3275bb Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 10 May 2025 12:16:27 +0330 Subject: [PATCH 047/256] feat : update gradle --- .mason/bricks.json | 1 - android/app/build.gradle.kts | 12 +- android/settings.gradle.kts | 2 +- .../repository/user/user_repository.dart | 10 +- lib/presentation/utils/color_utils.dart | 24 - .../auth/auth_with_use_and_pass/logic.dart | 69 +++ .../auth/auth_with_use_and_pass/view.dart | 522 ++++++++++++++++++ .../src/presentation/pages/splash/logic.dart | 68 +++ .../src/presentation/pages/splash/view.dart | 47 ++ .../pages/system_design/system_design.dart | 255 +++++++++ .../src/presentation/routes/app_pages.dart | 20 + .../src/presentation/routes/app_paths.dart | 10 + tools/package_builder.sh | 2 + 13 files changed, 998 insertions(+), 44 deletions(-) delete mode 100644 .mason/bricks.json delete mode 100644 lib/presentation/utils/color_utils.dart create mode 100644 packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/logic.dart create mode 100644 packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/view.dart create mode 100644 packages/auth/lib/src/presentation/pages/splash/logic.dart create mode 100644 packages/auth/lib/src/presentation/pages/splash/view.dart create mode 100644 packages/auth/lib/src/presentation/pages/system_design/system_design.dart create mode 100644 packages/auth/lib/src/presentation/routes/app_pages.dart create mode 100644 packages/auth/lib/src/presentation/routes/app_paths.dart create mode 100644 tools/package_builder.sh diff --git a/.mason/bricks.json b/.mason/bricks.json deleted file mode 100644 index 2645872..0000000 --- a/.mason/bricks.json +++ /dev/null @@ -1 +0,0 @@ -{"flutter_ddd_module":"D:/fl_project/rasadyar_app/flutter_ddd_module"} \ No newline at end of file diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index ac6af7a..d77a86b 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("com.android.application") id("kotlin-android") - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id("dev.flutter.flutter-gradle-plugin") } @@ -11,19 +10,16 @@ android { ndkVersion = "27.0.12077973" compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_11.toString() + jvmTarget = "21" } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.hoshomandsazan.rasadyar_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode @@ -32,8 +28,6 @@ android { 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.getByName("debug") } } diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index a439442..a0fa520 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -19,7 +19,7 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" id("com.android.application") version "8.7.0" apply false - id("org.jetbrains.kotlin.android") version "1.8.22" apply false + id("org.jetbrains.kotlin.android") version "1.9.25" apply false } include(":app") diff --git a/lib/domain/repository/user/user_repository.dart b/lib/domain/repository/user/user_repository.dart index 599c891..3f90c41 100644 --- a/lib/domain/repository/user/user_repository.dart +++ b/lib/domain/repository/user/user_repository.dart @@ -2,15 +2,7 @@ import 'package:rasadyar_app/data/data_source/local_storage/user/user_local_stor abstract class IUserRepository { Future userAuthed(); - /*Future setUserAuthed(bool value); - Future setUserName(String name); - Future getUserName(); - Future setUserPhone(String phone); - Future getUserPhone(); - Future setUserEmail(String email); - Future getUserEmail(); - Future setUserPassword(String password); - Future getUserPassword();*/ + } class UserRepository implements IUserRepository { diff --git a/lib/presentation/utils/color_utils.dart b/lib/presentation/utils/color_utils.dart deleted file mode 100644 index 46f9bb8..0000000 --- a/lib/presentation/utils/color_utils.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/material.dart'; - -extension ColorUtils on Color { - Color _darken([double amount = 0.1]) { - assert(amount >= 0 && amount <= 1, 'مقدار تیرگی باید بین 0 و 1 باشد'); - final hslColor = HSLColor.fromColor(this); - final newLightness = (hslColor.lightness - amount).clamp(0.0, 1.0); - final hslDarkerColor = hslColor.withLightness(newLightness); - return hslDarkerColor.toColor(); - } - - get disabledColor{ - return withAlpha(38); - } - - get hoverColor{ - return _darken(0.5); - } - - get pressedColor{ - return _darken(0.10); - } - -} diff --git a/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/logic.dart b/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/logic.dart new file mode 100644 index 0000000..580413d --- /dev/null +++ b/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/logic.dart @@ -0,0 +1,69 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +enum AuthType { useAndPass, otp } + +enum AuthStatus { init } + +enum OtpStatus { init, sent, verified, reSend } + +class AuthWithUseAndPassLogic extends GetxController { + Rx> formKey = GlobalKey().obs; + Rx> formKeyOtp = GlobalKey().obs; + Rx> formKeySentOtp = GlobalKey().obs; + Rx phoneNumberController = TextEditingController().obs; + Rx passwordController = TextEditingController().obs; + Rx phoneOtpNumberController = + TextEditingController().obs; + Rx otpCodeController = TextEditingController().obs; + CaptchaController captchaController = CaptchaController(); + CaptchaController captchaOtpController = CaptchaController(); + + RxnString phoneNumber = RxnString(null); + RxnString password = RxnString(null); + RxBool isOnError = false.obs; + RxBool hidePassword = true.obs; + Rx authType = AuthType.useAndPass.obs; + Rx authStatus = AuthStatus.init.obs; + Rx otpStatus = OtpStatus.init.obs; + + RxInt secondsRemaining = 120.obs; + Timer? _timer; + + void startTimer() { + _timer?.cancel(); + secondsRemaining.value = 120; + + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (secondsRemaining.value > 0) { + secondsRemaining.value--; + } else { + timer.cancel(); + } + }); + } + + void stopTimer() { + _timer?.cancel(); + } + + String get timeFormatted { + final minutes = secondsRemaining.value ~/ 60; + final seconds = secondsRemaining.value % 60; + return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; + } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + _timer?.cancel(); + super.onClose(); + } +} diff --git a/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/view.dart b/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/view.dart new file mode 100644 index 0000000..f6cd2d7 --- /dev/null +++ b/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/view.dart @@ -0,0 +1,522 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class AuthWithUseAndPassPage extends GetView { + const AuthWithUseAndPassPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 80), + logoWidget(), + ObxValue((types) { + switch (types.value) { + case AuthType.otp: + return otpForm(); + case AuthType.useAndPass: + return useAndPassFrom(); + } + }, controller.authType), + + SizedBox(height: 50), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: 'مطالعه بیانیه ', + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + recognizer: TapGestureRecognizer()..onTap = () {}, + text: 'حریم خصوصی', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + SizedBox(height: 18), + + ObxValue((types) { + return RichText( + text: TextSpan( + children: [ + TextSpan( + recognizer: + TapGestureRecognizer() + ..onTap = () { + if (controller.authType.value == AuthType.otp) { + controller.authType.value = AuthType.useAndPass; + if (controller.otpStatus.value != + OtpStatus.init) { + controller.otpStatus.value = OtpStatus.init; + } + } else { + controller.authType.value = AuthType.otp; + } + }, + text: + controller.authType.value == AuthType.otp + ? 'ورود با رمز ثابت' + : 'ورود با رمز یکبار مصرف', + + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ); + }, controller.authType), + ], + ), + ), + ); + } + + Widget useAndPassFrom() { + return ObxValue((data) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Form( + key: data.value, + child: Column( + children: [ + ObxValue((phoneController) { + return TextFormField( + controller: controller.phoneNumberController.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'شماره موبایل', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffix: + phoneController.value.text.trim().isNotEmpty + ? clearButton(() { + phoneController.value.clear(); + phoneController.refresh(); + }) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + + maxLines: 1, + maxLength: 11, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + + data.refresh(); + phoneController.value.text = value; + } + phoneController.refresh(); + }, + textInputAction: TextInputAction.next, + validator: (value) { + if (value == null) { + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.phoneNumberController), + + SizedBox(height: 26), + + ObxValue((passwordController) { + return TextFormField( + controller: passwordController.value, + obscureText: controller.hidePassword.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'رمز عبور', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + suffix: + passwordController.value.text.trim().isNotEmpty + ? GestureDetector( + onTap: () { + controller.hidePassword.value = + !controller.hidePassword.value; + }, + child: Icon( + controller.hidePassword.value + ? CupertinoIcons.eye + : CupertinoIcons.eye_slash, + ), + ) + : null, + counterText: '', + ), + textInputAction: TextInputAction.done, + keyboardType: TextInputType.visiblePassword, + maxLines: 1, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + passwordController.value.text = value; + } + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.passwordController), + SizedBox(height: 26), + + CaptchaWidget(controller: controller.captchaController), + + SizedBox(height: 23), + RElevated( + text: 'ورود', + onPressed: () async { + Jalali? picked = await showPersianDatePicker( + context: Get.context!, + + initialDate: Jalali.now(), + firstDate: Jalali(1385, 8), + lastDate: Jalali(1450, 9), + initialEntryMode: PersianDatePickerEntryMode.calendarOnly, + initialDatePickerMode: PersianDatePickerMode.year, + ); + + if (data.value.currentState?.validate() == true && + controller.captchaController.validate()) {} + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKey); + } + + Widget otpForm() { + return ObxValue((status) { + switch (status.value) { + case OtpStatus.init: + return sendCodeForm(); + case OtpStatus.sent: + case OtpStatus.verified: + case OtpStatus.reSend: + return confirmCodeForm(); + } + }, controller.otpStatus); + } + + Widget sendCodeForm() { + return ObxValue((data) { + return Form( + key: data.value, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Column( + children: [ + SizedBox(height: 26), + ObxValue((phoneController) { + return TextFormField( + controller: phoneController.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'شماره موبایل', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + prefixIconConstraints: BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffix: + phoneController.value.text.trim().isNotEmpty + ? clearButton(() { + phoneController.value.clear(); + phoneController.refresh(); + }) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + maxLines: 1, + maxLength: 11, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + data.refresh(); + phoneController.value.text = value; + } + phoneController.refresh(); + }, + textInputAction: TextInputAction.next, + validator: (value) { + if (value == null) { + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.phoneOtpNumberController), + + SizedBox(height: 26), + + CaptchaWidget(controller: controller.captchaOtpController), + + SizedBox(height: 23), + RElevated( + text: 'ارسال رمز یکبار مصرف', + onPressed: () { + if (data.value.currentState?.validate() == true && + controller.captchaOtpController.validate()) { + controller.otpStatus.value = OtpStatus.sent; + controller.startTimer(); + } + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKeyOtp); + } + + Widget confirmCodeForm() { + return ObxValue((data) { + return Form( + key: data.value, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Column( + children: [ + SizedBox(height: 26), + + ObxValue((passwordController) { + return TextFormField( + controller: passwordController.value, + obscureText: controller.hidePassword.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'رمز عبور', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + suffix: + passwordController.value.text.trim().isNotEmpty + ? GestureDetector( + onTap: () { + controller.hidePassword.value = + !controller.hidePassword.value; + }, + child: Icon( + controller.hidePassword.value + ? CupertinoIcons.eye + : CupertinoIcons.eye_slash, + ), + ) + : null, + counterText: '', + ), + textInputAction: TextInputAction.done, + keyboardType: TextInputType.visiblePassword, + maxLines: 1, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + passwordController.value.text = value; + } + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.passwordController), + + SizedBox(height: 23), + + ObxValue((timer) { + if (timer.value == 0) { + return TextButton( + onPressed: () { + controller.otpStatus.value = OtpStatus.reSend; + controller.startTimer(); + }, + child: Text( + style: AppFonts.yekan13.copyWith( + color: AppColor.blueNormal, + ), + 'ارسال مجدد کد یکبار مصرف', + ), + ); + } else { + return Text( + 'اعتبار رمز ارسال شده ${controller.timeFormatted}', + style: AppFonts.yekan13, + ); + } + }, controller.secondsRemaining), + + RichText( + text: TextSpan( + children: [ + TextSpan( + text: ' کد ارسال شده به شماره ', + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + text: controller.phoneOtpNumberController.value.text, + style: AppFonts.yekan13Bold.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + recognizer: + TapGestureRecognizer() + ..onTap = () { + controller.otpStatus.value = OtpStatus.init; + controller.captchaOtpController.clear(); + }, + text: ' ویرایش', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + + SizedBox(height: 23), + RElevated( + text: 'ورود', + onPressed: () { + if (controller.formKeyOtp.value.currentState?.validate() == + true && + controller.captchaOtpController.validate()) {} + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKeySentOtp); + } + + Widget logoWidget() { + return Column( + children: [ + Row(), + Image.asset(Assets.imagesInnerSplash, width: 120, height: 120), + Text( + 'سامانه رصدیار', + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyNormal), + ), + ], + ); + } + + Widget clearButton(VoidCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Icon(CupertinoIcons.multiply_circle, size: 24), + ); + } +} diff --git a/packages/auth/lib/src/presentation/pages/splash/logic.dart b/packages/auth/lib/src/presentation/pages/splash/logic.dart new file mode 100644 index 0000000..7542f46 --- /dev/null +++ b/packages/auth/lib/src/presentation/pages/splash/logic.dart @@ -0,0 +1,68 @@ +import 'package:flutter/animation.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:inspection/inspection.dart'; + +class SplashLogic extends GetxController with GetTickerProviderStateMixin { + late final AnimationController scaleController; + late final AnimationController rotateController; + Rxn> scaleAnimation = Rxn(); + Rxn> rotationAnimation = Rxn(); + + @override + void onInit() { + super.onInit(); + scaleController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1500), + ); + + rotateController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 8000), + ); + + scaleAnimation.value = Tween( + begin: 0.8, + end: 1.2, + ).animate(scaleController); + + rotationAnimation.value = Tween( + begin: 0.0, + end: 1, + ).animate(rotateController); + + rotateController.forward(); + rotateController.addStatusListener((status) { + if (status == AnimationStatus.completed) { + rotateController.repeat(); + } else if (status == AnimationStatus.dismissed) { + rotateController.forward(); + } + }); + + scaleController.forward(); + scaleController.addStatusListener((status) { + if (status == AnimationStatus.completed) { + scaleController.reverse(); + } else if (status == AnimationStatus.dismissed) { + scaleController.forward(); + } + }); + } + + @override + void onReady() { + super.onReady(); + Future.delayed(const Duration(seconds: 1), () { + Get.offAllNamed(InspectionRoutes.inspection); + }); + } + + @override + void onClose() { + rotateController.dispose(); + scaleController.dispose(); + super.onClose(); + } +} diff --git a/packages/auth/lib/src/presentation/pages/splash/view.dart b/packages/auth/lib/src/presentation/pages/splash/view.dart new file mode 100644 index 0000000..bffd309 --- /dev/null +++ b/packages/auth/lib/src/presentation/pages/splash/view.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + + +import 'logic.dart'; + +class SplashPage extends GetView { + const SplashPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.blueDarker, + body: Center( + child: Stack( + alignment: Alignment.center, + children: [ + ObxValue((data) { + return ScaleTransition( + scale: data.value!, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 1), + child: Image.asset( + Assets.imagesInnerSplash, + width: 190, + height: 190, + ), + ), + ); + }, controller.scaleAnimation), + + ObxValue((data) { + return RotationTransition( + turns: data.value!, + + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 1), + child: Image.asset(Assets.imagesOutterSplash), + ), + ); + }, controller.rotationAnimation), + ], + ), + ), + ); + } +} diff --git a/packages/auth/lib/src/presentation/pages/system_design/system_design.dart b/packages/auth/lib/src/presentation/pages/system_design/system_design.dart new file mode 100644 index 0000000..f53eb75 --- /dev/null +++ b/packages/auth/lib/src/presentation/pages/system_design/system_design.dart @@ -0,0 +1,255 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + + +class SystemDesignPage extends StatefulWidget { + const SystemDesignPage({super.key}); + + @override + State createState() => _SystemDesignPageState(); +} + +class _SystemDesignPageState extends State { + List _isOpen = [false, false, false, false, false, false]; + + void _handleAdd() { + print("Add FAB pressed"); + } + + void _handleEdit() { + print("Edit FAB pressed"); + } + + void _handleDelete() { + print("Delete FAB pressed"); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("System design"), centerTitle: true), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: ExpansionPanelList( + expansionCallback: (panelIndex, isExpanded) { + setState(() { + _isOpen[panelIndex] = isExpanded; + }); + }, + children: [ + buttonWidget(), + fabWidget(), + outlinedFabWidget(), + paginationWidget(), + tabWidget(), + inputsWidget(), + ], + ), + ), + ), + ); + } + + ExpansionPanel inputsWidget() { + return ExpansionPanel( + isExpanded: _isOpen[5], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "inputs", + style: AppFonts.yekan20.copyWith(color: Colors.red), + ), + ); + }, + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + spacing: 14, + children: [ + RTextField( + hintText: 'حجم کشتار را در روز به قطعه وارد کنید', + hintStyle: AppFonts.yekan13, + ), + RTextField( + label: 'تلفن مرغداری', + labelStyle: AppFonts.yekan10, + ), + ], + ), + ), + ); + } + + ExpansionPanel tabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[4], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "tab", + style: AppFonts.yekan20.copyWith(color: Colors.red), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + CupertinoSegmentedControlDemo(), + CupertinoSegmentedControlDemo2(), + ], + ), + ); + } + + ExpansionPanel paginationWidget() { + return ExpansionPanel( + isExpanded: _isOpen[3], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "پیجینیشن", + style: AppFonts.yekan20.copyWith(color: Colors.red), + ), + ); + }, + body: Column(spacing: 14, children: [RShowMore(), PaginationFromUntil()]), + ); + } + + ExpansionPanel outlinedFabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[2], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "Outlined Fab ", + style: AppFonts.yekan20.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), +/* + RFabOutlined.smallAdd(onPressed: () {}), + RFabOutlined.smallAdd(onPressed: null), + + RFabOutlined.smallAddNoBorder(onPressed: () {}), + RFabOutlined.smallAddNoBorder(onPressed: null), + + RFabOutlined.add(onPressed: () {}), + RFabOutlined.add(onPressed: null), + + RFabOutlined.addNoBorder(onPressed: () {}), + RFabOutlined.addNoBorder(onPressed: null),*/ + ], + ), + ); + } + + ExpansionPanel fabWidget() { + return ExpansionPanel( + isExpanded: _isOpen[1], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "Fab", + style: AppFonts.yekan20.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + /* RFab.smallAdd(onPressed: () {}), + RFab.smallAdd(onPressed: null), + + RFab.add(onPressed: () {}), + RFab.add(onPressed: null), + + RFab.smallEdit(onPressed: null), + RFab.smallEdit(onPressed: () {}), + + RFab.edit(onPressed: () {}), + RFab.edit(onPressed: null), + + RFab.smallDelete(onPressed: () {}), + RFab.smallDelete(onPressed: null), + + RFab.delete(onPressed: () {}), + RFab.delete(onPressed: null), + + RFab.smallAction(onPressed: () {}), + RFab.smallAction(onPressed: null), + + RFab.action(onPressed: () {}), + RFab.action(onPressed: null), + + RFab.smallFilter(onPressed: () {}), + RFab.smallFilter(onPressed: null), + + RFab.filter(onPressed: () {}), + RFab.filter(onPressed: null), + + RFab.smallDownload(onPressed: () {}), + RFab.smallDownload(onPressed: null), + + RFab.download(onPressed: () {}), + RFab.download(onPressed: null), + + RFab.smallExcel(onPressed: () {}), + RFab.smallExcel(onPressed: null), + + RFab.excel(onPressed: () {}), + RFab.excel(onPressed: null), + + RFab.smallBack(onPressed: () {}), + RFab.smallBack(onPressed: null), + + RFab.back(onPressed: () {}), + RFab.back(onPressed: null),*/ + ], + ), + ); + } + + ExpansionPanel buttonWidget() { + return ExpansionPanel( + isExpanded: _isOpen[0], + headerBuilder: (context, isExpanded) { + return ListTile( + title: Text( + "دکمه ها", + style: AppFonts.yekan20.copyWith(color: Colors.green), + ), + ); + }, + body: Column( + spacing: 14, + children: [ + Row(), + + RElevated(text: 'ثبت', onPressed: () {}), + + RElevated(text: 'ثبت', onPressed: null), + + ROutlinedElevated(text: 'ثبت', onPressed: () {}), + ROutlinedElevated( + text: 'ثبتwwww', + onPressed: () {}, + backgroundColor: AppColor.blueNormal.disabledColor, + pressedBackgroundColor: AppColor.blueNormal, + ), + ROutlinedElevated(text: 'ثبت', onPressed: null), + + RTextButton(text: 'ثبت', onPressed: () {}), + RTextButton(text: 'ثبت', onPressed: null), + ], + ), + ); + } +} diff --git a/packages/auth/lib/src/presentation/routes/app_pages.dart b/packages/auth/lib/src/presentation/routes/app_pages.dart new file mode 100644 index 0000000..4247cb5 --- /dev/null +++ b/packages/auth/lib/src/presentation/routes/app_pages.dart @@ -0,0 +1,20 @@ +import 'package:get/get.dart'; +import 'package:inspection/presentation/routes/app_pages.dart'; +import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logic.dart'; +import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; +import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; +import 'package:rasadyar_app/presentation/pages/splash/view.dart'; +import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; + +part 'app_paths.dart'; + +sealed class AppPages { + AppPages._(); + + static const String initRoutes = AppPaths.splash; + static const String initDesignSystem = AppPaths.systemDesignPage; + + static List pages = [ + + ]; +} diff --git a/packages/auth/lib/src/presentation/routes/app_paths.dart b/packages/auth/lib/src/presentation/routes/app_paths.dart new file mode 100644 index 0000000..f6fde78 --- /dev/null +++ b/packages/auth/lib/src/presentation/routes/app_paths.dart @@ -0,0 +1,10 @@ +part of 'app_pages.dart'; + +sealed class AppPaths { + AppPaths._(); + + static const String splash = '/splash'; + static const String authWithUserAndPass = '/authWithUserAndPass'; + static const String authWithOtp = '/authWithOtp'; + static const String systemDesignPage = '/systemDesignPage'; +} diff --git a/tools/package_builder.sh b/tools/package_builder.sh new file mode 100644 index 0000000..c1a8bb6 --- /dev/null +++ b/tools/package_builder.sh @@ -0,0 +1,2 @@ +#!/bin/bash +dart create --template=package ../packages/auth \ No newline at end of file From 8cc4a7517c8db8d58d89639200f5567583345769 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 10 May 2025 12:17:08 +0330 Subject: [PATCH 048/256] feat : auth package --- devtools_options.yaml | 3 ++ packages/auth/.gitignore | 7 +++++ packages/auth/CHANGELOG.md | 3 ++ packages/auth/README.md | 39 +++++++++++++++++++++++++ packages/auth/analysis_options.yaml | 30 +++++++++++++++++++ packages/auth/example/auth_example.dart | 5 ++++ packages/auth/lib/auth.dart | 5 ++++ packages/auth/pubspec.yaml | 15 ++++++++++ packages/auth/test/auth_test.dart | 8 +++++ 9 files changed, 115 insertions(+) create mode 100644 devtools_options.yaml create mode 100644 packages/auth/.gitignore create mode 100644 packages/auth/CHANGELOG.md create mode 100644 packages/auth/README.md create mode 100644 packages/auth/analysis_options.yaml create mode 100644 packages/auth/example/auth_example.dart create mode 100644 packages/auth/lib/auth.dart create mode 100644 packages/auth/pubspec.yaml create mode 100644 packages/auth/test/auth_test.dart diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/packages/auth/.gitignore b/packages/auth/.gitignore new file mode 100644 index 0000000..3cceda5 --- /dev/null +++ b/packages/auth/.gitignore @@ -0,0 +1,7 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ + +# Avoid committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md new file mode 100644 index 0000000..effe43c --- /dev/null +++ b/packages/auth/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/packages/auth/README.md b/packages/auth/README.md new file mode 100644 index 0000000..8831761 --- /dev/null +++ b/packages/auth/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/auth/analysis_options.yaml b/packages/auth/analysis_options.yaml new file mode 100644 index 0000000..dee8927 --- /dev/null +++ b/packages/auth/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/packages/auth/example/auth_example.dart b/packages/auth/example/auth_example.dart new file mode 100644 index 0000000..9733c86 --- /dev/null +++ b/packages/auth/example/auth_example.dart @@ -0,0 +1,5 @@ +import 'package:auth/auth.dart'; + +void main() { + +} diff --git a/packages/auth/lib/auth.dart b/packages/auth/lib/auth.dart new file mode 100644 index 0000000..34f09d1 --- /dev/null +++ b/packages/auth/lib/auth.dart @@ -0,0 +1,5 @@ +/// Support for doing something awesome. +/// +/// More dartdocs go here. +library; + diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml new file mode 100644 index 0000000..2179965 --- /dev/null +++ b/packages/auth/pubspec.yaml @@ -0,0 +1,15 @@ +name: auth +description: A starting point for Dart libraries or applications. +version: 1.0.0 +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.7.2 + +# Add regular dependencies here. +dependencies: + # path: ^1.8.0 + +dev_dependencies: + lints: ^5.0.0 + test: ^1.24.0 diff --git a/packages/auth/test/auth_test.dart b/packages/auth/test/auth_test.dart new file mode 100644 index 0000000..12ebb82 --- /dev/null +++ b/packages/auth/test/auth_test.dart @@ -0,0 +1,8 @@ +import 'package:auth/auth.dart'; +import 'package:test/test.dart'; + +void main() { + group('A group of tests', () { + + }); +} From 9ec761e6eb54e8f24f633e1e868cf8295847ceca Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 11 May 2025 11:49:51 +0330 Subject: [PATCH 049/256] feat : auth package --- .../local_storage/hive/hive_provider.dart | 12 - .../local_storage/hive/hive_types.dart | 1 - .../i_local_storage_provider.dart | 3 - .../user/user_local_storage.dart | 19 -- lib/data/model/user/user_model.dart | 17 -- .../repository/user/user_repository.dart | 17 -- lib/domain/service/user/user_service.dart | 17 -- lib/main.dart | 7 +- .../dto/auth_response/auth_response_dto.dart | 23 ++ .../login_request/login_request_model.dart | 21 ++ .../login_request_model.freezed.dart | 157 +++++++++++ .../login_request/login_request_model.g.dart | 23 ++ .../models/user_local/user_local_model.dart | 41 +++ .../domain/entity/auth_response_entity.dart | 12 + .../domain/repositories/auth_repository.dart | 7 + .../{auth_with_use_and_pass => }/logic.dart | 2 +- .../{auth_with_use_and_pass => }/view.dart | 6 +- .../src/presentation/pages/splash/logic.dart | 68 ----- .../src/presentation/pages/splash/view.dart | 47 ---- .../pages/system_design/system_design.dart | 255 ------------------ packages/auth/pubspec.yaml | 20 +- packages/core/lib/core.dart | 8 + packages/core/lib/data/utils.dart | 12 +- .../local/hive_local_storage.dart | 61 +++++ .../infrastructure/local/i_local_storage.dart | 11 + .../infrastructure/remote/dio_form_data.dart | 23 ++ .../lib/infrastructure/remote/dio_remote.dart | 126 +++++++++ .../infrastructure/remote/dio_response.dart | 21 ++ .../remote/interfaces/i_form_data.dart | 6 + .../remote/interfaces/i_http_client.dart | 51 ++++ .../remote/interfaces/i_http_response.dart | 6 + .../remote/interfaces/i_remote.dart | 4 + packages/core/pubspec.lock | 24 ++ packages/core/pubspec.yaml | 12 +- 34 files changed, 665 insertions(+), 475 deletions(-) delete mode 100644 lib/data/data_provider/local_storage/hive/hive_provider.dart delete mode 100644 lib/data/data_provider/local_storage/hive/hive_types.dart delete mode 100644 lib/data/data_provider/local_storage/i_local_storage_provider.dart delete mode 100644 lib/data/data_source/local_storage/user/user_local_storage.dart delete mode 100644 lib/data/model/user/user_model.dart delete mode 100644 lib/domain/repository/user/user_repository.dart delete mode 100644 lib/domain/service/user/user_service.dart create mode 100644 packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart create mode 100644 packages/auth/lib/src/data/models/login_request/login_request_model.dart create mode 100644 packages/auth/lib/src/data/models/login_request/login_request_model.freezed.dart create mode 100644 packages/auth/lib/src/data/models/login_request/login_request_model.g.dart create mode 100644 packages/auth/lib/src/data/models/user_local/user_local_model.dart create mode 100644 packages/auth/lib/src/domain/entity/auth_response_entity.dart create mode 100644 packages/auth/lib/src/domain/repositories/auth_repository.dart rename packages/auth/lib/src/presentation/pages/auth/{auth_with_use_and_pass => }/logic.dart (97%) rename packages/auth/lib/src/presentation/pages/auth/{auth_with_use_and_pass => }/view.dart (99%) delete mode 100644 packages/auth/lib/src/presentation/pages/splash/logic.dart delete mode 100644 packages/auth/lib/src/presentation/pages/splash/view.dart delete mode 100644 packages/auth/lib/src/presentation/pages/system_design/system_design.dart create mode 100644 packages/core/lib/infrastructure/local/hive_local_storage.dart create mode 100644 packages/core/lib/infrastructure/local/i_local_storage.dart create mode 100644 packages/core/lib/infrastructure/remote/dio_form_data.dart create mode 100644 packages/core/lib/infrastructure/remote/dio_remote.dart create mode 100644 packages/core/lib/infrastructure/remote/dio_response.dart create mode 100644 packages/core/lib/infrastructure/remote/interfaces/i_form_data.dart create mode 100644 packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart create mode 100644 packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart create mode 100644 packages/core/lib/infrastructure/remote/interfaces/i_remote.dart diff --git a/lib/data/data_provider/local_storage/hive/hive_provider.dart b/lib/data/data_provider/local_storage/hive/hive_provider.dart deleted file mode 100644 index c97f027..0000000 --- a/lib/data/data_provider/local_storage/hive/hive_provider.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:hive_ce_flutter/hive_flutter.dart'; -import 'package:rasadyar_app/data/data_provider/local_storage/i_local_storage_provider.dart'; - - -enum HiveBoxNames { user, settings, auth } - -class HiveProvider extends ILocalStorageProvider { - @override - Future init() async { - await Hive.initFlutter(); - } -} diff --git a/lib/data/data_provider/local_storage/hive/hive_types.dart b/lib/data/data_provider/local_storage/hive/hive_types.dart deleted file mode 100644 index eff0bf2..0000000 --- a/lib/data/data_provider/local_storage/hive/hive_types.dart +++ /dev/null @@ -1 +0,0 @@ -const int userTypeId = 0; diff --git a/lib/data/data_provider/local_storage/i_local_storage_provider.dart b/lib/data/data_provider/local_storage/i_local_storage_provider.dart deleted file mode 100644 index 2ccacf8..0000000 --- a/lib/data/data_provider/local_storage/i_local_storage_provider.dart +++ /dev/null @@ -1,3 +0,0 @@ -abstract class ILocalStorageProvider { - Future init(); -} diff --git a/lib/data/data_source/local_storage/user/user_local_storage.dart b/lib/data/data_source/local_storage/user/user_local_storage.dart deleted file mode 100644 index 0648a2d..0000000 --- a/lib/data/data_source/local_storage/user/user_local_storage.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:hive_ce_flutter/hive_flutter.dart'; -import 'package:rasadyar_app/data/data_provider/local_storage/hive/hive_provider.dart'; - -abstract class IUserLocalStorage { - Future userAuthed(); -} - -class UserLocalStorage extends IUserLocalStorage { - final user = Hive.box(HiveBoxNames.user.name); - - @override - Future userAuthed() async { - if (user.isNotEmpty ) { - return true; - } else { - return false; - } - } -} diff --git a/lib/data/model/user/user_model.dart b/lib/data/model/user/user_model.dart deleted file mode 100644 index 37f2b3b..0000000 --- a/lib/data/model/user/user_model.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:hive_ce/hive.dart'; - -import '../../data_provider/local_storage/hive/hive_types.dart'; - - -part 'user_model.g.dart'; - -@HiveType(typeId: userTypeId) -class UserModel extends HiveObject{ - @HiveField(0) - String? token; - - @HiveField(1) - String? refreshToken; - - UserModel({this.token, this.refreshToken}); -} diff --git a/lib/domain/repository/user/user_repository.dart b/lib/domain/repository/user/user_repository.dart deleted file mode 100644 index 3f90c41..0000000 --- a/lib/domain/repository/user/user_repository.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:rasadyar_app/data/data_source/local_storage/user/user_local_storage.dart'; - -abstract class IUserRepository { - Future userAuthed(); - -} - -class UserRepository implements IUserRepository { - final IUserLocalStorage _userLocalStorage; - - UserRepository(this._userLocalStorage); - - @override - Future userAuthed() async { - return await _userLocalStorage.userAuthed(); - } -} diff --git a/lib/domain/service/user/user_service.dart b/lib/domain/service/user/user_service.dart deleted file mode 100644 index 3c4b464..0000000 --- a/lib/domain/service/user/user_service.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:get/get.dart'; -import 'package:rasadyar_app/domain/repository/user/user_repository.dart'; -import 'package:rasadyar_app/infrastructure/di/di.dart'; - -class UserService extends GetxService { - late IUserRepository _userLocalStorage; - - @override - void onInit() { - return super.onInit(); - // _userLocalStorage = di.get(); - } - - Future isUserAuthed() async { - return await _userLocalStorage.userAuthed(); - } -} diff --git a/lib/main.dart b/lib/main.dart index 4eeebaa..148e4fe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,15 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_app/domain/service/user/user_service.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/infrastructure/di/di.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - setupInjection(); - await setupAllProvider(); - runApp(MyApp()); // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); } @@ -46,7 +41,7 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal), ), initialRoute: AppPages.initRoutes, - initialBinding: BindingsBuilder.put(() => UserService()), + // initialBinding: BindingsBuilder.put(() => UserService()), getPages: AppPages.pages, locale: const Locale("fa", "IR"), supportedLocales: const [ diff --git a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart new file mode 100644 index 0000000..1f259f5 --- /dev/null +++ b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart @@ -0,0 +1,23 @@ +import 'package:auth/src/domain/entity/auth_response_entity.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'auth_response_dto.freezed.dart'; +part 'auth_response_dto.g.dart'; + +@freezed +abstract class AuthResponseDto with _$AuthResponseDto { + const factory AuthResponseDto({ + String? refresh, + String? access, + @JsonKey(name: 'otp_status') bool? otpStatus, + }) = _AuthResponseDto; + + factory AuthResponseDto.fromJson(Map json) => + _$AuthResponseDtoFromJson(json); + + AuthResponseEntity toEntity() => AuthResponseEntity( + access: access, + otpStatus: otpStatus, + refresh: refresh, + ); +} diff --git a/packages/auth/lib/src/data/models/login_request/login_request_model.dart b/packages/auth/lib/src/data/models/login_request/login_request_model.dart new file mode 100644 index 0000000..0e4791c --- /dev/null +++ b/packages/auth/lib/src/data/models/login_request/login_request_model.dart @@ -0,0 +1,21 @@ +import 'package:rasadyar_core/core.dart'; + +part 'login_request_model.freezed.dart'; +part 'login_request_model.g.dart'; + +@freezed +abstract class LoginRequestModel with _$LoginRequestModel { + const factory LoginRequestModel({ + required String username, + required String password, + required String captchaCode, + required String captchaKey, + }) = _LoginRequestModel; + + factory LoginRequestModel.fromJson(Map json) => + _$LoginRequestModelFromJson(json); + + const LoginRequestModel._(); + + String get formattedCaptchaKey => 'rest_captcha_$captchaKey.0'; +} diff --git a/packages/auth/lib/src/data/models/login_request/login_request_model.freezed.dart b/packages/auth/lib/src/data/models/login_request/login_request_model.freezed.dart new file mode 100644 index 0000000..bf3b549 --- /dev/null +++ b/packages/auth/lib/src/data/models/login_request/login_request_model.freezed.dart @@ -0,0 +1,157 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'login_request_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$LoginRequestModel { + + String get username; String get password; String get captchaCode; String get captchaKey; +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LoginRequestModelCopyWith get copyWith => _$LoginRequestModelCopyWithImpl(this as LoginRequestModel, _$identity); + + /// Serializes this LoginRequestModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)&&(identical(other.captchaCode, captchaCode) || other.captchaCode == captchaCode)&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,username,password,captchaCode,captchaKey); + +@override +String toString() { + return 'LoginRequestModel(username: $username, password: $password, captchaCode: $captchaCode, captchaKey: $captchaKey)'; +} + + +} + +/// @nodoc +abstract mixin class $LoginRequestModelCopyWith<$Res> { + factory $LoginRequestModelCopyWith(LoginRequestModel value, $Res Function(LoginRequestModel) _then) = _$LoginRequestModelCopyWithImpl; +@useResult +$Res call({ + String username, String password, String captchaCode, String captchaKey +}); + + + + +} +/// @nodoc +class _$LoginRequestModelCopyWithImpl<$Res> + implements $LoginRequestModelCopyWith<$Res> { + _$LoginRequestModelCopyWithImpl(this._self, this._then); + + final LoginRequestModel _self; + final $Res Function(LoginRequestModel) _then; + +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? username = null,Object? password = null,Object? captchaCode = null,Object? captchaKey = null,}) { + return _then(_self.copyWith( +username: null == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String,captchaCode: null == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable +as String,captchaKey: null == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _LoginRequestModel extends LoginRequestModel { + const _LoginRequestModel({required this.username, required this.password, required this.captchaCode, required this.captchaKey}): super._(); + factory _LoginRequestModel.fromJson(Map json) => _$LoginRequestModelFromJson(json); + +@override final String username; +@override final String password; +@override final String captchaCode; +@override final String captchaKey; + +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$LoginRequestModelCopyWith<_LoginRequestModel> get copyWith => __$LoginRequestModelCopyWithImpl<_LoginRequestModel>(this, _$identity); + +@override +Map toJson() { + return _$LoginRequestModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _LoginRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)&&(identical(other.captchaCode, captchaCode) || other.captchaCode == captchaCode)&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,username,password,captchaCode,captchaKey); + +@override +String toString() { + return 'LoginRequestModel(username: $username, password: $password, captchaCode: $captchaCode, captchaKey: $captchaKey)'; +} + + +} + +/// @nodoc +abstract mixin class _$LoginRequestModelCopyWith<$Res> implements $LoginRequestModelCopyWith<$Res> { + factory _$LoginRequestModelCopyWith(_LoginRequestModel value, $Res Function(_LoginRequestModel) _then) = __$LoginRequestModelCopyWithImpl; +@override @useResult +$Res call({ + String username, String password, String captchaCode, String captchaKey +}); + + + + +} +/// @nodoc +class __$LoginRequestModelCopyWithImpl<$Res> + implements _$LoginRequestModelCopyWith<$Res> { + __$LoginRequestModelCopyWithImpl(this._self, this._then); + + final _LoginRequestModel _self; + final $Res Function(_LoginRequestModel) _then; + +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? username = null,Object? password = null,Object? captchaCode = null,Object? captchaKey = null,}) { + return _then(_LoginRequestModel( +username: null == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String,captchaCode: null == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable +as String,captchaKey: null == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +// dart format on diff --git a/packages/auth/lib/src/data/models/login_request/login_request_model.g.dart b/packages/auth/lib/src/data/models/login_request/login_request_model.g.dart new file mode 100644 index 0000000..e92c1b4 --- /dev/null +++ b/packages/auth/lib/src/data/models/login_request/login_request_model.g.dart @@ -0,0 +1,23 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'login_request_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_LoginRequestModel _$LoginRequestModelFromJson(Map json) => + _LoginRequestModel( + username: json['username'] as String, + password: json['password'] as String, + captchaCode: json['captchaCode'] as String, + captchaKey: json['captchaKey'] as String, + ); + +Map _$LoginRequestModelToJson(_LoginRequestModel instance) => + { + 'username': instance.username, + 'password': instance.password, + 'captchaCode': instance.captchaCode, + 'captchaKey': instance.captchaKey, + }; diff --git a/packages/auth/lib/src/data/models/user_local/user_local_model.dart b/packages/auth/lib/src/data/models/user_local/user_local_model.dart new file mode 100644 index 0000000..403f762 --- /dev/null +++ b/packages/auth/lib/src/data/models/user_local/user_local_model.dart @@ -0,0 +1,41 @@ +import 'package:rasadyar_core/core.dart'; + +part 'user_local_model.g.dart'; + +@HiveType(typeId: 0) +class UserLocalModel extends HiveObject { + @HiveField(0) + String? username; + @HiveField(1) + String? password; + @HiveField(2) + String? token; + @HiveField(3) + String? refreshToken; + @HiveField(4) + String? name; + + UserLocalModel({ + this.username, + this.password, + this.token, + this.refreshToken, + this.name, + }); + + UserLocalModel copyWith({ + String? username, + String? password, + String? token, + String? refreshToken, + String? name, + }) { + return UserLocalModel( + username: username ?? this.username, + password: password ?? this.password, + token: token ?? this.token, + refreshToken: refreshToken ?? this.refreshToken, + name: name ?? this.name, + ); + } +} diff --git a/packages/auth/lib/src/domain/entity/auth_response_entity.dart b/packages/auth/lib/src/domain/entity/auth_response_entity.dart new file mode 100644 index 0000000..a2cf7a9 --- /dev/null +++ b/packages/auth/lib/src/domain/entity/auth_response_entity.dart @@ -0,0 +1,12 @@ +class AuthResponseEntity { + final String? access; + final String? refresh; + final bool? otpStatus; + + AuthResponseEntity({this.access, this.refresh, this.otpStatus}); + + @override + String toString() { + return 'AuthResponseEntity{accessToken: $access, refreshToken: $refresh, expiresIn: $otpStatus}'; + } +} diff --git a/packages/auth/lib/src/domain/repositories/auth_repository.dart b/packages/auth/lib/src/domain/repositories/auth_repository.dart new file mode 100644 index 0000000..1d7748c --- /dev/null +++ b/packages/auth/lib/src/domain/repositories/auth_repository.dart @@ -0,0 +1,7 @@ +import 'package:auth/src/domain/entity/auth_response_entity.dart'; + +abstract class AuthRepository { + Future signIn({ + required Map authRequest, + }); +} diff --git a/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/logic.dart b/packages/auth/lib/src/presentation/pages/auth/logic.dart similarity index 97% rename from packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/logic.dart rename to packages/auth/lib/src/presentation/pages/auth/logic.dart index 580413d..505e224 100644 --- a/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/logic.dart +++ b/packages/auth/lib/src/presentation/pages/auth/logic.dart @@ -9,7 +9,7 @@ enum AuthStatus { init } enum OtpStatus { init, sent, verified, reSend } -class AuthWithUseAndPassLogic extends GetxController { +class AuthLogic extends GetxController { Rx> formKey = GlobalKey().obs; Rx> formKeyOtp = GlobalKey().obs; Rx> formKeySentOtp = GlobalKey().obs; diff --git a/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/view.dart b/packages/auth/lib/src/presentation/pages/auth/view.dart similarity index 99% rename from packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/view.dart rename to packages/auth/lib/src/presentation/pages/auth/view.dart index f6cd2d7..6bb6af6 100644 --- a/packages/auth/lib/src/presentation/pages/auth/auth_with_use_and_pass/view.dart +++ b/packages/auth/lib/src/presentation/pages/auth/view.dart @@ -5,8 +5,10 @@ import 'package:rasadyar_core/core.dart'; import 'logic.dart'; -class AuthWithUseAndPassPage extends GetView { - const AuthWithUseAndPassPage({super.key}); + + +class AuthPage extends GetView { + const AuthPage({super.key}); @override Widget build(BuildContext context) { diff --git a/packages/auth/lib/src/presentation/pages/splash/logic.dart b/packages/auth/lib/src/presentation/pages/splash/logic.dart deleted file mode 100644 index 7542f46..0000000 --- a/packages/auth/lib/src/presentation/pages/splash/logic.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/animation.dart'; -import 'package:get/get.dart'; -import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import 'package:inspection/inspection.dart'; - -class SplashLogic extends GetxController with GetTickerProviderStateMixin { - late final AnimationController scaleController; - late final AnimationController rotateController; - Rxn> scaleAnimation = Rxn(); - Rxn> rotationAnimation = Rxn(); - - @override - void onInit() { - super.onInit(); - scaleController = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 1500), - ); - - rotateController = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 8000), - ); - - scaleAnimation.value = Tween( - begin: 0.8, - end: 1.2, - ).animate(scaleController); - - rotationAnimation.value = Tween( - begin: 0.0, - end: 1, - ).animate(rotateController); - - rotateController.forward(); - rotateController.addStatusListener((status) { - if (status == AnimationStatus.completed) { - rotateController.repeat(); - } else if (status == AnimationStatus.dismissed) { - rotateController.forward(); - } - }); - - scaleController.forward(); - scaleController.addStatusListener((status) { - if (status == AnimationStatus.completed) { - scaleController.reverse(); - } else if (status == AnimationStatus.dismissed) { - scaleController.forward(); - } - }); - } - - @override - void onReady() { - super.onReady(); - Future.delayed(const Duration(seconds: 1), () { - Get.offAllNamed(InspectionRoutes.inspection); - }); - } - - @override - void onClose() { - rotateController.dispose(); - scaleController.dispose(); - super.onClose(); - } -} diff --git a/packages/auth/lib/src/presentation/pages/splash/view.dart b/packages/auth/lib/src/presentation/pages/splash/view.dart deleted file mode 100644 index bffd309..0000000 --- a/packages/auth/lib/src/presentation/pages/splash/view.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - - -import 'logic.dart'; - -class SplashPage extends GetView { - const SplashPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColor.blueDarker, - body: Center( - child: Stack( - alignment: Alignment.center, - children: [ - ObxValue((data) { - return ScaleTransition( - scale: data.value!, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 1), - child: Image.asset( - Assets.imagesInnerSplash, - width: 190, - height: 190, - ), - ), - ); - }, controller.scaleAnimation), - - ObxValue((data) { - return RotationTransition( - turns: data.value!, - - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 1), - child: Image.asset(Assets.imagesOutterSplash), - ), - ); - }, controller.rotationAnimation), - ], - ), - ), - ); - } -} diff --git a/packages/auth/lib/src/presentation/pages/system_design/system_design.dart b/packages/auth/lib/src/presentation/pages/system_design/system_design.dart deleted file mode 100644 index f53eb75..0000000 --- a/packages/auth/lib/src/presentation/pages/system_design/system_design.dart +++ /dev/null @@ -1,255 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - - -class SystemDesignPage extends StatefulWidget { - const SystemDesignPage({super.key}); - - @override - State createState() => _SystemDesignPageState(); -} - -class _SystemDesignPageState extends State { - List _isOpen = [false, false, false, false, false, false]; - - void _handleAdd() { - print("Add FAB pressed"); - } - - void _handleEdit() { - print("Edit FAB pressed"); - } - - void _handleDelete() { - print("Delete FAB pressed"); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text("System design"), centerTitle: true), - body: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: ExpansionPanelList( - expansionCallback: (panelIndex, isExpanded) { - setState(() { - _isOpen[panelIndex] = isExpanded; - }); - }, - children: [ - buttonWidget(), - fabWidget(), - outlinedFabWidget(), - paginationWidget(), - tabWidget(), - inputsWidget(), - ], - ), - ), - ), - ); - } - - ExpansionPanel inputsWidget() { - return ExpansionPanel( - isExpanded: _isOpen[5], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "inputs", - style: AppFonts.yekan20.copyWith(color: Colors.red), - ), - ); - }, - body: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - spacing: 14, - children: [ - RTextField( - hintText: 'حجم کشتار را در روز به قطعه وارد کنید', - hintStyle: AppFonts.yekan13, - ), - RTextField( - label: 'تلفن مرغداری', - labelStyle: AppFonts.yekan10, - ), - ], - ), - ), - ); - } - - ExpansionPanel tabWidget() { - return ExpansionPanel( - isExpanded: _isOpen[4], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "tab", - style: AppFonts.yekan20.copyWith(color: Colors.red), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - CupertinoSegmentedControlDemo(), - CupertinoSegmentedControlDemo2(), - ], - ), - ); - } - - ExpansionPanel paginationWidget() { - return ExpansionPanel( - isExpanded: _isOpen[3], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "پیجینیشن", - style: AppFonts.yekan20.copyWith(color: Colors.red), - ), - ); - }, - body: Column(spacing: 14, children: [RShowMore(), PaginationFromUntil()]), - ); - } - - ExpansionPanel outlinedFabWidget() { - return ExpansionPanel( - isExpanded: _isOpen[2], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "Outlined Fab ", - style: AppFonts.yekan20.copyWith(color: Colors.green), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - Row(), -/* - RFabOutlined.smallAdd(onPressed: () {}), - RFabOutlined.smallAdd(onPressed: null), - - RFabOutlined.smallAddNoBorder(onPressed: () {}), - RFabOutlined.smallAddNoBorder(onPressed: null), - - RFabOutlined.add(onPressed: () {}), - RFabOutlined.add(onPressed: null), - - RFabOutlined.addNoBorder(onPressed: () {}), - RFabOutlined.addNoBorder(onPressed: null),*/ - ], - ), - ); - } - - ExpansionPanel fabWidget() { - return ExpansionPanel( - isExpanded: _isOpen[1], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "Fab", - style: AppFonts.yekan20.copyWith(color: Colors.green), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - Row(), - - /* RFab.smallAdd(onPressed: () {}), - RFab.smallAdd(onPressed: null), - - RFab.add(onPressed: () {}), - RFab.add(onPressed: null), - - RFab.smallEdit(onPressed: null), - RFab.smallEdit(onPressed: () {}), - - RFab.edit(onPressed: () {}), - RFab.edit(onPressed: null), - - RFab.smallDelete(onPressed: () {}), - RFab.smallDelete(onPressed: null), - - RFab.delete(onPressed: () {}), - RFab.delete(onPressed: null), - - RFab.smallAction(onPressed: () {}), - RFab.smallAction(onPressed: null), - - RFab.action(onPressed: () {}), - RFab.action(onPressed: null), - - RFab.smallFilter(onPressed: () {}), - RFab.smallFilter(onPressed: null), - - RFab.filter(onPressed: () {}), - RFab.filter(onPressed: null), - - RFab.smallDownload(onPressed: () {}), - RFab.smallDownload(onPressed: null), - - RFab.download(onPressed: () {}), - RFab.download(onPressed: null), - - RFab.smallExcel(onPressed: () {}), - RFab.smallExcel(onPressed: null), - - RFab.excel(onPressed: () {}), - RFab.excel(onPressed: null), - - RFab.smallBack(onPressed: () {}), - RFab.smallBack(onPressed: null), - - RFab.back(onPressed: () {}), - RFab.back(onPressed: null),*/ - ], - ), - ); - } - - ExpansionPanel buttonWidget() { - return ExpansionPanel( - isExpanded: _isOpen[0], - headerBuilder: (context, isExpanded) { - return ListTile( - title: Text( - "دکمه ها", - style: AppFonts.yekan20.copyWith(color: Colors.green), - ), - ); - }, - body: Column( - spacing: 14, - children: [ - Row(), - - RElevated(text: 'ثبت', onPressed: () {}), - - RElevated(text: 'ثبت', onPressed: null), - - ROutlinedElevated(text: 'ثبت', onPressed: () {}), - ROutlinedElevated( - text: 'ثبتwwww', - onPressed: () {}, - backgroundColor: AppColor.blueNormal.disabledColor, - pressedBackgroundColor: AppColor.blueNormal, - ), - ROutlinedElevated(text: 'ثبت', onPressed: null), - - RTextButton(text: 'ثبت', onPressed: () {}), - RTextButton(text: 'ثبت', onPressed: null), - ], - ), - ); - } -} diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml index 2179965..e6f65ab 100644 --- a/packages/auth/pubspec.yaml +++ b/packages/auth/pubspec.yaml @@ -1,15 +1,33 @@ name: auth description: A starting point for Dart libraries or applications. +publish_to: 'none' version: 1.0.0 + # repository: https://github.com/my_org/my_repo environment: sdk: ^3.7.2 -# Add regular dependencies here. dependencies: # path: ^1.8.0 + rasadyar_core: + path: ../core dev_dependencies: lints: ^5.0.0 test: ^1.24.0 + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + ##code generation + build_runner: ^2.4.15 + hive_ce_generator: ^1.9.1 + freezed: ^3.0.3 + json_serializable: ^6.9.4 + + ##test + mocktail: ^1.0.4 + get_test: ^4.0.1 + +flutter: + uses-material-design: true \ No newline at end of file diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index f6d3b76..0aa727e 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -11,6 +11,13 @@ export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:flutter_rating_bar/flutter_rating_bar.dart'; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; + +//freezed +export 'package:freezed_annotation/freezed_annotation.dart'; + +//local storage +export 'package:hive_ce_flutter/hive_flutter.dart'; + //Map and location export 'package:latlong2/latlong.dart'; export 'package:flutter_map/flutter_map.dart'; @@ -19,3 +26,4 @@ export 'package:flutter_map_animations/flutter_map_animations.dart'; + diff --git a/packages/core/lib/data/utils.dart b/packages/core/lib/data/utils.dart index c7a1250..4edf8a0 100644 --- a/packages/core/lib/data/utils.dart +++ b/packages/core/lib/data/utils.dart @@ -1,37 +1,37 @@ import 'package:flutter/foundation.dart'; import 'package:logger/logger.dart'; -import 'package:rasadyar_core/infrastructure/di/di.dart'; +import 'package:rasadyar_core/injection/di.dart'; void iLog(dynamic message) { if(kDebugMode){ - di.get().i(message.toString()); + diCore.get().i(message.toString()); } } void eLog(dynamic message) { if(kDebugMode){ - di.get().e(message.toString()); + diCore.get().e(message.toString()); } } void dLog(dynamic message) { if(kDebugMode){ - di.get().d(message.toString()); + diCore.get().d(message.toString()); } } void fLog(dynamic message){ if(kDebugMode){ - di.get().f(message.toString()); + diCore.get().f(message.toString()); } } void tLog(dynamic message) { if(kDebugMode){ - di.get().t(message.toString()); + diCore.get().t(message.toString()); } } diff --git a/packages/core/lib/infrastructure/local/hive_local_storage.dart b/packages/core/lib/infrastructure/local/hive_local_storage.dart new file mode 100644 index 0000000..c63e7f3 --- /dev/null +++ b/packages/core/lib/infrastructure/local/hive_local_storage.dart @@ -0,0 +1,61 @@ +import 'package:hive_ce_flutter/hive_flutter.dart'; + +import 'i_local_storage.dart'; + +class HiveLocalStorage implements ILocalStorage { + HiveLocalStorage() { + Hive.initFlutter(); + } + + final Map _boxes = {}; + + @override + Future init() async => await Hive.initFlutter(); + + @override + Future openBox(String boxName) async { + if (!_boxes.containsKey(boxName)) { + final box = await Hive.openBox(boxName); + _boxes[boxName] = box; + } + } + + @override + Future delete(String boxName, String key) async { + Box? box = await getBox(boxName); + await box.delete(key); + } + + @override + Future read(String boxName, String key) async { + Box? box = await getBox(boxName); + return box.get(key) as T?; + } + + @override + Future save(String boxName, String key, value) async { + Box? box = await getBox(boxName); + await box.put(key, value); + } + + @override + Future add(String boxName, value) async { + Box? box = await getBox(boxName); + await box.add(value); + } + + @override + Future addAll(String boxName, Iterable values) async { + Box? box = await getBox(boxName); + await box.addAll(values); + } + + Future> getBox(String boxName) async { + final box = _boxes[boxName]; + if (box is Box) { + return box; + } else { + throw Exception('Box $boxName is not of expected type $T'); + } + } +} diff --git a/packages/core/lib/infrastructure/local/i_local_storage.dart b/packages/core/lib/infrastructure/local/i_local_storage.dart new file mode 100644 index 0000000..2b0a7f4 --- /dev/null +++ b/packages/core/lib/infrastructure/local/i_local_storage.dart @@ -0,0 +1,11 @@ +abstract class ILocalStorage{ + Future init(); + Future openBox(String boxName); + Future save(String boxName, String key, dynamic value); + Future read(String boxName, String key); + Future delete(String boxName, String key); + + Future add(String boxName, E value); + Future addAll(String boxName, Iterable values); + +} \ No newline at end of file diff --git a/packages/core/lib/infrastructure/remote/dio_form_data.dart b/packages/core/lib/infrastructure/remote/dio_form_data.dart new file mode 100644 index 0000000..8e74832 --- /dev/null +++ b/packages/core/lib/infrastructure/remote/dio_form_data.dart @@ -0,0 +1,23 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; + +import 'interfaces/i_form_data.dart'; + +class DioFormData implements IFormData { + final FormData _formData = FormData(); + + @override + void addFile(String field, Uint8List bytes, String filename) { + _formData.files.add(MapEntry( + field, + MultipartFile.fromBytes(bytes, filename: filename), + )); + } + + @override + void addField(String key, String value) { + _formData.fields.add(MapEntry(key, value)); + } + + FormData get raw => _formData; +} diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart new file mode 100644 index 0000000..6b8ac08 --- /dev/null +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -0,0 +1,126 @@ +import 'dart:typed_data'; + +import 'package:dio/dio.dart'; +import 'package:pretty_dio_logger/pretty_dio_logger.dart'; +import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart'; +import 'package:rasadyar_core/infrastructure/remote/interfaces/i_http_response.dart'; +import 'package:rasadyar_core/infrastructure/remote/interfaces/i_remote.dart'; + +import 'dio_form_data.dart'; +import 'dio_response.dart'; +import 'interfaces/i_http_client.dart'; + +class DioRemote implements IRemote, IHttpClient { + final String baseUrl; + late final Dio _dio; + + DioRemote(this.baseUrl); + + @override + Future init() async { + final dio = Dio(BaseOptions(baseUrl: baseUrl)); + dio.interceptors.add(PrettyDioLogger()); + _dio = dio; + } + + @override + Future get( + String path, { + Map? queryParameters, + Map? headers, + ProgressCallback? onReceiveProgress, + }) async { + final response = await _dio.get( + path, + queryParameters: queryParameters, + options: Options(headers: headers), + onReceiveProgress: onReceiveProgress, + ); + return DioHttpResponse(response); + } + + @override + Future post( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final response = await _dio.post( + path, + data: data, + queryParameters: queryParameters, + options: Options(headers: headers), + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + return DioHttpResponse(response); + } + + @override + Future put( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final response = await _dio.put( + path, + data: data, + queryParameters: queryParameters, + options: Options(headers: headers), + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + return DioHttpResponse(response); + } + + @override + Future delete( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + }) async { + final response = await _dio.delete( + path, + data: data, + queryParameters: queryParameters, + options: Options(headers: headers), + ); + return DioHttpResponse(response); + } + + @override + Future> download( + String url, { + ProgressCallback? onReceiveProgress, + }) async { + final response = await _dio.get( + url, + options: Options(responseType: ResponseType.bytes), + onReceiveProgress: onReceiveProgress, + ); + return DioHttpResponse(response); + } + + @override + Future upload( + String path, { + required IFormData formData, + Map? headers, + ProgressCallback? onSendProgress, + }) async { + final response = await _dio.post( + path, + data: (formData as DioFormData).raw, + options: Options(headers: headers, contentType: 'multipart/form-data'), + onSendProgress: onSendProgress, + ); + return DioHttpResponse(response); + } +} diff --git a/packages/core/lib/infrastructure/remote/dio_response.dart b/packages/core/lib/infrastructure/remote/dio_response.dart new file mode 100644 index 0000000..0a42eea --- /dev/null +++ b/packages/core/lib/infrastructure/remote/dio_response.dart @@ -0,0 +1,21 @@ +import 'interfaces/i_http_response.dart'; +import 'package:dio/dio.dart'; + +class DioHttpResponse implements IHttpResponse { + final Response _response; + + DioHttpResponse(this._response); + + @override + T? get data => _response.data; + + @override + int get statusCode => _response.statusCode ?? 0; + + @override + Map> get headers => + _response.headers.map.map((k, v) => MapEntry(k, v)); + + @override + bool get isSuccessful => statusCode >= 200 && statusCode < 300; +} diff --git a/packages/core/lib/infrastructure/remote/interfaces/i_form_data.dart b/packages/core/lib/infrastructure/remote/interfaces/i_form_data.dart new file mode 100644 index 0000000..ddbda85 --- /dev/null +++ b/packages/core/lib/infrastructure/remote/interfaces/i_form_data.dart @@ -0,0 +1,6 @@ +import 'package:flutter/foundation.dart'; + +abstract class IFormData{ + void addFile(String field, Uint8List bytes, String filename); + void addField(String key, String value); +} \ No newline at end of file diff --git a/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart b/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart new file mode 100644 index 0000000..253130a --- /dev/null +++ b/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart @@ -0,0 +1,51 @@ +import 'dart:typed_data'; +import 'package:dio/dio.dart'; +import 'package:rasadyar_core/infrastructure/remote/dio_form_data.dart'; +import 'i_http_response.dart'; +import 'i_form_data.dart'; + +abstract class IHttpClient { + Future get( + String path, { + Map? queryParameters, + Map? headers, + ProgressCallback? onReceiveProgress, + }); + + Future post( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }); + + Future put( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }); + + Future delete( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + }); + + Future> download( + String url, { + ProgressCallback? onReceiveProgress, + }); + + Future upload( + String path, { + required IFormData formData, + Map? headers, + ProgressCallback? onSendProgress, + }); +} diff --git a/packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart b/packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart new file mode 100644 index 0000000..14dd20a --- /dev/null +++ b/packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart @@ -0,0 +1,6 @@ +abstract class IHttpResponse { + T? get data; + int get statusCode; + Map> get headers; + bool get isSuccessful; +} diff --git a/packages/core/lib/infrastructure/remote/interfaces/i_remote.dart b/packages/core/lib/infrastructure/remote/interfaces/i_remote.dart new file mode 100644 index 0000000..648883b --- /dev/null +++ b/packages/core/lib/infrastructure/remote/interfaces/i_remote.dart @@ -0,0 +1,4 @@ +abstract class IRemote{ + Future init(); +} + diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 6b71ba8..a7deeac 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -193,6 +193,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dio: + dependency: "direct main" + description: + name: dio + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + url: "https://pub.dev" + source: hosted + version: "5.8.0+1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.dev" + source: hosted + version: "2.1.1" fake_async: dependency: transitive description: @@ -797,6 +813,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + pretty_dio_logger: + dependency: "direct main" + description: + name: pretty_dio_logger + sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407" + url: "https://pub.dev" + source: hosted + version: "1.4.0" proj4dart: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index b3d4712..ce7312c 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -26,8 +26,8 @@ dependencies: rxdart: ^0.28.0 ## local storage - hive_ce: ^2.10.1 - hive_ce_flutter: ^2.2.0 + hive_ce: ^2.11.1 + hive_ce_flutter: ^2.3.0 ##code generation freezed_annotation: ^3.0.0 @@ -58,7 +58,11 @@ dependencies: #location latlong2: ^0.9.1 geolocator: ^14.0.0 + #network + dio: ^5.8.0+1 + #networkLogger + pretty_dio_logger: ^1.4.0 dev_dependencies: flutter_test: @@ -66,7 +70,7 @@ dev_dependencies: flutter_lints: ^5.0.0 ##code generation build_runner: ^2.4.15 - hive_ce_generator: ^1.8.2 + hive_ce_generator: ^1.9.1 freezed: ^3.0.3 json_serializable: ^6.9.4 @@ -75,5 +79,7 @@ dev_dependencies: get_test: ^4.0.1 + + flutter: uses-material-design: true From 114f8a1adad5b85a5db6b6b6accbaac9fb242cb5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 11 May 2025 11:50:01 +0330 Subject: [PATCH 050/256] feat : auth package --- packages/auth/lib/hive_registrar.g.dart | 18 ++ .../auth_response_dto.freezed.dart | 160 ++++++++++++++++++ .../auth_response/auth_response_dto.g.dart | 21 +++ .../models/user_local/user_local_model.g.dart | 33 ++-- .../src/presentation/pages/modules/logic.dart | 16 ++ .../src/presentation/pages/modules/view.dart | 15 ++ .../src/presentation/routes/app_pages.dart | 20 --- .../src/presentation/routes/app_paths.dart | 10 -- .../lib/src/presentation/routes/pages.dart | 26 +++ .../lib/src/presentation/routes/paths.dart | 8 + packages/core/lib/infrastructure/di/di.dart | 32 ---- packages/core/lib/injection/di.dart | 25 +++ 12 files changed, 310 insertions(+), 74 deletions(-) create mode 100644 packages/auth/lib/hive_registrar.g.dart create mode 100644 packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart create mode 100644 packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart rename lib/data/model/user/user_model.g.dart => packages/auth/lib/src/data/models/user_local/user_local_model.g.dart (53%) create mode 100644 packages/auth/lib/src/presentation/pages/modules/logic.dart create mode 100644 packages/auth/lib/src/presentation/pages/modules/view.dart delete mode 100644 packages/auth/lib/src/presentation/routes/app_pages.dart delete mode 100644 packages/auth/lib/src/presentation/routes/app_paths.dart create mode 100644 packages/auth/lib/src/presentation/routes/pages.dart create mode 100644 packages/auth/lib/src/presentation/routes/paths.dart delete mode 100644 packages/core/lib/infrastructure/di/di.dart create mode 100644 packages/core/lib/injection/di.dart diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart new file mode 100644 index 0000000..74cb88e --- /dev/null +++ b/packages/auth/lib/hive_registrar.g.dart @@ -0,0 +1,18 @@ +// Generated by Hive CE +// Do not modify +// Check in to version control + +import 'package:hive_ce/hive.dart'; +import 'package:auth/src/data/models/user_local/user_local_model.dart'; + +extension HiveRegistrar on HiveInterface { + void registerAdapters() { + registerAdapter(UserLocalModelAdapter()); + } +} + +extension IsolatedHiveRegistrar on IsolatedHiveInterface { + void registerAdapters() { + registerAdapter(UserLocalModelAdapter()); + } +} diff --git a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart new file mode 100644 index 0000000..23e681f --- /dev/null +++ b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart @@ -0,0 +1,160 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'auth_response_dto.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$AuthResponseDto { + + String? get refresh; String? get access;@JsonKey(name: 'otp_status') bool? get otpStatus; +/// Create a copy of AuthResponseDto +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AuthResponseDtoCopyWith get copyWith => _$AuthResponseDtoCopyWithImpl(this as AuthResponseDto, _$identity); + + /// Serializes this AuthResponseDto to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AuthResponseDto&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); + +@override +String toString() { + return 'AuthResponseDto(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; +} + + +} + +/// @nodoc +abstract mixin class $AuthResponseDtoCopyWith<$Res> { + factory $AuthResponseDtoCopyWith(AuthResponseDto value, $Res Function(AuthResponseDto) _then) = _$AuthResponseDtoCopyWithImpl; +@useResult +$Res call({ + String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus +}); + + + + +} +/// @nodoc +class _$AuthResponseDtoCopyWithImpl<$Res> + implements $AuthResponseDtoCopyWith<$Res> { + _$AuthResponseDtoCopyWithImpl(this._self, this._then); + + final AuthResponseDto _self; + final $Res Function(AuthResponseDto) _then; + +/// Create a copy of AuthResponseDto +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { + return _then(_self.copyWith( +refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable +as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable +as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _AuthResponseDto implements AuthResponseDto { + const _AuthResponseDto({this.refresh, this.access, @JsonKey(name: 'otp_status') this.otpStatus}); + factory _AuthResponseDto.fromJson(Map json) => _$AuthResponseDtoFromJson(json); + +@override final String? refresh; +@override final String? access; +@override@JsonKey(name: 'otp_status') final bool? otpStatus; + +/// Create a copy of AuthResponseDto +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AuthResponseDtoCopyWith<_AuthResponseDto> get copyWith => __$AuthResponseDtoCopyWithImpl<_AuthResponseDto>(this, _$identity); + +@override +Map toJson() { + return _$AuthResponseDtoToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AuthResponseDto&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); + +@override +String toString() { + return 'AuthResponseDto(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; +} + + @override + AuthResponseEntity toEntity() { + // TODO: implement toEntity + throw UnimplementedError(); + } + + +} + +/// @nodoc +abstract mixin class _$AuthResponseDtoCopyWith<$Res> implements $AuthResponseDtoCopyWith<$Res> { + factory _$AuthResponseDtoCopyWith(_AuthResponseDto value, $Res Function(_AuthResponseDto) _then) = __$AuthResponseDtoCopyWithImpl; +@override @useResult +$Res call({ + String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus +}); + + + + +} +/// @nodoc +class __$AuthResponseDtoCopyWithImpl<$Res> + implements _$AuthResponseDtoCopyWith<$Res> { + __$AuthResponseDtoCopyWithImpl(this._self, this._then); + + final _AuthResponseDto _self; + final $Res Function(_AuthResponseDto) _then; + +/// Create a copy of AuthResponseDto +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { + return _then(_AuthResponseDto( +refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable +as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable +as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + +// dart format on diff --git a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart new file mode 100644 index 0000000..cbe0276 --- /dev/null +++ b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'auth_response_dto.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_AuthResponseDto _$AuthResponseDtoFromJson(Map json) => + _AuthResponseDto( + refresh: json['refresh'] as String?, + access: json['access'] as String?, + otpStatus: json['otp_status'] as bool?, + ); + +Map _$AuthResponseDtoToJson(_AuthResponseDto instance) => + { + 'refresh': instance.refresh, + 'access': instance.access, + 'otp_status': instance.otpStatus, + }; diff --git a/lib/data/model/user/user_model.g.dart b/packages/auth/lib/src/data/models/user_local/user_local_model.g.dart similarity index 53% rename from lib/data/model/user/user_model.g.dart rename to packages/auth/lib/src/data/models/user_local/user_local_model.g.dart index e786785..13f86a8 100644 --- a/lib/data/model/user/user_model.g.dart +++ b/packages/auth/lib/src/data/models/user_local/user_local_model.g.dart @@ -1,35 +1,44 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'user_model.dart'; +part of 'user_local_model.dart'; // ************************************************************************** // TypeAdapterGenerator // ************************************************************************** -class UserModelAdapter extends TypeAdapter { +class UserLocalModelAdapter extends TypeAdapter { @override - final int typeId = 0; + final typeId = 0; @override - UserModel read(BinaryReader reader) { + UserLocalModel read(BinaryReader reader) { final numOfFields = reader.readByte(); final fields = { for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; - return UserModel( - token: fields[0] as String?, - refreshToken: fields[1] as String?, + return UserLocalModel( + username: fields[0] as String?, + password: fields[1] as String?, + token: fields[2] as String?, + refreshToken: fields[3] as String?, + name: fields[4] as String?, ); } @override - void write(BinaryWriter writer, UserModel obj) { + void write(BinaryWriter writer, UserLocalModel obj) { writer - ..writeByte(2) + ..writeByte(5) ..writeByte(0) - ..write(obj.token) + ..write(obj.username) ..writeByte(1) - ..write(obj.refreshToken); + ..write(obj.password) + ..writeByte(2) + ..write(obj.token) + ..writeByte(3) + ..write(obj.refreshToken) + ..writeByte(4) + ..write(obj.name); } @override @@ -38,7 +47,7 @@ class UserModelAdapter extends TypeAdapter { @override bool operator ==(Object other) => identical(this, other) || - other is UserModelAdapter && + other is UserLocalModelAdapter && runtimeType == other.runtimeType && typeId == other.typeId; } diff --git a/packages/auth/lib/src/presentation/pages/modules/logic.dart b/packages/auth/lib/src/presentation/pages/modules/logic.dart new file mode 100644 index 0000000..87c35ee --- /dev/null +++ b/packages/auth/lib/src/presentation/pages/modules/logic.dart @@ -0,0 +1,16 @@ +import 'package:rasadyar_core/core.dart'; + +class ModulesLogic extends GetxController { + + + + @override + void onReady() { + super.onReady(); + } + + @override + void onClose() { + super.onClose(); + } +} diff --git a/packages/auth/lib/src/presentation/pages/modules/view.dart b/packages/auth/lib/src/presentation/pages/modules/view.dart new file mode 100644 index 0000000..f1c4a0b --- /dev/null +++ b/packages/auth/lib/src/presentation/pages/modules/view.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class ModulesPage extends GetView { + const ModulesPage({super.key}); + + @override + Widget build(BuildContext context) { + final ModulesLogic logic = Get.put(ModulesLogic()); + + return Container(); + } +} diff --git a/packages/auth/lib/src/presentation/routes/app_pages.dart b/packages/auth/lib/src/presentation/routes/app_pages.dart deleted file mode 100644 index 4247cb5..0000000 --- a/packages/auth/lib/src/presentation/routes/app_pages.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:get/get.dart'; -import 'package:inspection/presentation/routes/app_pages.dart'; -import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logic.dart'; -import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; -import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; -import 'package:rasadyar_app/presentation/pages/splash/view.dart'; -import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; - -part 'app_paths.dart'; - -sealed class AppPages { - AppPages._(); - - static const String initRoutes = AppPaths.splash; - static const String initDesignSystem = AppPaths.systemDesignPage; - - static List pages = [ - - ]; -} diff --git a/packages/auth/lib/src/presentation/routes/app_paths.dart b/packages/auth/lib/src/presentation/routes/app_paths.dart deleted file mode 100644 index f6fde78..0000000 --- a/packages/auth/lib/src/presentation/routes/app_paths.dart +++ /dev/null @@ -1,10 +0,0 @@ -part of 'app_pages.dart'; - -sealed class AppPaths { - AppPaths._(); - - static const String splash = '/splash'; - static const String authWithUserAndPass = '/authWithUserAndPass'; - static const String authWithOtp = '/authWithOtp'; - static const String systemDesignPage = '/systemDesignPage'; -} diff --git a/packages/auth/lib/src/presentation/routes/pages.dart b/packages/auth/lib/src/presentation/routes/pages.dart new file mode 100644 index 0000000..614b28d --- /dev/null +++ b/packages/auth/lib/src/presentation/routes/pages.dart @@ -0,0 +1,26 @@ +import 'package:auth/src/presentation/pages/auth/logic.dart'; +import 'package:auth/src/presentation/pages/auth/view.dart'; +import 'package:rasadyar_core/core.dart'; + +part 'paths.dart'; + +sealed class AuthPages { + AuthPages._(); + + static List pages = [ + GetPage( + name: AuthPaths.moduleList, + page: () => AuthPage(), + binding: BindingsBuilder(() { + Get.lazyPut(() => AuthLogic()); + }), + ), + GetPage( + name: AuthPaths.auth, + page: () => AuthPage(), + binding: BindingsBuilder(() { + Get.lazyPut(() => AuthLogic()); + }), + ), + ]; +} diff --git a/packages/auth/lib/src/presentation/routes/paths.dart b/packages/auth/lib/src/presentation/routes/paths.dart new file mode 100644 index 0000000..85dfe5c --- /dev/null +++ b/packages/auth/lib/src/presentation/routes/paths.dart @@ -0,0 +1,8 @@ +part of 'pages.dart'; + +sealed class AuthPaths { + AuthPaths._(); + + static const String moduleList = '/moduleList'; + static const String auth = '/Auth'; +} diff --git a/packages/core/lib/infrastructure/di/di.dart b/packages/core/lib/infrastructure/di/di.dart deleted file mode 100644 index c6ecb54..0000000 --- a/packages/core/lib/infrastructure/di/di.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:get_it/get_it.dart'; -import 'package:hive_ce_flutter/hive_flutter.dart'; -import 'package:logger/logger.dart'; - - -final di = GetIt.instance; - -void setupInjection() { - // di.registerLazySingleton(() => HiveProvider(), instanceName: 'HiveProvider'); - di.registerSingleton( Logger()); -} - -Future setupAllProvider() async { - //await _setupLocalStorage(); - await di.allReady(); -} - -// Future _setupLocalStorage() async { -// final hiveProvider = di.get(instanceName: 'HiveProvider'); -// await hiveProvider.init(); -// Hive.registerAdapter(UserModelAdapter()); -// -// await Hive.openBox(HiveBoxNames.user.name); -// -// //user -// di.registerLazySingleton(() => UserLocalStorage()); -// di.registerLazySingleton( -// () => UserRepository(di.get()), -// ); -// -// // -// } diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart new file mode 100644 index 0000000..f6c0b73 --- /dev/null +++ b/packages/core/lib/injection/di.dart @@ -0,0 +1,25 @@ +import 'package:get_it/get_it.dart'; +import 'package:logger/logger.dart'; +import 'package:rasadyar_core/infrastructure/local/hive_local_storage.dart'; + +final diCore = GetIt.instance; + +Future setupAllProvider() async { + await _setUpLogger(); + await _setupLocalStorage(); + await diCore.allReady(); +} + +Future _setUpLogger() async{ + diCore.registerSingleton(Logger()); +} + +Future _setupLocalStorage() async { + diCore.registerSingleton(HiveLocalStorage()); +} + + + +Future _setupRemote() async { + diCore.registerSingleton(HiveLocalStorage()); +} From e11ef1990c06589ef8bf65a99887d48b0e2748a9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 12 May 2025 16:55:55 +0330 Subject: [PATCH 051/256] chore : change app archticle --- {packages => features}/auth/lib/auth.dart | 0 features/auth/lib/data/di/auth_di.dart | 8 + .../local}/user_local/user_local_model.dart | 0 .../local}/user_local/user_local_model.g.dart | 0 .../login_request/login_request_model.dart | 8 +- .../login_request_model.freezed.dart | 40 +- .../login_request/login_request_model.g.dart | 8 +- .../response/auth/auth_response_model.dart | 20 + .../captcha/captcha_response_model.dart | 17 + .../data/repositories/auth_repository.dart | 21 + .../repositories/auth_repository_imp.dart | 81 +++ .../lib}/presentation/pages/auth/logic.dart | 0 .../lib}/presentation/pages/auth/view.dart | 0 .../presentation/pages/modules/logic.dart | 0 .../lib}/presentation/pages/modules/view.dart | 0 .../auth/lib}/presentation/routes/pages.dart | 7 +- .../auth/lib}/presentation/routes/paths.dart | 0 .../lib/presentation/action/logic.dart | 2 +- .../add_mobile_inspector/view.dart | 2 +- .../presentation/add_supervision/logic.dart | 3 +- .../presentation/add_supervision/view.dart | 2 +- .../lib/presentation/filter/logic.dart | 5 +- .../lib/presentation/filter/view.dart | 4 +- .../registration_of_violation/view.dart | 5 +- .../lib/presentation/root/logic.dart | 10 +- .../lib/presentation/root/view.dart | 4 +- .../lib/presentation/routes/app_pages.dart | 36 +- features/inspection/pubspec.lock | 649 ------------------ features/inspection/pubspec.yaml | 13 - lib/presentation/pages/splash/logic.dart | 2 +- lib/presentation/routes/app_pages.dart | 2 +- packages/auth/.gitignore | 7 - packages/auth/CHANGELOG.md | 3 - packages/auth/README.md | 39 -- packages/auth/analysis_options.yaml | 30 - packages/auth/example/auth_example.dart | 5 - packages/auth/lib/hive_registrar.g.dart | 18 - .../dto/auth_response/auth_response_dto.dart | 23 - .../auth_response_dto.freezed.dart | 160 ----- .../auth_response/auth_response_dto.g.dart | 21 - .../domain/entity/auth_response_entity.dart | 12 - .../domain/repositories/auth_repository.dart | 7 - packages/auth/pubspec.yaml | 33 - packages/auth/test/auth_test.dart | 8 - packages/core/lib/core.dart | 46 +- .../lib/infrastructure/remote/dio_remote.dart | 104 ++- .../infrastructure/remote/dio_response.dart | 7 +- .../remote/interfaces/i_http_client.dart | 73 +- .../remote/interfaces/i_http_response.dart | 2 +- .../widget/buttons/outline_elevated_icon.dart | 3 - .../draggable_bottom_sheet.dart | 2 +- packages/core/lib/utils/README.md | 6 + .../utils.dart => utils/logger_utils.dart} | 0 packages/core/lib/utils/safe_call_utils.dart | 71 ++ pubspec.lock | 427 +++++++++++- pubspec.yaml | 64 +- 56 files changed, 873 insertions(+), 1247 deletions(-) rename {packages => features}/auth/lib/auth.dart (100%) create mode 100644 features/auth/lib/data/di/auth_di.dart rename {packages/auth/lib/src/data/models => features/auth/lib/data/models/local}/user_local/user_local_model.dart (100%) rename {packages/auth/lib/src/data/models => features/auth/lib/data/models/local}/user_local/user_local_model.g.dart (100%) rename {packages/auth/lib/src/data/models => features/auth/lib/data/models/request}/login_request/login_request_model.dart (78%) rename {packages/auth/lib/src/data/models => features/auth/lib/data/models/request}/login_request/login_request_model.freezed.dart (74%) rename {packages/auth/lib/src/data/models => features/auth/lib/data/models/request}/login_request/login_request_model.g.dart (77%) create mode 100644 features/auth/lib/data/models/response/auth/auth_response_model.dart create mode 100644 features/auth/lib/data/models/response/captcha/captcha_response_model.dart create mode 100644 features/auth/lib/data/repositories/auth_repository.dart create mode 100644 features/auth/lib/data/repositories/auth_repository_imp.dart rename {packages/auth/lib/src => features/auth/lib}/presentation/pages/auth/logic.dart (100%) rename {packages/auth/lib/src => features/auth/lib}/presentation/pages/auth/view.dart (100%) rename {packages/auth/lib/src => features/auth/lib}/presentation/pages/modules/logic.dart (100%) rename {packages/auth/lib/src => features/auth/lib}/presentation/pages/modules/view.dart (100%) rename {packages/auth/lib/src => features/auth/lib}/presentation/routes/pages.dart (79%) rename {packages/auth/lib/src => features/auth/lib}/presentation/routes/paths.dart (100%) delete mode 100644 features/inspection/pubspec.lock delete mode 100644 features/inspection/pubspec.yaml delete mode 100644 packages/auth/.gitignore delete mode 100644 packages/auth/CHANGELOG.md delete mode 100644 packages/auth/README.md delete mode 100644 packages/auth/analysis_options.yaml delete mode 100644 packages/auth/example/auth_example.dart delete mode 100644 packages/auth/lib/hive_registrar.g.dart delete mode 100644 packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart delete mode 100644 packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart delete mode 100644 packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart delete mode 100644 packages/auth/lib/src/domain/entity/auth_response_entity.dart delete mode 100644 packages/auth/lib/src/domain/repositories/auth_repository.dart delete mode 100644 packages/auth/pubspec.yaml delete mode 100644 packages/auth/test/auth_test.dart create mode 100644 packages/core/lib/utils/README.md rename packages/core/lib/{data/utils.dart => utils/logger_utils.dart} (100%) create mode 100644 packages/core/lib/utils/safe_call_utils.dart diff --git a/packages/auth/lib/auth.dart b/features/auth/lib/auth.dart similarity index 100% rename from packages/auth/lib/auth.dart rename to features/auth/lib/auth.dart diff --git a/features/auth/lib/data/di/auth_di.dart b/features/auth/lib/data/di/auth_di.dart new file mode 100644 index 0000000..7e9c760 --- /dev/null +++ b/features/auth/lib/data/di/auth_di.dart @@ -0,0 +1,8 @@ +import 'package:rasadyar_core/core.dart'; + + + +GetIt diAuth = GetIt.instance; + + + diff --git a/packages/auth/lib/src/data/models/user_local/user_local_model.dart b/features/auth/lib/data/models/local/user_local/user_local_model.dart similarity index 100% rename from packages/auth/lib/src/data/models/user_local/user_local_model.dart rename to features/auth/lib/data/models/local/user_local/user_local_model.dart diff --git a/packages/auth/lib/src/data/models/user_local/user_local_model.g.dart b/features/auth/lib/data/models/local/user_local/user_local_model.g.dart similarity index 100% rename from packages/auth/lib/src/data/models/user_local/user_local_model.g.dart rename to features/auth/lib/data/models/local/user_local/user_local_model.g.dart diff --git a/packages/auth/lib/src/data/models/login_request/login_request_model.dart b/features/auth/lib/data/models/request/login_request/login_request_model.dart similarity index 78% rename from packages/auth/lib/src/data/models/login_request/login_request_model.dart rename to features/auth/lib/data/models/request/login_request/login_request_model.dart index 0e4791c..3794525 100644 --- a/packages/auth/lib/src/data/models/login_request/login_request_model.dart +++ b/features/auth/lib/data/models/request/login_request/login_request_model.dart @@ -6,10 +6,10 @@ part 'login_request_model.g.dart'; @freezed abstract class LoginRequestModel with _$LoginRequestModel { const factory LoginRequestModel({ - required String username, - required String password, - required String captchaCode, - required String captchaKey, + String? username, + String? password, + String? captchaCode, + String? captchaKey, }) = _LoginRequestModel; factory LoginRequestModel.fromJson(Map json) => diff --git a/packages/auth/lib/src/data/models/login_request/login_request_model.freezed.dart b/features/auth/lib/data/models/request/login_request/login_request_model.freezed.dart similarity index 74% rename from packages/auth/lib/src/data/models/login_request/login_request_model.freezed.dart rename to features/auth/lib/data/models/request/login_request/login_request_model.freezed.dart index bf3b549..c9f60aa 100644 --- a/packages/auth/lib/src/data/models/login_request/login_request_model.freezed.dart +++ b/features/auth/lib/data/models/request/login_request/login_request_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$LoginRequestModel { - String get username; String get password; String get captchaCode; String get captchaKey; + String? get username; String? get password; String? get captchaCode; String? get captchaKey; /// Create a copy of LoginRequestModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -49,7 +49,7 @@ abstract mixin class $LoginRequestModelCopyWith<$Res> { factory $LoginRequestModelCopyWith(LoginRequestModel value, $Res Function(LoginRequestModel) _then) = _$LoginRequestModelCopyWithImpl; @useResult $Res call({ - String username, String password, String captchaCode, String captchaKey + String? username, String? password, String? captchaCode, String? captchaKey }); @@ -66,13 +66,13 @@ class _$LoginRequestModelCopyWithImpl<$Res> /// Create a copy of LoginRequestModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? username = null,Object? password = null,Object? captchaCode = null,Object? captchaKey = null,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? username = freezed,Object? password = freezed,Object? captchaCode = freezed,Object? captchaKey = freezed,}) { return _then(_self.copyWith( -username: null == username ? _self.username : username // ignore: cast_nullable_to_non_nullable -as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable -as String,captchaCode: null == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable -as String,captchaKey: null == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable -as String, +username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?,captchaCode: freezed == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable +as String?,captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?, )); } @@ -83,13 +83,13 @@ as String, @JsonSerializable() class _LoginRequestModel extends LoginRequestModel { - const _LoginRequestModel({required this.username, required this.password, required this.captchaCode, required this.captchaKey}): super._(); + const _LoginRequestModel({this.username, this.password, this.captchaCode, this.captchaKey}): super._(); factory _LoginRequestModel.fromJson(Map json) => _$LoginRequestModelFromJson(json); -@override final String username; -@override final String password; -@override final String captchaCode; -@override final String captchaKey; +@override final String? username; +@override final String? password; +@override final String? captchaCode; +@override final String? captchaKey; /// Create a copy of LoginRequestModel /// with the given fields replaced by the non-null parameter values. @@ -124,7 +124,7 @@ abstract mixin class _$LoginRequestModelCopyWith<$Res> implements $LoginRequestM factory _$LoginRequestModelCopyWith(_LoginRequestModel value, $Res Function(_LoginRequestModel) _then) = __$LoginRequestModelCopyWithImpl; @override @useResult $Res call({ - String username, String password, String captchaCode, String captchaKey + String? username, String? password, String? captchaCode, String? captchaKey }); @@ -141,13 +141,13 @@ class __$LoginRequestModelCopyWithImpl<$Res> /// Create a copy of LoginRequestModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? username = null,Object? password = null,Object? captchaCode = null,Object? captchaKey = null,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? username = freezed,Object? password = freezed,Object? captchaCode = freezed,Object? captchaKey = freezed,}) { return _then(_LoginRequestModel( -username: null == username ? _self.username : username // ignore: cast_nullable_to_non_nullable -as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable -as String,captchaCode: null == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable -as String,captchaKey: null == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable -as String, +username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?,captchaCode: freezed == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable +as String?,captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?, )); } diff --git a/packages/auth/lib/src/data/models/login_request/login_request_model.g.dart b/features/auth/lib/data/models/request/login_request/login_request_model.g.dart similarity index 77% rename from packages/auth/lib/src/data/models/login_request/login_request_model.g.dart rename to features/auth/lib/data/models/request/login_request/login_request_model.g.dart index e92c1b4..f10c8a6 100644 --- a/packages/auth/lib/src/data/models/login_request/login_request_model.g.dart +++ b/features/auth/lib/data/models/request/login_request/login_request_model.g.dart @@ -8,10 +8,10 @@ part of 'login_request_model.dart'; _LoginRequestModel _$LoginRequestModelFromJson(Map json) => _LoginRequestModel( - username: json['username'] as String, - password: json['password'] as String, - captchaCode: json['captchaCode'] as String, - captchaKey: json['captchaKey'] as String, + username: json['username'] as String?, + password: json['password'] as String?, + captchaCode: json['captchaCode'] as String?, + captchaKey: json['captchaKey'] as String?, ); Map _$LoginRequestModelToJson(_LoginRequestModel instance) => diff --git a/features/auth/lib/data/models/response/auth/auth_response_model.dart b/features/auth/lib/data/models/response/auth/auth_response_model.dart new file mode 100644 index 0000000..c13cb0e --- /dev/null +++ b/features/auth/lib/data/models/response/auth/auth_response_model.dart @@ -0,0 +1,20 @@ + + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'auth_response_model.freezed.dart'; +part 'auth_response_model.g.dart'; + +@freezed +abstract class AuthResponseModel with _$AuthResponseModel { + const factory AuthResponseModel({ + String? refresh, + String? access, + @JsonKey(name: 'otp_status') bool? otpStatus, + }) = _AuthResponseModel; + + factory AuthResponseModel.fromJson(Map json) => + _$AuthResponseModelFromJson(json); + +} + diff --git a/features/auth/lib/data/models/response/captcha/captcha_response_model.dart b/features/auth/lib/data/models/response/captcha/captcha_response_model.dart new file mode 100644 index 0000000..2b2f986 --- /dev/null +++ b/features/auth/lib/data/models/response/captcha/captcha_response_model.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'captcha_response_model.freezed.dart'; +part 'captcha_response_model.g.dart'; + +@freezed +abstract class CaptchaResponseModel with _$CaptchaResponseModel { + const factory CaptchaResponseModel({ + String? captchaKey, + String? captchaImage, + String? imageType, + String? imageDecode, + }) = _CaptchaResponseModel; + + factory CaptchaResponseModel.fromJson(Map json) => + _$CaptchaResponseModelFromJson(json); +} diff --git a/features/auth/lib/data/repositories/auth_repository.dart b/features/auth/lib/data/repositories/auth_repository.dart new file mode 100644 index 0000000..1fecfa5 --- /dev/null +++ b/features/auth/lib/data/repositories/auth_repository.dart @@ -0,0 +1,21 @@ + + +import '../models/response/auth/auth_response_model.dart'; +import '../models/response/captcha/captcha_response_model.dart'; + +abstract class AuthRepository { + Future login({ + required Map authRequest, + }); + + Future captcha(); + + Future logout(); + + + Future loginWithRefreshToken({ + required Map authRequest, + }); + + +} diff --git a/features/auth/lib/data/repositories/auth_repository_imp.dart b/features/auth/lib/data/repositories/auth_repository_imp.dart new file mode 100644 index 0000000..6486f4d --- /dev/null +++ b/features/auth/lib/data/repositories/auth_repository_imp.dart @@ -0,0 +1,81 @@ +import 'package:rasadyar_core/core.dart'; + +import '../models/response/auth/auth_response_model.dart'; +import '../models/response/captcha/captcha_response_model.dart'; +import 'auth_repository.dart'; + +class AuthRepositoryImpl implements AuthRepository { + final DioRemote _httpClient; + final String _BASE_URL = 'auth/api/v1/'; + + AuthRepositoryImpl(this._httpClient); + + @override + Future login({ + required Map authRequest, + }) async { + final response = await safeCall>( + call: + () async => await _httpClient.post( + '$_BASE_URL/login/', + data: authRequest, + headers: {'Content-Type': 'application/json'}, + ), + onSuccess: (response) { + iLog(response); + }, + onError: (error, trace) { + throw Exception('Error during sign in: $error'); + }, + ); + + return response?.data; + } + + @override + Future captcha() async { + final response = await safeCall>( + call: + () async => await _httpClient.post( + '$_BASE_URL/login/', + headers: {'Content-Type': 'application/json'}, + ), + onSuccess: (response) { + iLog(response); + }, + onError: (error, trace) { + throw Exception('Error during sign in: $error'); + }, + ); + + return response?.data; + } + + @override + Future loginWithRefreshToken({ + required Map authRequest, + }) async { + final response = await safeCall>( + call: + () async => await _httpClient.post( + '$_BASE_URL/login/', + data: authRequest, + headers: {'Content-Type': 'application/json'}, + ), + onSuccess: (response) { + iLog(response); + }, + onError: (error, trace) { + throw Exception('Error during sign in: $error'); + }, + ); + + return response?.data; + } + + @override + Future logout() { + // TODO: implement logout + throw UnimplementedError(); + } +} diff --git a/packages/auth/lib/src/presentation/pages/auth/logic.dart b/features/auth/lib/presentation/pages/auth/logic.dart similarity index 100% rename from packages/auth/lib/src/presentation/pages/auth/logic.dart rename to features/auth/lib/presentation/pages/auth/logic.dart diff --git a/packages/auth/lib/src/presentation/pages/auth/view.dart b/features/auth/lib/presentation/pages/auth/view.dart similarity index 100% rename from packages/auth/lib/src/presentation/pages/auth/view.dart rename to features/auth/lib/presentation/pages/auth/view.dart diff --git a/packages/auth/lib/src/presentation/pages/modules/logic.dart b/features/auth/lib/presentation/pages/modules/logic.dart similarity index 100% rename from packages/auth/lib/src/presentation/pages/modules/logic.dart rename to features/auth/lib/presentation/pages/modules/logic.dart diff --git a/packages/auth/lib/src/presentation/pages/modules/view.dart b/features/auth/lib/presentation/pages/modules/view.dart similarity index 100% rename from packages/auth/lib/src/presentation/pages/modules/view.dart rename to features/auth/lib/presentation/pages/modules/view.dart diff --git a/packages/auth/lib/src/presentation/routes/pages.dart b/features/auth/lib/presentation/routes/pages.dart similarity index 79% rename from packages/auth/lib/src/presentation/routes/pages.dart rename to features/auth/lib/presentation/routes/pages.dart index 614b28d..4b12ffa 100644 --- a/packages/auth/lib/src/presentation/routes/pages.dart +++ b/features/auth/lib/presentation/routes/pages.dart @@ -1,7 +1,8 @@ -import 'package:auth/src/presentation/pages/auth/logic.dart'; -import 'package:auth/src/presentation/pages/auth/view.dart'; import 'package:rasadyar_core/core.dart'; +import '../pages/auth/logic.dart'; +import '../pages/auth/view.dart'; + part 'paths.dart'; sealed class AuthPages { @@ -15,6 +16,8 @@ sealed class AuthPages { Get.lazyPut(() => AuthLogic()); }), ), + + GetPage( name: AuthPaths.auth, page: () => AuthPage(), diff --git a/packages/auth/lib/src/presentation/routes/paths.dart b/features/auth/lib/presentation/routes/paths.dart similarity index 100% rename from packages/auth/lib/src/presentation/routes/paths.dart rename to features/auth/lib/presentation/routes/paths.dart diff --git a/features/inspection/lib/presentation/action/logic.dart b/features/inspection/lib/presentation/action/logic.dart index 34a4ec6..14cf098 100644 --- a/features/inspection/lib/presentation/action/logic.dart +++ b/features/inspection/lib/presentation/action/logic.dart @@ -1,5 +1,5 @@ import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; + class ActionLogic extends GetxController with GetTickerProviderStateMixin { late Rx slidController; diff --git a/features/inspection/lib/presentation/add_mobile_inspector/view.dart b/features/inspection/lib/presentation/add_mobile_inspector/view.dart index d6b1a0d..47ebdf8 100644 --- a/features/inspection/lib/presentation/add_mobile_inspector/view.dart +++ b/features/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import '../routes/app_routes.dart'; import 'logic.dart'; class AddMobileInspectorPage extends GetView { diff --git a/features/inspection/lib/presentation/add_supervision/logic.dart b/features/inspection/lib/presentation/add_supervision/logic.dart index 4aee4ec..57352cc 100644 --- a/features/inspection/lib/presentation/add_supervision/logic.dart +++ b/features/inspection/lib/presentation/add_supervision/logic.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; +import '../routes/app_routes.dart'; + class AddSupervisionLogic extends GetxController { RxInt selectedSegment = 0.obs; RxInt violationSegmentsSelected = 0.obs; diff --git a/features/inspection/lib/presentation/add_supervision/view.dart b/features/inspection/lib/presentation/add_supervision/view.dart index eb989cb..17d1e52 100644 --- a/features/inspection/lib/presentation/add_supervision/view.dart +++ b/features/inspection/lib/presentation/add_supervision/view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:inspection/inspection.dart'; +import '../routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/features/inspection/lib/presentation/filter/logic.dart b/features/inspection/lib/presentation/filter/logic.dart index a8610fd..2d18e9b 100644 --- a/features/inspection/lib/presentation/filter/logic.dart +++ b/features/inspection/lib/presentation/filter/logic.dart @@ -1,10 +1,11 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:inspection/data/utils/marker_generator.dart'; -import 'package:inspection/presentation/filter/view.dart'; import 'package:rasadyar_core/core.dart'; +import '../../data/utils/marker_generator.dart'; +import 'view.dart'; + class InspectorFilterLogic extends GetxController with GetTickerProviderStateMixin { Rx currentLocation = LatLng(35.824891, 50.948025).obs; diff --git a/features/inspection/lib/presentation/filter/view.dart b/features/inspection/lib/presentation/filter/view.dart index 1046873..82ee88a 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/features/inspection/lib/presentation/filter/view.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; +import '../routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -509,7 +508,6 @@ Widget selectedLocationWidget({ required VoidCallback trigger, required VoidCallback toggle, }) { - eLog(showHint); if (showHint) { trigger.call(); } diff --git a/features/inspection/lib/presentation/registration_of_violation/view.dart b/features/inspection/lib/presentation/registration_of_violation/view.dart index d823a60..39d20ee 100644 --- a/features/inspection/lib/presentation/registration_of_violation/view.dart +++ b/features/inspection/lib/presentation/registration_of_violation/view.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/registration_of_violation/logic.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import '../routes/app_routes.dart'; +import 'logic.dart'; + class RegistrationOfViolationPage extends GetView { const RegistrationOfViolationPage({super.key}); diff --git a/features/inspection/lib/presentation/root/logic.dart b/features/inspection/lib/presentation/root/logic.dart index bc88796..9a24ed9 100644 --- a/features/inspection/lib/presentation/root/logic.dart +++ b/features/inspection/lib/presentation/root/logic.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/action/view.dart'; -import 'package:inspection/presentation/filter/view.dart'; -import 'package:inspection/presentation/profile/view.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; + +import '../action/view.dart'; +import '../filter/view.dart'; +import '../profile/view.dart'; + enum ErrorLocationType { serviceDisabled, permissionDenied, none } @@ -50,7 +51,6 @@ class RootLogic extends GetxController { } } catch (e) { - eLog(e); return await Geolocator.openLocationSettings(); } } diff --git a/features/inspection/lib/presentation/root/view.dart b/features/inspection/lib/presentation/root/view.dart index 356a1d6..1609912 100644 --- a/features/inspection/lib/presentation/root/view.dart +++ b/features/inspection/lib/presentation/root/view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; + import 'logic.dart'; @@ -25,7 +25,7 @@ class RootPage extends GetView { textStyle: AppFonts.yekan16, onPressed: () async { var service = await controller.locationServiceEnabled(); - eLog(service); + if (service) { controller.errorLocationType.remove( ErrorLocationType.serviceDisabled, diff --git a/features/inspection/lib/presentation/routes/app_pages.dart b/features/inspection/lib/presentation/routes/app_pages.dart index aeb25c4..59006ef 100644 --- a/features/inspection/lib/presentation/routes/app_pages.dart +++ b/features/inspection/lib/presentation/routes/app_pages.dart @@ -1,21 +1,23 @@ import 'package:rasadyar_core/core.dart'; -import 'package:inspection/presentation/action/logic.dart'; -import 'package:inspection/presentation/add_mobile_inspector/logic.dart'; -import 'package:inspection/presentation/add_mobile_inspector/view.dart'; -import 'package:inspection/presentation/add_supervision/logic.dart'; -import 'package:inspection/presentation/add_supervision/view.dart'; -import 'package:inspection/presentation/display_information/logic.dart'; -import 'package:inspection/presentation/display_information/view.dart'; -import 'package:inspection/presentation/filter/logic.dart'; -import 'package:inspection/presentation/location_details/logic.dart'; -import 'package:inspection/presentation/location_details/view.dart'; -import 'package:inspection/presentation/profile/logic.dart'; -import 'package:inspection/presentation/profile/view.dart'; -import 'package:inspection/presentation/registration_of_violation/logic.dart'; -import 'package:inspection/presentation/registration_of_violation/view.dart'; -import 'package:inspection/presentation/root/logic.dart'; -import 'package:inspection/presentation/root/view.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; + +import '../action/logic.dart'; +import '../add_mobile_inspector/logic.dart'; +import '../add_mobile_inspector/view.dart'; +import '../add_supervision/logic.dart'; +import '../add_supervision/view.dart'; +import '../display_information/logic.dart'; +import '../display_information/view.dart'; +import '../filter/logic.dart'; +import '../location_details/logic.dart'; +import '../location_details/view.dart'; +import '../profile/logic.dart'; +import '../profile/view.dart'; +import '../registration_of_violation/logic.dart'; +import '../registration_of_violation/view.dart'; +import '../root/logic.dart'; +import '../root/view.dart'; +import 'app_routes.dart'; + sealed class InspectionPages { InspectionPages._(); diff --git a/features/inspection/pubspec.lock b/features/inspection/pubspec.lock deleted file mode 100644 index 276fc68..0000000 --- a/features/inspection/pubspec.lock +++ /dev/null @@ -1,649 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev" - source: hosted - version: "2.13.0" - characters: - dependency: transitive - description: - name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - crypto: - dependency: transitive - description: - name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev" - source: hosted - version: "3.0.6" - cupertino_icons: - dependency: transitive - description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" - source: hosted - version: "1.0.8" - dart_earcut: - dependency: transitive - description: - name: dart_earcut - sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b - url: "https://pub.dev" - source: hosted - version: "1.2.0" - dartx: - dependency: transitive - description: - name: dartx - sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - ffi: - dependency: transitive - description: - name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_map: - dependency: transitive - description: - name: flutter_map - sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a - url: "https://pub.dev" - source: hosted - version: "8.1.1" - flutter_map_animations: - dependency: transitive - description: - name: flutter_map_animations - sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e - url: "https://pub.dev" - source: hosted - version: "0.9.0" - flutter_rating_bar: - dependency: transitive - description: - name: flutter_rating_bar - sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 - url: "https://pub.dev" - source: hosted - version: "4.0.1" - flutter_slidable: - dependency: transitive - description: - name: flutter_slidable - sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a - url: "https://pub.dev" - source: hosted - version: "4.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 - url: "https://pub.dev" - source: hosted - version: "2.1.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - font_awesome_flutter: - dependency: transitive - description: - name: font_awesome_flutter - sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a - url: "https://pub.dev" - source: hosted - version: "10.8.0" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b - url: "https://pub.dev" - source: hosted - version: "3.0.0" - geolocator: - dependency: transitive - description: - name: geolocator - sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 - url: "https://pub.dev" - source: hosted - version: "14.0.0" - geolocator_android: - dependency: transitive - description: - name: geolocator_android - sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" - url: "https://pub.dev" - source: hosted - version: "5.0.1+1" - geolocator_apple: - dependency: transitive - description: - name: geolocator_apple - sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 - url: "https://pub.dev" - source: hosted - version: "2.3.13" - geolocator_platform_interface: - dependency: transitive - description: - name: geolocator_platform_interface - sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" - url: "https://pub.dev" - source: hosted - version: "4.2.6" - geolocator_web: - dependency: transitive - description: - name: geolocator_web - sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 - url: "https://pub.dev" - source: hosted - version: "4.1.3" - geolocator_windows: - dependency: transitive - description: - name: geolocator_windows - sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" - url: "https://pub.dev" - source: hosted - version: "0.2.5" - get: - dependency: transitive - description: - name: get - sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 - url: "https://pub.dev" - source: hosted - version: "4.7.2" - get_it: - dependency: transitive - description: - name: get_it - sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 - url: "https://pub.dev" - source: hosted - version: "8.0.3" - hive_ce: - dependency: transitive - description: - name: hive_ce - sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e - url: "https://pub.dev" - source: hosted - version: "2.11.1" - hive_ce_flutter: - dependency: transitive - description: - name: hive_ce_flutter - sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - http: - dependency: transitive - description: - name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f - url: "https://pub.dev" - source: hosted - version: "1.3.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - intl: - dependency: transitive - description: - name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" - source: hosted - version: "0.19.0" - isolate_channel: - dependency: transitive - description: - name: isolate_channel - sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df - url: "https://pub.dev" - source: hosted - version: "0.2.2" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" - source: hosted - version: "4.9.0" - latlong2: - dependency: transitive - description: - name: latlong2 - sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" - url: "https://pub.dev" - source: hosted - version: "0.9.1" - lists: - dependency: transitive - description: - name: lists - sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - logger: - dependency: transitive - description: - name: logger - sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 - url: "https://pub.dev" - source: hosted - version: "2.5.0" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" - source: hosted - version: "0.11.1" - meta: - dependency: transitive - description: - name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.dev" - source: hosted - version: "1.16.0" - mgrs_dart: - dependency: transitive - description: - name: mgrs_dart - sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 - url: "https://pub.dev" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" - source: hosted - version: "2.1.5" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.dev" - source: hosted - version: "2.2.17" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" - source: hosted - version: "2.2.1" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - permission_handler: - dependency: transitive - description: - name: permission_handler - sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" - url: "https://pub.dev" - source: hosted - version: "12.0.0+1" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.dev" - source: hosted - version: "13.0.1" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 - url: "https://pub.dev" - source: hosted - version: "9.4.7" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" - source: hosted - version: "0.1.3+5" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.dev" - source: hosted - version: "4.3.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - persian_datetime_picker: - dependency: transitive - description: - name: persian_datetime_picker - sha256: "7ccbfd3a68dc89d405550f624e9fa590c914fed2aa2d48973c4f4400baab2e06" - url: "https://pub.dev" - source: hosted - version: "3.1.0" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - polylabel: - dependency: transitive - description: - name: polylabel - sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - proj4dart: - dependency: transitive - description: - name: proj4dart - sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e - url: "https://pub.dev" - source: hosted - version: "2.1.0" - rasadyar_core: - dependency: "direct main" - description: - path: "../../packages/core" - relative: true - source: path - version: "1.0.0+1" - rxdart: - dependency: transitive - description: - name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.dev" - source: hosted - version: "0.28.0" - shamsi_date: - dependency: transitive - description: - name: shamsi_date - sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51 - url: "https://pub.dev" - source: hosted - version: "1.1.0" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" - source: hosted - version: "1.10.1" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - time: - dependency: transitive - description: - name: time - sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" - url: "https://pub.dev" - source: hosted - version: "2.1.5" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - unicode: - dependency: transitive - description: - name: unicode - sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" - url: "https://pub.dev" - source: hosted - version: "0.3.1" - uuid: - dependency: transitive - description: - name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.dev" - source: hosted - version: "4.5.1" - vector_graphics: - dependency: transitive - description: - name: vector_graphics - sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" - url: "https://pub.dev" - source: hosted - version: "1.1.18" - vector_graphics_codec: - dependency: transitive - description: - name: vector_graphics_codec - sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.dev" - source: hosted - version: "1.1.13" - vector_graphics_compiler: - dependency: transitive - description: - name: vector_graphics_compiler - sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" - url: "https://pub.dev" - source: hosted - version: "1.1.16" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - wkt_parser: - dependency: transitive - description: - name: wkt_parser - sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" - source: hosted - version: "6.5.0" -sdks: - dart: ">=3.7.2 <4.0.0" - flutter: ">=3.27.0" diff --git a/features/inspection/pubspec.yaml b/features/inspection/pubspec.yaml deleted file mode 100644 index 22e85bd..0000000 --- a/features/inspection/pubspec.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: inspection -description: "inspection module for rasadyar" -publish_to: 'none' -version: 1.0.1 - -environment: - sdk: ^3.7.2 - -dependencies: - flutter: - sdk: flutter - rasadyar_core: - path: ./../../packages/core \ No newline at end of file diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 7542f46..5f98668 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -1,7 +1,7 @@ import 'package:flutter/animation.dart'; import 'package:get/get.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import 'package:inspection/inspection.dart'; +import ''; class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController scaleController; diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index ab5cb96..4910184 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:inspection/presentation/routes/app_pages.dart'; + import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logic.dart'; import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; diff --git a/packages/auth/.gitignore b/packages/auth/.gitignore deleted file mode 100644 index 3cceda5..0000000 --- a/packages/auth/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# https://dart.dev/guides/libraries/private-files -# Created by `dart pub` -.dart_tool/ - -# Avoid committing pubspec.lock for library packages; see -# https://dart.dev/guides/libraries/private-files#pubspeclock. -pubspec.lock diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md deleted file mode 100644 index effe43c..0000000 --- a/packages/auth/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.0 - -- Initial version. diff --git a/packages/auth/README.md b/packages/auth/README.md deleted file mode 100644 index 8831761..0000000 --- a/packages/auth/README.md +++ /dev/null @@ -1,39 +0,0 @@ - - -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. - -## Features - -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. - -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. - -```dart -const like = 'sample'; -``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. diff --git a/packages/auth/analysis_options.yaml b/packages/auth/analysis_options.yaml deleted file mode 100644 index dee8927..0000000 --- a/packages/auth/analysis_options.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# This file configures the static analysis results for your project (errors, -# warnings, and lints). -# -# This enables the 'recommended' set of lints from `package:lints`. -# This set helps identify many issues that may lead to problems when running -# or consuming Dart code, and enforces writing Dart using a single, idiomatic -# style and format. -# -# If you want a smaller set of lints you can change this to specify -# 'package:lints/core.yaml'. These are just the most critical lints -# (the recommended set includes the core lints). -# The core lints are also what is used by pub.dev for scoring packages. - -include: package:lints/recommended.yaml - -# Uncomment the following section to specify additional rules. - -# linter: -# rules: -# - camel_case_types - -# analyzer: -# exclude: -# - path/to/excluded/files/** - -# For more information about the core and recommended set of lints, see -# https://dart.dev/go/core-lints - -# For additional information about configuring this file, see -# https://dart.dev/guides/language/analysis-options diff --git a/packages/auth/example/auth_example.dart b/packages/auth/example/auth_example.dart deleted file mode 100644 index 9733c86..0000000 --- a/packages/auth/example/auth_example.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:auth/auth.dart'; - -void main() { - -} diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart deleted file mode 100644 index 74cb88e..0000000 --- a/packages/auth/lib/hive_registrar.g.dart +++ /dev/null @@ -1,18 +0,0 @@ -// Generated by Hive CE -// Do not modify -// Check in to version control - -import 'package:hive_ce/hive.dart'; -import 'package:auth/src/data/models/user_local/user_local_model.dart'; - -extension HiveRegistrar on HiveInterface { - void registerAdapters() { - registerAdapter(UserLocalModelAdapter()); - } -} - -extension IsolatedHiveRegistrar on IsolatedHiveInterface { - void registerAdapters() { - registerAdapter(UserLocalModelAdapter()); - } -} diff --git a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart deleted file mode 100644 index 1f259f5..0000000 --- a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:auth/src/domain/entity/auth_response_entity.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'auth_response_dto.freezed.dart'; -part 'auth_response_dto.g.dart'; - -@freezed -abstract class AuthResponseDto with _$AuthResponseDto { - const factory AuthResponseDto({ - String? refresh, - String? access, - @JsonKey(name: 'otp_status') bool? otpStatus, - }) = _AuthResponseDto; - - factory AuthResponseDto.fromJson(Map json) => - _$AuthResponseDtoFromJson(json); - - AuthResponseEntity toEntity() => AuthResponseEntity( - access: access, - otpStatus: otpStatus, - refresh: refresh, - ); -} diff --git a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart deleted file mode 100644 index 23e681f..0000000 --- a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.freezed.dart +++ /dev/null @@ -1,160 +0,0 @@ -// dart format width=80 -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'auth_response_dto.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -// dart format off -T _$identity(T value) => value; - -/// @nodoc -mixin _$AuthResponseDto { - - String? get refresh; String? get access;@JsonKey(name: 'otp_status') bool? get otpStatus; -/// Create a copy of AuthResponseDto -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$AuthResponseDtoCopyWith get copyWith => _$AuthResponseDtoCopyWithImpl(this as AuthResponseDto, _$identity); - - /// Serializes this AuthResponseDto to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is AuthResponseDto&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); - -@override -String toString() { - return 'AuthResponseDto(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; -} - - -} - -/// @nodoc -abstract mixin class $AuthResponseDtoCopyWith<$Res> { - factory $AuthResponseDtoCopyWith(AuthResponseDto value, $Res Function(AuthResponseDto) _then) = _$AuthResponseDtoCopyWithImpl; -@useResult -$Res call({ - String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus -}); - - - - -} -/// @nodoc -class _$AuthResponseDtoCopyWithImpl<$Res> - implements $AuthResponseDtoCopyWith<$Res> { - _$AuthResponseDtoCopyWithImpl(this._self, this._then); - - final AuthResponseDto _self; - final $Res Function(AuthResponseDto) _then; - -/// Create a copy of AuthResponseDto -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { - return _then(_self.copyWith( -refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable -as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable -as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable -as bool?, - )); -} - -} - - -/// @nodoc -@JsonSerializable() - -class _AuthResponseDto implements AuthResponseDto { - const _AuthResponseDto({this.refresh, this.access, @JsonKey(name: 'otp_status') this.otpStatus}); - factory _AuthResponseDto.fromJson(Map json) => _$AuthResponseDtoFromJson(json); - -@override final String? refresh; -@override final String? access; -@override@JsonKey(name: 'otp_status') final bool? otpStatus; - -/// Create a copy of AuthResponseDto -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$AuthResponseDtoCopyWith<_AuthResponseDto> get copyWith => __$AuthResponseDtoCopyWithImpl<_AuthResponseDto>(this, _$identity); - -@override -Map toJson() { - return _$AuthResponseDtoToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _AuthResponseDto&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); - -@override -String toString() { - return 'AuthResponseDto(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; -} - - @override - AuthResponseEntity toEntity() { - // TODO: implement toEntity - throw UnimplementedError(); - } - - -} - -/// @nodoc -abstract mixin class _$AuthResponseDtoCopyWith<$Res> implements $AuthResponseDtoCopyWith<$Res> { - factory _$AuthResponseDtoCopyWith(_AuthResponseDto value, $Res Function(_AuthResponseDto) _then) = __$AuthResponseDtoCopyWithImpl; -@override @useResult -$Res call({ - String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus -}); - - - - -} -/// @nodoc -class __$AuthResponseDtoCopyWithImpl<$Res> - implements _$AuthResponseDtoCopyWith<$Res> { - __$AuthResponseDtoCopyWithImpl(this._self, this._then); - - final _AuthResponseDto _self; - final $Res Function(_AuthResponseDto) _then; - -/// Create a copy of AuthResponseDto -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { - return _then(_AuthResponseDto( -refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable -as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable -as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable -as bool?, - )); -} - - -} - -// dart format on diff --git a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart b/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart deleted file mode 100644 index cbe0276..0000000 --- a/packages/auth/lib/src/data/dto/auth_response/auth_response_dto.g.dart +++ /dev/null @@ -1,21 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'auth_response_dto.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_AuthResponseDto _$AuthResponseDtoFromJson(Map json) => - _AuthResponseDto( - refresh: json['refresh'] as String?, - access: json['access'] as String?, - otpStatus: json['otp_status'] as bool?, - ); - -Map _$AuthResponseDtoToJson(_AuthResponseDto instance) => - { - 'refresh': instance.refresh, - 'access': instance.access, - 'otp_status': instance.otpStatus, - }; diff --git a/packages/auth/lib/src/domain/entity/auth_response_entity.dart b/packages/auth/lib/src/domain/entity/auth_response_entity.dart deleted file mode 100644 index a2cf7a9..0000000 --- a/packages/auth/lib/src/domain/entity/auth_response_entity.dart +++ /dev/null @@ -1,12 +0,0 @@ -class AuthResponseEntity { - final String? access; - final String? refresh; - final bool? otpStatus; - - AuthResponseEntity({this.access, this.refresh, this.otpStatus}); - - @override - String toString() { - return 'AuthResponseEntity{accessToken: $access, refreshToken: $refresh, expiresIn: $otpStatus}'; - } -} diff --git a/packages/auth/lib/src/domain/repositories/auth_repository.dart b/packages/auth/lib/src/domain/repositories/auth_repository.dart deleted file mode 100644 index 1d7748c..0000000 --- a/packages/auth/lib/src/domain/repositories/auth_repository.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:auth/src/domain/entity/auth_response_entity.dart'; - -abstract class AuthRepository { - Future signIn({ - required Map authRequest, - }); -} diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml deleted file mode 100644 index e6f65ab..0000000 --- a/packages/auth/pubspec.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: auth -description: A starting point for Dart libraries or applications. -publish_to: 'none' -version: 1.0.0 - -# repository: https://github.com/my_org/my_repo - -environment: - sdk: ^3.7.2 - -dependencies: - # path: ^1.8.0 - rasadyar_core: - path: ../core - -dev_dependencies: - lints: ^5.0.0 - test: ^1.24.0 - flutter_test: - sdk: flutter - flutter_lints: ^5.0.0 - ##code generation - build_runner: ^2.4.15 - hive_ce_generator: ^1.9.1 - freezed: ^3.0.3 - json_serializable: ^6.9.4 - - ##test - mocktail: ^1.0.4 - get_test: ^4.0.1 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/packages/auth/test/auth_test.dart b/packages/auth/test/auth_test.dart deleted file mode 100644 index 12ebb82..0000000 --- a/packages/auth/test/auth_test.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:auth/auth.dart'; -import 'package:test/test.dart'; - -void main() { - group('A group of tests', () { - - }); -} diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 0aa727e..f33e467 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -1,29 +1,31 @@ library; +//other packages +export 'package:flutter_localizations/flutter_localizations.dart'; +export 'package:flutter_map/flutter_map.dart'; +export 'package:flutter_map_animations/flutter_map_animations.dart'; +export 'package:flutter_rating_bar/flutter_rating_bar.dart'; +export 'package:flutter_slidable/flutter_slidable.dart'; +export 'package:font_awesome_flutter/font_awesome_flutter.dart'; +//freezed +export 'package:freezed_annotation/freezed_annotation.dart'; +export 'package:geolocator/geolocator.dart'; export 'package:get/get.dart'; +//di +export 'package:get_it/get_it.dart'; +//local storage +export 'package:hive_ce_flutter/hive_flutter.dart'; +//Map and location +export 'package:latlong2/latlong.dart'; +export 'package:persian_datetime_picker/persian_datetime_picker.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; -//other packages -export 'package:flutter_localizations/flutter_localizations.dart'; -export 'package:flutter_slidable/flutter_slidable.dart'; -export 'package:font_awesome_flutter/font_awesome_flutter.dart'; -export 'package:flutter_rating_bar/flutter_rating_bar.dart'; -export 'package:persian_datetime_picker/persian_datetime_picker.dart'; - -//freezed -export 'package:freezed_annotation/freezed_annotation.dart'; - -//local storage -export 'package:hive_ce_flutter/hive_flutter.dart'; - -//Map and location -export 'package:latlong2/latlong.dart'; -export 'package:flutter_map/flutter_map.dart'; -export 'package:geolocator/geolocator.dart'; -export 'package:flutter_map_animations/flutter_map_animations.dart'; - - - - +export 'infrastructure/remote/dio_form_data.dart'; +//network +export 'infrastructure/remote/dio_remote.dart'; +export 'infrastructure/remote/dio_response.dart'; +//utils +export 'utils/logger_utils.dart'; +export 'utils/safe_call_utils.dart'; diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 6b8ac08..9e5a208 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -1,16 +1,12 @@ -import 'dart:typed_data'; - import 'package:dio/dio.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart'; -import 'package:rasadyar_core/infrastructure/remote/interfaces/i_http_response.dart'; -import 'package:rasadyar_core/infrastructure/remote/interfaces/i_remote.dart'; import 'dio_form_data.dart'; import 'dio_response.dart'; import 'interfaces/i_http_client.dart'; -class DioRemote implements IRemote, IHttpClient { +class DioRemote implements IHttpClient { final String baseUrl; late final Dio _dio; @@ -24,31 +20,31 @@ class DioRemote implements IRemote, IHttpClient { } @override - Future get( - String path, { - Map? queryParameters, - Map? headers, - ProgressCallback? onReceiveProgress, - }) async { - final response = await _dio.get( + Future> get( + String path, { + Map? queryParameters, + Map? headers, + ProgressCallback? onReceiveProgress, + }) async { + final response = await _dio.get( path, queryParameters: queryParameters, options: Options(headers: headers), onReceiveProgress: onReceiveProgress, ); - return DioHttpResponse(response); + return DioResponse(response); } @override - Future post( - String path, { - dynamic data, - Map? queryParameters, - Map? headers, - ProgressCallback? onSendProgress, - ProgressCallback? onReceiveProgress, - }) async { - final response = await _dio.post( + Future> post( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final response = await _dio.post( path, data: data, queryParameters: queryParameters, @@ -56,19 +52,19 @@ class DioRemote implements IRemote, IHttpClient { onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); - return DioHttpResponse(response); + return DioResponse(response); } @override - Future put( - String path, { - dynamic data, - Map? queryParameters, - Map? headers, - ProgressCallback? onSendProgress, - ProgressCallback? onReceiveProgress, - }) async { - final response = await _dio.put( + Future> put( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final response = await _dio.put( path, data: data, queryParameters: queryParameters, @@ -76,51 +72,51 @@ class DioRemote implements IRemote, IHttpClient { onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); - return DioHttpResponse(response); + return DioResponse(response); } @override - Future delete( - String path, { - dynamic data, - Map? queryParameters, - Map? headers, - }) async { - final response = await _dio.delete( + Future> delete( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + }) async { + final response = await _dio.delete( path, data: data, queryParameters: queryParameters, options: Options(headers: headers), ); - return DioHttpResponse(response); + return DioResponse(response); } @override - Future> download( - String url, { - ProgressCallback? onReceiveProgress, - }) async { + Future> download( + String url, { + ProgressCallback? onReceiveProgress, + }) async { final response = await _dio.get( url, options: Options(responseType: ResponseType.bytes), onReceiveProgress: onReceiveProgress, ); - return DioHttpResponse(response); + return DioResponse(response); } @override - Future upload( - String path, { - required IFormData formData, - Map? headers, - ProgressCallback? onSendProgress, - }) async { - final response = await _dio.post( + Future> upload( + String path, { + required IFormData formData, + Map? headers, + ProgressCallback? onSendProgress, + }) async { + final response = await _dio.post( path, data: (formData as DioFormData).raw, options: Options(headers: headers, contentType: 'multipart/form-data'), onSendProgress: onSendProgress, ); - return DioHttpResponse(response); + return DioResponse(response); } } diff --git a/packages/core/lib/infrastructure/remote/dio_response.dart b/packages/core/lib/infrastructure/remote/dio_response.dart index 0a42eea..97a14c3 100644 --- a/packages/core/lib/infrastructure/remote/dio_response.dart +++ b/packages/core/lib/infrastructure/remote/dio_response.dart @@ -1,10 +1,10 @@ import 'interfaces/i_http_response.dart'; import 'package:dio/dio.dart'; -class DioHttpResponse implements IHttpResponse { +class DioResponse implements IHttpResponse { final Response _response; - DioHttpResponse(this._response); + DioResponse(this._response); @override T? get data => _response.data; @@ -13,8 +13,7 @@ class DioHttpResponse implements IHttpResponse { int get statusCode => _response.statusCode ?? 0; @override - Map> get headers => - _response.headers.map.map((k, v) => MapEntry(k, v)); + Map? get headers => _response.headers.map; @override bool get isSuccessful => statusCode >= 200 && statusCode < 300; diff --git a/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart b/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart index 253130a..9550c18 100644 --- a/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart +++ b/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart @@ -1,51 +1,54 @@ + import 'dart:typed_data'; import 'package:dio/dio.dart'; -import 'package:rasadyar_core/infrastructure/remote/dio_form_data.dart'; -import 'i_http_response.dart'; import 'i_form_data.dart'; +import 'i_http_response.dart'; abstract class IHttpClient { - Future get( + Future init(); + + Future> get( String path, { Map? queryParameters, Map? headers, ProgressCallback? onReceiveProgress, }); - Future post( - String path, { - dynamic data, - Map? queryParameters, - Map? headers, - ProgressCallback? onSendProgress, - ProgressCallback? onReceiveProgress, - }); - Future put( - String path, { - dynamic data, - Map? queryParameters, - Map? headers, - ProgressCallback? onSendProgress, - ProgressCallback? onReceiveProgress, - }); + Future> post( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }); - Future delete( - String path, { - dynamic data, - Map? queryParameters, - Map? headers, - }); + Future> put( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }); - Future> download( - String url, { - ProgressCallback? onReceiveProgress, - }); + Future> delete( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + }); - Future upload( - String path, { - required IFormData formData, - Map? headers, - ProgressCallback? onSendProgress, - }); + Future> download( + String url, { + ProgressCallback? onReceiveProgress, + }); + + Future> upload( + String path, { + required IFormData formData, + Map? headers, + ProgressCallback? onSendProgress, + }); } diff --git a/packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart b/packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart index 14dd20a..461146a 100644 --- a/packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart +++ b/packages/core/lib/infrastructure/remote/interfaces/i_http_response.dart @@ -1,6 +1,6 @@ abstract class IHttpResponse { T? get data; int get statusCode; - Map> get headers; + Map? get headers; bool get isSuccessful; } diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart index 3060019..7afef0e 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; -import 'package:rasadyar_core/presentation/utils/color_utils.dart'; class ROutlinedElevatedIcon extends StatefulWidget { ROutlinedElevatedIcon({ @@ -127,6 +125,5 @@ Color? _getIconColor(BuildContext context) { } return Colors.blue; }).resolve({}); - fLog(ss); return ss; } diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart index b430ad6..aa74dbc 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:rasadyar_core/data/utils.dart'; + import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; import 'package:flutter/material.dart'; diff --git a/packages/core/lib/utils/README.md b/packages/core/lib/utils/README.md new file mode 100644 index 0000000..c3df897 --- /dev/null +++ b/packages/core/lib/utils/README.md @@ -0,0 +1,6 @@ +```markdown +در معماری DDD (Domain-Driven Design)، فایل‌های utils یا همان ابزارهای کمکی (utility/helpers) معمولاً: + +✅ در هیچ لایه‌ی خاصی قرار نمی‌گیرند، +❗ بلکه به‌صورت cross-cutting concerns یا "مسائل متقاطع" در نظر گرفته می‌شن، چون در همه‌ی لایه‌ها ممکنه استفاده بشن. +``` \ No newline at end of file diff --git a/packages/core/lib/data/utils.dart b/packages/core/lib/utils/logger_utils.dart similarity index 100% rename from packages/core/lib/data/utils.dart rename to packages/core/lib/utils/logger_utils.dart diff --git a/packages/core/lib/utils/safe_call_utils.dart b/packages/core/lib/utils/safe_call_utils.dart new file mode 100644 index 0000000..116101f --- /dev/null +++ b/packages/core/lib/utils/safe_call_utils.dart @@ -0,0 +1,71 @@ +import 'package:flutter/foundation.dart'; + +typedef AsyncCallback = Future Function(); +typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace); +typedef VoidCallback = void Function(); + +// تعریف دقیق تابع safeCall +Future safeCall({ + required AsyncCallback call, + Function(T result)? onSuccess, + ErrorCallback? onError, + VoidCallback? onComplete, + bool showLoading = false, + bool showError = false, + bool showSuccess = false, + bool showToast = false, + bool showSnackBar = false, + Function()? onShowLoading, + Function()? onHideLoading, + Function()? onShowSuccessMessage, + Function()? onShowErrorMessage, +}) async { + try { + if (showLoading) { + (onShowLoading ?? _defaultShowLoading)(); + } + + final result = await call(); + + if (showSuccess) { + (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); + } + + onSuccess?.call(result); + return result; // اضافه کردن بازگشت نتیجه + + } catch (error, stackTrace) { + if (showError) { + (onShowErrorMessage ?? _defaultShowErrorMessage)(); + } + + onError?.call(error, stackTrace); + if (kDebugMode) { + print('safeCall error: $error\n$stackTrace'); + } + + return null; + } finally { + if (showLoading) { + (onHideLoading ?? _defaultHideLoading)(); + } + + onComplete?.call(); + } +} + +void _defaultShowLoading() { + // پیاده‌سازی پیش‌فرض +} + +void _defaultHideLoading() { + // پیاده‌سازی پیش‌فرض +} + +void _defaultShowSuccessMessage() { + // پیاده‌سازی پیش‌فرض +} + +void _defaultShowErrorMessage() { + // پیاده‌سازی پیش‌فرض +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 9434345..711330d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,22 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f + url: "https://pub.dev" + source: hosted + version: "82.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" + url: "https://pub.dev" + source: hosted + version: "7.4.5" args: dependency: transitive description: @@ -25,6 +41,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.dev" + source: hosted + version: "4.0.4" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + url: "https://pub.dev" + source: hosted + version: "2.4.15" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + url: "https://pub.dev" + source: hosted + version: "8.9.5" characters: dependency: transitive description: @@ -33,6 +113,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" clock: dependency: transitive description: @@ -41,6 +129,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" collection: dependency: transitive description: @@ -49,6 +145,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" crypto: dependency: transitive description: @@ -73,14 +177,38 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - dartx: + dart_style: dependency: transitive + description: + name: dart_style + sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + dartx: + dependency: "direct main" description: name: dartx sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" url: "https://pub.dev" source: hosted version: "1.2.0" + dio: + dependency: "direct main" + description: + name: dio + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + url: "https://pub.dev" + source: hosted + version: "5.8.0+1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.dev" + source: hosted + version: "2.1.1" fake_async: dependency: transitive description: @@ -97,6 +225,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" fixnum: dependency: transitive description: @@ -124,7 +260,7 @@ packages: source: sdk version: "0.0.0" flutter_map: - dependency: transitive + dependency: "direct main" description: name: flutter_map sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a @@ -132,7 +268,7 @@ packages: source: hosted version: "8.1.1" flutter_map_animations: - dependency: transitive + dependency: "direct main" description: name: flutter_map_animations sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e @@ -140,7 +276,7 @@ packages: source: hosted version: "0.9.0" flutter_rating_bar: - dependency: transitive + dependency: "direct main" description: name: flutter_rating_bar sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 @@ -148,7 +284,7 @@ packages: source: hosted version: "4.0.1" flutter_slidable: - dependency: transitive + dependency: "direct main" description: name: flutter_slidable sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a @@ -156,7 +292,7 @@ packages: source: hosted version: "4.0.0" flutter_svg: - dependency: transitive + dependency: "direct main" description: name: flutter_svg sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 @@ -174,23 +310,39 @@ packages: source: sdk version: "0.0.0" font_awesome_flutter: - dependency: transitive + dependency: "direct main" description: name: font_awesome_flutter sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a url: "https://pub.dev" source: hosted version: "10.8.0" + freezed: + dependency: "direct dev" + description: + name: freezed + sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" + url: "https://pub.dev" + source: hosted + version: "3.0.6" freezed_annotation: - dependency: transitive + dependency: "direct main" description: name: freezed_annotation sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b url: "https://pub.dev" source: hosted version: "3.0.0" - geolocator: + frontend_server_client: dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + geolocator: + dependency: "direct main" description: name: geolocator sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 @@ -238,7 +390,7 @@ packages: source: hosted version: "0.2.5" get: - dependency: transitive + dependency: "direct main" description: name: get sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 @@ -246,15 +398,39 @@ packages: source: hosted version: "4.7.2" get_it: - dependency: transitive + dependency: "direct main" description: name: get_it sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 url: "https://pub.dev" source: hosted version: "8.0.3" - hive_ce: + get_test: + dependency: "direct dev" + description: + name: get_test + sha256: "558c39cb35fb37bd501f337dc143de60a4314d5ef3b75f4b0551d6741634995b" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + glob: dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hive_ce: + dependency: "direct main" description: name: hive_ce sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e @@ -262,21 +438,37 @@ packages: source: hosted version: "2.11.1" hive_ce_flutter: - dependency: transitive + dependency: "direct main" description: name: hive_ce_flutter sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" url: "https://pub.dev" source: hosted version: "2.3.0" + hive_ce_generator: + dependency: "direct dev" + description: + name: hive_ce_generator + sha256: "84940c2fd3cb1d1eb318892cdb666bc0b8023f365f28aefe09b9e5a7222bc740" + url: "https://pub.dev" + source: hosted + version: "1.9.1" http: dependency: transitive description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" http_parser: dependency: transitive description: @@ -285,21 +477,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" - inspection: - dependency: "direct main" - description: - path: "features/inspection" - relative: true - source: path - version: "1.0.1" intl: - dependency: transitive + dependency: "direct main" description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted version: "0.19.0" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" isolate_channel: dependency: transitive description: @@ -308,16 +501,32 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.2" - json_annotation: + js: dependency: transitive + description: + name: js + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + json_annotation: + dependency: "direct main" description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c + url: "https://pub.dev" + source: hosted + version: "6.9.5" latlong2: - dependency: transitive + dependency: "direct main" description: name: latlong2 sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" @@ -365,13 +574,21 @@ packages: source: hosted version: "1.0.1" logger: - dependency: transitive + dependency: "direct main" description: name: logger sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 url: "https://pub.dev" source: hosted version: "2.5.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" matcher: dependency: transitive description: @@ -404,6 +621,38 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: "4546eac99e8967ea91bae633d2ca7698181d008e95fa4627330cf903d573277a" + url: "https://pub.dev" + source: hosted + version: "5.4.6" + mocktail: + dependency: "direct dev" + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" path: dependency: transitive description: @@ -469,7 +718,7 @@ packages: source: hosted version: "2.3.0" permission_handler: - dependency: transitive + dependency: "direct main" description: name: permission_handler sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" @@ -517,7 +766,7 @@ packages: source: hosted version: "0.2.1" persian_datetime_picker: - dependency: transitive + dependency: "direct main" description: name: persian_datetime_picker sha256: "7ccbfd3a68dc89d405550f624e9fa590c914fed2aa2d48973c4f4400baab2e06" @@ -556,6 +805,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pretty_dio_logger: + dependency: "direct main" + description: + name: pretty_dio_logger + sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407" + url: "https://pub.dev" + source: hosted + version: "1.4.0" proj4dart: dependency: transitive description: @@ -564,6 +829,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" rasadyar_core: dependency: "direct main" description: @@ -572,7 +853,7 @@ packages: source: path version: "1.0.0+1" rxdart: - dependency: transitive + dependency: "direct main" description: name: rxdart sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" @@ -587,11 +868,43 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + url: "https://pub.dev" + source: hosted + version: "1.3.5" source_span: dependency: transitive description: @@ -624,6 +937,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: @@ -656,6 +977,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.5" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" typed_data: dependency: transitive description: @@ -720,6 +1049,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.1" + watcher: + dependency: transitive + description: + name: watcher + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" web: dependency: transitive description: @@ -728,6 +1065,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" wkt_parser: dependency: transitive description: @@ -752,6 +1105,22 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" + yaml_writer: + dependency: transitive + description: + name: yaml_writer + sha256: "69651cd7238411179ac32079937d4aa9a2970150d6b2ae2c6fe6de09402a5dc5" + url: "https://pub.dev" + source: hosted + version: "2.1.0" sdks: dart: ">=3.7.2 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 200f78e..4ad2865 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,10 +10,57 @@ dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - inspection: - path: ./features/inspection + #UI + cupertino_icons: ^1.0.8 + flutter_slidable: ^4.0.0 + flutter_rating_bar: ^4.0.1 + + ##Log + logger: ^2.5.0 + + ## reactive + dartx: ^1.2.0 + rxdart: ^0.28.0 + + ## local storage + hive_ce: ^2.11.1 + hive_ce_flutter: ^2.3.0 + + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 + + + #SVG + flutter_svg: ^2.0.17 + font_awesome_flutter: ^10.8.0 + + ##state manger + get: ^4.7.2 + + ##Di + get_it: ^8.0.3 + + #other + permission_handler: ^12.0.0+1 + persian_datetime_picker: ^3.1.0 + + #L10N tools + intl: ^0.19.0 + + + #Map + flutter_map: ^8.1.1 + flutter_map_animations: ^0.9.0 + #location + latlong2: ^0.9.1 + geolocator: ^14.0.0 + #network + dio: ^5.8.0+1 + + #networkLogger + pretty_dio_logger: ^1.4.0 rasadyar_core: path: ./packages/core @@ -24,6 +71,17 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 + ##code generation + build_runner: ^2.4.15 + hive_ce_generator: ^1.9.1 + freezed: ^3.0.6 + json_serializable: ^6.9.4 + + ##test + mocktail: ^1.0.4 + get_test: ^4.0.1 + + flutter: From feb3df6a06c17192e8b38f6cf7828410e5cb41c4 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 14 May 2025 09:42:44 +0330 Subject: [PATCH 052/256] fix : change app architecture feat : add some method to local storage --- features/auth/lib/data/di/auth_di.dart | 8 - {features => packages}/auth/lib/auth.dart | 0 packages/auth/lib/data/common/constant.dart | 14 + .../auth/lib/data/common/dio_manager.dart | 42 ++ packages/auth/lib/data/di/auth_di.dart | 23 + .../local/user_local/user_local_model.dart | 0 .../local/user_local/user_local_model.g.dart | 0 .../login_request/login_request_model.dart | 0 .../login_request_model.freezed.dart | 0 .../login_request/login_request_model.g.dart | 0 .../response/auth/auth_response_model.dart | 0 .../captcha/captcha_response_model.dart | 0 .../data/repositories/auth_repository.dart | 2 + .../repositories/auth_repository_imp.dart | 19 + .../lib/data/services/auth_middelware.dart | 16 + .../auth/lib/data/services/auth_service.dart | 9 + .../data/services/token_storage_service.dart | 59 ++ .../lib/presentation/pages/auth/logic.dart | 0 .../lib/presentation/pages/auth/view.dart | 0 .../lib/presentation/pages/modules/logic.dart | 0 .../lib/presentation/pages/modules/view.dart | 0 .../auth/lib/presentation/routes/pages.dart | 0 .../auth/lib/presentation/routes/paths.dart | 0 .../local/hive_local_storage.dart | 77 +- .../infrastructure/local/i_local_storage.dart | 49 +- .../lib/data/utils/marker_generator.dart | 0 .../inspection/lib/inspection.dart | 0 .../lib/presentation/action/logic.dart | 2 +- .../lib/presentation/action/view.dart | 0 .../add_mobile_inspector/logic.dart | 0 .../add_mobile_inspector/view.dart | 2 +- .../presentation/add_supervision/logic.dart | 3 +- .../presentation/add_supervision/view.dart | 2 +- .../display_information/logic.dart | 0 .../display_information/view.dart | 0 .../lib/presentation/filter/logic.dart | 5 +- .../lib/presentation/filter/view.dart | 4 +- .../presentation/location_details/logic.dart | 0 .../presentation/location_details/view.dart | 0 .../lib/presentation/profile/logic.dart | 0 .../lib/presentation/profile/view.dart | 0 .../registration_of_violation/logic.dart | 0 .../registration_of_violation/view.dart | 5 +- .../lib/presentation/root/logic.dart | 10 +- .../lib/presentation/root/view.dart | 4 +- .../lib/presentation/routes/app_pages.dart | 36 +- .../lib/presentation/routes/app_routes.dart | 0 .../presentation/widget/cluster_marker.dart | 0 packages/inspection/pubspec.lock | 673 ++++++++++++++++++ packages/inspection/pubspec.yaml | 13 + 50 files changed, 1007 insertions(+), 70 deletions(-) delete mode 100644 features/auth/lib/data/di/auth_di.dart rename {features => packages}/auth/lib/auth.dart (100%) create mode 100644 packages/auth/lib/data/common/constant.dart create mode 100644 packages/auth/lib/data/common/dio_manager.dart create mode 100644 packages/auth/lib/data/di/auth_di.dart rename {features => packages}/auth/lib/data/models/local/user_local/user_local_model.dart (100%) rename {features => packages}/auth/lib/data/models/local/user_local/user_local_model.g.dart (100%) rename {features => packages}/auth/lib/data/models/request/login_request/login_request_model.dart (100%) rename {features => packages}/auth/lib/data/models/request/login_request/login_request_model.freezed.dart (100%) rename {features => packages}/auth/lib/data/models/request/login_request/login_request_model.g.dart (100%) rename {features => packages}/auth/lib/data/models/response/auth/auth_response_model.dart (100%) rename {features => packages}/auth/lib/data/models/response/captcha/captcha_response_model.dart (100%) rename {features => packages}/auth/lib/data/repositories/auth_repository.dart (92%) rename {features => packages}/auth/lib/data/repositories/auth_repository_imp.dart (81%) create mode 100644 packages/auth/lib/data/services/auth_middelware.dart create mode 100644 packages/auth/lib/data/services/auth_service.dart create mode 100644 packages/auth/lib/data/services/token_storage_service.dart rename {features => packages}/auth/lib/presentation/pages/auth/logic.dart (100%) rename {features => packages}/auth/lib/presentation/pages/auth/view.dart (100%) rename {features => packages}/auth/lib/presentation/pages/modules/logic.dart (100%) rename {features => packages}/auth/lib/presentation/pages/modules/view.dart (100%) rename {features => packages}/auth/lib/presentation/routes/pages.dart (100%) rename {features => packages}/auth/lib/presentation/routes/paths.dart (100%) rename {features => packages}/inspection/lib/data/utils/marker_generator.dart (100%) rename {features => packages}/inspection/lib/inspection.dart (100%) rename {features => packages}/inspection/lib/presentation/action/logic.dart (97%) rename {features => packages}/inspection/lib/presentation/action/view.dart (100%) rename {features => packages}/inspection/lib/presentation/add_mobile_inspector/logic.dart (100%) rename {features => packages}/inspection/lib/presentation/add_mobile_inspector/view.dart (98%) rename {features => packages}/inspection/lib/presentation/add_supervision/logic.dart (96%) rename {features => packages}/inspection/lib/presentation/add_supervision/view.dart (99%) rename {features => packages}/inspection/lib/presentation/display_information/logic.dart (100%) rename {features => packages}/inspection/lib/presentation/display_information/view.dart (100%) rename {features => packages}/inspection/lib/presentation/filter/logic.dart (97%) rename {features => packages}/inspection/lib/presentation/filter/view.dart (99%) rename {features => packages}/inspection/lib/presentation/location_details/logic.dart (100%) rename {features => packages}/inspection/lib/presentation/location_details/view.dart (100%) rename {features => packages}/inspection/lib/presentation/profile/logic.dart (100%) rename {features => packages}/inspection/lib/presentation/profile/view.dart (100%) rename {features => packages}/inspection/lib/presentation/registration_of_violation/logic.dart (100%) rename {features => packages}/inspection/lib/presentation/registration_of_violation/view.dart (95%) rename {features => packages}/inspection/lib/presentation/root/logic.dart (90%) rename {features => packages}/inspection/lib/presentation/root/view.dart (98%) rename {features => packages}/inspection/lib/presentation/routes/app_pages.dart (58%) rename {features => packages}/inspection/lib/presentation/routes/app_routes.dart (100%) rename {features => packages}/inspection/lib/presentation/widget/cluster_marker.dart (100%) create mode 100644 packages/inspection/pubspec.lock create mode 100644 packages/inspection/pubspec.yaml diff --git a/features/auth/lib/data/di/auth_di.dart b/features/auth/lib/data/di/auth_di.dart deleted file mode 100644 index 7e9c760..0000000 --- a/features/auth/lib/data/di/auth_di.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:rasadyar_core/core.dart'; - - - -GetIt diAuth = GetIt.instance; - - - diff --git a/features/auth/lib/auth.dart b/packages/auth/lib/auth.dart similarity index 100% rename from features/auth/lib/auth.dart rename to packages/auth/lib/auth.dart diff --git a/packages/auth/lib/data/common/constant.dart b/packages/auth/lib/data/common/constant.dart new file mode 100644 index 0000000..c9a0aba --- /dev/null +++ b/packages/auth/lib/data/common/constant.dart @@ -0,0 +1,14 @@ +enum ApiEnvironment { + dam(url: 'https://api.dam.rasadyar.net'); + + const ApiEnvironment({required this.url}); + + final String url; + + String get baseUrl { + switch (this) { + case ApiEnvironment.dam: + return url; + } + } +} diff --git a/packages/auth/lib/data/common/dio_manager.dart b/packages/auth/lib/data/common/dio_manager.dart new file mode 100644 index 0000000..9be65ca --- /dev/null +++ b/packages/auth/lib/data/common/dio_manager.dart @@ -0,0 +1,42 @@ +import 'package:auths/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../di/auth_di.dart'; +import 'constant.dart'; + +class DioRemoteManager { + DioRemote? _currentClient; + ApiEnvironment? _currentEnv; + + DioRemote setEnvironment(ApiEnvironment env) { + if (_currentEnv != env) { + _currentClient = DioRemote(env.baseUrl); + _currentEnv = env; + } + return _currentClient!; + } + + DioRemote get currentClient { + if (_currentClient == null) { + throw Exception('Call setEnvironment() before accessing DioRemote.'); + } + + return _currentClient!; + } + + ApiEnvironment? get currentEnv => _currentEnv; +} + +Future switchAuthEnvironment(ApiEnvironment env) async { + final manager = diAuth.get(); + + final dioRemote = manager.setEnvironment(env); + + if (diAuth.isRegistered()) { + await diAuth.unregister(); + } + + diAuth.registerLazySingleton( + () => AuthRepositoryImpl(dioRemote), + ); +} diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart new file mode 100644 index 0000000..375d940 --- /dev/null +++ b/packages/auth/lib/data/di/auth_di.dart @@ -0,0 +1,23 @@ +import 'package:auths/data/common/constant.dart'; +import 'package:auths/data/repositories/auth_repository_imp.dart'; +import 'package:auths/data/services/auth_service.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../common/dio_manager.dart'; + +GetIt diAuth = GetIt.instance; + +Future setupAuthDI() async { + diAuth.registerLazySingleton(() => DioRemoteManager()); + + final manager = diAuth.get(); + final dioRemote = manager.setEnvironment(ApiEnvironment.dam); + + diAuth.registerLazySingleton( + () => AuthRepositoryImpl(dioRemote), + ); + diAuth.registerLazySingleton(() => AuthService()); + + //hive + await diAuth.registerCachedFactoryAsync(() async=>await ,) +} diff --git a/features/auth/lib/data/models/local/user_local/user_local_model.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.dart similarity index 100% rename from features/auth/lib/data/models/local/user_local/user_local_model.dart rename to packages/auth/lib/data/models/local/user_local/user_local_model.dart diff --git a/features/auth/lib/data/models/local/user_local/user_local_model.g.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart similarity index 100% rename from features/auth/lib/data/models/local/user_local/user_local_model.g.dart rename to packages/auth/lib/data/models/local/user_local/user_local_model.g.dart diff --git a/features/auth/lib/data/models/request/login_request/login_request_model.dart b/packages/auth/lib/data/models/request/login_request/login_request_model.dart similarity index 100% rename from features/auth/lib/data/models/request/login_request/login_request_model.dart rename to packages/auth/lib/data/models/request/login_request/login_request_model.dart diff --git a/features/auth/lib/data/models/request/login_request/login_request_model.freezed.dart b/packages/auth/lib/data/models/request/login_request/login_request_model.freezed.dart similarity index 100% rename from features/auth/lib/data/models/request/login_request/login_request_model.freezed.dart rename to packages/auth/lib/data/models/request/login_request/login_request_model.freezed.dart diff --git a/features/auth/lib/data/models/request/login_request/login_request_model.g.dart b/packages/auth/lib/data/models/request/login_request/login_request_model.g.dart similarity index 100% rename from features/auth/lib/data/models/request/login_request/login_request_model.g.dart rename to packages/auth/lib/data/models/request/login_request/login_request_model.g.dart diff --git a/features/auth/lib/data/models/response/auth/auth_response_model.dart b/packages/auth/lib/data/models/response/auth/auth_response_model.dart similarity index 100% rename from features/auth/lib/data/models/response/auth/auth_response_model.dart rename to packages/auth/lib/data/models/response/auth/auth_response_model.dart diff --git a/features/auth/lib/data/models/response/captcha/captcha_response_model.dart b/packages/auth/lib/data/models/response/captcha/captcha_response_model.dart similarity index 100% rename from features/auth/lib/data/models/response/captcha/captcha_response_model.dart rename to packages/auth/lib/data/models/response/captcha/captcha_response_model.dart diff --git a/features/auth/lib/data/repositories/auth_repository.dart b/packages/auth/lib/data/repositories/auth_repository.dart similarity index 92% rename from features/auth/lib/data/repositories/auth_repository.dart rename to packages/auth/lib/data/repositories/auth_repository.dart index 1fecfa5..eb68705 100644 --- a/features/auth/lib/data/repositories/auth_repository.dart +++ b/packages/auth/lib/data/repositories/auth_repository.dart @@ -12,6 +12,8 @@ abstract class AuthRepository { Future logout(); + Future hasAuthenticated(); + Future loginWithRefreshToken({ required Map authRequest, diff --git a/features/auth/lib/data/repositories/auth_repository_imp.dart b/packages/auth/lib/data/repositories/auth_repository_imp.dart similarity index 81% rename from features/auth/lib/data/repositories/auth_repository_imp.dart rename to packages/auth/lib/data/repositories/auth_repository_imp.dart index 6486f4d..a3bc1ee 100644 --- a/features/auth/lib/data/repositories/auth_repository_imp.dart +++ b/packages/auth/lib/data/repositories/auth_repository_imp.dart @@ -78,4 +78,23 @@ class AuthRepositoryImpl implements AuthRepository { // TODO: implement logout throw UnimplementedError(); } + + @override + Future hasAuthenticated() async { + final response = await safeCall>( + call: + () async => await _httpClient.get( + '$_BASE_URL/login/', + headers: {'Content-Type': 'application/json'}, + ), + onSuccess: (response) { + iLog(response); + }, + onError: (error, trace) { + throw Exception('Error during sign in: $error'); + }, + ); + + return response?.data ?? false; + } } diff --git a/packages/auth/lib/data/services/auth_middelware.dart b/packages/auth/lib/data/services/auth_middelware.dart new file mode 100644 index 0000000..bf63f2e --- /dev/null +++ b/packages/auth/lib/data/services/auth_middelware.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../../presentation/routes/pages.dart'; + +class AuthMiddleware extends GetMiddleware{ + @override + RouteSettings? redirect(String? route) { + if(route == AuthPaths.auth) { + return const RouteSettings(name: AuthPaths.moduleList); + } + return super.redirect(route); + } + + +} diff --git a/packages/auth/lib/data/services/auth_service.dart b/packages/auth/lib/data/services/auth_service.dart new file mode 100644 index 0000000..b1dffa5 --- /dev/null +++ b/packages/auth/lib/data/services/auth_service.dart @@ -0,0 +1,9 @@ +import 'package:rasadyar_core/core.dart'; + +class AuthService extends GetxService{ + + + Future initService() async { + + } +} \ No newline at end of file diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart new file mode 100644 index 0000000..1b57026 --- /dev/null +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -0,0 +1,59 @@ +import 'dart:convert'; + +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/injection/di.dart'; + +class TokenStorageService extends GetxService { + static const String _boxName = 'secureBox'; + static const String _accessTokenKey = 'accessToken'; + static const String _refreshTokenKey = 'refreshToken'; + final FlutterSecureStorage _secureStorage = FlutterSecureStorage(); + final HiveLocalStorage _localStorage = diCore.get(); + + Future init() async { + final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key'); + final encryptionKey = + encryptedKey != null + ? base64Url.decode(encryptedKey) + : Hive.generateSecureKey(); + + if (encryptedKey == null) { + await _secureStorage.write( + key: 'hive_enc_key', + value: base64UrlEncode(encryptionKey), + ); + } + + await Hive.initFlutter(); + await Hive.openBox( + _boxName, + encryptionCipher: HiveAesCipher(encryptionKey), + ); + } + + Future saveAccessToken(String token) async { + final box = Hive.box(_boxName); + await box.put(_accessTokenKey, token); + } + + Future saveRefreshToken(String token) async { + final box = Hive.box(_boxName); + await box.put(_refreshTokenKey, token); + } + + Future getAccessToken() async { + final box = Hive.box(_boxName); + return box.get(_accessTokenKey); + } + + Future getRefreshToken() async { + final box = Hive.box(_boxName); + return box.get(_refreshTokenKey); + } + + Future deleteTokens() async { + final box = Hive.box(_boxName); + await box.delete(_accessTokenKey); + await box.delete(_refreshTokenKey); + } +} diff --git a/features/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart similarity index 100% rename from features/auth/lib/presentation/pages/auth/logic.dart rename to packages/auth/lib/presentation/pages/auth/logic.dart diff --git a/features/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart similarity index 100% rename from features/auth/lib/presentation/pages/auth/view.dart rename to packages/auth/lib/presentation/pages/auth/view.dart diff --git a/features/auth/lib/presentation/pages/modules/logic.dart b/packages/auth/lib/presentation/pages/modules/logic.dart similarity index 100% rename from features/auth/lib/presentation/pages/modules/logic.dart rename to packages/auth/lib/presentation/pages/modules/logic.dart diff --git a/features/auth/lib/presentation/pages/modules/view.dart b/packages/auth/lib/presentation/pages/modules/view.dart similarity index 100% rename from features/auth/lib/presentation/pages/modules/view.dart rename to packages/auth/lib/presentation/pages/modules/view.dart diff --git a/features/auth/lib/presentation/routes/pages.dart b/packages/auth/lib/presentation/routes/pages.dart similarity index 100% rename from features/auth/lib/presentation/routes/pages.dart rename to packages/auth/lib/presentation/routes/pages.dart diff --git a/features/auth/lib/presentation/routes/paths.dart b/packages/auth/lib/presentation/routes/paths.dart similarity index 100% rename from features/auth/lib/presentation/routes/paths.dart rename to packages/auth/lib/presentation/routes/paths.dart diff --git a/packages/core/lib/infrastructure/local/hive_local_storage.dart b/packages/core/lib/infrastructure/local/hive_local_storage.dart index c63e7f3..e88baa6 100644 --- a/packages/core/lib/infrastructure/local/hive_local_storage.dart +++ b/packages/core/lib/infrastructure/local/hive_local_storage.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:hive_ce_flutter/hive_flutter.dart'; import 'i_local_storage.dart'; @@ -13,39 +14,40 @@ class HiveLocalStorage implements ILocalStorage { Future init() async => await Hive.initFlutter(); @override - Future openBox(String boxName) async { + Future openBox( + String boxName, { + HiveCipher? encryptionCipher, + bool crashRecovery = true, + String? path, + Uint8List? bytes, + String? collection, + }) async { if (!_boxes.containsKey(boxName)) { - final box = await Hive.openBox(boxName); + final box = await Hive.openBox( + boxName, + encryptionCipher: encryptionCipher, + crashRecovery: crashRecovery, + ); _boxes[boxName] = box; } } @override - Future delete(String boxName, String key) async { - Box? box = await getBox(boxName); - await box.delete(key); - } - - @override - Future read(String boxName, String key) async { + Future read({required String boxName,required String key}) async { Box? box = await getBox(boxName); return box.get(key) as T?; } - @override - Future save(String boxName, String key, value) async { - Box? box = await getBox(boxName); - await box.put(key, value); - } + @override - Future add(String boxName, value) async { + Future add({required String boxName,required dynamic value}) async { Box? box = await getBox(boxName); await box.add(value); } @override - Future addAll(String boxName, Iterable values) async { + Future addAll({required String boxName,required Iterable values}) async { Box? box = await getBox(boxName); await box.addAll(values); } @@ -58,4 +60,47 @@ class HiveLocalStorage implements ILocalStorage { throw Exception('Box $boxName is not of expected type $T'); } } + + @override + Future clear(String boxName) async{ + await _boxes[boxName]?.clear(); + } + + @override + Future close(String boxName) async => await _boxes[boxName]?.close(); + + @override + Future deleteValue({ + required String boxName, + required String key, + }) async { + Box? box = await getBox(boxName); + await box.delete(key); + } + + @override + Future save({ + required String boxName, + required String key, + required value, + }) async{ + Box? box = await getBox(boxName); + await box.put(key, value); + } + + @override + Future saveAll({required String boxName, required Map entries}) async{ + Box? box = await getBox(boxName); + await box.putAll(entries); + } + + @override + Future saveAt({ + required String boxName, + required int index, + required value, + }) async{ + Box? box = await getBox(boxName); + await box.putAt(index, value); + } } diff --git a/packages/core/lib/infrastructure/local/i_local_storage.dart b/packages/core/lib/infrastructure/local/i_local_storage.dart index 2b0a7f4..ae011ea 100644 --- a/packages/core/lib/infrastructure/local/i_local_storage.dart +++ b/packages/core/lib/infrastructure/local/i_local_storage.dart @@ -1,11 +1,44 @@ -abstract class ILocalStorage{ +import 'package:flutter/foundation.dart'; +import 'package:hive_ce/hive.dart'; + +abstract class ILocalStorage { Future init(); - Future openBox(String boxName); - Future save(String boxName, String key, dynamic value); - Future read(String boxName, String key); - Future delete(String boxName, String key); - Future add(String boxName, E value); - Future addAll(String boxName, Iterable values); + Future openBox( + String boxName, { + HiveCipher? encryptionCipher, + bool crashRecovery = true, + String? path, + Uint8List? bytes, + String? collection, + }); -} \ No newline at end of file + Future read({required String boxName, required String key}); + + Future deleteValue({required String boxName, required String key}); + + Future add({required String boxName, required E value}); + + Future addAll({required String boxName, required Iterable values}); + + Future clear(String boxName); + + Future close(String boxName); + + Future save({ + required String boxName, + required String key, + required dynamic value, + }); + + Future saveAt({ + required String boxName, + required int index, + required dynamic value, + }); + + Future saveAll({ + required String boxName, + required Map entries, + }); +} diff --git a/features/inspection/lib/data/utils/marker_generator.dart b/packages/inspection/lib/data/utils/marker_generator.dart similarity index 100% rename from features/inspection/lib/data/utils/marker_generator.dart rename to packages/inspection/lib/data/utils/marker_generator.dart diff --git a/features/inspection/lib/inspection.dart b/packages/inspection/lib/inspection.dart similarity index 100% rename from features/inspection/lib/inspection.dart rename to packages/inspection/lib/inspection.dart diff --git a/features/inspection/lib/presentation/action/logic.dart b/packages/inspection/lib/presentation/action/logic.dart similarity index 97% rename from features/inspection/lib/presentation/action/logic.dart rename to packages/inspection/lib/presentation/action/logic.dart index 14cf098..34a4ec6 100644 --- a/features/inspection/lib/presentation/action/logic.dart +++ b/packages/inspection/lib/presentation/action/logic.dart @@ -1,5 +1,5 @@ import 'package:rasadyar_core/core.dart'; - +import 'package:rasadyar_core/data/utils.dart'; class ActionLogic extends GetxController with GetTickerProviderStateMixin { late Rx slidController; diff --git a/features/inspection/lib/presentation/action/view.dart b/packages/inspection/lib/presentation/action/view.dart similarity index 100% rename from features/inspection/lib/presentation/action/view.dart rename to packages/inspection/lib/presentation/action/view.dart diff --git a/features/inspection/lib/presentation/add_mobile_inspector/logic.dart b/packages/inspection/lib/presentation/add_mobile_inspector/logic.dart similarity index 100% rename from features/inspection/lib/presentation/add_mobile_inspector/logic.dart rename to packages/inspection/lib/presentation/add_mobile_inspector/logic.dart diff --git a/features/inspection/lib/presentation/add_mobile_inspector/view.dart b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart similarity index 98% rename from features/inspection/lib/presentation/add_mobile_inspector/view.dart rename to packages/inspection/lib/presentation/add_mobile_inspector/view.dart index 47ebdf8..d6b1a0d 100644 --- a/features/inspection/lib/presentation/add_mobile_inspector/view.dart +++ b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; -import '../routes/app_routes.dart'; import 'logic.dart'; class AddMobileInspectorPage extends GetView { diff --git a/features/inspection/lib/presentation/add_supervision/logic.dart b/packages/inspection/lib/presentation/add_supervision/logic.dart similarity index 96% rename from features/inspection/lib/presentation/add_supervision/logic.dart rename to packages/inspection/lib/presentation/add_supervision/logic.dart index 57352cc..4aee4ec 100644 --- a/features/inspection/lib/presentation/add_supervision/logic.dart +++ b/packages/inspection/lib/presentation/add_supervision/logic.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; -import '../routes/app_routes.dart'; - class AddSupervisionLogic extends GetxController { RxInt selectedSegment = 0.obs; RxInt violationSegmentsSelected = 0.obs; diff --git a/features/inspection/lib/presentation/add_supervision/view.dart b/packages/inspection/lib/presentation/add_supervision/view.dart similarity index 99% rename from features/inspection/lib/presentation/add_supervision/view.dart rename to packages/inspection/lib/presentation/add_supervision/view.dart index 17d1e52..eb989cb 100644 --- a/features/inspection/lib/presentation/add_supervision/view.dart +++ b/packages/inspection/lib/presentation/add_supervision/view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import '../routes/app_routes.dart'; +import 'package:inspection/inspection.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/features/inspection/lib/presentation/display_information/logic.dart b/packages/inspection/lib/presentation/display_information/logic.dart similarity index 100% rename from features/inspection/lib/presentation/display_information/logic.dart rename to packages/inspection/lib/presentation/display_information/logic.dart diff --git a/features/inspection/lib/presentation/display_information/view.dart b/packages/inspection/lib/presentation/display_information/view.dart similarity index 100% rename from features/inspection/lib/presentation/display_information/view.dart rename to packages/inspection/lib/presentation/display_information/view.dart diff --git a/features/inspection/lib/presentation/filter/logic.dart b/packages/inspection/lib/presentation/filter/logic.dart similarity index 97% rename from features/inspection/lib/presentation/filter/logic.dart rename to packages/inspection/lib/presentation/filter/logic.dart index 2d18e9b..a8610fd 100644 --- a/features/inspection/lib/presentation/filter/logic.dart +++ b/packages/inspection/lib/presentation/filter/logic.dart @@ -1,11 +1,10 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:inspection/data/utils/marker_generator.dart'; +import 'package:inspection/presentation/filter/view.dart'; import 'package:rasadyar_core/core.dart'; -import '../../data/utils/marker_generator.dart'; -import 'view.dart'; - class InspectorFilterLogic extends GetxController with GetTickerProviderStateMixin { Rx currentLocation = LatLng(35.824891, 50.948025).obs; diff --git a/features/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/filter/view.dart similarity index 99% rename from features/inspection/lib/presentation/filter/view.dart rename to packages/inspection/lib/presentation/filter/view.dart index 82ee88a..1046873 100644 --- a/features/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/filter/view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import '../routes/app_routes.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -508,6 +509,7 @@ Widget selectedLocationWidget({ required VoidCallback trigger, required VoidCallback toggle, }) { + eLog(showHint); if (showHint) { trigger.call(); } diff --git a/features/inspection/lib/presentation/location_details/logic.dart b/packages/inspection/lib/presentation/location_details/logic.dart similarity index 100% rename from features/inspection/lib/presentation/location_details/logic.dart rename to packages/inspection/lib/presentation/location_details/logic.dart diff --git a/features/inspection/lib/presentation/location_details/view.dart b/packages/inspection/lib/presentation/location_details/view.dart similarity index 100% rename from features/inspection/lib/presentation/location_details/view.dart rename to packages/inspection/lib/presentation/location_details/view.dart diff --git a/features/inspection/lib/presentation/profile/logic.dart b/packages/inspection/lib/presentation/profile/logic.dart similarity index 100% rename from features/inspection/lib/presentation/profile/logic.dart rename to packages/inspection/lib/presentation/profile/logic.dart diff --git a/features/inspection/lib/presentation/profile/view.dart b/packages/inspection/lib/presentation/profile/view.dart similarity index 100% rename from features/inspection/lib/presentation/profile/view.dart rename to packages/inspection/lib/presentation/profile/view.dart diff --git a/features/inspection/lib/presentation/registration_of_violation/logic.dart b/packages/inspection/lib/presentation/registration_of_violation/logic.dart similarity index 100% rename from features/inspection/lib/presentation/registration_of_violation/logic.dart rename to packages/inspection/lib/presentation/registration_of_violation/logic.dart diff --git a/features/inspection/lib/presentation/registration_of_violation/view.dart b/packages/inspection/lib/presentation/registration_of_violation/view.dart similarity index 95% rename from features/inspection/lib/presentation/registration_of_violation/view.dart rename to packages/inspection/lib/presentation/registration_of_violation/view.dart index 39d20ee..d823a60 100644 --- a/features/inspection/lib/presentation/registration_of_violation/view.dart +++ b/packages/inspection/lib/presentation/registration_of_violation/view.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:inspection/presentation/registration_of_violation/logic.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; -import '../routes/app_routes.dart'; -import 'logic.dart'; - class RegistrationOfViolationPage extends GetView { const RegistrationOfViolationPage({super.key}); diff --git a/features/inspection/lib/presentation/root/logic.dart b/packages/inspection/lib/presentation/root/logic.dart similarity index 90% rename from features/inspection/lib/presentation/root/logic.dart rename to packages/inspection/lib/presentation/root/logic.dart index 9a24ed9..bc88796 100644 --- a/features/inspection/lib/presentation/root/logic.dart +++ b/packages/inspection/lib/presentation/root/logic.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:inspection/presentation/action/view.dart'; +import 'package:inspection/presentation/filter/view.dart'; +import 'package:inspection/presentation/profile/view.dart'; import 'package:rasadyar_core/core.dart'; - -import '../action/view.dart'; -import '../filter/view.dart'; -import '../profile/view.dart'; - +import 'package:rasadyar_core/data/utils.dart'; enum ErrorLocationType { serviceDisabled, permissionDenied, none } @@ -51,6 +50,7 @@ class RootLogic extends GetxController { } } catch (e) { + eLog(e); return await Geolocator.openLocationSettings(); } } diff --git a/features/inspection/lib/presentation/root/view.dart b/packages/inspection/lib/presentation/root/view.dart similarity index 98% rename from features/inspection/lib/presentation/root/view.dart rename to packages/inspection/lib/presentation/root/view.dart index 1609912..356a1d6 100644 --- a/features/inspection/lib/presentation/root/view.dart +++ b/packages/inspection/lib/presentation/root/view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; - +import 'package:rasadyar_core/data/utils.dart'; import 'logic.dart'; @@ -25,7 +25,7 @@ class RootPage extends GetView { textStyle: AppFonts.yekan16, onPressed: () async { var service = await controller.locationServiceEnabled(); - + eLog(service); if (service) { controller.errorLocationType.remove( ErrorLocationType.serviceDisabled, diff --git a/features/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart similarity index 58% rename from features/inspection/lib/presentation/routes/app_pages.dart rename to packages/inspection/lib/presentation/routes/app_pages.dart index 59006ef..aeb25c4 100644 --- a/features/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -1,23 +1,21 @@ import 'package:rasadyar_core/core.dart'; - -import '../action/logic.dart'; -import '../add_mobile_inspector/logic.dart'; -import '../add_mobile_inspector/view.dart'; -import '../add_supervision/logic.dart'; -import '../add_supervision/view.dart'; -import '../display_information/logic.dart'; -import '../display_information/view.dart'; -import '../filter/logic.dart'; -import '../location_details/logic.dart'; -import '../location_details/view.dart'; -import '../profile/logic.dart'; -import '../profile/view.dart'; -import '../registration_of_violation/logic.dart'; -import '../registration_of_violation/view.dart'; -import '../root/logic.dart'; -import '../root/view.dart'; -import 'app_routes.dart'; - +import 'package:inspection/presentation/action/logic.dart'; +import 'package:inspection/presentation/add_mobile_inspector/logic.dart'; +import 'package:inspection/presentation/add_mobile_inspector/view.dart'; +import 'package:inspection/presentation/add_supervision/logic.dart'; +import 'package:inspection/presentation/add_supervision/view.dart'; +import 'package:inspection/presentation/display_information/logic.dart'; +import 'package:inspection/presentation/display_information/view.dart'; +import 'package:inspection/presentation/filter/logic.dart'; +import 'package:inspection/presentation/location_details/logic.dart'; +import 'package:inspection/presentation/location_details/view.dart'; +import 'package:inspection/presentation/profile/logic.dart'; +import 'package:inspection/presentation/profile/view.dart'; +import 'package:inspection/presentation/registration_of_violation/logic.dart'; +import 'package:inspection/presentation/registration_of_violation/view.dart'; +import 'package:inspection/presentation/root/logic.dart'; +import 'package:inspection/presentation/root/view.dart'; +import 'package:inspection/presentation/routes/app_routes.dart'; sealed class InspectionPages { InspectionPages._(); diff --git a/features/inspection/lib/presentation/routes/app_routes.dart b/packages/inspection/lib/presentation/routes/app_routes.dart similarity index 100% rename from features/inspection/lib/presentation/routes/app_routes.dart rename to packages/inspection/lib/presentation/routes/app_routes.dart diff --git a/features/inspection/lib/presentation/widget/cluster_marker.dart b/packages/inspection/lib/presentation/widget/cluster_marker.dart similarity index 100% rename from features/inspection/lib/presentation/widget/cluster_marker.dart rename to packages/inspection/lib/presentation/widget/cluster_marker.dart diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock new file mode 100644 index 0000000..798be08 --- /dev/null +++ b/packages/inspection/pubspec.lock @@ -0,0 +1,673 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + cupertino_icons: + dependency: transitive + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dartx: + dependency: transitive + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dio: + dependency: transitive + description: + name: dio + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + url: "https://pub.dev" + source: hosted + version: "5.8.0+1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_map: + dependency: transitive + description: + name: flutter_map + sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a + url: "https://pub.dev" + source: hosted + version: "8.1.1" + flutter_map_animations: + dependency: transitive + description: + name: flutter_map_animations + sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e + url: "https://pub.dev" + source: hosted + version: "0.9.0" + flutter_rating_bar: + dependency: transitive + description: + name: flutter_rating_bar + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" + source: hosted + version: "4.0.1" + flutter_slidable: + dependency: transitive + description: + name: flutter_slidable + sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a + url: "https://pub.dev" + source: hosted + version: "4.0.0" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 + url: "https://pub.dev" + source: hosted + version: "2.1.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + font_awesome_flutter: + dependency: transitive + description: + name: font_awesome_flutter + sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a + url: "https://pub.dev" + source: hosted + version: "10.8.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + url: "https://pub.dev" + source: hosted + version: "3.0.0" + geolocator: + dependency: transitive + description: + name: geolocator + sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 + url: "https://pub.dev" + source: hosted + version: "14.0.0" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" + url: "https://pub.dev" + source: hosted + version: "5.0.1+1" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" + source: hosted + version: "4.2.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" + get: + dependency: transitive + description: + name: get + sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 + url: "https://pub.dev" + source: hosted + version: "4.7.2" + get_it: + dependency: transitive + description: + name: get_it + sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 + url: "https://pub.dev" + source: hosted + version: "8.0.3" + hive_ce: + dependency: transitive + description: + name: hive_ce + sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e + url: "https://pub.dev" + source: hosted + version: "2.11.1" + hive_ce_flutter: + dependency: transitive + description: + name: hive_ce_flutter + sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + http: + dependency: transitive + description: + name: http + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + url: "https://pub.dev" + source: hosted + version: "1.3.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + intl: + dependency: transitive + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + isolate_channel: + dependency: transitive + description: + name: isolate_channel + sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df + url: "https://pub.dev" + source: hosted + version: "0.2.2" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + latlong2: + dependency: transitive + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + logger: + dependency: transitive + description: + name: logger + sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + url: "https://pub.dev" + source: hosted + version: "2.5.0" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + url: "https://pub.dev" + source: hosted + version: "2.2.17" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: transitive + description: + name: permission_handler + sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" + url: "https://pub.dev" + source: hosted + version: "12.0.0+1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + persian_datetime_picker: + dependency: transitive + description: + name: persian_datetime_picker + sha256: "7ccbfd3a68dc89d405550f624e9fa590c914fed2aa2d48973c4f4400baab2e06" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + pretty_dio_logger: + dependency: transitive + description: + name: pretty_dio_logger + sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" + rasadyar_core: + dependency: "direct main" + description: + path: "../core" + relative: true + source: path + version: "1.0.0+1" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + shamsi_date: + dependency: transitive + description: + name: shamsi_date + sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51 + url: "https://pub.dev" + source: hosted + version: "1.1.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + time: + dependency: transitive + description: + name: time + sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + url: "https://pub.dev" + source: hosted + version: "1.1.18" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" +sdks: + dart: ">=3.7.2 <4.0.0" + flutter: ">=3.27.0" diff --git a/packages/inspection/pubspec.yaml b/packages/inspection/pubspec.yaml new file mode 100644 index 0000000..bb987bc --- /dev/null +++ b/packages/inspection/pubspec.yaml @@ -0,0 +1,13 @@ +name: inspection +description: "inspection module for rasadyar" +publish_to: 'none' +version: 1.0.1 + +environment: + sdk: ^3.7.2 + +dependencies: + flutter: + sdk: flutter + rasadyar_core: + path: ../core \ No newline at end of file From 3fbe438ab1218612508f8298c73e6dd24044819c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 14 May 2025 09:44:12 +0330 Subject: [PATCH 053/256] fix : inspection --- packages/inspection/lib/presentation/action/logic.dart | 2 +- packages/inspection/lib/presentation/filter/view.dart | 1 - packages/inspection/lib/presentation/root/logic.dart | 1 - packages/inspection/lib/presentation/root/view.dart | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/inspection/lib/presentation/action/logic.dart b/packages/inspection/lib/presentation/action/logic.dart index 34a4ec6..14cf098 100644 --- a/packages/inspection/lib/presentation/action/logic.dart +++ b/packages/inspection/lib/presentation/action/logic.dart @@ -1,5 +1,5 @@ import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; + class ActionLogic extends GetxController with GetTickerProviderStateMixin { late Rx slidController; diff --git a/packages/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/filter/view.dart index 1046873..ca710bd 100644 --- a/packages/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/filter/view.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; diff --git a/packages/inspection/lib/presentation/root/logic.dart b/packages/inspection/lib/presentation/root/logic.dart index bc88796..85ad494 100644 --- a/packages/inspection/lib/presentation/root/logic.dart +++ b/packages/inspection/lib/presentation/root/logic.dart @@ -3,7 +3,6 @@ import 'package:inspection/presentation/action/view.dart'; import 'package:inspection/presentation/filter/view.dart'; import 'package:inspection/presentation/profile/view.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; enum ErrorLocationType { serviceDisabled, permissionDenied, none } diff --git a/packages/inspection/lib/presentation/root/view.dart b/packages/inspection/lib/presentation/root/view.dart index 356a1d6..8b7faea 100644 --- a/packages/inspection/lib/presentation/root/view.dart +++ b/packages/inspection/lib/presentation/root/view.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/utils.dart'; import 'logic.dart'; From 2615f354162827e8e24a31bef04e9cb2c0449b99 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 14 May 2025 09:56:59 +0330 Subject: [PATCH 054/256] fix : core local method --- packages/auth/.gitignore | 31 ++++ packages/auth/.metadata | 10 ++ packages/auth/CHANGELOG.md | 3 + packages/auth/LICENSE | 1 + packages/auth/README.md | 39 +++++ packages/auth/analysis_options.yaml | 4 + packages/auth/lib/data/di/auth_di.dart | 2 +- .../auth/auth_response_model.freezed.dart | 154 +++++++++++++++++ .../response/auth/auth_response_model.g.dart | 21 +++ .../captcha_response_model.freezed.dart | 157 ++++++++++++++++++ .../captcha/captcha_response_model.g.dart | 25 +++ .../data/services/token_storage_service.dart | 1 - packages/auth/lib/hive_registrar.g.dart | 18 ++ packages/auth/pubspec.yaml | 35 ++++ packages/core/lib/core.dart | 7 + packages/core/pubspec.lock | 84 +++++++++- packages/core/pubspec.yaml | 8 +- packages/inspection/pubspec.lock | 96 +++++++++++ pubspec.lock | 124 +++++++++++--- pubspec.yaml | 52 +----- 20 files changed, 794 insertions(+), 78 deletions(-) create mode 100644 packages/auth/.gitignore create mode 100644 packages/auth/.metadata create mode 100644 packages/auth/CHANGELOG.md create mode 100644 packages/auth/LICENSE create mode 100644 packages/auth/README.md create mode 100644 packages/auth/analysis_options.yaml create mode 100644 packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart create mode 100644 packages/auth/lib/data/models/response/auth/auth_response_model.g.dart create mode 100644 packages/auth/lib/data/models/response/captcha/captcha_response_model.freezed.dart create mode 100644 packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart create mode 100644 packages/auth/lib/hive_registrar.g.dart create mode 100644 packages/auth/pubspec.yaml diff --git a/packages/auth/.gitignore b/packages/auth/.gitignore new file mode 100644 index 0000000..eb6c05c --- /dev/null +++ b/packages/auth/.gitignore @@ -0,0 +1,31 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/packages/auth/.metadata b/packages/auth/.metadata new file mode 100644 index 0000000..dfbc19f --- /dev/null +++ b/packages/auth/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "ea121f8859e4b13e47a8f845e4586164519588bc" + channel: "stable" + +project_type: package diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md new file mode 100644 index 0000000..41cc7d8 --- /dev/null +++ b/packages/auth/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/packages/auth/LICENSE b/packages/auth/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/packages/auth/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/packages/auth/README.md b/packages/auth/README.md new file mode 100644 index 0000000..4a260d8 --- /dev/null +++ b/packages/auth/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/auth/analysis_options.yaml b/packages/auth/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/packages/auth/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 375d940..06bf88d 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -19,5 +19,5 @@ Future setupAuthDI() async { diAuth.registerLazySingleton(() => AuthService()); //hive - await diAuth.registerCachedFactoryAsync(() async=>await ,) + //await diAuth.registerCachedFactoryAsync(() async=>await ,) } diff --git a/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart b/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart new file mode 100644 index 0000000..a61f9f7 --- /dev/null +++ b/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart @@ -0,0 +1,154 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'auth_response_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$AuthResponseModel { + + String? get refresh; String? get access;@JsonKey(name: 'otp_status') bool? get otpStatus; +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AuthResponseModelCopyWith get copyWith => _$AuthResponseModelCopyWithImpl(this as AuthResponseModel, _$identity); + + /// Serializes this AuthResponseModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AuthResponseModel&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); + +@override +String toString() { + return 'AuthResponseModel(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; +} + + +} + +/// @nodoc +abstract mixin class $AuthResponseModelCopyWith<$Res> { + factory $AuthResponseModelCopyWith(AuthResponseModel value, $Res Function(AuthResponseModel) _then) = _$AuthResponseModelCopyWithImpl; +@useResult +$Res call({ + String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus +}); + + + + +} +/// @nodoc +class _$AuthResponseModelCopyWithImpl<$Res> + implements $AuthResponseModelCopyWith<$Res> { + _$AuthResponseModelCopyWithImpl(this._self, this._then); + + final AuthResponseModel _self; + final $Res Function(AuthResponseModel) _then; + +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { + return _then(_self.copyWith( +refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable +as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable +as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _AuthResponseModel implements AuthResponseModel { + const _AuthResponseModel({this.refresh, this.access, @JsonKey(name: 'otp_status') this.otpStatus}); + factory _AuthResponseModel.fromJson(Map json) => _$AuthResponseModelFromJson(json); + +@override final String? refresh; +@override final String? access; +@override@JsonKey(name: 'otp_status') final bool? otpStatus; + +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AuthResponseModelCopyWith<_AuthResponseModel> get copyWith => __$AuthResponseModelCopyWithImpl<_AuthResponseModel>(this, _$identity); + +@override +Map toJson() { + return _$AuthResponseModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AuthResponseModel&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); + +@override +String toString() { + return 'AuthResponseModel(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; +} + + +} + +/// @nodoc +abstract mixin class _$AuthResponseModelCopyWith<$Res> implements $AuthResponseModelCopyWith<$Res> { + factory _$AuthResponseModelCopyWith(_AuthResponseModel value, $Res Function(_AuthResponseModel) _then) = __$AuthResponseModelCopyWithImpl; +@override @useResult +$Res call({ + String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus +}); + + + + +} +/// @nodoc +class __$AuthResponseModelCopyWithImpl<$Res> + implements _$AuthResponseModelCopyWith<$Res> { + __$AuthResponseModelCopyWithImpl(this._self, this._then); + + final _AuthResponseModel _self; + final $Res Function(_AuthResponseModel) _then; + +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { + return _then(_AuthResponseModel( +refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable +as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable +as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + +// dart format on diff --git a/packages/auth/lib/data/models/response/auth/auth_response_model.g.dart b/packages/auth/lib/data/models/response/auth/auth_response_model.g.dart new file mode 100644 index 0000000..dc5d66d --- /dev/null +++ b/packages/auth/lib/data/models/response/auth/auth_response_model.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'auth_response_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_AuthResponseModel _$AuthResponseModelFromJson(Map json) => + _AuthResponseModel( + refresh: json['refresh'] as String?, + access: json['access'] as String?, + otpStatus: json['otp_status'] as bool?, + ); + +Map _$AuthResponseModelToJson(_AuthResponseModel instance) => + { + 'refresh': instance.refresh, + 'access': instance.access, + 'otp_status': instance.otpStatus, + }; diff --git a/packages/auth/lib/data/models/response/captcha/captcha_response_model.freezed.dart b/packages/auth/lib/data/models/response/captcha/captcha_response_model.freezed.dart new file mode 100644 index 0000000..0e12301 --- /dev/null +++ b/packages/auth/lib/data/models/response/captcha/captcha_response_model.freezed.dart @@ -0,0 +1,157 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'captcha_response_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$CaptchaResponseModel { + + String? get captchaKey; String? get captchaImage; String? get imageType; String? get imageDecode; +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CaptchaResponseModelCopyWith get copyWith => _$CaptchaResponseModelCopyWithImpl(this as CaptchaResponseModel, _$identity); + + /// Serializes this CaptchaResponseModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is CaptchaResponseModel&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)&&(identical(other.captchaImage, captchaImage) || other.captchaImage == captchaImage)&&(identical(other.imageType, imageType) || other.imageType == imageType)&&(identical(other.imageDecode, imageDecode) || other.imageDecode == imageDecode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,captchaKey,captchaImage,imageType,imageDecode); + +@override +String toString() { + return 'CaptchaResponseModel(captchaKey: $captchaKey, captchaImage: $captchaImage, imageType: $imageType, imageDecode: $imageDecode)'; +} + + +} + +/// @nodoc +abstract mixin class $CaptchaResponseModelCopyWith<$Res> { + factory $CaptchaResponseModelCopyWith(CaptchaResponseModel value, $Res Function(CaptchaResponseModel) _then) = _$CaptchaResponseModelCopyWithImpl; +@useResult +$Res call({ + String? captchaKey, String? captchaImage, String? imageType, String? imageDecode +}); + + + + +} +/// @nodoc +class _$CaptchaResponseModelCopyWithImpl<$Res> + implements $CaptchaResponseModelCopyWith<$Res> { + _$CaptchaResponseModelCopyWithImpl(this._self, this._then); + + final CaptchaResponseModel _self; + final $Res Function(CaptchaResponseModel) _then; + +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? captchaKey = freezed,Object? captchaImage = freezed,Object? imageType = freezed,Object? imageDecode = freezed,}) { + return _then(_self.copyWith( +captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?,captchaImage: freezed == captchaImage ? _self.captchaImage : captchaImage // ignore: cast_nullable_to_non_nullable +as String?,imageType: freezed == imageType ? _self.imageType : imageType // ignore: cast_nullable_to_non_nullable +as String?,imageDecode: freezed == imageDecode ? _self.imageDecode : imageDecode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _CaptchaResponseModel implements CaptchaResponseModel { + const _CaptchaResponseModel({this.captchaKey, this.captchaImage, this.imageType, this.imageDecode}); + factory _CaptchaResponseModel.fromJson(Map json) => _$CaptchaResponseModelFromJson(json); + +@override final String? captchaKey; +@override final String? captchaImage; +@override final String? imageType; +@override final String? imageDecode; + +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CaptchaResponseModelCopyWith<_CaptchaResponseModel> get copyWith => __$CaptchaResponseModelCopyWithImpl<_CaptchaResponseModel>(this, _$identity); + +@override +Map toJson() { + return _$CaptchaResponseModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CaptchaResponseModel&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)&&(identical(other.captchaImage, captchaImage) || other.captchaImage == captchaImage)&&(identical(other.imageType, imageType) || other.imageType == imageType)&&(identical(other.imageDecode, imageDecode) || other.imageDecode == imageDecode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,captchaKey,captchaImage,imageType,imageDecode); + +@override +String toString() { + return 'CaptchaResponseModel(captchaKey: $captchaKey, captchaImage: $captchaImage, imageType: $imageType, imageDecode: $imageDecode)'; +} + + +} + +/// @nodoc +abstract mixin class _$CaptchaResponseModelCopyWith<$Res> implements $CaptchaResponseModelCopyWith<$Res> { + factory _$CaptchaResponseModelCopyWith(_CaptchaResponseModel value, $Res Function(_CaptchaResponseModel) _then) = __$CaptchaResponseModelCopyWithImpl; +@override @useResult +$Res call({ + String? captchaKey, String? captchaImage, String? imageType, String? imageDecode +}); + + + + +} +/// @nodoc +class __$CaptchaResponseModelCopyWithImpl<$Res> + implements _$CaptchaResponseModelCopyWith<$Res> { + __$CaptchaResponseModelCopyWithImpl(this._self, this._then); + + final _CaptchaResponseModel _self; + final $Res Function(_CaptchaResponseModel) _then; + +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? captchaKey = freezed,Object? captchaImage = freezed,Object? imageType = freezed,Object? imageDecode = freezed,}) { + return _then(_CaptchaResponseModel( +captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?,captchaImage: freezed == captchaImage ? _self.captchaImage : captchaImage // ignore: cast_nullable_to_non_nullable +as String?,imageType: freezed == imageType ? _self.imageType : imageType // ignore: cast_nullable_to_non_nullable +as String?,imageDecode: freezed == imageDecode ? _self.imageDecode : imageDecode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart b/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart new file mode 100644 index 0000000..a0ffdcb --- /dev/null +++ b/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'captcha_response_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_CaptchaResponseModel _$CaptchaResponseModelFromJson( + Map json, +) => _CaptchaResponseModel( + captchaKey: json['captchaKey'] as String?, + captchaImage: json['captchaImage'] as String?, + imageType: json['imageType'] as String?, + imageDecode: json['imageDecode'] as String?, +); + +Map _$CaptchaResponseModelToJson( + _CaptchaResponseModel instance, +) => { + 'captchaKey': instance.captchaKey, + 'captchaImage': instance.captchaImage, + 'imageType': instance.imageType, + 'imageDecode': instance.imageDecode, +}; diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index 1b57026..c7b18e9 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -1,5 +1,4 @@ import 'dart:convert'; - import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/injection/di.dart'; diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart new file mode 100644 index 0000000..d19b903 --- /dev/null +++ b/packages/auth/lib/hive_registrar.g.dart @@ -0,0 +1,18 @@ +// Generated by Hive CE +// Do not modify +// Check in to version control + +import 'package:hive_ce/hive.dart'; +import 'package:auths/data/models/local/user_local/user_local_model.dart'; + +extension HiveRegistrar on HiveInterface { + void registerAdapters() { + registerAdapter(UserLocalModelAdapter()); + } +} + +extension IsolatedHiveRegistrar on IsolatedHiveInterface { + void registerAdapters() { + registerAdapter(UserLocalModelAdapter()); + } +} diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml new file mode 100644 index 0000000..1e261ac --- /dev/null +++ b/packages/auth/pubspec.yaml @@ -0,0 +1,35 @@ +name: auths +description: "A new Flutter project." +version: 0.0.1 +publish_to: 'none' + + +environment: + sdk: ^3.7.2 + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + + rasadyar_core: + path: ../core + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + ##code generation + build_runner: ^2.4.15 + hive_ce_generator: ^1.9.1 + freezed: ^3.0.6 + json_serializable: ^6.9.4 + + ##test + mocktail: ^1.0.4 + get_test: ^4.0.1 + +flutter: + uses-material-design: true \ No newline at end of file diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index f33e467..36d756e 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -13,8 +13,15 @@ export 'package:geolocator/geolocator.dart'; export 'package:get/get.dart'; //di export 'package:get_it/get_it.dart'; + //local storage export 'package:hive_ce_flutter/hive_flutter.dart'; +export 'package:flutter_secure_storage/flutter_secure_storage.dart'; +export 'infrastructure/local/hive_local_storage.dart'; + +//encryption +//export 'package:encrypt/encrypt.dart' show Encrypted; + //Map and location export 'package:latlong2/latlong.dart'; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index a7deeac..467a430 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -25,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "0511d6be23b007e95105ae023db599aea731df604608978dada7f9faf2637623" + url: "https://pub.dev" + source: hosted + version: "1.6.4" async: dependency: transitive description: @@ -209,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + encrypt: + dependency: "direct main" + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" fake_async: dependency: transitive description: @@ -283,6 +299,54 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.1" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" flutter_slidable: dependency: "direct main" description: @@ -505,10 +569,10 @@ packages: dependency: transitive description: name: js - sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.6.7" json_annotation: dependency: "direct main" description: @@ -797,6 +861,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" polylabel: dependency: transitive description: @@ -1074,6 +1146,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + win32: + dependency: transitive + description: + name: win32 + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + url: "https://pub.dev" + source: hosted + version: "5.13.0" wkt_parser: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index ce7312c..1c25b27 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -28,10 +28,8 @@ dependencies: ## local storage hive_ce: ^2.11.1 hive_ce_flutter: ^2.3.0 + flutter_secure_storage: ^9.2.4 - ##code generation - freezed_annotation: ^3.0.0 - json_annotation: ^4.9.0 #SVG @@ -47,6 +45,7 @@ dependencies: #other permission_handler: ^12.0.0+1 persian_datetime_picker: ^3.1.0 + encrypt: ^5.0.3 #L10N tools intl: ^0.19.0 @@ -64,6 +63,9 @@ dependencies: #networkLogger pretty_dio_logger: ^1.4.0 + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 dev_dependencies: flutter_test: sdk: flutter diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock index 798be08..2a641bd 100644 --- a/packages/inspection/pubspec.lock +++ b/packages/inspection/pubspec.lock @@ -9,6 +9,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "0511d6be23b007e95105ae023db599aea731df604608978dada7f9faf2637623" + url: "https://pub.dev" + source: hosted + version: "1.6.4" async: dependency: transitive description: @@ -41,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" crypto: dependency: transitive description: @@ -89,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + encrypt: + dependency: transitive + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" ffi: dependency: transitive description: @@ -139,6 +163,54 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.1" + flutter_secure_storage: + dependency: transitive + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" flutter_slidable: dependency: transitive description: @@ -288,6 +360,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.2" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" json_annotation: dependency: transitive description: @@ -488,6 +568,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" polylabel: dependency: transitive description: @@ -644,6 +732,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + url: "https://pub.dev" + source: hosted + version: "5.13.0" wkt_parser: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 711330d..bf4cc5d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -25,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "0511d6be23b007e95105ae023db599aea731df604608978dada7f9faf2637623" + url: "https://pub.dev" + source: hosted + version: "1.6.4" async: dependency: transitive description: @@ -186,7 +194,7 @@ packages: source: hosted version: "3.0.1" dartx: - dependency: "direct main" + dependency: transitive description: name: dartx sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" @@ -194,7 +202,7 @@ packages: source: hosted version: "1.2.0" dio: - dependency: "direct main" + dependency: transitive description: name: dio sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" @@ -209,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + encrypt: + dependency: transitive + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" fake_async: dependency: transitive description: @@ -260,7 +276,7 @@ packages: source: sdk version: "0.0.0" flutter_map: - dependency: "direct main" + dependency: transitive description: name: flutter_map sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a @@ -268,7 +284,7 @@ packages: source: hosted version: "8.1.1" flutter_map_animations: - dependency: "direct main" + dependency: transitive description: name: flutter_map_animations sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e @@ -276,15 +292,63 @@ packages: source: hosted version: "0.9.0" flutter_rating_bar: - dependency: "direct main" + dependency: transitive description: name: flutter_rating_bar sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 url: "https://pub.dev" source: hosted version: "4.0.1" + flutter_secure_storage: + dependency: transitive + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" flutter_slidable: - dependency: "direct main" + dependency: transitive description: name: flutter_slidable sha256: ab7dbb16f783307c9d7762ede2593ce32c220ba2ba0fd540a3db8e9a3acba71a @@ -292,7 +356,7 @@ packages: source: hosted version: "4.0.0" flutter_svg: - dependency: "direct main" + dependency: transitive description: name: flutter_svg sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 @@ -310,7 +374,7 @@ packages: source: sdk version: "0.0.0" font_awesome_flutter: - dependency: "direct main" + dependency: transitive description: name: font_awesome_flutter sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a @@ -342,7 +406,7 @@ packages: source: hosted version: "4.0.0" geolocator: - dependency: "direct main" + dependency: transitive description: name: geolocator sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 @@ -390,7 +454,7 @@ packages: source: hosted version: "0.2.5" get: - dependency: "direct main" + dependency: transitive description: name: get sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 @@ -398,7 +462,7 @@ packages: source: hosted version: "4.7.2" get_it: - dependency: "direct main" + dependency: transitive description: name: get_it sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103 @@ -430,7 +494,7 @@ packages: source: hosted version: "2.3.2" hive_ce: - dependency: "direct main" + dependency: transitive description: name: hive_ce sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e @@ -438,7 +502,7 @@ packages: source: hosted version: "2.11.1" hive_ce_flutter: - dependency: "direct main" + dependency: transitive description: name: hive_ce_flutter sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" @@ -478,7 +542,7 @@ packages: source: hosted version: "4.1.2" intl: - dependency: "direct main" + dependency: transitive description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf @@ -505,10 +569,10 @@ packages: dependency: transitive description: name: js - sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.6.7" json_annotation: dependency: "direct main" description: @@ -526,7 +590,7 @@ packages: source: hosted version: "6.9.5" latlong2: - dependency: "direct main" + dependency: transitive description: name: latlong2 sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" @@ -574,7 +638,7 @@ packages: source: hosted version: "1.0.1" logger: - dependency: "direct main" + dependency: transitive description: name: logger sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 @@ -718,7 +782,7 @@ packages: source: hosted version: "2.3.0" permission_handler: - dependency: "direct main" + dependency: transitive description: name: permission_handler sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" @@ -766,7 +830,7 @@ packages: source: hosted version: "0.2.1" persian_datetime_picker: - dependency: "direct main" + dependency: transitive description: name: persian_datetime_picker sha256: "7ccbfd3a68dc89d405550f624e9fa590c914fed2aa2d48973c4f4400baab2e06" @@ -797,6 +861,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" polylabel: dependency: transitive description: @@ -814,7 +886,7 @@ packages: source: hosted version: "1.5.1" pretty_dio_logger: - dependency: "direct main" + dependency: transitive description: name: pretty_dio_logger sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407" @@ -853,7 +925,7 @@ packages: source: path version: "1.0.0+1" rxdart: - dependency: "direct main" + dependency: transitive description: name: rxdart sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" @@ -1081,6 +1153,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + win32: + dependency: transitive + description: + name: win32 + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + url: "https://pub.dev" + source: hosted + version: "5.13.0" wkt_parser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4ad2865..f8d6884 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,63 +10,17 @@ dependencies: flutter: sdk: flutter - #UI cupertino_icons: ^1.0.8 - flutter_slidable: ^4.0.0 - flutter_rating_bar: ^4.0.1 - ##Log - logger: ^2.5.0 - - ## reactive - dartx: ^1.2.0 - rxdart: ^0.28.0 - - ## local storage - hive_ce: ^2.11.1 - hive_ce_flutter: ^2.3.0 - - ##code generation - freezed_annotation: ^3.0.0 - json_annotation: ^4.9.0 - - - #SVG - flutter_svg: ^2.0.17 - font_awesome_flutter: ^10.8.0 - - ##state manger - get: ^4.7.2 - - ##Di - get_it: ^8.0.3 - - #other - permission_handler: ^12.0.0+1 - persian_datetime_picker: ^3.1.0 - - #L10N tools - intl: ^0.19.0 - - - #Map - flutter_map: ^8.1.1 - flutter_map_animations: ^0.9.0 - #location - latlong2: ^0.9.1 - geolocator: ^14.0.0 - #network - dio: ^5.8.0+1 - - #networkLogger - pretty_dio_logger: ^1.4.0 rasadyar_core: path: ./packages/core - + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 dev_dependencies: flutter_test: sdk: flutter From 9a8ab8467b19efd977c601771902d6ed4e5cf37c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 14 May 2025 10:02:03 +0330 Subject: [PATCH 055/256] feat : new method in token_storage_service.dart use core local_repository --- .../data/services/token_storage_service.dart | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index c7b18e9..82e9fa1 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -1,4 +1,5 @@ import 'dart:convert'; + import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/injection/di.dart'; @@ -23,36 +24,32 @@ class TokenStorageService extends GetxService { ); } - await Hive.initFlutter(); - await Hive.openBox( + await _localStorage.init(); + await _localStorage.openBox( _boxName, encryptionCipher: HiveAesCipher(encryptionKey), ); } - Future saveAccessToken(String token) async { - final box = Hive.box(_boxName); - await box.put(_accessTokenKey, token); - } + Future saveAccessToken(String token) async => await _localStorage.save( + boxName: _boxName, + key: _accessTokenKey, + value: token, + ); - Future saveRefreshToken(String token) async { - final box = Hive.box(_boxName); - await box.put(_refreshTokenKey, token); - } + Future saveRefreshToken(String token) async => await _localStorage.save( + boxName: _boxName, + key: _refreshTokenKey, + value: token, + ); - Future getAccessToken() async { - final box = Hive.box(_boxName); - return box.get(_accessTokenKey); - } + Future getAccessToken() async => + await _localStorage.read(boxName: _boxName, key: _accessTokenKey); + + Future getRefreshToken() async => + await _localStorage.read(boxName: _boxName, key: _refreshTokenKey); + + Future deleteTokens() async => await _localStorage.clear(_boxName); - Future getRefreshToken() async { - final box = Hive.box(_boxName); - return box.get(_refreshTokenKey); - } - Future deleteTokens() async { - final box = Hive.box(_boxName); - await box.delete(_accessTokenKey); - await box.delete(_refreshTokenKey); - } } From 60f7cd85beddad40aad008548715c41f720ddb34 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 14 May 2025 11:44:46 +0330 Subject: [PATCH 056/256] fix : auth middleware --- lib/infrastructure/di/di.dart | 38 +- lib/main.dart | 10 +- .../auth/auth_with_use_and_pass/logic.dart | 69 --- .../auth/auth_with_use_and_pass/view.dart | 522 ------------------ lib/presentation/pages/splash/logic.dart | 5 +- lib/presentation/routes/app_pages.dart | 14 +- lib/presentation/routes/app_paths.dart | 2 - packages/auth/lib/auth.dart | 3 + .../auth/lib/data/common/dio_manager.dart | 2 +- packages/auth/lib/data/di/auth_di.dart | 12 +- .../lib/data/services/auth_middelware.dart | 16 +- .../data/services/token_storage_service.dart | 9 +- packages/auth/lib/hive_registrar.g.dart | 4 +- packages/auth/pubspec.yaml | 2 +- packages/core/lib/core.dart | 1 + .../local/hive_local_storage.dart | 82 +-- .../infrastructure/local/i_local_storage.dart | 2 +- packages/core/lib/injection/di.dart | 3 +- .../add_mobile_inspector/view.dart | 2 +- .../presentation/add_supervision/logic.dart | 2 +- .../presentation/add_supervision/view.dart | 2 +- .../lib/presentation/filter/logic.dart | 4 +- .../lib/presentation/filter/view.dart | 2 +- .../registration_of_violation/view.dart | 5 +- .../lib/presentation/root/logic.dart | 6 +- .../lib/presentation/routes/app_pages.dart | 36 +- packages/inspection/pubspec.lock | 7 + packages/inspection/pubspec.yaml | 6 +- pubspec.lock | 14 + pubspec.yaml | 8 + 30 files changed, 160 insertions(+), 730 deletions(-) delete mode 100644 lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart delete mode 100644 lib/presentation/pages/auth/auth_with_use_and_pass/view.dart diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index b3919d0..db60b78 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -1,37 +1,13 @@ -/* -import 'package:get_it/get_it.dart'; -import 'package:hive_ce_flutter/hive_flutter.dart'; -import 'package:logger/logger.dart'; -import 'package:rasadyar_app/data/data_provider/local_storage/hive/hive_provider.dart'; -import 'package:rasadyar_app/data/data_source/local_storage/user/user_local_storage.dart'; -import 'package:rasadyar_app/data/model/user/user_model.dart'; -import 'package:rasadyar_app/domain/repository/user/user_repository.dart'; + +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_core/core.dart'; final di = GetIt.instance; -void setupInjection() { - di.registerLazySingleton(() => HiveProvider(), instanceName: 'HiveProvider'); - di.registerSingleton( Logger()); +Future setupInjection() async{ + await setupAuthDI(); + await setupAllProvider(); + } -Future setupAllProvider() async { - await _setupLocalStorage(); - await di.allReady(); -} -Future _setupLocalStorage() async { - final hiveProvider = di.get(instanceName: 'HiveProvider'); - await hiveProvider.init(); - Hive.registerAdapter(UserModelAdapter()); - - await Hive.openBox(HiveBoxNames.user.name); - - //user - di.registerLazySingleton(() => UserLocalStorage()); - di.registerLazySingleton( - () => UserRepository(di.get()), - ); - - // -} -*/ diff --git a/lib/main.dart b/lib/main.dart index 148e4fe..bd6d7db 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,8 +2,11 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_core/core.dart'; -void main() async { +import 'infrastructure/di/di.dart'; + +Future main() async { WidgetsFlutterBinding.ensureInitialized(); + await setupInjection(); runApp(MyApp()); // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); @@ -41,12 +44,9 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal), ), initialRoute: AppPages.initRoutes, - // initialBinding: BindingsBuilder.put(() => UserService()), getPages: AppPages.pages, locale: const Locale("fa", "IR"), - supportedLocales: const [ - Locale("fa", "IR"), - ], + supportedLocales: const [Locale("fa", "IR")], localizationsDelegates: [ PersianMaterialLocalizations.delegate, PersianCupertinoLocalizations.delegate, diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart deleted file mode 100644 index 580413d..0000000 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/logic.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -enum AuthType { useAndPass, otp } - -enum AuthStatus { init } - -enum OtpStatus { init, sent, verified, reSend } - -class AuthWithUseAndPassLogic extends GetxController { - Rx> formKey = GlobalKey().obs; - Rx> formKeyOtp = GlobalKey().obs; - Rx> formKeySentOtp = GlobalKey().obs; - Rx phoneNumberController = TextEditingController().obs; - Rx passwordController = TextEditingController().obs; - Rx phoneOtpNumberController = - TextEditingController().obs; - Rx otpCodeController = TextEditingController().obs; - CaptchaController captchaController = CaptchaController(); - CaptchaController captchaOtpController = CaptchaController(); - - RxnString phoneNumber = RxnString(null); - RxnString password = RxnString(null); - RxBool isOnError = false.obs; - RxBool hidePassword = true.obs; - Rx authType = AuthType.useAndPass.obs; - Rx authStatus = AuthStatus.init.obs; - Rx otpStatus = OtpStatus.init.obs; - - RxInt secondsRemaining = 120.obs; - Timer? _timer; - - void startTimer() { - _timer?.cancel(); - secondsRemaining.value = 120; - - _timer = Timer.periodic(const Duration(seconds: 1), (timer) { - if (secondsRemaining.value > 0) { - secondsRemaining.value--; - } else { - timer.cancel(); - } - }); - } - - void stopTimer() { - _timer?.cancel(); - } - - String get timeFormatted { - final minutes = secondsRemaining.value ~/ 60; - final seconds = secondsRemaining.value % 60; - return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; - } - - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - } - - @override - void onClose() { - _timer?.cancel(); - super.onClose(); - } -} diff --git a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart b/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart deleted file mode 100644 index f6cd2d7..0000000 --- a/lib/presentation/pages/auth/auth_with_use_and_pass/view.dart +++ /dev/null @@ -1,522 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class AuthWithUseAndPassPage extends GetView { - const AuthWithUseAndPassPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: SingleChildScrollView( - child: Column( - children: [ - SizedBox(height: 80), - logoWidget(), - ObxValue((types) { - switch (types.value) { - case AuthType.otp: - return otpForm(); - case AuthType.useAndPass: - return useAndPassFrom(); - } - }, controller.authType), - - SizedBox(height: 50), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: 'مطالعه بیانیه ', - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDark, - ), - ), - TextSpan( - recognizer: TapGestureRecognizer()..onTap = () {}, - text: 'حریم خصوصی', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - SizedBox(height: 18), - - ObxValue((types) { - return RichText( - text: TextSpan( - children: [ - TextSpan( - recognizer: - TapGestureRecognizer() - ..onTap = () { - if (controller.authType.value == AuthType.otp) { - controller.authType.value = AuthType.useAndPass; - if (controller.otpStatus.value != - OtpStatus.init) { - controller.otpStatus.value = OtpStatus.init; - } - } else { - controller.authType.value = AuthType.otp; - } - }, - text: - controller.authType.value == AuthType.otp - ? 'ورود با رمز ثابت' - : 'ورود با رمز یکبار مصرف', - - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ); - }, controller.authType), - ], - ), - ), - ); - } - - Widget useAndPassFrom() { - return ObxValue((data) { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), - child: Form( - key: data.value, - child: Column( - children: [ - ObxValue((phoneController) { - return TextFormField( - controller: controller.phoneNumberController.value, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'شماره موبایل', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - - prefixIconConstraints: BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: vecWidget(Assets.vecCallSvg), - ), - suffix: - phoneController.value.text.trim().isNotEmpty - ? clearButton(() { - phoneController.value.clear(); - phoneController.refresh(); - }) - : null, - counterText: '', - ), - keyboardType: TextInputType.numberWithOptions( - decimal: false, - signed: false, - ), - - maxLines: 1, - maxLength: 11, - onChanged: (value) { - if (controller.isOnError.value) { - controller.isOnError.value = !controller.isOnError.value; - data.value.currentState?.reset(); - - data.refresh(); - phoneController.value.text = value; - } - phoneController.refresh(); - }, - textInputAction: TextInputAction.next, - validator: (value) { - if (value == null) { - return '⚠️ شماره موبایل را وارد کنید'; - } else if (value.length < 11) { - return '⚠️ شماره موبایل باید 11 رقم باشد'; - } - return null; - }, - style: AppFonts.yekan13, - ); - }, controller.phoneNumberController), - - SizedBox(height: 26), - - ObxValue((passwordController) { - return TextFormField( - controller: passwordController.value, - obscureText: controller.hidePassword.value, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'رمز عبور', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - - prefixIconConstraints: BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: vecWidget(Assets.vecKeySvg), - ), - suffix: - passwordController.value.text.trim().isNotEmpty - ? GestureDetector( - onTap: () { - controller.hidePassword.value = - !controller.hidePassword.value; - }, - child: Icon( - controller.hidePassword.value - ? CupertinoIcons.eye - : CupertinoIcons.eye_slash, - ), - ) - : null, - counterText: '', - ), - textInputAction: TextInputAction.done, - keyboardType: TextInputType.visiblePassword, - maxLines: 1, - onChanged: (value) { - if (controller.isOnError.value) { - controller.isOnError.value = !controller.isOnError.value; - data.value.currentState?.reset(); - passwordController.value.text = value; - } - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" - } - return null; - }, - style: AppFonts.yekan13, - ); - }, controller.passwordController), - SizedBox(height: 26), - - CaptchaWidget(controller: controller.captchaController), - - SizedBox(height: 23), - RElevated( - text: 'ورود', - onPressed: () async { - Jalali? picked = await showPersianDatePicker( - context: Get.context!, - - initialDate: Jalali.now(), - firstDate: Jalali(1385, 8), - lastDate: Jalali(1450, 9), - initialEntryMode: PersianDatePickerEntryMode.calendarOnly, - initialDatePickerMode: PersianDatePickerMode.year, - ); - - if (data.value.currentState?.validate() == true && - controller.captchaController.validate()) {} - }, - width: Get.width, - height: 48, - ), - ], - ), - ), - ); - }, controller.formKey); - } - - Widget otpForm() { - return ObxValue((status) { - switch (status.value) { - case OtpStatus.init: - return sendCodeForm(); - case OtpStatus.sent: - case OtpStatus.verified: - case OtpStatus.reSend: - return confirmCodeForm(); - } - }, controller.otpStatus); - } - - Widget sendCodeForm() { - return ObxValue((data) { - return Form( - key: data.value, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), - child: Column( - children: [ - SizedBox(height: 26), - ObxValue((phoneController) { - return TextFormField( - controller: phoneController.value, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'شماره موبایل', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - prefixIconConstraints: BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: vecWidget(Assets.vecCallSvg), - ), - suffix: - phoneController.value.text.trim().isNotEmpty - ? clearButton(() { - phoneController.value.clear(); - phoneController.refresh(); - }) - : null, - counterText: '', - ), - keyboardType: TextInputType.numberWithOptions( - decimal: false, - signed: false, - ), - maxLines: 1, - maxLength: 11, - onChanged: (value) { - if (controller.isOnError.value) { - controller.isOnError.value = !controller.isOnError.value; - data.value.currentState?.reset(); - data.refresh(); - phoneController.value.text = value; - } - phoneController.refresh(); - }, - textInputAction: TextInputAction.next, - validator: (value) { - if (value == null) { - return '⚠️ شماره موبایل را وارد کنید'; - } else if (value.length < 11) { - return '⚠️ شماره موبایل باید 11 رقم باشد'; - } - return null; - }, - style: AppFonts.yekan13, - ); - }, controller.phoneOtpNumberController), - - SizedBox(height: 26), - - CaptchaWidget(controller: controller.captchaOtpController), - - SizedBox(height: 23), - RElevated( - text: 'ارسال رمز یکبار مصرف', - onPressed: () { - if (data.value.currentState?.validate() == true && - controller.captchaOtpController.validate()) { - controller.otpStatus.value = OtpStatus.sent; - controller.startTimer(); - } - }, - width: Get.width, - height: 48, - ), - ], - ), - ), - ); - }, controller.formKeyOtp); - } - - Widget confirmCodeForm() { - return ObxValue((data) { - return Form( - key: data.value, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), - child: Column( - children: [ - SizedBox(height: 26), - - ObxValue((passwordController) { - return TextFormField( - controller: passwordController.value, - obscureText: controller.hidePassword.value, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'رمز عبور', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - - prefixIconConstraints: BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: vecWidget(Assets.vecKeySvg), - ), - suffix: - passwordController.value.text.trim().isNotEmpty - ? GestureDetector( - onTap: () { - controller.hidePassword.value = - !controller.hidePassword.value; - }, - child: Icon( - controller.hidePassword.value - ? CupertinoIcons.eye - : CupertinoIcons.eye_slash, - ), - ) - : null, - counterText: '', - ), - textInputAction: TextInputAction.done, - keyboardType: TextInputType.visiblePassword, - maxLines: 1, - onChanged: (value) { - if (controller.isOnError.value) { - controller.isOnError.value = !controller.isOnError.value; - data.value.currentState?.reset(); - passwordController.value.text = value; - } - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" - } - return null; - }, - style: AppFonts.yekan13, - ); - }, controller.passwordController), - - SizedBox(height: 23), - - ObxValue((timer) { - if (timer.value == 0) { - return TextButton( - onPressed: () { - controller.otpStatus.value = OtpStatus.reSend; - controller.startTimer(); - }, - child: Text( - style: AppFonts.yekan13.copyWith( - color: AppColor.blueNormal, - ), - 'ارسال مجدد کد یکبار مصرف', - ), - ); - } else { - return Text( - 'اعتبار رمز ارسال شده ${controller.timeFormatted}', - style: AppFonts.yekan13, - ); - } - }, controller.secondsRemaining), - - RichText( - text: TextSpan( - children: [ - TextSpan( - text: ' کد ارسال شده به شماره ', - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDark, - ), - ), - TextSpan( - text: controller.phoneOtpNumberController.value.text, - style: AppFonts.yekan13Bold.copyWith( - color: AppColor.darkGreyDark, - ), - ), - TextSpan( - recognizer: - TapGestureRecognizer() - ..onTap = () { - controller.otpStatus.value = OtpStatus.init; - controller.captchaOtpController.clear(); - }, - text: ' ویرایش', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - - SizedBox(height: 23), - RElevated( - text: 'ورود', - onPressed: () { - if (controller.formKeyOtp.value.currentState?.validate() == - true && - controller.captchaOtpController.validate()) {} - }, - width: Get.width, - height: 48, - ), - ], - ), - ), - ); - }, controller.formKeySentOtp); - } - - Widget logoWidget() { - return Column( - children: [ - Row(), - Image.asset(Assets.imagesInnerSplash, width: 120, height: 120), - Text( - 'سامانه رصدیار', - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyNormal), - ), - ], - ); - } - - Widget clearButton(VoidCallback onTap) { - return GestureDetector( - onTap: onTap, - child: Icon(CupertinoIcons.multiply_circle, size: 24), - ); - } -} diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 5f98668..4dd4a4e 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -1,7 +1,6 @@ import 'package:flutter/animation.dart'; -import 'package:get/get.dart'; -import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import ''; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/inspection.dart'; class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController scaleController; diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 4910184..61effcb 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -1,10 +1,9 @@ -import 'package:get/get.dart'; - -import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/logic.dart'; -import 'package:rasadyar_app/presentation/pages/auth/auth_with_use_and_pass/view.dart'; import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; import 'package:rasadyar_app/presentation/pages/splash/view.dart'; import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; +import 'package:rasadyar_auth/presentation/routes/pages.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/inspection.dart'; part 'app_paths.dart'; @@ -21,12 +20,9 @@ sealed class AppPages { page: () => SplashPage(), binding: BindingsBuilder.put(() => SplashLogic()), ), - GetPage( - name: AppPaths.authWithUserAndPass, - page: () => AuthWithUseAndPassPage(), - binding: BindingsBuilder.put(() => AuthWithUseAndPassLogic()), - ), ...InspectionPages.pages, + ...AuthPages.pages, + ]; } diff --git a/lib/presentation/routes/app_paths.dart b/lib/presentation/routes/app_paths.dart index f6fde78..cd31b8f 100644 --- a/lib/presentation/routes/app_paths.dart +++ b/lib/presentation/routes/app_paths.dart @@ -4,7 +4,5 @@ sealed class AppPaths { AppPaths._(); static const String splash = '/splash'; - static const String authWithUserAndPass = '/authWithUserAndPass'; - static const String authWithOtp = '/authWithOtp'; static const String systemDesignPage = '/systemDesignPage'; } diff --git a/packages/auth/lib/auth.dart b/packages/auth/lib/auth.dart index 34f09d1..8007b45 100644 --- a/packages/auth/lib/auth.dart +++ b/packages/auth/lib/auth.dart @@ -3,3 +3,6 @@ /// More dartdocs go here. library; +export 'data/services/auth_middelware.dart'; +export 'data/services/auth_service.dart'; +export 'data/di/auth_di.dart'; diff --git a/packages/auth/lib/data/common/dio_manager.dart b/packages/auth/lib/data/common/dio_manager.dart index 9be65ca..37f46ee 100644 --- a/packages/auth/lib/data/common/dio_manager.dart +++ b/packages/auth/lib/data/common/dio_manager.dart @@ -1,4 +1,4 @@ -import 'package:auths/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; import '../di/auth_di.dart'; diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 06bf88d..3451b86 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -1,6 +1,7 @@ -import 'package:auths/data/common/constant.dart'; -import 'package:auths/data/repositories/auth_repository_imp.dart'; -import 'package:auths/data/services/auth_service.dart'; +import 'package:rasadyar_auth/data/common/constant.dart'; +import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_auth/data/services/auth_service.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; import '../common/dio_manager.dart'; @@ -17,7 +18,8 @@ Future setupAuthDI() async { () => AuthRepositoryImpl(dioRemote), ); diAuth.registerLazySingleton(() => AuthService()); - + diAuth.registerLazySingleton(() => TokenStorageService()); + //hive - //await diAuth.registerCachedFactoryAsync(() async=>await ,) + //await diAuth.registerCachedFactoryAsync(() async=>await ,) } diff --git a/packages/auth/lib/data/services/auth_middelware.dart b/packages/auth/lib/data/services/auth_middelware.dart index bf63f2e..e34c326 100644 --- a/packages/auth/lib/data/services/auth_middelware.dart +++ b/packages/auth/lib/data/services/auth_middelware.dart @@ -1,16 +1,22 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/di/auth_di.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; import '../../presentation/routes/pages.dart'; -class AuthMiddleware extends GetMiddleware{ +class AuthMiddleware extends GetMiddleware { + var tokenService = diAuth.get(); + @override RouteSettings? redirect(String? route) { - if(route == AuthPaths.auth) { - return const RouteSettings(name: AuthPaths.moduleList); + eLog('redirect'); + final refreshToken = tokenService.getRefreshToken(); + final accessToken = tokenService.getAccessToken(); + + if (refreshToken == null || accessToken == null) { + return RouteSettings(name: AuthPaths.moduleList); } return super.redirect(route); } - - } diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index 82e9fa1..0f0eed6 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -43,11 +43,10 @@ class TokenStorageService extends GetxService { value: token, ); - Future getAccessToken() async => - await _localStorage.read(boxName: _boxName, key: _accessTokenKey); - - Future getRefreshToken() async => - await _localStorage.read(boxName: _boxName, key: _refreshTokenKey); + String? getAccessToken() => + _localStorage.read(boxName: _boxName, key: _accessTokenKey); + String? getRefreshToken() => + _localStorage.read(boxName: _boxName, key: _refreshTokenKey); Future deleteTokens() async => await _localStorage.clear(_boxName); diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart index d19b903..d174454 100644 --- a/packages/auth/lib/hive_registrar.g.dart +++ b/packages/auth/lib/hive_registrar.g.dart @@ -2,8 +2,8 @@ // Do not modify // Check in to version control -import 'package:hive_ce/hive.dart'; -import 'package:auths/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_core/core.dart'; extension HiveRegistrar on HiveInterface { void registerAdapters() { diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml index 1e261ac..aa2237c 100644 --- a/packages/auth/pubspec.yaml +++ b/packages/auth/pubspec.yaml @@ -1,4 +1,4 @@ -name: auths +name: rasadyar_auth description: "A new Flutter project." version: 0.0.1 publish_to: 'none' diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 36d756e..4e48c2f 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -13,6 +13,7 @@ export 'package:geolocator/geolocator.dart'; export 'package:get/get.dart'; //di export 'package:get_it/get_it.dart'; +export 'injection/di.dart'; //local storage export 'package:hive_ce_flutter/hive_flutter.dart'; diff --git a/packages/core/lib/infrastructure/local/hive_local_storage.dart b/packages/core/lib/infrastructure/local/hive_local_storage.dart index e88baa6..53b7b55 100644 --- a/packages/core/lib/infrastructure/local/hive_local_storage.dart +++ b/packages/core/lib/infrastructure/local/hive_local_storage.dart @@ -1,5 +1,5 @@ import 'package:flutter/foundation.dart'; -import 'package:hive_ce_flutter/hive_flutter.dart'; +import 'package:rasadyar_core/core.dart'; import 'i_local_storage.dart'; @@ -33,36 +33,42 @@ class HiveLocalStorage implements ILocalStorage { } @override - Future read({required String boxName,required String key}) async { - Box? box = await getBox(boxName); - return box.get(key) as T?; - } - - - - @override - Future add({required String boxName,required dynamic value}) async { - Box? box = await getBox(boxName); - await box.add(value); - } - - @override - Future addAll({required String boxName,required Iterable values}) async { - Box? box = await getBox(boxName); - await box.addAll(values); - } - - Future> getBox(String boxName) async { - final box = _boxes[boxName]; - if (box is Box) { - return box; - } else { - throw Exception('Box $boxName is not of expected type $T'); + T? read({required String boxName, required String key}) { + try { + Box? box = getBox(boxName); + return box?.get(key) as T?; + } on Exception catch (e) { + eLog(e); + return null; } } @override - Future clear(String boxName) async{ + Future add({required String boxName, required dynamic value}) async { + Box? box = getBox(boxName); + await box?.add(value); + } + + @override + Future addAll({ + required String boxName, + required Iterable values, + }) async { + Box? box = getBox(boxName); + await box?.addAll(values); + } + + Box? getBox(String boxName) { + final box = _boxes[boxName]; + if (box is Box) { + return box; + } else { + throw Exception('Box $boxName is not of exist'); + } + } + + @override + Future clear(String boxName) async { await _boxes[boxName]?.clear(); } @@ -74,8 +80,8 @@ class HiveLocalStorage implements ILocalStorage { required String boxName, required String key, }) async { - Box? box = await getBox(boxName); - await box.delete(key); + Box? box = getBox(boxName); + await box?.delete(key); } @override @@ -83,15 +89,15 @@ class HiveLocalStorage implements ILocalStorage { required String boxName, required String key, required value, - }) async{ - Box? box = await getBox(boxName); - await box.put(key, value); + }) async { + Box? box = getBox(boxName); + await box?.put(key, value); } @override - Future saveAll({required String boxName, required Map entries}) async{ - Box? box = await getBox(boxName); - await box.putAll(entries); + Future saveAll({required String boxName, required Map entries}) async { + Box? box = getBox(boxName); + await box?.putAll(entries); } @override @@ -99,8 +105,8 @@ class HiveLocalStorage implements ILocalStorage { required String boxName, required int index, required value, - }) async{ - Box? box = await getBox(boxName); - await box.putAt(index, value); + }) async { + Box? box = getBox(boxName); + await box?.putAt(index, value); } } diff --git a/packages/core/lib/infrastructure/local/i_local_storage.dart b/packages/core/lib/infrastructure/local/i_local_storage.dart index ae011ea..7cb4f49 100644 --- a/packages/core/lib/infrastructure/local/i_local_storage.dart +++ b/packages/core/lib/infrastructure/local/i_local_storage.dart @@ -13,7 +13,7 @@ abstract class ILocalStorage { String? collection, }); - Future read({required String boxName, required String key}); + T? read({required String boxName, required String key}); Future deleteValue({required String boxName, required String key}); diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index f6c0b73..95949c8 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -7,6 +7,7 @@ final diCore = GetIt.instance; Future setupAllProvider() async { await _setUpLogger(); await _setupLocalStorage(); + await _setupRemote(); await diCore.allReady(); } @@ -21,5 +22,5 @@ Future _setupLocalStorage() async { Future _setupRemote() async { - diCore.registerSingleton(HiveLocalStorage()); +// diCore.registerSingleton(HiveLocalStorage()); } diff --git a/packages/inspection/lib/presentation/add_mobile_inspector/view.dart b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart index d6b1a0d..75bf4d1 100644 --- a/packages/inspection/lib/presentation/add_mobile_inspector/view.dart +++ b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'logic.dart'; diff --git a/packages/inspection/lib/presentation/add_supervision/logic.dart b/packages/inspection/lib/presentation/add_supervision/logic.dart index 4aee4ec..4f308bb 100644 --- a/packages/inspection/lib/presentation/add_supervision/logic.dart +++ b/packages/inspection/lib/presentation/add_supervision/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; class AddSupervisionLogic extends GetxController { diff --git a/packages/inspection/lib/presentation/add_supervision/view.dart b/packages/inspection/lib/presentation/add_supervision/view.dart index eb989cb..8be8f92 100644 --- a/packages/inspection/lib/presentation/add_supervision/view.dart +++ b/packages/inspection/lib/presentation/add_supervision/view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:inspection/inspection.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'logic.dart'; diff --git a/packages/inspection/lib/presentation/filter/logic.dart b/packages/inspection/lib/presentation/filter/logic.dart index a8610fd..5caf8ed 100644 --- a/packages/inspection/lib/presentation/filter/logic.dart +++ b/packages/inspection/lib/presentation/filter/logic.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:inspection/data/utils/marker_generator.dart'; -import 'package:inspection/presentation/filter/view.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/utils/marker_generator.dart'; +import 'package:rasadyar_inspection/presentation/filter/view.dart'; class InspectorFilterLogic extends GetxController with GetTickerProviderStateMixin { diff --git a/packages/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/filter/view.dart index ca710bd..c8b2271 100644 --- a/packages/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/filter/view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; diff --git a/packages/inspection/lib/presentation/registration_of_violation/view.dart b/packages/inspection/lib/presentation/registration_of_violation/view.dart index d823a60..b74ee54 100644 --- a/packages/inspection/lib/presentation/registration_of_violation/view.dart +++ b/packages/inspection/lib/presentation/registration_of_violation/view.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/registration_of_violation/logic.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'logic.dart'; + class RegistrationOfViolationPage extends GetView { const RegistrationOfViolationPage({super.key}); diff --git a/packages/inspection/lib/presentation/root/logic.dart b/packages/inspection/lib/presentation/root/logic.dart index 85ad494..e95a9b3 100644 --- a/packages/inspection/lib/presentation/root/logic.dart +++ b/packages/inspection/lib/presentation/root/logic.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:inspection/presentation/action/view.dart'; -import 'package:inspection/presentation/filter/view.dart'; -import 'package:inspection/presentation/profile/view.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/action/view.dart'; +import 'package:rasadyar_inspection/presentation/filter/view.dart'; +import 'package:rasadyar_inspection/presentation/profile/view.dart'; enum ErrorLocationType { serviceDisabled, permissionDenied, none } diff --git a/packages/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart index aeb25c4..69ac156 100644 --- a/packages/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -1,21 +1,22 @@ +import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:inspection/presentation/action/logic.dart'; -import 'package:inspection/presentation/add_mobile_inspector/logic.dart'; -import 'package:inspection/presentation/add_mobile_inspector/view.dart'; -import 'package:inspection/presentation/add_supervision/logic.dart'; -import 'package:inspection/presentation/add_supervision/view.dart'; -import 'package:inspection/presentation/display_information/logic.dart'; -import 'package:inspection/presentation/display_information/view.dart'; -import 'package:inspection/presentation/filter/logic.dart'; -import 'package:inspection/presentation/location_details/logic.dart'; -import 'package:inspection/presentation/location_details/view.dart'; -import 'package:inspection/presentation/profile/logic.dart'; -import 'package:inspection/presentation/profile/view.dart'; -import 'package:inspection/presentation/registration_of_violation/logic.dart'; -import 'package:inspection/presentation/registration_of_violation/view.dart'; -import 'package:inspection/presentation/root/logic.dart'; -import 'package:inspection/presentation/root/view.dart'; -import 'package:inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_inspection/presentation/action/logic.dart'; +import 'package:rasadyar_inspection/presentation/add_mobile_inspector/logic.dart'; +import 'package:rasadyar_inspection/presentation/add_mobile_inspector/view.dart'; +import 'package:rasadyar_inspection/presentation/add_supervision/logic.dart'; +import 'package:rasadyar_inspection/presentation/add_supervision/view.dart'; +import 'package:rasadyar_inspection/presentation/display_information/logic.dart'; +import 'package:rasadyar_inspection/presentation/display_information/view.dart'; +import 'package:rasadyar_inspection/presentation/filter/logic.dart'; +import 'package:rasadyar_inspection/presentation/location_details/logic.dart'; +import 'package:rasadyar_inspection/presentation/location_details/view.dart'; +import 'package:rasadyar_inspection/presentation/profile/logic.dart'; +import 'package:rasadyar_inspection/presentation/profile/view.dart'; +import 'package:rasadyar_inspection/presentation/registration_of_violation/logic.dart'; +import 'package:rasadyar_inspection/presentation/registration_of_violation/view.dart'; +import 'package:rasadyar_inspection/presentation/root/logic.dart'; +import 'package:rasadyar_inspection/presentation/root/view.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; sealed class InspectionPages { InspectionPages._(); @@ -24,6 +25,7 @@ sealed class InspectionPages { GetPage( name: InspectionRoutes.inspection, page: () => RootPage(), + middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.put(RootLogic()); Get.put(InspectorFilterLogic()); diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock index 2a641bd..793f1ae 100644 --- a/packages/inspection/pubspec.lock +++ b/packages/inspection/pubspec.lock @@ -600,6 +600,13 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + rasadyar_auth: + dependency: "direct main" + description: + path: "../auth" + relative: true + source: path + version: "0.0.1" rasadyar_core: dependency: "direct main" description: diff --git a/packages/inspection/pubspec.yaml b/packages/inspection/pubspec.yaml index bb987bc..474c698 100644 --- a/packages/inspection/pubspec.yaml +++ b/packages/inspection/pubspec.yaml @@ -1,4 +1,4 @@ -name: inspection +name: rasadyar_inspection description: "inspection module for rasadyar" publish_to: 'none' version: 1.0.1 @@ -10,4 +10,6 @@ dependencies: flutter: sdk: flutter rasadyar_core: - path: ../core \ No newline at end of file + path: ../core + rasadyar_auth: + path: ../auth \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index bf4cc5d..82b7839 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -917,6 +917,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + rasadyar_auth: + dependency: "direct main" + description: + path: "packages/auth" + relative: true + source: path + version: "0.0.1" rasadyar_core: dependency: "direct main" description: @@ -924,6 +931,13 @@ packages: relative: true source: path version: "1.0.0+1" + rasadyar_inspection: + dependency: "direct main" + description: + path: "packages/inspection" + relative: true + source: path + version: "1.0.1" rxdart: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f8d6884..95fc0f1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,9 +14,17 @@ dependencies: cupertino_icons: ^1.0.8 + #rasadyar packages rasadyar_core: path: ./packages/core + rasadyar_inspection: + path: ./packages/inspection + + rasadyar_auth: + path: ./packages/auth + + ##code generation freezed_annotation: ^3.0.0 From a132b21b1852f513fe9c4a0f0e46b45318ca6dc5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 14 May 2025 11:50:12 +0330 Subject: [PATCH 057/256] fix : label --- packages/auth/lib/presentation/pages/auth/view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 6bb6af6..9708005 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -102,7 +102,7 @@ class AuthPage extends GetView { borderRadius: BorderRadius.circular(8), gapPadding: 11, ), - labelText: 'شماره موبایل', + labelText: 'نام کاربری', labelStyle: AppFonts.yekan13, errorStyle: AppFonts.yekan13.copyWith( color: AppColor.redNormal, From 3a017b59566d1240cfb560104f7936746b9ca1c2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 14 May 2025 15:01:03 +0330 Subject: [PATCH 058/256] feat : captcha widget.dart --- packages/auth/lib/data/common/constant.dart | 2 +- .../auth/lib/data/common/dio_manager.dart | 9 +- packages/auth/lib/data/di/auth_di.dart | 8 +- .../repositories/auth_repository_imp.dart | 7 +- .../lib/presentation/pages/auth/logic.dart | 15 +- .../lib/presentation/pages/auth/view.dart | 31 +- .../lib/presentation/widget/clear_button.dart | 8 + .../lib/infrastructure/remote/dio_remote.dart | 15 +- .../widget/captcha/captcha_widget.dart | 266 ------------------ .../core/lib/presentation/widget/widget.dart | 1 - 10 files changed, 57 insertions(+), 305 deletions(-) create mode 100644 packages/auth/lib/presentation/widget/clear_button.dart delete mode 100644 packages/core/lib/presentation/widget/captcha/captcha_widget.dart diff --git a/packages/auth/lib/data/common/constant.dart b/packages/auth/lib/data/common/constant.dart index c9a0aba..c0b0982 100644 --- a/packages/auth/lib/data/common/constant.dart +++ b/packages/auth/lib/data/common/constant.dart @@ -1,5 +1,5 @@ enum ApiEnvironment { - dam(url: 'https://api.dam.rasadyar.net'); + dam(url: 'https://api.dam.rasadyar.net/'); const ApiEnvironment({required this.url}); diff --git a/packages/auth/lib/data/common/dio_manager.dart b/packages/auth/lib/data/common/dio_manager.dart index 37f46ee..441485a 100644 --- a/packages/auth/lib/data/common/dio_manager.dart +++ b/packages/auth/lib/data/common/dio_manager.dart @@ -8,9 +8,12 @@ class DioRemoteManager { DioRemote? _currentClient; ApiEnvironment? _currentEnv; - DioRemote setEnvironment(ApiEnvironment env) { + Future setEnvironment([ + ApiEnvironment env = ApiEnvironment.dam, + ]) async { if (_currentEnv != env) { _currentClient = DioRemote(env.baseUrl); + await _currentClient?.init(); _currentEnv = env; } return _currentClient!; @@ -30,10 +33,10 @@ class DioRemoteManager { Future switchAuthEnvironment(ApiEnvironment env) async { final manager = diAuth.get(); - final dioRemote = manager.setEnvironment(env); + final dioRemote = await manager.setEnvironment(env); if (diAuth.isRegistered()) { - await diAuth.unregister(); + await diAuth.unregister(); } diAuth.registerLazySingleton( diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 3451b86..391647f 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -12,14 +12,10 @@ Future setupAuthDI() async { diAuth.registerLazySingleton(() => DioRemoteManager()); final manager = diAuth.get(); - final dioRemote = manager.setEnvironment(ApiEnvironment.dam); - - diAuth.registerLazySingleton( + final dioRemote = await manager.setEnvironment(ApiEnvironment.dam); + diAuth.registerCachedFactory( () => AuthRepositoryImpl(dioRemote), ); diAuth.registerLazySingleton(() => AuthService()); diAuth.registerLazySingleton(() => TokenStorageService()); - - //hive - //await diAuth.registerCachedFactoryAsync(() async=>await ,) } diff --git a/packages/auth/lib/data/repositories/auth_repository_imp.dart b/packages/auth/lib/data/repositories/auth_repository_imp.dart index a3bc1ee..523efad 100644 --- a/packages/auth/lib/data/repositories/auth_repository_imp.dart +++ b/packages/auth/lib/data/repositories/auth_repository_imp.dart @@ -34,17 +34,18 @@ class AuthRepositoryImpl implements AuthRepository { @override Future captcha() async { - final response = await safeCall>( + final response = await safeCall( call: () async => await _httpClient.post( - '$_BASE_URL/login/', + 'captcha/', headers: {'Content-Type': 'application/json'}, + fromJson: CaptchaResponseModel.fromJson ), onSuccess: (response) { iLog(response); }, onError: (error, trace) { - throw Exception('Error during sign in: $error'); + throw Exception('Error during captcha : $error'); }, ); diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 505e224..737c4a3 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; enum AuthType { useAndPass, otp } @@ -18,8 +20,7 @@ class AuthLogic extends GetxController { Rx phoneOtpNumberController = TextEditingController().obs; Rx otpCodeController = TextEditingController().obs; - CaptchaController captchaController = CaptchaController(); - CaptchaController captchaOtpController = CaptchaController(); + RxnString phoneNumber = RxnString(null); RxnString password = RxnString(null); @@ -32,6 +33,8 @@ class AuthLogic extends GetxController { RxInt secondsRemaining = 120.obs; Timer? _timer; + AuthRepositoryImpl authRepository = diAuth.get(); + void startTimer() { _timer?.cancel(); secondsRemaining.value = 120; @@ -55,6 +58,12 @@ class AuthLogic extends GetxController { return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; } + @override + void onInit() { + super.onInit(); + + } + @override void onReady() { // TODO: implement onReady @@ -66,4 +75,6 @@ class AuthLogic extends GetxController { _timer?.cancel(); super.onClose(); } + + } diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 9708005..98cc7aa 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -1,12 +1,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/presentation/widget/captcha/view.dart'; +import 'package:rasadyar_auth/presentation/widget/clear_button.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; - - class AuthPage extends GetView { const AuthPage({super.key}); @@ -21,7 +21,7 @@ class AuthPage extends GetView { ObxValue((types) { switch (types.value) { case AuthType.otp: - return otpForm(); + //return otpForm(); case AuthType.useAndPass: return useAndPassFrom(); } @@ -222,7 +222,7 @@ class AuthPage extends GetView { }, controller.passwordController), SizedBox(height: 26), - CaptchaWidget(controller: controller.captchaController), + CaptchaWidget(), SizedBox(height: 23), RElevated( @@ -237,9 +237,6 @@ class AuthPage extends GetView { initialEntryMode: PersianDatePickerEntryMode.calendarOnly, initialDatePickerMode: PersianDatePickerMode.year, ); - - if (data.value.currentState?.validate() == true && - controller.captchaController.validate()) {} }, width: Get.width, height: 48, @@ -251,7 +248,7 @@ class AuthPage extends GetView { }, controller.formKey); } - Widget otpForm() { +/* Widget otpForm() { return ObxValue((status) { switch (status.value) { case OtpStatus.init: @@ -262,7 +259,7 @@ class AuthPage extends GetView { return confirmCodeForm(); } }, controller.otpStatus); - } + }*/ Widget sendCodeForm() { return ObxValue((data) { @@ -335,14 +332,13 @@ class AuthPage extends GetView { SizedBox(height: 26), - CaptchaWidget(controller: controller.captchaOtpController), + CaptchaWidget(), SizedBox(height: 23), RElevated( text: 'ارسال رمز یکبار مصرف', onPressed: () { - if (data.value.currentState?.validate() == true && - controller.captchaOtpController.validate()) { + if (data.value.currentState?.validate() == true) { controller.otpStatus.value = OtpStatus.sent; controller.startTimer(); } @@ -473,7 +469,6 @@ class AuthPage extends GetView { TapGestureRecognizer() ..onTap = () { controller.otpStatus.value = OtpStatus.init; - controller.captchaOtpController.clear(); }, text: ' ویرایش', style: AppFonts.yekan14.copyWith( @@ -489,8 +484,7 @@ class AuthPage extends GetView { text: 'ورود', onPressed: () { if (controller.formKeyOtp.value.currentState?.validate() == - true && - controller.captchaOtpController.validate()) {} + true) {} }, width: Get.width, height: 48, @@ -514,11 +508,4 @@ class AuthPage extends GetView { ], ); } - - Widget clearButton(VoidCallback onTap) { - return GestureDetector( - onTap: onTap, - child: Icon(CupertinoIcons.multiply_circle, size: 24), - ); - } } diff --git a/packages/auth/lib/presentation/widget/clear_button.dart b/packages/auth/lib/presentation/widget/clear_button.dart new file mode 100644 index 0000000..393ebed --- /dev/null +++ b/packages/auth/lib/presentation/widget/clear_button.dart @@ -0,0 +1,8 @@ +import 'package:flutter/cupertino.dart'; + +Widget clearButton(VoidCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Icon(CupertinoIcons.multiply_circle, size: 24), + ); +} diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 9e5a208..9422cc1 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -1,4 +1,5 @@ import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart'; @@ -15,7 +16,9 @@ class DioRemote implements IHttpClient { @override Future init() async { final dio = Dio(BaseOptions(baseUrl: baseUrl)); - dio.interceptors.add(PrettyDioLogger()); + if (kDebugMode) { + dio.interceptors.add(PrettyDioLogger()); + } _dio = dio; } @@ -40,6 +43,7 @@ class DioRemote implements IHttpClient { String path, { dynamic data, Map? queryParameters, + T Function(Map json)? fromJson, Map? headers, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, @@ -52,6 +56,15 @@ class DioRemote implements IHttpClient { onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); + + if (fromJson != null) { + final rawData = response.data; + final parsedData = + rawData is Map ? fromJson(rawData) : null; + response.data = parsedData; + return DioResponse(response); + } + return DioResponse(response); } diff --git a/packages/core/lib/presentation/widget/captcha/captcha_widget.dart b/packages/core/lib/presentation/widget/captcha/captcha_widget.dart deleted file mode 100644 index fc20c4e..0000000 --- a/packages/core/lib/presentation/widget/captcha/captcha_widget.dart +++ /dev/null @@ -1,266 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/presentation/common/app_color.dart'; -import 'package:rasadyar_core/presentation/common/app_fonts.dart'; - -class CaptchaController { - int? captchaCode; - TextEditingController textController = TextEditingController(); - GlobalKey formKey = GlobalKey(); - - late Function() refreshCaptcha; - - bool validate() { - if (formKey.currentState?.validate() == true) { - return true; - } - return false; - } - - String get enteredText => textController.text; - - bool isCorrect() { - return textController.text == captchaCode.toString(); - } - - void clear() { - textController.clear(); - } -} - -class RandomLinePainter extends CustomPainter { - final Random random = Random(); - final Paint linePaint; - final List points; - - RandomLinePainter({ - required this.points, - required Color lineColor, - double strokeWidth = 2.0, - }) : linePaint = - Paint() - ..color = lineColor - ..strokeWidth = strokeWidth - ..strokeCap = StrokeCap.round - ..style = PaintingStyle.stroke; - - @override - void paint(Canvas canvas, Size size) { - final path = Path(); - - if (points.isNotEmpty) { - path.moveTo(points[0].dx, points[0].dy); - - for (int i = 1; i < points.length; i++) { - path.lineTo(points[i].dx, points[i].dy); - } - - canvas.drawPath(path, linePaint); - } - } - - @override - bool shouldRepaint(RandomLinePainter oldDelegate) => true; -} - -class CaptchaWidget extends StatefulWidget { - final CaptchaController controller; - final bool autoValidateMode; - - const CaptchaWidget({ - required this.controller, - this.autoValidateMode = false, - super.key, - }); - - @override - _CaptchaWidgetState createState() => _CaptchaWidgetState(); -} - -class _CaptchaWidgetState extends State { - late List points; - late List points1; - late List points2; - bool isOnError = false; - - @override - void initState() { - super.initState(); - generateLines(); - getRandomSixDigitNumber(); - - // Set the refresh function in the controller - widget.controller.refreshCaptcha = () { - getRandomSixDigitNumber(); - generateLines(); - setState(() {}); - }; - } - - void generateLines() { - points = generateRandomLine(); - points1 = generateRandomLine(); - points2 = generateRandomLine(); - setState(() {}); - } - - List generateRandomLine() { - final random = Random(); - int pointCount = random.nextInt(10) + 5; - List points = []; - - double previousY = 0; - - for (int i = 0; i < pointCount; i++) { - double x = (i / (pointCount - 1)) * 135; - - if (i == 0) { - previousY = 24; - } else { - double change = (random.nextDouble() * 20) - 10; - previousY = max(5, min(43, previousY + change)); - } - - points.add(Offset(x, previousY)); - } - - return points; - } - - void getRandomSixDigitNumber() { - final random = Random(); - widget.controller.captchaCode = random.nextInt(900000) + 100000; - setState(() {}); - } - - @override - Widget build(BuildContext context) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - width: 135, - height: 48, - decoration: BoxDecoration( - color: AppColor.whiteNormalHover, - border: Border.all(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(8), - ), - child: Stack( - alignment: AlignmentDirectional.center, - children: [ - CustomPaint( - painter: RandomLinePainter( - points: points, - lineColor: Colors.blue, - strokeWidth: 1.0, - ), - size: const Size(double.infinity, double.infinity), - ), - CustomPaint( - painter: RandomLinePainter( - points: points1, - lineColor: Colors.green, - strokeWidth: 1.0, - ), - size: const Size(double.infinity, double.infinity), - ), - CustomPaint( - painter: RandomLinePainter( - points: points2, - lineColor: Colors.red, - strokeWidth: 1.0, - ), - size: const Size(double.infinity, double.infinity), - ), - Text( - widget.controller.captchaCode.toString(), - style: AppFonts.yekan24, - ), - ], - ), - ), - const SizedBox(height: 20), - IconButton( - padding: EdgeInsets.zero, - onPressed: widget.controller.refreshCaptcha, - icon: Icon(CupertinoIcons.refresh, size: 16), - ), - Expanded( - child: Form( - key: widget.controller.formKey, - autovalidateMode: - widget.autoValidateMode - ? AutovalidateMode.onUserInteraction - : AutovalidateMode.disabled, - child: TextFormField( - controller: widget.controller.textController, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'کد امنیتی', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan10.copyWith( - color: AppColor.redNormal, - fontSize: 8, - ), - suffixIconConstraints: BoxConstraints( - maxHeight: 24, - minHeight: 24, - maxWidth: 24, - minWidth: 24, - ), - - suffix: - widget.controller.textController.text.trim().isNotEmpty - ? clearButton(() { - widget.controller.textController.clear(); - setState(() {}); - }) - : null, - counterText: '', - ), - keyboardType: TextInputType.numberWithOptions( - decimal: false, - signed: false, - ), - maxLines: 1, - maxLength: 6, - onChanged: (value) { - if (isOnError) { - isOnError = !isOnError; - widget.controller.formKey.currentState?.reset(); - widget.controller.textController.text = value; - } - setState(() {}); - }, - validator: (value) { - if (value == null || value.isEmpty) { - isOnError = true; - return 'کد امنیتی را وارد کنید'; - } - if (value != widget.controller.captchaCode.toString()) { - isOnError = true; - return '⚠️کد امنیتی وارد شده اشتباه است'; - } - return null; - }, - style: AppFonts.yekan13, - ), - ), - ), - ], - ); - } - - Widget clearButton(VoidCallback onTap) { - return GestureDetector( - onTap: onTap, - child: Icon(CupertinoIcons.multiply_circle, size: 18), - ); - } -} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index f61a097..7175a76 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -5,7 +5,6 @@ export 'buttons/elevated.dart'; export 'buttons/outline_elevated.dart'; export 'buttons/outline_elevated_icon.dart'; export 'buttons/text_button.dart'; -export 'captcha/captcha_widget.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; From b5d6055aa75813c1107ae4c6cd44ce3c58ef4b54 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 17 May 2025 09:08:46 +0330 Subject: [PATCH 059/256] fix : dio call --- .../repositories/auth_repository_imp.dart | 19 ++-- .../presentation/widget/captcha/logic.dart | 38 +++++++ .../lib/presentation/widget/captcha/view.dart | 98 +++++++++++++++++++ .../lib/infrastructure/remote/dio_remote.dart | 15 +-- .../infrastructure/remote/dio_response.dart | 2 +- packages/core/lib/utils/safe_call_utils.dart | 5 +- 6 files changed, 159 insertions(+), 18 deletions(-) create mode 100644 packages/auth/lib/presentation/widget/captcha/logic.dart create mode 100644 packages/auth/lib/presentation/widget/captcha/view.dart diff --git a/packages/auth/lib/data/repositories/auth_repository_imp.dart b/packages/auth/lib/data/repositories/auth_repository_imp.dart index 523efad..6aa2e1a 100644 --- a/packages/auth/lib/data/repositories/auth_repository_imp.dart +++ b/packages/auth/lib/data/repositories/auth_repository_imp.dart @@ -34,13 +34,15 @@ class AuthRepositoryImpl implements AuthRepository { @override Future captcha() async { - final response = await safeCall( - call: - () async => await _httpClient.post( - 'captcha/', - headers: {'Content-Type': 'application/json'}, - fromJson: CaptchaResponseModel.fromJson - ), + final response = await safeCall( + call: () async { + var res = await _httpClient.post( + 'captcha/', + fromJson: CaptchaResponseModel.fromJson, + ); + + return res.data; + }, onSuccess: (response) { iLog(response); }, @@ -48,8 +50,7 @@ class AuthRepositoryImpl implements AuthRepository { throw Exception('Error during captcha : $error'); }, ); - - return response?.data; + return response; } @override diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart new file mode 100644 index 0000000..de379b6 --- /dev/null +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/di/auth_di.dart'; +import 'package:rasadyar_auth/data/models/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_core/core.dart'; + +class CaptchaWidgetLogic extends GetxController + with StateMixin { + TextEditingController textController = TextEditingController(); + GlobalKey formKey = GlobalKey(); + AuthRepositoryImpl authRepository = diAuth.get(); + + @override + void onInit() { + super.onInit(); + + getCaptcha(); + } + + + @override + void onClose() { + super.onClose(); + } + + Future getCaptcha() async { + change(null, status: RxStatus.loading()); + safeCall( + call: () async => await authRepository.captcha(), + onSuccess: (value) { + change(value, status: RxStatus.success()); + }, + onError: (error, stackTrace) { + change(null, status: RxStatus.error(error.toString())); + }, + ); + } +} diff --git a/packages/auth/lib/presentation/widget/captcha/view.dart b/packages/auth/lib/presentation/widget/captcha/view.dart new file mode 100644 index 0000000..4d42576 --- /dev/null +++ b/packages/auth/lib/presentation/widget/captcha/view.dart @@ -0,0 +1,98 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/presentation/widget/clear_button.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class CaptchaWidget extends GetView { + CaptchaWidget({super.key}); + + final CaptchaWidgetLogic logic = Get.put(CaptchaWidgetLogic()); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 135, + height: 48, + clipBehavior: Clip.antiAliasWithSaveLayer, + decoration: BoxDecoration( + color: AppColor.whiteNormalHover, + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(8), + ), + child: Expanded(child:controller.obx((state) { + return Container(color: Colors.blue,); + }, + onLoading: const Center( + child: CircularProgressIndicator( + color: AppColor.blueNormal, + strokeWidth: 2, + ), + ), + )), + ), + const SizedBox(height: 20), + IconButton( + padding: EdgeInsets.zero, + onPressed: controller.getCaptcha, + icon: Icon(CupertinoIcons.refresh, size: 16), + ), + Expanded( + child: Form( + key: controller.formKey, + autovalidateMode: AutovalidateMode.onUserInteraction, + child: TextFormField( + controller: controller.textController, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'کد امنیتی', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan10.copyWith( + color: AppColor.redNormal, + fontSize: 8, + ), + suffixIconConstraints: BoxConstraints( + maxHeight: 24, + minHeight: 24, + maxWidth: 24, + minWidth: 24, + ), + suffix: + controller.textController.text + .trim() + .isNotEmpty + ? clearButton(() => controller.textController.clear()) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + maxLines: 1, + maxLength: 6, + onChanged: (value) {}, + validator: (value) { + if (value == null || value.isEmpty) { + return 'کد امنیتی را وارد کنید'; + } + /*if (value != controller.captchaCode.toString()) { + return '⚠️کد امنیتی وارد شده اشتباه است'; + }*/ + return null; + }, + style: AppFonts.yekan13, + ), + ), + ), + ], + ); + } +} diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 9422cc1..113def3 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -1,10 +1,9 @@ import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; +import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart'; -import 'dio_form_data.dart'; -import 'dio_response.dart'; import 'interfaces/i_http_client.dart'; class DioRemote implements IHttpClient { @@ -29,7 +28,7 @@ class DioRemote implements IHttpClient { Map? headers, ProgressCallback? onReceiveProgress, }) async { - final response = await _dio.get( + final response = await _dio.get( path, queryParameters: queryParameters, options: Options(headers: headers), @@ -48,7 +47,7 @@ class DioRemote implements IHttpClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { - final response = await _dio.post( + final response = await _dio.post( path, data: data, queryParameters: queryParameters, @@ -57,6 +56,8 @@ class DioRemote implements IHttpClient { onReceiveProgress: onReceiveProgress, ); + eLog(response.toString()); + if (fromJson != null) { final rawData = response.data; final parsedData = @@ -65,7 +66,7 @@ class DioRemote implements IHttpClient { return DioResponse(response); } - return DioResponse(response); + return DioResponse(response ); } @override @@ -77,7 +78,7 @@ class DioRemote implements IHttpClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { - final response = await _dio.put( + final response = await _dio.put( path, data: data, queryParameters: queryParameters, @@ -124,7 +125,7 @@ class DioRemote implements IHttpClient { Map? headers, ProgressCallback? onSendProgress, }) async { - final response = await _dio.post( + final response = await _dio.post( path, data: (formData as DioFormData).raw, options: Options(headers: headers, contentType: 'multipart/form-data'), diff --git a/packages/core/lib/infrastructure/remote/dio_response.dart b/packages/core/lib/infrastructure/remote/dio_response.dart index 97a14c3..30f54eb 100644 --- a/packages/core/lib/infrastructure/remote/dio_response.dart +++ b/packages/core/lib/infrastructure/remote/dio_response.dart @@ -2,7 +2,7 @@ import 'interfaces/i_http_response.dart'; import 'package:dio/dio.dart'; class DioResponse implements IHttpResponse { - final Response _response; + final Response _response; DioResponse(this._response); diff --git a/packages/core/lib/utils/safe_call_utils.dart b/packages/core/lib/utils/safe_call_utils.dart index 116101f..cb9a3e4 100644 --- a/packages/core/lib/utils/safe_call_utils.dart +++ b/packages/core/lib/utils/safe_call_utils.dart @@ -1,4 +1,5 @@ import 'package:flutter/foundation.dart'; +import 'package:rasadyar_core/core.dart'; typedef AsyncCallback = Future Function(); typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace); @@ -27,12 +28,14 @@ Future safeCall({ final result = await call(); + iLog(result.toString()); + if (showSuccess) { (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); } onSuccess?.call(result); - return result; // اضافه کردن بازگشت نتیجه + return result; } catch (error, stackTrace) { if (showError) { From 64c89af440ed29a76313eef01590f6d8cc1c75c1 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 17 May 2025 09:09:32 +0330 Subject: [PATCH 060/256] chore : clear logger --- packages/core/lib/infrastructure/remote/dio_remote.dart | 2 -- packages/core/lib/utils/safe_call_utils.dart | 2 -- 2 files changed, 4 deletions(-) diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 113def3..31b84e5 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -56,8 +56,6 @@ class DioRemote implements IHttpClient { onReceiveProgress: onReceiveProgress, ); - eLog(response.toString()); - if (fromJson != null) { final rawData = response.data; final parsedData = diff --git a/packages/core/lib/utils/safe_call_utils.dart b/packages/core/lib/utils/safe_call_utils.dart index cb9a3e4..78195cc 100644 --- a/packages/core/lib/utils/safe_call_utils.dart +++ b/packages/core/lib/utils/safe_call_utils.dart @@ -28,8 +28,6 @@ Future safeCall({ final result = await call(); - iLog(result.toString()); - if (showSuccess) { (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); } From 0e630e709b7020b4f8b7a1a2709fb825e1a2a843 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 17 May 2025 09:39:09 +0330 Subject: [PATCH 061/256] feat : api call and get captcha --- packages/auth/build.yaml | 6 ++++++ .../login_request/login_request_model.g.dart | 8 ++++---- .../response/auth/auth_response_model.dart | 2 +- .../auth/auth_response_model.freezed.dart | 10 +++++----- .../captcha/captcha_response_model.g.dart | 16 ++++++++-------- .../data/repositories/auth_repository_imp.dart | 3 +-- packages/auth/lib/hive_registrar.g.dart | 2 +- .../lib/presentation/widget/captcha/view.dart | 18 ++++++++++++------ 8 files changed, 38 insertions(+), 27 deletions(-) create mode 100644 packages/auth/build.yaml diff --git a/packages/auth/build.yaml b/packages/auth/build.yaml new file mode 100644 index 0000000..840029b --- /dev/null +++ b/packages/auth/build.yaml @@ -0,0 +1,6 @@ +targets: + $default: + builders: + json_serializable: + options: + field_rename: snake \ No newline at end of file diff --git a/packages/auth/lib/data/models/request/login_request/login_request_model.g.dart b/packages/auth/lib/data/models/request/login_request/login_request_model.g.dart index f10c8a6..4504142 100644 --- a/packages/auth/lib/data/models/request/login_request/login_request_model.g.dart +++ b/packages/auth/lib/data/models/request/login_request/login_request_model.g.dart @@ -10,14 +10,14 @@ _LoginRequestModel _$LoginRequestModelFromJson(Map json) => _LoginRequestModel( username: json['username'] as String?, password: json['password'] as String?, - captchaCode: json['captchaCode'] as String?, - captchaKey: json['captchaKey'] as String?, + captchaCode: json['captcha_code'] as String?, + captchaKey: json['captcha_key'] as String?, ); Map _$LoginRequestModelToJson(_LoginRequestModel instance) => { 'username': instance.username, 'password': instance.password, - 'captchaCode': instance.captchaCode, - 'captchaKey': instance.captchaKey, + 'captcha_code': instance.captchaCode, + 'captcha_key': instance.captchaKey, }; diff --git a/packages/auth/lib/data/models/response/auth/auth_response_model.dart b/packages/auth/lib/data/models/response/auth/auth_response_model.dart index c13cb0e..1f5faba 100644 --- a/packages/auth/lib/data/models/response/auth/auth_response_model.dart +++ b/packages/auth/lib/data/models/response/auth/auth_response_model.dart @@ -10,7 +10,7 @@ abstract class AuthResponseModel with _$AuthResponseModel { const factory AuthResponseModel({ String? refresh, String? access, - @JsonKey(name: 'otp_status') bool? otpStatus, + bool? otpStatus, }) = _AuthResponseModel; factory AuthResponseModel.fromJson(Map json) => diff --git a/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart b/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart index a61f9f7..c0c505f 100644 --- a/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart +++ b/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$AuthResponseModel { - String? get refresh; String? get access;@JsonKey(name: 'otp_status') bool? get otpStatus; + String? get refresh; String? get access; bool? get otpStatus; /// Create a copy of AuthResponseModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -49,7 +49,7 @@ abstract mixin class $AuthResponseModelCopyWith<$Res> { factory $AuthResponseModelCopyWith(AuthResponseModel value, $Res Function(AuthResponseModel) _then) = _$AuthResponseModelCopyWithImpl; @useResult $Res call({ - String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus + String? refresh, String? access, bool? otpStatus }); @@ -82,12 +82,12 @@ as bool?, @JsonSerializable() class _AuthResponseModel implements AuthResponseModel { - const _AuthResponseModel({this.refresh, this.access, @JsonKey(name: 'otp_status') this.otpStatus}); + const _AuthResponseModel({this.refresh, this.access, this.otpStatus}); factory _AuthResponseModel.fromJson(Map json) => _$AuthResponseModelFromJson(json); @override final String? refresh; @override final String? access; -@override@JsonKey(name: 'otp_status') final bool? otpStatus; +@override final bool? otpStatus; /// Create a copy of AuthResponseModel /// with the given fields replaced by the non-null parameter values. @@ -122,7 +122,7 @@ abstract mixin class _$AuthResponseModelCopyWith<$Res> implements $AuthResponseM factory _$AuthResponseModelCopyWith(_AuthResponseModel value, $Res Function(_AuthResponseModel) _then) = __$AuthResponseModelCopyWithImpl; @override @useResult $Res call({ - String? refresh, String? access,@JsonKey(name: 'otp_status') bool? otpStatus + String? refresh, String? access, bool? otpStatus }); diff --git a/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart b/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart index a0ffdcb..8d69248 100644 --- a/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart +++ b/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart @@ -9,17 +9,17 @@ part of 'captcha_response_model.dart'; _CaptchaResponseModel _$CaptchaResponseModelFromJson( Map json, ) => _CaptchaResponseModel( - captchaKey: json['captchaKey'] as String?, - captchaImage: json['captchaImage'] as String?, - imageType: json['imageType'] as String?, - imageDecode: json['imageDecode'] as String?, + captchaKey: json['captcha_key'] as String?, + captchaImage: json['captcha_image'] as String?, + imageType: json['image_type'] as String?, + imageDecode: json['image_decode'] as String?, ); Map _$CaptchaResponseModelToJson( _CaptchaResponseModel instance, ) => { - 'captchaKey': instance.captchaKey, - 'captchaImage': instance.captchaImage, - 'imageType': instance.imageType, - 'imageDecode': instance.imageDecode, + 'captcha_key': instance.captchaKey, + 'captcha_image': instance.captchaImage, + 'image_type': instance.imageType, + 'image_decode': instance.imageDecode, }; diff --git a/packages/auth/lib/data/repositories/auth_repository_imp.dart b/packages/auth/lib/data/repositories/auth_repository_imp.dart index 6aa2e1a..9ddcd17 100644 --- a/packages/auth/lib/data/repositories/auth_repository_imp.dart +++ b/packages/auth/lib/data/repositories/auth_repository_imp.dart @@ -40,11 +40,10 @@ class AuthRepositoryImpl implements AuthRepository { 'captcha/', fromJson: CaptchaResponseModel.fromJson, ); - return res.data; }, onSuccess: (response) { - iLog(response); + return response; }, onError: (error, trace) { throw Exception('Error during captcha : $error'); diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart index d174454..b4abe2c 100644 --- a/packages/auth/lib/hive_registrar.g.dart +++ b/packages/auth/lib/hive_registrar.g.dart @@ -2,8 +2,8 @@ // Do not modify // Check in to version control +import 'package:hive_ce/hive.dart'; import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; -import 'package:rasadyar_core/core.dart'; extension HiveRegistrar on HiveInterface { void registerAdapters() { diff --git a/packages/auth/lib/presentation/widget/captcha/view.dart b/packages/auth/lib/presentation/widget/captcha/view.dart index 4d42576..db795c2 100644 --- a/packages/auth/lib/presentation/widget/captcha/view.dart +++ b/packages/auth/lib/presentation/widget/captcha/view.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/presentation/widget/clear_button.dart'; @@ -24,16 +26,20 @@ class CaptchaWidget extends GetView { border: Border.all(color: Colors.grey.shade300), borderRadius: BorderRadius.circular(8), ), - child: Expanded(child:controller.obx((state) { - return Container(color: Colors.blue,); - }, + child: controller.obx( + (state) => Image.memory(base64Decode(state?.captchaImage??''),fit: BoxFit.cover,), onLoading: const Center( - child: CircularProgressIndicator( + child: CupertinoActivityIndicator( color: AppColor.blueNormal, - strokeWidth: 2, ), ), - )), + onError: (error) { + return const Center( + child: Text( + 'خطا در بارگذاری کد امنیتی', + style: AppFonts.yekan13,)); + }, + ), ), const SizedBox(height: 20), IconButton( From 303ff86d8567c50bb5704cd00de7d14cc0f221db Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 17 May 2025 15:24:06 +0330 Subject: [PATCH 062/256] feat : login api call --- .../pages/system_design/system_design.dart | 6 +- .../lib/data/common/dio_error_handler.dart | 53 ++++ packages/auth/lib/data/di/auth_di.dart | 6 +- .../login_request/login_request_model.dart | 15 +- .../repositories/auth_repository_imp.dart | 77 ++--- .../data/services/token_storage_service.dart | 2 +- .../lib/presentation/pages/auth/logic.dart | 58 +++- .../lib/presentation/pages/auth/view.dart | 287 +++++++----------- .../auth/lib/presentation/routes/pages.dart | 4 +- .../presentation/widget/captcha/logic.dart | 7 +- .../lib/presentation/widget/captcha/view.dart | 107 +++---- .../lib/presentation/widget/clear_button.dart | 2 +- .../lib/presentation/widget/logo_widget.dart | 20 ++ packages/core/lib/core.dart | 5 +- .../lib/infrastructure/remote/dio_remote.dart | 6 +- .../presentation/widget/buttons/elevated.dart | 56 ++-- .../presentation/widget/inputs/r_input.dart | 277 +++++++---------- packages/core/lib/utils/safe_call_utils.dart | 6 +- .../add_mobile_inspector/view.dart | 4 + .../presentation/add_supervision/view.dart | 12 +- .../display_information/view.dart | 15 +- .../registration_of_violation/view.dart | 15 +- 22 files changed, 518 insertions(+), 522 deletions(-) create mode 100644 packages/auth/lib/data/common/dio_error_handler.dart create mode 100644 packages/auth/lib/presentation/widget/logo_widget.dart diff --git a/lib/presentation/pages/system_design/system_design.dart b/lib/presentation/pages/system_design/system_design.dart index f53eb75..bacf390 100644 --- a/lib/presentation/pages/system_design/system_design.dart +++ b/lib/presentation/pages/system_design/system_design.dart @@ -67,11 +67,13 @@ class _SystemDesignPageState extends State { child: Column( spacing: 14, children: [ - RTextField( + RTextField( + controller: TextEditingController(), hintText: 'حجم کشتار را در روز به قطعه وارد کنید', hintStyle: AppFonts.yekan13, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'تلفن مرغداری', labelStyle: AppFonts.yekan10, ), diff --git a/packages/auth/lib/data/common/dio_error_handler.dart b/packages/auth/lib/data/common/dio_error_handler.dart new file mode 100644 index 0000000..963707c --- /dev/null +++ b/packages/auth/lib/data/common/dio_error_handler.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class DioErrorHandler { + void handle(DioException error) { + switch (error.response?.statusCode) { + case 401: + _handle401(); + break; + case 403: + _handle403(); + break; + default: + _handleGeneric(error); + } + } + + //wrong password/user name => "detail": "No active account found with the given credentials" - 401 + void _handle401() { + Get.showSnackbar( + _errorSnackBar('نام کاربری یا رمز عبور اشتباه است'), + ); + } + + //wrong captcha => "detail": "Captcha code is incorrect" - 403 + void _handle403() { + Get.showSnackbar( + _errorSnackBar('کد امنیتی اشتباه است'), + ); + } + + void _handleGeneric(DioException error) { + // General error handling + } + + GetSnackBar _errorSnackBar(String message) { + return GetSnackBar( + titleText: Text( + 'خطا', + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + messageText: Text( + message, + style: AppFonts.yekan12.copyWith(color: Colors.white), + ), + backgroundColor: AppColor.error, + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: 12, + duration: Duration(milliseconds: 3500), + snackPosition: SnackPosition.TOP, + ); + } +} diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 391647f..d654ef1 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -1,4 +1,5 @@ import 'package:rasadyar_auth/data/common/constant.dart'; +import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_auth/data/services/auth_service.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; @@ -16,6 +17,7 @@ Future setupAuthDI() async { diAuth.registerCachedFactory( () => AuthRepositoryImpl(dioRemote), ); - diAuth.registerLazySingleton(() => AuthService()); - diAuth.registerLazySingleton(() => TokenStorageService()); + diAuth.registerLazySingleton(() => AuthService()); + diAuth.registerLazySingleton(() => TokenStorageService()); + diAuth.registerLazySingleton(() => DioErrorHandler()); } diff --git a/packages/auth/lib/data/models/request/login_request/login_request_model.dart b/packages/auth/lib/data/models/request/login_request/login_request_model.dart index 3794525..0e76bc2 100644 --- a/packages/auth/lib/data/models/request/login_request/login_request_model.dart +++ b/packages/auth/lib/data/models/request/login_request/login_request_model.dart @@ -12,10 +12,23 @@ abstract class LoginRequestModel with _$LoginRequestModel { String? captchaKey, }) = _LoginRequestModel; + factory LoginRequestModel.createWithCaptcha({ + required String username, + required String password, + required String captchaCode, + required String captchaKey, + }) { + return LoginRequestModel( + username: username, + password: password, + captchaCode: captchaCode, + captchaKey: 'rest_captcha_$captchaKey.0', + ); + } + factory LoginRequestModel.fromJson(Map json) => _$LoginRequestModelFromJson(json); const LoginRequestModel._(); - String get formattedCaptchaKey => 'rest_captcha_$captchaKey.0'; } diff --git a/packages/auth/lib/data/repositories/auth_repository_imp.dart b/packages/auth/lib/data/repositories/auth_repository_imp.dart index 9ddcd17..6f03fc0 100644 --- a/packages/auth/lib/data/repositories/auth_repository_imp.dart +++ b/packages/auth/lib/data/repositories/auth_repository_imp.dart @@ -14,64 +14,34 @@ class AuthRepositoryImpl implements AuthRepository { Future login({ required Map authRequest, }) async { - final response = await safeCall>( - call: - () async => await _httpClient.post( - '$_BASE_URL/login/', - data: authRequest, - headers: {'Content-Type': 'application/json'}, - ), - onSuccess: (response) { - iLog(response); - }, - onError: (error, trace) { - throw Exception('Error during sign in: $error'); - }, + var res = await _httpClient.post( + '$_BASE_URL/login/', + data: authRequest, + fromJson: AuthResponseModel.fromJson, + headers: {'Content-Type': 'application/json'}, ); - - return response?.data; + return res.data; } @override Future captcha() async { - final response = await safeCall( - call: () async { - var res = await _httpClient.post( - 'captcha/', - fromJson: CaptchaResponseModel.fromJson, - ); - return res.data; - }, - onSuccess: (response) { - return response; - }, - onError: (error, trace) { - throw Exception('Error during captcha : $error'); - }, + var res = await _httpClient.post( + 'captcha/', + fromJson: CaptchaResponseModel.fromJson, ); - return response; + return res.data; } @override Future loginWithRefreshToken({ required Map authRequest, }) async { - final response = await safeCall>( - call: - () async => await _httpClient.post( - '$_BASE_URL/login/', - data: authRequest, - headers: {'Content-Type': 'application/json'}, - ), - onSuccess: (response) { - iLog(response); - }, - onError: (error, trace) { - throw Exception('Error during sign in: $error'); - }, + var res = await _httpClient.post( + '$_BASE_URL/login/', + data: authRequest, + headers: {'Content-Type': 'application/json'}, ); - - return response?.data; + return res.data; } @override @@ -82,20 +52,11 @@ class AuthRepositoryImpl implements AuthRepository { @override Future hasAuthenticated() async { - final response = await safeCall>( - call: - () async => await _httpClient.get( - '$_BASE_URL/login/', - headers: {'Content-Type': 'application/json'}, - ), - onSuccess: (response) { - iLog(response); - }, - onError: (error, trace) { - throw Exception('Error during sign in: $error'); - }, + final response = await _httpClient.get( + '$_BASE_URL/login/', + headers: {'Content-Type': 'application/json'}, ); - return response?.data ?? false; + return response.data ?? false; } } diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index 0f0eed6..b73122c 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/injection/di.dart'; + class TokenStorageService extends GetxService { static const String _boxName = 'secureBox'; diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 737c4a3..66a8887 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -2,7 +2,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; +import 'package:rasadyar_auth/data/models/request/login_request/login_request_model.dart'; +import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_auth/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_core/core.dart'; enum AuthType { useAndPass, otp } @@ -12,7 +17,8 @@ enum AuthStatus { init } enum OtpStatus { init, sent, verified, reSend } class AuthLogic extends GetxController { - Rx> formKey = GlobalKey().obs; + GlobalKey formKey = GlobalKey(); + Rx> formKeyOtp = GlobalKey().obs; Rx> formKeySentOtp = GlobalKey().obs; Rx phoneNumberController = TextEditingController().obs; @@ -21,11 +27,12 @@ class AuthLogic extends GetxController { TextEditingController().obs; Rx otpCodeController = TextEditingController().obs; + var captchaController = Get.find(); RxnString phoneNumber = RxnString(null); - RxnString password = RxnString(null); - RxBool isOnError = false.obs; - RxBool hidePassword = true.obs; + RxBool isLoading = false.obs; + TokenStorageService tokenStorageService = diAuth.get(); + Rx authType = AuthType.useAndPass.obs; Rx authStatus = AuthStatus.init.obs; Rx otpStatus = OtpStatus.init.obs; @@ -61,7 +68,7 @@ class AuthLogic extends GetxController { @override void onInit() { super.onInit(); - + tokenStorageService.init(); } @override @@ -76,5 +83,46 @@ class AuthLogic extends GetxController { super.onClose(); } + bool _isFormValid() { + final isCaptchaValid = + captchaController.formKey.currentState?.validate() ?? false; + final isFormValid = formKey.currentState?.validate() ?? false; + return isCaptchaValid && isFormValid; + } + LoginRequestModel _buildLoginRequest() { + final phone = phoneNumberController.value.text; + final pass = passwordController.value.text; + final code = captchaController.textController.value.text; + final key = captchaController.captchaKey.value; + + return LoginRequestModel.createWithCaptcha( + username: phone, + password: pass, + captchaCode: code, + captchaKey: key!, + ); + } + + Future submitLoginForm() async { + if (!_isFormValid()) return; + + final loginRequestModel = _buildLoginRequest(); + isLoading.value = true; + await safeCall( + call: () => authRepository.login(authRequest: loginRequestModel.toJson()), + onSuccess: (result) async{ + await tokenStorageService.saveRefreshToken(result!.refresh!); + await tokenStorageService.saveAccessToken(result!.access!); + //Get.offAndToNamed(Routes.home); + }, + onError: (error, stackTrace) { + if (error is DioException) { + diAuth.get().handle(error); + } + captchaController.getCaptcha(); + }, + ); + isLoading.value = false; + } } diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 98cc7aa..674a796 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -1,8 +1,8 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/presentation/widget/captcha/view.dart'; import 'package:rasadyar_auth/presentation/widget/clear_button.dart'; +import 'package:rasadyar_auth/presentation/widget/logo_widget.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -17,11 +17,11 @@ class AuthPage extends GetView { child: Column( children: [ SizedBox(height: 80), - logoWidget(), + LogoWidget(), ObxValue((types) { switch (types.value) { case AuthType.otp: - //return otpForm(); + //return otpForm(); case AuthType.useAndPass: return useAndPassFrom(); } @@ -87,180 +87,114 @@ class AuthPage extends GetView { } Widget useAndPassFrom() { - return ObxValue((data) { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), - child: Form( - key: data.value, - child: Column( - children: [ - ObxValue((phoneController) { - return TextFormField( - controller: controller.phoneNumberController.value, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'نام کاربری', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - - prefixIconConstraints: BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: vecWidget(Assets.vecCallSvg), - ), - suffix: - phoneController.value.text.trim().isNotEmpty - ? clearButton(() { - phoneController.value.clear(); - phoneController.refresh(); - }) - : null, - counterText: '', - ), - keyboardType: TextInputType.numberWithOptions( - decimal: false, - signed: false, - ), - - maxLines: 1, - maxLength: 11, - onChanged: (value) { - if (controller.isOnError.value) { - controller.isOnError.value = !controller.isOnError.value; - data.value.currentState?.reset(); - - data.refresh(); - phoneController.value.text = value; - } - phoneController.refresh(); - }, - textInputAction: TextInputAction.next, - validator: (value) { - if (value == null) { - return '⚠️ شماره موبایل را وارد کنید'; - } else if (value.length < 11) { - return '⚠️ شماره موبایل باید 11 رقم باشد'; - } - return null; - }, - style: AppFonts.yekan13, - ); - }, controller.phoneNumberController), - - SizedBox(height: 26), - - ObxValue((passwordController) { - return TextFormField( - controller: passwordController.value, - obscureText: controller.hidePassword.value, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, - ), - labelText: 'رمز عبور', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - - prefixIconConstraints: BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: vecWidget(Assets.vecKeySvg), - ), - suffix: - passwordController.value.text.trim().isNotEmpty - ? GestureDetector( - onTap: () { - controller.hidePassword.value = - !controller.hidePassword.value; - }, - child: Icon( - controller.hidePassword.value - ? CupertinoIcons.eye - : CupertinoIcons.eye_slash, - ), - ) - : null, - counterText: '', - ), - textInputAction: TextInputAction.done, - keyboardType: TextInputType.visiblePassword, - maxLines: 1, - onChanged: (value) { - if (controller.isOnError.value) { - controller.isOnError.value = !controller.isOnError.value; - data.value.currentState?.reset(); - passwordController.value.text = value; - } - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" - } - return null; - }, - style: AppFonts.yekan13, - ); - }, controller.passwordController), - SizedBox(height: 26), - - CaptchaWidget(), - - SizedBox(height: 23), - RElevated( + return Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Form( + key: controller.formKey, + child: Column( + children: [ + ObxValue( + (phoneController) => RTextField( + label: 'نام کاربری', + maxLength: 11, + maxLines: 1, + controller: phoneController.value, + keyboardType: TextInputType.number, + initText: phoneController.value.text, + onChanged: (value) { + phoneController.value.text = value; + phoneController.refresh(); + }, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffixIcon: + phoneController.value.text.trim().isNotEmpty + ? clearButton(() { + phoneController.value.clear(); + phoneController.refresh(); + }) + : null, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ شماره موبایل را وارد کنید'; + } + /*else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + }*/ + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + labelStyle: AppFonts.yekan13, + boxConstraints: const BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + ), + controller.phoneNumberController, + ), + const SizedBox(height: 26), + ObxValue( + (passwordController) => RTextField( + label: 'رمز عبور', + filled: false, + controller: passwordController.value, + variant: RTextFieldVariant.password, + initText: passwordController.value.text, + onChanged: (value) { + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + labelStyle: AppFonts.yekan13, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + boxConstraints: const BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + ), + controller.passwordController, + ), + SizedBox(height: 26), + CaptchaWidget(), + SizedBox(height: 23), + ObxValue((data) { + return RElevated( text: 'ورود', + isLoading: data.value, onPressed: () async { - Jalali? picked = await showPersianDatePicker( - context: Get.context!, - - initialDate: Jalali.now(), - firstDate: Jalali(1385, 8), - lastDate: Jalali(1450, 9), - initialEntryMode: PersianDatePickerEntryMode.calendarOnly, - initialDatePickerMode: PersianDatePickerMode.year, - ); + await controller.submitLoginForm(); }, width: Get.width, height: 48, - ), - ], - ), + ); + }, controller.isLoading), + ], ), - ); - }, controller.formKey); + ), + ); } -/* Widget otpForm() { - return ObxValue((status) { - switch (status.value) { - case OtpStatus.init: - return sendCodeForm(); - case OtpStatus.sent: - case OtpStatus.verified: - case OtpStatus.reSend: - return confirmCodeForm(); - } - }, controller.otpStatus); - }*/ - + /* Widget sendCodeForm() { return ObxValue((data) { return Form( @@ -494,18 +428,5 @@ class AuthPage extends GetView { ), ); }, controller.formKeySentOtp); - } - - Widget logoWidget() { - return Column( - children: [ - Row(), - Image.asset(Assets.imagesInnerSplash, width: 120, height: 120), - Text( - 'سامانه رصدیار', - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyNormal), - ), - ], - ); - } + }*/ } diff --git a/packages/auth/lib/presentation/routes/pages.dart b/packages/auth/lib/presentation/routes/pages.dart index 4b12ffa..11b8d56 100644 --- a/packages/auth/lib/presentation/routes/pages.dart +++ b/packages/auth/lib/presentation/routes/pages.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_auth/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_core/core.dart'; import '../pages/auth/logic.dart'; @@ -14,15 +15,16 @@ sealed class AuthPages { page: () => AuthPage(), binding: BindingsBuilder(() { Get.lazyPut(() => AuthLogic()); + Get.lazyPut(() => CaptchaWidgetLogic()); }), ), - GetPage( name: AuthPaths.auth, page: () => AuthPage(), binding: BindingsBuilder(() { Get.lazyPut(() => AuthLogic()); + Get.lazyPut(() => CaptchaWidgetLogic()); }), ), ]; diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart index de379b6..4adb51c 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -6,7 +6,8 @@ import 'package:rasadyar_core/core.dart'; class CaptchaWidgetLogic extends GetxController with StateMixin { - TextEditingController textController = TextEditingController(); + Rx textController = TextEditingController().obs; + RxnString captchaKey = RxnString(); GlobalKey formKey = GlobalKey(); AuthRepositoryImpl authRepository = diAuth.get(); @@ -17,17 +18,19 @@ class CaptchaWidgetLogic extends GetxController getCaptcha(); } - @override void onClose() { + textController.value.dispose(); super.onClose(); } Future getCaptcha() async { change(null, status: RxStatus.loading()); + textController.value.clear(); safeCall( call: () async => await authRepository.captcha(), onSuccess: (value) { + captchaKey.value = value?.captchaKey; change(value, status: RxStatus.success()); }, onError: (error, stackTrace) { diff --git a/packages/auth/lib/presentation/widget/captcha/view.dart b/packages/auth/lib/presentation/widget/captcha/view.dart index db795c2..af4d955 100644 --- a/packages/auth/lib/presentation/widget/captcha/view.dart +++ b/packages/auth/lib/presentation/widget/captcha/view.dart @@ -8,9 +8,7 @@ import 'package:rasadyar_core/core.dart'; import 'logic.dart'; class CaptchaWidget extends GetView { - CaptchaWidget({super.key}); - - final CaptchaWidgetLogic logic = Get.put(CaptchaWidgetLogic()); + const CaptchaWidget({super.key}); @override Widget build(BuildContext context) { @@ -19,7 +17,7 @@ class CaptchaWidget extends GetView { children: [ Container( width: 135, - height: 48, + height: 50, clipBehavior: Clip.antiAliasWithSaveLayer, decoration: BoxDecoration( color: AppColor.whiteNormalHover, @@ -27,75 +25,62 @@ class CaptchaWidget extends GetView { borderRadius: BorderRadius.circular(8), ), child: controller.obx( - (state) => Image.memory(base64Decode(state?.captchaImage??''),fit: BoxFit.cover,), + (state) => Image.memory( + base64Decode(state?.captchaImage ?? ''), + fit: BoxFit.cover, + ), onLoading: const Center( - child: CupertinoActivityIndicator( - color: AppColor.blueNormal, - ), + child: CupertinoActivityIndicator(color: AppColor.blueNormal), ), onError: (error) { return const Center( - child: Text( - 'خطا در بارگذاری کد امنیتی', - style: AppFonts.yekan13,)); + child: Text( + 'خطا در بارگذاری کد امنیتی', + style: AppFonts.yekan13, + ), + ); }, ), ), - const SizedBox(height: 20), - IconButton( - padding: EdgeInsets.zero, - onPressed: controller.getCaptcha, - icon: Icon(CupertinoIcons.refresh, size: 16), + GestureDetector( + onTap: controller.getCaptcha, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 3), + child: Icon(CupertinoIcons.refresh, size: 20), + ), ), + const SizedBox(width: 8), Expanded( child: Form( key: controller.formKey, - autovalidateMode: AutovalidateMode.onUserInteraction, - child: TextFormField( - controller: controller.textController, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - gapPadding: 11, + autovalidateMode: AutovalidateMode.disabled, + child: ObxValue((data) { + return RTextField( + label: 'کد امنیتی', + controller: data.value, + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, ), - labelText: 'کد امنیتی', - labelStyle: AppFonts.yekan13, - errorStyle: AppFonts.yekan10.copyWith( - color: AppColor.redNormal, - fontSize: 8, - ), - suffixIconConstraints: BoxConstraints( - maxHeight: 24, - minHeight: 24, - maxWidth: 24, - minWidth: 24, - ), - suffix: - controller.textController.text - .trim() - .isNotEmpty - ? clearButton(() => controller.textController.clear()) - : null, - counterText: '', - ), - keyboardType: TextInputType.numberWithOptions( - decimal: false, - signed: false, - ), - maxLines: 1, - maxLength: 6, - onChanged: (value) {}, - validator: (value) { - if (value == null || value.isEmpty) { - return 'کد امنیتی را وارد کنید'; - } - /*if (value != controller.captchaCode.toString()) { - return '⚠️کد امنیتی وارد شده اشتباه است'; - }*/ - return null; - }, - style: AppFonts.yekan13, - ), + maxLines: 1, + maxLength: 6, + suffixIcon: + (data.value.text.trim().isNotEmpty ?? false) + ? clearButton( + () => controller.textController.value.clear(), + ) + : null, + + onSubmitted: (data) {}, + validator: (value) { + if (value == null || value.isEmpty) { + return 'کد امنیتی را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.textController), ), ), ], diff --git a/packages/auth/lib/presentation/widget/clear_button.dart b/packages/auth/lib/presentation/widget/clear_button.dart index 393ebed..523d6b5 100644 --- a/packages/auth/lib/presentation/widget/clear_button.dart +++ b/packages/auth/lib/presentation/widget/clear_button.dart @@ -3,6 +3,6 @@ import 'package:flutter/cupertino.dart'; Widget clearButton(VoidCallback onTap) { return GestureDetector( onTap: onTap, - child: Icon(CupertinoIcons.multiply_circle, size: 24), + child: Icon(CupertinoIcons.multiply_circle, size: 20), ); } diff --git a/packages/auth/lib/presentation/widget/logo_widget.dart b/packages/auth/lib/presentation/widget/logo_widget.dart new file mode 100644 index 0000000..ea4a5a9 --- /dev/null +++ b/packages/auth/lib/presentation/widget/logo_widget.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class LogoWidget extends StatelessWidget { + const LogoWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row(), + Image.asset(Assets.imagesInnerSplash, width: 120, height: 120), + Text( + 'سامانه رصدیار', + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyNormal), + ), + ], + ); + } +} diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 4e48c2f..6108fd6 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -30,10 +30,13 @@ export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; -export 'infrastructure/remote/dio_form_data.dart'; + //network +export 'infrastructure/remote/dio_form_data.dart'; export 'infrastructure/remote/dio_remote.dart'; export 'infrastructure/remote/dio_response.dart'; +export 'package:dio/dio.dart' show DioException; + //utils export 'utils/logger_utils.dart'; export 'utils/safe_call_utils.dart'; diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 31b84e5..c8f0189 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -16,7 +16,11 @@ class DioRemote implements IHttpClient { Future init() async { final dio = Dio(BaseOptions(baseUrl: baseUrl)); if (kDebugMode) { - dio.interceptors.add(PrettyDioLogger()); + dio.interceptors.add(PrettyDioLogger( + requestHeader: true, + responseHeader: true, + requestBody: true + )); } _dio = dio; } diff --git a/packages/core/lib/presentation/widget/buttons/elevated.dart b/packages/core/lib/presentation/widget/buttons/elevated.dart index 3e4e5ff..bcbe124 100644 --- a/packages/core/lib/presentation/widget/buttons/elevated.dart +++ b/packages/core/lib/presentation/widget/buttons/elevated.dart @@ -3,51 +3,65 @@ import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/common/app_fonts.dart'; class RElevated extends StatelessWidget { - RElevated({ + const RElevated({ super.key, required this.text, required this.onPressed, - this.foregroundColor, - this.backgroundColor, + this.foregroundColor = Colors.white, + this.backgroundColor = AppColor.blueNormal, this.disabledBackgroundColor, - this.disabledForegroundColor, - this.radius, + this.disabledForegroundColor = Colors.white, + this.radius = 8.0, this.textStyle, this.width = 150.0, this.height = 56.0, - this.isFullWidth, + this.isFullWidth = false, + this.isLoading = false, }); final String text; final VoidCallback? onPressed; final double width; final double height; - final bool? isFullWidth; - Color? foregroundColor; - Color? backgroundColor; - Color? disabledForegroundColor; - Color? disabledBackgroundColor; - double? radius; - TextStyle? textStyle; + final bool isFullWidth; + final Color foregroundColor; + final Color backgroundColor; + final Color? disabledForegroundColor; + final Color? disabledBackgroundColor; + final double radius; + final TextStyle? textStyle; + final bool isLoading; @override Widget build(BuildContext context) { + final bool isEnabled = onPressed != null && !isLoading; + return ElevatedButton( - onPressed: onPressed, + onPressed: isEnabled ? onPressed : null, style: ElevatedButton.styleFrom( - backgroundColor: backgroundColor ?? AppColor.blueNormal, - foregroundColor: foregroundColor ?? Colors.white, + backgroundColor: backgroundColor, + foregroundColor: foregroundColor, disabledBackgroundColor: - disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38), - disabledForegroundColor: disabledForegroundColor ?? Colors.white, + disabledBackgroundColor ?? backgroundColor.withAlpha(38), + disabledForegroundColor: disabledForegroundColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(radius ?? 8), + borderRadius: BorderRadius.circular(radius), ), - minimumSize: Size((isFullWidth ??false) ? double.infinity : width, height), + minimumSize: Size(isFullWidth ? double.infinity : width, height), padding: EdgeInsets.zero, textStyle: textStyle ?? AppFonts.yekan24, ), - child: Text(text), + child: + isLoading + ? SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator( + strokeWidth: 2.5, + valueColor: AlwaysStoppedAnimation(foregroundColor), + ), + ) + : Text(text), ); } } diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index c6b9d9a..2780b59 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -2,164 +2,106 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -@immutable +enum RTextFieldVariant { + normal, + noBorder, + password, + passwordNoBorder, +} + class RTextField extends StatefulWidget { - RTextField({ - super.key, - this.maxLines, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.isForNumber = false, - this.style, - this.hintStyle, - this.suffixIcon, - this.prefixIcon, - this.validator, - this.readonly = false, - this.boxConstraints, - this.minLines, - this.radius, - this.filled, - this.filledColor, - this.enabled, - this.errorStyle, - this.labelStyle, - this.label, - }) { - filled = filled ?? false; - obscure = false; - _inputBorder = OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(radius ?? 8), - ); - } - - RTextField.noBorder({ - super.key, - this.maxLines, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.style, - this.hintStyle, - this.suffixIcon, - this.radius, - this.validator, - this.boxConstraints, - this.minLines, - this.isForNumber = false, - this.readonly = false, - this.label, - this.filled, - this.filledColor, - this.errorStyle, - this.labelStyle, - this.enabled, - }) { - _inputBorder = OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(radius ?? 16), - ); - obscure = false; - filled = filled ?? true; - } - - RTextField.password({ - super.key, - this.maxLines = 1, - this.maxLength, - this.hintText, - this.padding, - this.onChanged, - this.onSubmitted, - this.keyboardType, - this.showCounter = false, - this.isDense, - this.initText, - this.style, - this.hintStyle, - this.suffixIcon, - this.prefixIcon, - this.radius, - this.validator, - this.boxConstraints, - this.minLines, - this.isForNumber = false, - this.readonly = false, - this.label, - this.filled, - this.filledColor, - this.errorStyle, - this.labelStyle, - this.enabled, - }) { - _inputBorder = OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(radius ?? 16), - ); - filled = filled ?? true; - obscure = true; - _isPassword = true; - prefixIcon = prefixIcon ?? const Icon(CupertinoIcons.person); - } - - final int? maxLines; - final int? minLines; - final int? maxLength; - final String? hintText; + final TextEditingController controller; final String? label; - final EdgeInsets? padding; + final String? hintText; + final String? initText; + final bool obscure; + final bool readonly; + final bool enabled; + final int? maxLength; + final int? minLines; + final int? maxLines; + final Widget? suffixIcon; + final Widget? prefixIcon; + final BoxConstraints? boxConstraints; + final RTextFieldVariant variant; + final bool filled; + final Color? filledColor; + final bool showCounter; + final bool isDense; + final TextInputType? keyboardType; final TextStyle? style; - final TextStyle? errorStyle; final TextStyle? hintStyle; final TextStyle? labelStyle; - final bool showCounter; - final bool? isDense; - final bool? isForNumber; - final bool readonly; - bool? obscure; - final bool? enabled; - final double? radius; - final TextInputType? keyboardType; - final Function(String)? onChanged; - final Function(String)? onSubmitted; - final FormFieldValidator? validator; - final String? initText; - Widget? suffixIcon; - Widget? prefixIcon; - bool? filled; - Color? filledColor; - bool _isPassword = false; + final TextStyle? errorStyle; + final EdgeInsets? padding; + final FormFieldValidator? validator; + final void Function(String)? onChanged; + final void Function(String)? onSubmitted; + + const RTextField({ + super.key, + required this.controller, + this.label, + this.hintText, + this.initText, + this.obscure = false, + this.readonly = false, + this.enabled = true, + this.maxLength, + this.minLines, + this.maxLines = 1, + this.suffixIcon, + this.prefixIcon, + this.boxConstraints, + this.variant = RTextFieldVariant.normal, + this.filled = false, + this.filledColor, + this.showCounter = false, + this.isDense = false, + this.keyboardType, + this.style, + this.hintStyle, + this.labelStyle, + this.errorStyle, + this.padding, + this.validator, + this.onChanged, + this.onSubmitted, + }); - final BoxConstraints? boxConstraints; - late final InputBorder? _inputBorder; @override State createState() => _RTextFieldState(); + + bool get _isPassword => variant == RTextFieldVariant.password; + bool get _noBorder => variant == RTextFieldVariant.noBorder; + bool get _passwordNoBorder => variant == RTextFieldVariant.passwordNoBorder; + + + InputBorder get _inputBorder => + _noBorder || _passwordNoBorder ? InputBorder.none : OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide( + color: AppColor.lightGreyDarkActive, + width: 1, + ), + ); + + + + + + } class _RTextFieldState extends State { - final TextEditingController _controller = TextEditingController(); - bool? obscure; + late bool obscure; @override void initState() { super.initState(); if (widget.initText != null) { - _controller.text = widget.initText!; + widget.controller.text = widget.initText!; } obscure = widget.obscure; } @@ -167,51 +109,56 @@ class _RTextFieldState extends State { @override void didUpdateWidget(covariant RTextField oldWidget) { super.didUpdateWidget(oldWidget); - if (widget.initText != oldWidget.initText) { - _controller.text = widget.initText ?? ''; + if (widget.initText != null && widget.initText != oldWidget.initText) { + widget.controller.text = widget.initText!; } } + Widget _buildSuffixIcon() { + if (widget.suffixIcon != null) return widget.suffixIcon!; + if (!widget._isPassword) return const SizedBox.shrink(); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: GestureDetector( + onTap: () { + setState(() { + obscure = !obscure; + }); + }, + child: Icon( + obscure ? CupertinoIcons.eye : CupertinoIcons.eye_slash, + color: AppColor.darkGreyDarkActive, + ), + ), + ); + } + @override Widget build(BuildContext context) { return Padding( padding: widget.padding ?? EdgeInsets.zero, child: TextFormField( - controller: _controller, + controller: widget.controller, readOnly: widget.readonly, minLines: widget.minLines, maxLines: widget.maxLines, onChanged: widget.onChanged, validator: widget.validator, enabled: widget.enabled, - obscureText: obscure ?? false, - onTapOutside: (event) { - FocusScope.of(context).unfocus(); - }, + obscureText: obscure, + onTapOutside: (_) => FocusScope.of(context).unfocus(), onFieldSubmitted: widget.onSubmitted, maxLength: widget.maxLength, textDirection: TextDirection.rtl, style: widget.style, keyboardType: widget.keyboardType, decoration: InputDecoration( - contentPadding: EdgeInsets.symmetric(horizontal: 16), + contentPadding: const EdgeInsets.symmetric(horizontal: 16), errorStyle: widget.errorStyle, errorMaxLines: 1, isDense: widget.isDense, - suffixIcon: - widget.suffixIcon ?? - (widget._isPassword - ? IconButton( - onPressed: () { - setState(() { - obscure = !obscure!; - }); - }, - icon: Icon( - !obscure! ? CupertinoIcons.eye_slash : CupertinoIcons.eye, - ), - ) - : null), + suffixIcon: _buildSuffixIcon(), suffixIconConstraints: widget.boxConstraints, prefixIcon: widget.prefixIcon, prefixIconConstraints: widget.boxConstraints, @@ -221,7 +168,7 @@ class _RTextFieldState extends State { labelStyle: AppFonts.yekan14 .copyWith(color: AppColor.lightGreyDarkActive) .merge(widget.labelStyle), - filled: widget.filled, + filled: widget.filled || widget._noBorder || widget._passwordNoBorder, fillColor: widget.filledColor, counter: widget.showCounter ? null : const SizedBox(), hintStyle: widget.hintStyle, @@ -232,4 +179,4 @@ class _RTextFieldState extends State { ), ); } -} +} \ No newline at end of file diff --git a/packages/core/lib/utils/safe_call_utils.dart b/packages/core/lib/utils/safe_call_utils.dart index 78195cc..e210b40 100644 --- a/packages/core/lib/utils/safe_call_utils.dart +++ b/packages/core/lib/utils/safe_call_utils.dart @@ -1,3 +1,4 @@ +import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; @@ -6,7 +7,7 @@ typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace); typedef VoidCallback = void Function(); // تعریف دقیق تابع safeCall -Future safeCall({ +Future safeCall({ required AsyncCallback call, Function(T result)? onSuccess, ErrorCallback? onError, @@ -33,7 +34,7 @@ Future safeCall({ } onSuccess?.call(result); - return result; + } catch (error, stackTrace) { if (showError) { @@ -45,7 +46,6 @@ Future safeCall({ print('safeCall error: $error\n$stackTrace'); } - return null; } finally { if (showLoading) { (onHideLoading ?? _defaultHideLoading)(); diff --git a/packages/inspection/lib/presentation/add_mobile_inspector/view.dart b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart index 75bf4d1..61a9aba 100644 --- a/packages/inspection/lib/presentation/add_mobile_inspector/view.dart +++ b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -68,24 +68,28 @@ Container mobileInspectorWidget() { spacing: 16, children: [ RTextField( + controller: TextEditingController(), label: 'نام و نام خانوادگی', filled: true, filledColor: AppColor.whiteLight, padding: EdgeInsets.zero, ), RTextField( + controller: TextEditingController(), label: 'شماره مجوز', filled: true, filledColor: AppColor.whiteLight, padding: EdgeInsets.zero, ), RTextField( + controller: TextEditingController(), label: 'شماره ثبت', filled: true, filledColor: AppColor.whiteLight, padding: EdgeInsets.zero, ), RTextField( + controller: TextEditingController(), label: 'کد اقتصادی', filled: true, filledColor: AppColor.whiteLight, diff --git a/packages/inspection/lib/presentation/add_supervision/view.dart b/packages/inspection/lib/presentation/add_supervision/view.dart index 8be8f92..46738a1 100644 --- a/packages/inspection/lib/presentation/add_supervision/view.dart +++ b/packages/inspection/lib/presentation/add_supervision/view.dart @@ -86,13 +86,17 @@ class AddSupervisionPage extends GetView { ); }, controller.violationSegmentsSelected), SizedBox(height: 8), - RTextField(label: 'صادر کننده پروانه'), + RTextField( + controller: TextEditingController(),label: 'صادر کننده پروانه'), SizedBox(height: 8), - RTextField(label: 'شماره مجوز'), + RTextField( + controller: TextEditingController(),label: 'شماره مجوز'), SizedBox(height: 8), - RTextField(label: 'شماره ثبت'), + RTextField( + controller: TextEditingController(),label: 'شماره ثبت'), SizedBox(height: 8), - RTextField(label: 'کد اقتصادی'), + RTextField( + controller: TextEditingController(),label: 'کد اقتصادی'), ], ), ), diff --git a/packages/inspection/lib/presentation/display_information/view.dart b/packages/inspection/lib/presentation/display_information/view.dart index 55b52d9..3adbe1f 100644 --- a/packages/inspection/lib/presentation/display_information/view.dart +++ b/packages/inspection/lib/presentation/display_information/view.dart @@ -108,29 +108,34 @@ Widget violationWidget() { child: Column( spacing: 16, children: [ - RTextField( + RTextField( + controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'توضیحات تخلف', filled: true, filledColor: AppColor.whiteLight, maxLines: 3, minLines: 3, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'توضیحات تخلف', filled: true, filledColor: AppColor.whiteLight, diff --git a/packages/inspection/lib/presentation/registration_of_violation/view.dart b/packages/inspection/lib/presentation/registration_of_violation/view.dart index b74ee54..9e75e0a 100644 --- a/packages/inspection/lib/presentation/registration_of_violation/view.dart +++ b/packages/inspection/lib/presentation/registration_of_violation/view.dart @@ -69,29 +69,34 @@ Container violationWidget() { child: Column( spacing: 16, children: [ - RTextField( + RTextField( + controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'توضیحات تخلف', filled: true, filledColor: AppColor.whiteLight, maxLines: 3, minLines: 3, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( + controller: TextEditingController(), label: 'توضیحات تخلف', filled: true, filledColor: AppColor.whiteLight, From 6843973c4ff56ebbc7fe43b3c1ee3946226b293e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 17 May 2025 17:07:44 +0330 Subject: [PATCH 063/256] fix : login api call --- lib/domain/entity/user/user_entity.dart | 6 - lib/infrastructure/di/di.dart | 2 +- lib/infrastructure/service/auth_service.dart | 34 ++++ lib/main.dart | 3 + packages/auth/lib/auth.dart | 1 - packages/auth/lib/data/di/auth_di.dart | 2 - .../lib/data/services/auth_middelware.dart | 5 +- .../auth/lib/data/services/auth_service.dart | 9 - .../data/services/token_storage_service.dart | 56 ++++-- .../lib/presentation/pages/auth/logic.dart | 8 +- .../lib/presentation/pages/auth/view.dart | 182 +++++++++--------- packages/core/lib/injection/di.dart | 2 +- 12 files changed, 180 insertions(+), 130 deletions(-) delete mode 100644 lib/domain/entity/user/user_entity.dart create mode 100644 lib/infrastructure/service/auth_service.dart delete mode 100644 packages/auth/lib/data/services/auth_service.dart diff --git a/lib/domain/entity/user/user_entity.dart b/lib/domain/entity/user/user_entity.dart deleted file mode 100644 index 1988ce3..0000000 --- a/lib/domain/entity/user/user_entity.dart +++ /dev/null @@ -1,6 +0,0 @@ -class UserEntity { - String? token; - String? refreshToken; - - UserEntity({this.token, this.refreshToken}); -} diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index db60b78..b7107fb 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -6,7 +6,7 @@ final di = GetIt.instance; Future setupInjection() async{ await setupAuthDI(); - await setupAllProvider(); + await setupAllCoreProvider(); } diff --git a/lib/infrastructure/service/auth_service.dart b/lib/infrastructure/service/auth_service.dart new file mode 100644 index 0000000..786ce8e --- /dev/null +++ b/lib/infrastructure/service/auth_service.dart @@ -0,0 +1,34 @@ +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_core/core.dart'; + +class AuthService extends GetxService { + var tokenService = diAuth.get(); + RxBool accessRes = false.obs; + RxBool refAccessRes = false.obs; + @override + void onInit() { + super.onInit(); + + ever(tokenService.accessToken, (callback) { + iLog('Access token callback: $callback, value: ${tokenService.accessToken.value}'); + accessRes.value = (callback != null); + }); + + // رصد تغییرات refreshToken + ever(tokenService.refreshToken, (callback) { + fLog('Refresh token callback: $callback, value: ${tokenService.refreshToken.value}'); + refAccessRes.value = (callback != null); + }); + + // بررسی اینکه هر دو مقدار دارند + everAll([accessRes, refAccessRes], (_) { + if (accessRes.value && refAccessRes.value) { + fLog('Both accessToken and refreshToken are available: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); + } else { + fLog('One or both tokens are missing: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); + } + }); + + } +} diff --git a/lib/main.dart b/lib/main.dart index bd6d7db..708bf7c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; + import 'package:rasadyar_core/core.dart'; import 'infrastructure/di/di.dart'; +import 'infrastructure/service/auth_service.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await setupInjection(); + Get.put(AuthService()); runApp(MyApp()); // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); diff --git a/packages/auth/lib/auth.dart b/packages/auth/lib/auth.dart index 8007b45..9e7c1c4 100644 --- a/packages/auth/lib/auth.dart +++ b/packages/auth/lib/auth.dart @@ -4,5 +4,4 @@ library; export 'data/services/auth_middelware.dart'; -export 'data/services/auth_service.dart'; export 'data/di/auth_di.dart'; diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index d654ef1..10802b1 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -1,7 +1,6 @@ import 'package:rasadyar_auth/data/common/constant.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_auth/data/services/auth_service.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; @@ -17,7 +16,6 @@ Future setupAuthDI() async { diAuth.registerCachedFactory( () => AuthRepositoryImpl(dioRemote), ); - diAuth.registerLazySingleton(() => AuthService()); diAuth.registerLazySingleton(() => TokenStorageService()); diAuth.registerLazySingleton(() => DioErrorHandler()); } diff --git a/packages/auth/lib/data/services/auth_middelware.dart b/packages/auth/lib/data/services/auth_middelware.dart index e34c326..56c0bb4 100644 --- a/packages/auth/lib/data/services/auth_middelware.dart +++ b/packages/auth/lib/data/services/auth_middelware.dart @@ -10,9 +10,8 @@ class AuthMiddleware extends GetMiddleware { @override RouteSettings? redirect(String? route) { - eLog('redirect'); - final refreshToken = tokenService.getRefreshToken(); - final accessToken = tokenService.getAccessToken(); + final refreshToken = tokenService.refreshToken.value; + final accessToken = tokenService.accessToken.value; if (refreshToken == null || accessToken == null) { return RouteSettings(name: AuthPaths.moduleList); diff --git a/packages/auth/lib/data/services/auth_service.dart b/packages/auth/lib/data/services/auth_service.dart deleted file mode 100644 index b1dffa5..0000000 --- a/packages/auth/lib/data/services/auth_service.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:rasadyar_core/core.dart'; - -class AuthService extends GetxService{ - - - Future initService() async { - - } -} \ No newline at end of file diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index b73122c..78fc35b 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -2,14 +2,18 @@ import 'dart:convert'; import 'package:rasadyar_core/core.dart'; - class TokenStorageService extends GetxService { static const String _boxName = 'secureBox'; static const String _accessTokenKey = 'accessToken'; static const String _refreshTokenKey = 'refreshToken'; + final FlutterSecureStorage _secureStorage = FlutterSecureStorage(); final HiveLocalStorage _localStorage = diCore.get(); + RxnString accessToken = RxnString(); + RxnString refreshToken = RxnString(); + RxnString tsss = RxnString(); + Future init() async { final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key'); final encryptionKey = @@ -29,26 +33,40 @@ class TokenStorageService extends GetxService { _boxName, encryptionCipher: HiveAesCipher(encryptionKey), ); + + accessToken.value = _localStorage.read( + boxName: _boxName, + key: _accessTokenKey, + ); + refreshToken.value = _localStorage.read( + boxName: _boxName, + key: _refreshTokenKey, + ); } - Future saveAccessToken(String token) async => await _localStorage.save( - boxName: _boxName, - key: _accessTokenKey, - value: token, - ); - - Future saveRefreshToken(String token) async => await _localStorage.save( - boxName: _boxName, - key: _refreshTokenKey, - value: token, - ); - - String? getAccessToken() => - _localStorage.read(boxName: _boxName, key: _accessTokenKey); - String? getRefreshToken() => - _localStorage.read(boxName: _boxName, key: _refreshTokenKey); - - Future deleteTokens() async => await _localStorage.clear(_boxName); + Future saveAccessToken(String token) async { + await _localStorage.save( + boxName: _boxName, + key: _accessTokenKey, + value: token, + ); + accessToken.value = token; + accessToken.refresh(); + } + Future saveRefreshToken(String token) async { + await _localStorage.save( + boxName: _boxName, + key: _refreshTokenKey, + value: token, + ); + refreshToken.value = token; + refreshToken.refresh(); + } + Future deleteTokens() async { + await _localStorage.clear(_boxName); + accessToken.value = null; + refreshToken.value = null; + } } diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 66a8887..3e885a7 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -38,6 +38,7 @@ class AuthLogic extends GetxController { Rx otpStatus = OtpStatus.init.obs; RxInt secondsRemaining = 120.obs; + int wsd = 120; Timer? _timer; AuthRepositoryImpl authRepository = diAuth.get(); @@ -111,7 +112,7 @@ class AuthLogic extends GetxController { isLoading.value = true; await safeCall( call: () => authRepository.login(authRequest: loginRequestModel.toJson()), - onSuccess: (result) async{ + onSuccess: (result) async { await tokenStorageService.saveRefreshToken(result!.refresh!); await tokenStorageService.saveAccessToken(result!.access!); //Get.offAndToNamed(Routes.home); @@ -125,4 +126,9 @@ class AuthLogic extends GetxController { ); isLoading.value = false; } + + adder() { + tokenStorageService.tsss.value = (wsd++).toString(); + + } } diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 674a796..4125915 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -38,7 +38,8 @@ class AuthPage extends GetView { ), ), TextSpan( - recognizer: TapGestureRecognizer()..onTap = () {}, + recognizer: TapGestureRecognizer() + ..onTap = () {}, text: 'حریم خصوصی', style: AppFonts.yekan14.copyWith( color: AppColor.blueNormal, @@ -55,22 +56,22 @@ class AuthPage extends GetView { children: [ TextSpan( recognizer: - TapGestureRecognizer() - ..onTap = () { - if (controller.authType.value == AuthType.otp) { - controller.authType.value = AuthType.useAndPass; - if (controller.otpStatus.value != - OtpStatus.init) { - controller.otpStatus.value = OtpStatus.init; - } - } else { - controller.authType.value = AuthType.otp; - } - }, + TapGestureRecognizer() + ..onTap = () { + if (controller.authType.value == AuthType.otp) { + controller.authType.value = AuthType.useAndPass; + if (controller.otpStatus.value != + OtpStatus.init) { + controller.otpStatus.value = OtpStatus.init; + } + } else { + controller.authType.value = AuthType.otp; + } + }, text: - controller.authType.value == AuthType.otp - ? 'ورود با رمز ثابت' - : 'ورود با رمز یکبار مصرف', + controller.authType.value == AuthType.otp + ? 'ورود با رمز ثابت' + : 'ورود با رمز یکبار مصرف', style: AppFonts.yekan14.copyWith( color: AppColor.blueNormal, @@ -94,84 +95,88 @@ class AuthPage extends GetView { child: Column( children: [ ObxValue( - (phoneController) => RTextField( - label: 'نام کاربری', - maxLength: 11, - maxLines: 1, - controller: phoneController.value, - keyboardType: TextInputType.number, - initText: phoneController.value.text, - onChanged: (value) { - phoneController.value.text = value; - phoneController.refresh(); - }, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: vecWidget(Assets.vecCallSvg), - ), - suffixIcon: - phoneController.value.text.trim().isNotEmpty + (phoneController) => + RTextField( + label: 'نام کاربری', + maxLength: 11, + maxLines: 1, + controller: phoneController.value, + keyboardType: TextInputType.number, + initText: phoneController.value.text, + onChanged: (value) { + phoneController.value.text = value; + phoneController.refresh(); + }, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffixIcon: + phoneController.value.text + .trim() + .isNotEmpty ? clearButton(() { - phoneController.value.clear(); - phoneController.refresh(); - }) + phoneController.value.clear(); + phoneController.refresh(); + }) : null, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ شماره موبایل را وارد کنید'; - } - /*else if (value.length < 11) { + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ شماره موبایل را وارد کنید'; + } + /*else if (value.length < 11) { return '⚠️ شماره موبایل باید 11 رقم باشد'; }*/ - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - boxConstraints: const BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - ), + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + labelStyle: AppFonts.yekan13, + boxConstraints: const BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + ), controller.phoneNumberController, ), const SizedBox(height: 26), ObxValue( - (passwordController) => RTextField( - label: 'رمز عبور', - filled: false, - controller: passwordController.value, - variant: RTextFieldVariant.password, - initText: passwordController.value.text, - onChanged: (value) { - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; - } - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: vecWidget(Assets.vecKeySvg), - ), - boxConstraints: const BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - ), + (passwordController) => + RTextField( + label: 'رمز عبور', + filled: false, + controller: passwordController.value, + variant: RTextFieldVariant.password, + initText: passwordController.value.text, + onChanged: (value) { + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + labelStyle: AppFonts.yekan13, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + boxConstraints: const BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + ), controller.passwordController, ), SizedBox(height: 26), @@ -188,13 +193,16 @@ class AuthPage extends GetView { height: 48, ); }, controller.isLoading), + FloatingActionButton(onPressed: () { + controller.adder(); + }, child: Icon(Icons.add),) ], ), ), ); } - /* +/* Widget sendCodeForm() { return ObxValue((data) { return Form( diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index 95949c8..8e1c1b2 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -4,7 +4,7 @@ import 'package:rasadyar_core/infrastructure/local/hive_local_storage.dart'; final diCore = GetIt.instance; -Future setupAllProvider() async { +Future setupAllCoreProvider() async { await _setUpLogger(); await _setupLocalStorage(); await _setupRemote(); From f7ea9f3a19875795aab37ea578eb0741a597aa65 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 18 May 2025 09:32:43 +0330 Subject: [PATCH 064/256] fix : login and route --- lib/infrastructure/service/auth_service.dart | 8 +++++--- lib/main.dart | 6 ++++++ packages/auth/lib/data/di/auth_di.dart | 1 - packages/auth/lib/data/services/auth_middelware.dart | 2 +- packages/auth/lib/presentation/pages/auth/logic.dart | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/infrastructure/service/auth_service.dart b/lib/infrastructure/service/auth_service.dart index 786ce8e..5fc3f44 100644 --- a/lib/infrastructure/service/auth_service.dart +++ b/lib/infrastructure/service/auth_service.dart @@ -1,9 +1,10 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/inspection.dart'; class AuthService extends GetxService { - var tokenService = diAuth.get(); + var tokenService = Get.find(); RxBool accessRes = false.obs; RxBool refAccessRes = false.obs; @override @@ -15,15 +16,16 @@ class AuthService extends GetxService { accessRes.value = (callback != null); }); - // رصد تغییرات refreshToken ever(tokenService.refreshToken, (callback) { fLog('Refresh token callback: $callback, value: ${tokenService.refreshToken.value}'); refAccessRes.value = (callback != null); }); - // بررسی اینکه هر دو مقدار دارند + everAll([accessRes, refAccessRes], (_) { if (accessRes.value && refAccessRes.value) { + + Get.offAndToNamed(InspectionRoutes.inspection); fLog('Both accessToken and refreshToken are available: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); } else { fLog('One or both tokens are missing: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); diff --git a/lib/main.dart b/lib/main.dart index 708bf7c..42195b2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; @@ -9,6 +11,10 @@ import 'infrastructure/service/auth_service.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await setupInjection(); + Get.put(TokenStorageService()); + var tokenService = Get.find(); + await tokenService.init(); + Get.put(AuthMiddleware()); Get.put(AuthService()); runApp(MyApp()); diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 10802b1..3f4771e 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -16,6 +16,5 @@ Future setupAuthDI() async { diAuth.registerCachedFactory( () => AuthRepositoryImpl(dioRemote), ); - diAuth.registerLazySingleton(() => TokenStorageService()); diAuth.registerLazySingleton(() => DioErrorHandler()); } diff --git a/packages/auth/lib/data/services/auth_middelware.dart b/packages/auth/lib/data/services/auth_middelware.dart index 56c0bb4..ba907ce 100644 --- a/packages/auth/lib/data/services/auth_middelware.dart +++ b/packages/auth/lib/data/services/auth_middelware.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_core/core.dart'; import '../../presentation/routes/pages.dart'; class AuthMiddleware extends GetMiddleware { - var tokenService = diAuth.get(); + var tokenService = Get.find(); @override RouteSettings? redirect(String? route) { diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 3e885a7..93781d8 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -31,7 +31,7 @@ class AuthLogic extends GetxController { RxnString phoneNumber = RxnString(null); RxBool isLoading = false.obs; - TokenStorageService tokenStorageService = diAuth.get(); + TokenStorageService tokenStorageService = Get.find(); Rx authType = AuthType.useAndPass.obs; Rx authStatus = AuthStatus.init.obs; From dcc333e302883940eea215a452643f25b84546ca Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 18 May 2025 09:57:10 +0330 Subject: [PATCH 065/256] fix : ui and android premissons --- android/app/src/main/AndroidManifest.xml | 1 + lib/infrastructure/service/auth_service.dart | 1 + packages/auth/lib/presentation/pages/auth/logic.dart | 6 ------ packages/auth/lib/presentation/pages/auth/view.dart | 3 --- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1e152ab..83fb7fb 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,5 @@ + diff --git a/lib/infrastructure/service/auth_service.dart b/lib/infrastructure/service/auth_service.dart index 5fc3f44..3f38f67 100644 --- a/lib/infrastructure/service/auth_service.dart +++ b/lib/infrastructure/service/auth_service.dart @@ -7,6 +7,7 @@ class AuthService extends GetxService { var tokenService = Get.find(); RxBool accessRes = false.obs; RxBool refAccessRes = false.obs; + @override void onInit() { super.onInit(); diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 93781d8..eacfb7c 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -38,7 +38,6 @@ class AuthLogic extends GetxController { Rx otpStatus = OtpStatus.init.obs; RxInt secondsRemaining = 120.obs; - int wsd = 120; Timer? _timer; AuthRepositoryImpl authRepository = diAuth.get(); @@ -126,9 +125,4 @@ class AuthLogic extends GetxController { ); isLoading.value = false; } - - adder() { - tokenStorageService.tsss.value = (wsd++).toString(); - - } } diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 4125915..a495578 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -193,9 +193,6 @@ class AuthPage extends GetView { height: 48, ); }, controller.isLoading), - FloatingActionButton(onPressed: () { - controller.adder(); - }, child: Icon(Icons.add),) ], ), ), From 1b30dafafceeaec3794ca3dc2df9fb713946c2e7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 18 May 2025 10:21:50 +0330 Subject: [PATCH 066/256] fix : captcha and username input type --- .../lib/presentation/pages/auth/view.dart | 2 +- .../lib/presentation/widget/captcha/view.dart | 75 +++++++++---------- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index a495578..90f764c 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -101,7 +101,7 @@ class AuthPage extends GetView { maxLength: 11, maxLines: 1, controller: phoneController.value, - keyboardType: TextInputType.number, + keyboardType: TextInputType.text, initText: phoneController.value.text, onChanged: (value) { phoneController.value.text = value; diff --git a/packages/auth/lib/presentation/widget/captcha/view.dart b/packages/auth/lib/presentation/widget/captcha/view.dart index af4d955..d606b7b 100644 --- a/packages/auth/lib/presentation/widget/captcha/view.dart +++ b/packages/auth/lib/presentation/widget/captcha/view.dart @@ -15,40 +15,37 @@ class CaptchaWidget extends GetView { return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - width: 135, - height: 50, - clipBehavior: Clip.antiAliasWithSaveLayer, - decoration: BoxDecoration( - color: AppColor.whiteNormalHover, - border: Border.all(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(8), - ), - child: controller.obx( - (state) => Image.memory( - base64Decode(state?.captchaImage ?? ''), - fit: BoxFit.cover, - ), - onLoading: const Center( - child: CupertinoActivityIndicator(color: AppColor.blueNormal), - ), - onError: (error) { - return const Center( - child: Text( - 'خطا در بارگذاری کد امنیتی', - style: AppFonts.yekan13, - ), - ); - }, - ), - ), GestureDetector( - onTap: controller.getCaptcha, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 3), - child: Icon(CupertinoIcons.refresh, size: 20), - ), - ), + onTap: controller.getCaptcha, + child: Container( + width: 135, + height: 50, + clipBehavior: Clip.antiAliasWithSaveLayer, + decoration: BoxDecoration( + color: AppColor.whiteNormalHover, + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(8), + ), + child: controller.obx( + (state) => + Image.memory( + base64Decode(state?.captchaImage ?? ''), + fit: BoxFit.cover, + ), + onLoading: const Center( + child: CupertinoActivityIndicator(color: AppColor.blueNormal), + ), + onError: (error) { + return const Center( + child: Text( + 'خطا در بارگذاری کد امنیتی', + style: AppFonts.yekan13, + ), + ); + }, + ), + )), + const SizedBox(width: 8), Expanded( child: Form( @@ -65,11 +62,13 @@ class CaptchaWidget extends GetView { maxLines: 1, maxLength: 6, suffixIcon: - (data.value.text.trim().isNotEmpty ?? false) - ? clearButton( - () => controller.textController.value.clear(), - ) - : null, + (data.value.text + .trim() + .isNotEmpty ?? false) + ? clearButton( + () => controller.textController.value.clear(), + ) + : null, onSubmitted: (data) {}, validator: (value) { From 7f66476ecaf41f672bca2ab0bd628aeb60c09a7f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 18 May 2025 11:15:28 +0330 Subject: [PATCH 067/256] feat : add liveStock package --- packages/livestock/.gitignore | 7 ++++ packages/livestock/CHANGELOG.md | 3 ++ packages/livestock/README.md | 39 +++++++++++++++++++ packages/livestock/analysis_options.yaml | 30 ++++++++++++++ .../livestock/example/livestock_example.dart | 6 +++ packages/livestock/lib/livestock.dart | 8 ++++ .../livestock/lib/src/livestock_base.dart | 6 +++ packages/livestock/pubspec.yaml | 35 +++++++++++++++++ packages/livestock/test/livestock_test.dart | 16 ++++++++ tools/package_builder.sh | 2 +- 10 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 packages/livestock/.gitignore create mode 100644 packages/livestock/CHANGELOG.md create mode 100644 packages/livestock/README.md create mode 100644 packages/livestock/analysis_options.yaml create mode 100644 packages/livestock/example/livestock_example.dart create mode 100644 packages/livestock/lib/livestock.dart create mode 100644 packages/livestock/lib/src/livestock_base.dart create mode 100644 packages/livestock/pubspec.yaml create mode 100644 packages/livestock/test/livestock_test.dart diff --git a/packages/livestock/.gitignore b/packages/livestock/.gitignore new file mode 100644 index 0000000..3cceda5 --- /dev/null +++ b/packages/livestock/.gitignore @@ -0,0 +1,7 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ + +# Avoid committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock diff --git a/packages/livestock/CHANGELOG.md b/packages/livestock/CHANGELOG.md new file mode 100644 index 0000000..effe43c --- /dev/null +++ b/packages/livestock/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/packages/livestock/README.md b/packages/livestock/README.md new file mode 100644 index 0000000..8831761 --- /dev/null +++ b/packages/livestock/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/livestock/analysis_options.yaml b/packages/livestock/analysis_options.yaml new file mode 100644 index 0000000..dee8927 --- /dev/null +++ b/packages/livestock/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/packages/livestock/example/livestock_example.dart b/packages/livestock/example/livestock_example.dart new file mode 100644 index 0000000..45f8441 --- /dev/null +++ b/packages/livestock/example/livestock_example.dart @@ -0,0 +1,6 @@ +import 'package:livestock/livestock.dart'; + +void main() { + var awesome = Awesome(); + print('awesome: ${awesome.isAwesome}'); +} diff --git a/packages/livestock/lib/livestock.dart b/packages/livestock/lib/livestock.dart new file mode 100644 index 0000000..850bfa8 --- /dev/null +++ b/packages/livestock/lib/livestock.dart @@ -0,0 +1,8 @@ +/// Support for doing something awesome. +/// +/// More dartdocs go here. +library; + +export 'src/livestock_base.dart'; + +// TODO: Export any libraries intended for clients of this package. diff --git a/packages/livestock/lib/src/livestock_base.dart b/packages/livestock/lib/src/livestock_base.dart new file mode 100644 index 0000000..e8a6f15 --- /dev/null +++ b/packages/livestock/lib/src/livestock_base.dart @@ -0,0 +1,6 @@ +// TODO: Put public facing types in this file. + +/// Checks if you are awesome. Spoiler: you are. +class Awesome { + bool get isAwesome => true; +} diff --git a/packages/livestock/pubspec.yaml b/packages/livestock/pubspec.yaml new file mode 100644 index 0000000..f591e97 --- /dev/null +++ b/packages/livestock/pubspec.yaml @@ -0,0 +1,35 @@ +name: livestock +description: A starting point for Dart libraries or applications. +version: 1.0.0 +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.7.2 + + +dependencies: +rasadyar_core: + path: ../core + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + lints: ^5.0.0 + test: ^1.24.0 + ##code generation + build_runner: ^2.4.15 + hive_ce_generator: ^1.9.1 + freezed: ^3.0.6 + json_serializable: ^6.9.4 + + ##test + mocktail: ^1.0.4 + get_test: ^4.0.1 + +flutter: + uses-material-design: true + + diff --git a/packages/livestock/test/livestock_test.dart b/packages/livestock/test/livestock_test.dart new file mode 100644 index 0000000..3104e61 --- /dev/null +++ b/packages/livestock/test/livestock_test.dart @@ -0,0 +1,16 @@ +import 'package:livestock/livestock.dart'; +import 'package:test/test.dart'; + +void main() { + group('A group of tests', () { + final awesome = Awesome(); + + setUp(() { + // Additional setup goes here. + }); + + test('First Test', () { + expect(awesome.isAwesome, isTrue); + }); + }); +} diff --git a/tools/package_builder.sh b/tools/package_builder.sh index c1a8bb6..c14cc59 100644 --- a/tools/package_builder.sh +++ b/tools/package_builder.sh @@ -1,2 +1,2 @@ #!/bin/bash -dart create --template=package ../packages/auth \ No newline at end of file +dart create --template=package ../packages/livestock \ No newline at end of file From 62b23a26df1662c340b4ae1993dba667253f9866 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 18 May 2025 11:50:15 +0330 Subject: [PATCH 068/256] feat : project structure --- packages/livestock/example/livestock_example.dart | 6 ------ packages/livestock/lib/livestock.dart | 2 -- packages/livestock/lib/src/livestock_base.dart | 6 ------ packages/livestock/pubspec.yaml | 6 ++++-- packages/livestock/test/livestock_test.dart | 10 ---------- 5 files changed, 4 insertions(+), 26 deletions(-) delete mode 100644 packages/livestock/example/livestock_example.dart delete mode 100644 packages/livestock/lib/src/livestock_base.dart diff --git a/packages/livestock/example/livestock_example.dart b/packages/livestock/example/livestock_example.dart deleted file mode 100644 index 45f8441..0000000 --- a/packages/livestock/example/livestock_example.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:livestock/livestock.dart'; - -void main() { - var awesome = Awesome(); - print('awesome: ${awesome.isAwesome}'); -} diff --git a/packages/livestock/lib/livestock.dart b/packages/livestock/lib/livestock.dart index 850bfa8..6289ca5 100644 --- a/packages/livestock/lib/livestock.dart +++ b/packages/livestock/lib/livestock.dart @@ -3,6 +3,4 @@ /// More dartdocs go here. library; -export 'src/livestock_base.dart'; -// TODO: Export any libraries intended for clients of this package. diff --git a/packages/livestock/lib/src/livestock_base.dart b/packages/livestock/lib/src/livestock_base.dart deleted file mode 100644 index e8a6f15..0000000 --- a/packages/livestock/lib/src/livestock_base.dart +++ /dev/null @@ -1,6 +0,0 @@ -// TODO: Put public facing types in this file. - -/// Checks if you are awesome. Spoiler: you are. -class Awesome { - bool get isAwesome => true; -} diff --git a/packages/livestock/pubspec.yaml b/packages/livestock/pubspec.yaml index f591e97..09d7557 100644 --- a/packages/livestock/pubspec.yaml +++ b/packages/livestock/pubspec.yaml @@ -1,6 +1,7 @@ name: livestock description: A starting point for Dart libraries or applications. version: 1.0.0 +publish_to: 'none' # repository: https://github.com/my_org/my_repo environment: @@ -8,8 +9,9 @@ environment: dependencies: -rasadyar_core: - path: ../core + + rasadyar_core: + path: ../core ##code generation freezed_annotation: ^3.0.0 json_annotation: ^4.9.0 diff --git a/packages/livestock/test/livestock_test.dart b/packages/livestock/test/livestock_test.dart index 3104e61..dbd1d90 100644 --- a/packages/livestock/test/livestock_test.dart +++ b/packages/livestock/test/livestock_test.dart @@ -2,15 +2,5 @@ import 'package:livestock/livestock.dart'; import 'package:test/test.dart'; void main() { - group('A group of tests', () { - final awesome = Awesome(); - setUp(() { - // Additional setup goes here. - }); - - test('First Test', () { - expect(awesome.isAwesome, isTrue); - }); - }); } From 982329a3eba75895c2b983822c49fa8c2882efd6 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 19 May 2025 09:43:11 +0330 Subject: [PATCH 069/256] chore : change for package using --- tools/vecGeneratoe.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/vecGeneratoe.sh b/tools/vecGeneratoe.sh index 4f92558..1b84fb3 100644 --- a/tools/vecGeneratoe.sh +++ b/tools/vecGeneratoe.sh @@ -1,8 +1,20 @@ #!/bin/bash + +# Relative path to the package +PACKAGE_PATH="../packages/core" + +# Get absolute path to the package +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PACKAGE_ABS_PATH="$SCRIPT_DIR/$PACKAGE_PATH" + +echo "🗃️ package path: $PACKAGE_ABS_PATH" + # Directory to read files from -sourcePath="assets/icons" -targetPath="assets/vec" +sourcePath="$PACKAGE_ABS_PATH/assets/icons" +targetPath="$PACKAGE_ABS_PATH/assets/vec" +echo "🗃️ sourcePath path: $sourcePath" +echo "🗃️ targetPath path: $targetPath" if [ ! -e "$targetPath" ]; then From 905e407ccdefb926b0e86c5ca21a0bc62b06e78f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 19 May 2025 16:16:33 +0330 Subject: [PATCH 070/256] fix : 1 - multi module in Auth select save selected module 2 - add flutter gen for assets builder --- assets/icons/inspection.svg | 1 + assets/icons/liveStock.svg | 1 + assets/vec/inspection.svg.vec | Bin 0 -> 4224 bytes assets/vec/liveStock.svg.vec | Bin 0 -> 5948 bytes lib/infrastructure/service/auth_service.dart | 16 +- lib/presentation/pages/splash/logic.dart | 10 +- lib/presentation/pages/splash/view.dart | 7 +- lib/presentation/routes/app_pages.dart | 17 +- packages/auth/lib/auth.dart | 1 + packages/auth/lib/data/di/auth_di.dart | 1 + .../models/local/module/module_model.dart | 16 + .../local/module/module_model.freezed.dart | 148 ++++++ .../local/user_local/user_local_model.dart | 15 + .../local/user_local/user_local_model.g.dart | 44 +- .../data/services/token_storage_service.dart | 22 +- packages/auth/lib/hive_registrar.g.dart | 2 + .../lib/presentation/pages/auth/logic.dart | 15 +- .../lib/presentation/pages/auth/view.dart | 10 +- .../lib/presentation/pages/modules/logic.dart | 12 + .../lib/presentation/pages/modules/view.dart | 36 +- .../auth/lib/presentation/routes/pages.dart | 7 +- .../lib/presentation/widget/logo_widget.dart | 5 +- packages/core/lib/core.dart | 2 + .../core/lib/presentation/common/assets.dart | 72 --- .../lib/presentation/common/assets.gen.dart | 451 ++++++++++++++++++ .../core/lib/presentation/common/common.dart | 2 +- .../lib/presentation/common/fonts.gen.dart | 15 + .../wave_bottom_navigation.dart | 9 +- .../lib/presentation/widget/buttons/fab.dart | 83 +++- .../widget/buttons/fab_outlined.dart | 426 +++++++++-------- .../card/card_with_icon_with_border.dart | 46 ++ .../lib/presentation/widget/vec_widget.dart | 11 +- .../core/lib/presentation/widget/widget.dart | 1 + packages/core/pubspec.lock | 56 +++ packages/core/pubspec.yaml | 10 + .../lib/presentation/action/view.dart | 37 +- .../add_mobile_inspector/view.dart | 8 +- .../presentation/add_supervision/view.dart | 8 +- .../display_information/view.dart | 8 +- .../lib/presentation/filter/view.dart | 25 +- .../lib/presentation/profile/view.dart | 44 +- .../registration_of_violation/view.dart | 8 +- .../lib/presentation/root/view.dart | 38 +- .../lib/presentation/page/root/logic.dart | 17 + .../lib/presentation/page/root/view.dart | 12 + pubspec.lock | 63 +++ 46 files changed, 1431 insertions(+), 407 deletions(-) create mode 100644 assets/icons/inspection.svg create mode 100644 assets/icons/liveStock.svg create mode 100644 assets/vec/inspection.svg.vec create mode 100644 assets/vec/liveStock.svg.vec create mode 100644 packages/auth/lib/data/models/local/module/module_model.dart create mode 100644 packages/auth/lib/data/models/local/module/module_model.freezed.dart delete mode 100644 packages/core/lib/presentation/common/assets.dart create mode 100644 packages/core/lib/presentation/common/assets.gen.dart create mode 100644 packages/core/lib/presentation/common/fonts.gen.dart create mode 100644 packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart create mode 100644 packages/livestock/lib/presentation/page/root/logic.dart create mode 100644 packages/livestock/lib/presentation/page/root/view.dart diff --git a/assets/icons/inspection.svg b/assets/icons/inspection.svg new file mode 100644 index 0000000..3e49ae8 --- /dev/null +++ b/assets/icons/inspection.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/liveStock.svg b/assets/icons/liveStock.svg new file mode 100644 index 0000000..24b6c5e --- /dev/null +++ b/assets/icons/liveStock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/vec/inspection.svg.vec b/assets/vec/inspection.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..ed9d937f9d3ac204d8e1be8c8e8792016d9641c9 GIT binary patch literal 4224 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 Y5EbD}DbA}3dnM=*LP?U5P|AjX1JC_?(f|Me literal 0 HcmV?d00001 diff --git a/assets/vec/liveStock.svg.vec b/assets/vec/liveStock.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..469f5a140fc70f19d9f9a5abd2b8361412bc51a3 GIT binary patch literal 5948 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 @@ -13,25 +15,19 @@ class AuthService extends GetxService { super.onInit(); ever(tokenService.accessToken, (callback) { - iLog('Access token callback: $callback, value: ${tokenService.accessToken.value}'); accessRes.value = (callback != null); }); ever(tokenService.refreshToken, (callback) { - fLog('Refresh token callback: $callback, value: ${tokenService.refreshToken.value}'); refAccessRes.value = (callback != null); }); - everAll([accessRes, refAccessRes], (_) { if (accessRes.value && refAccessRes.value) { - - Get.offAndToNamed(InspectionRoutes.inspection); - fLog('Both accessToken and refreshToken are available: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); - } else { - fLog('One or both tokens are missing: accessToken=${tokenService.accessToken.value}, refreshToken=${tokenService.refreshToken.value}'); + var targetPage = getTargetPage(tokenService.appModule.value); + Get.offAndToNamed(targetPage); } }); - } + } diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 4dd4a4e..8f26018 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -1,6 +1,7 @@ import 'package:flutter/animation.dart'; +import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/inspection.dart'; class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController scaleController; @@ -8,6 +9,8 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { Rxn> scaleAnimation = Rxn(); Rxn> rotationAnimation = Rxn(); + var tokenService = Get.find(); + @override void onInit() { super.onInit(); @@ -53,8 +56,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { @override void onReady() { super.onReady(); - Future.delayed(const Duration(seconds: 1), () { - Get.offAllNamed(InspectionRoutes.inspection); + Future.delayed(const Duration(seconds: 1), () async { + var module = tokenService.appModule.value; + Get.offAndToNamed(getTargetPage(module)); }); } diff --git a/lib/presentation/pages/splash/view.dart b/lib/presentation/pages/splash/view.dart index bffd309..4cd5ce8 100644 --- a/lib/presentation/pages/splash/view.dart +++ b/lib/presentation/pages/splash/view.dart @@ -20,11 +20,10 @@ class SplashPage extends GetView { scale: data.value!, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 1), - child: Image.asset( - Assets.imagesInnerSplash, + child: Assets.images.innerSplash.image( width: 190, height: 190, - ), + ) ), ); }, controller.scaleAnimation), @@ -35,7 +34,7 @@ class SplashPage extends GetView { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 1), - child: Image.asset(Assets.imagesOutterSplash), + child: Assets.images.outterSplash.image() ), ); }, controller.rotationAnimation), diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 61effcb..8e5f373 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -1,9 +1,12 @@ import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; import 'package:rasadyar_app/presentation/pages/splash/view.dart'; import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/inspection.dart'; +import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; part 'app_paths.dart'; @@ -23,6 +26,18 @@ sealed class AppPages { ...InspectionPages.pages, ...AuthPages.pages, - + ...LiveStockPages.pages, ]; } + +String getTargetPage(Module? value) { + eLog('getTargetPage: $value'); + switch (value) { + case Module.inspection: + return InspectionRoutes.inspection; + case Module.liveStocks: + return LiveStockRoutes.init; + default: + return InspectionRoutes.inspection; + } +} \ No newline at end of file diff --git a/packages/auth/lib/auth.dart b/packages/auth/lib/auth.dart index 9e7c1c4..30c7f5f 100644 --- a/packages/auth/lib/auth.dart +++ b/packages/auth/lib/auth.dart @@ -5,3 +5,4 @@ library; export 'data/services/auth_middelware.dart'; export 'data/di/auth_di.dart'; +export 'data/models/local/module/module_model.dart'; diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 3f4771e..190715f 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -11,6 +11,7 @@ GetIt diAuth = GetIt.instance; Future setupAuthDI() async { diAuth.registerLazySingleton(() => DioRemoteManager()); + final manager = diAuth.get(); final dioRemote = await manager.setEnvironment(ApiEnvironment.dam); diAuth.registerCachedFactory( diff --git a/packages/auth/lib/data/models/local/module/module_model.dart b/packages/auth/lib/data/models/local/module/module_model.dart new file mode 100644 index 0000000..f543681 --- /dev/null +++ b/packages/auth/lib/data/models/local/module/module_model.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_core/core.dart'; + +part 'module_model.freezed.dart'; + + +@freezed +abstract class ModuleModel with _$ModuleModel{ + const factory ModuleModel({ + required String title, + required String icon, + required Module module, + }) = _ModuleModel; + +} \ No newline at end of file diff --git a/packages/auth/lib/data/models/local/module/module_model.freezed.dart b/packages/auth/lib/data/models/local/module/module_model.freezed.dart new file mode 100644 index 0000000..48feb37 --- /dev/null +++ b/packages/auth/lib/data/models/local/module/module_model.freezed.dart @@ -0,0 +1,148 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'module_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; +/// @nodoc +mixin _$ModuleModel { + + String get title; String get icon; Module get module; +/// Create a copy of ModuleModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ModuleModelCopyWith get copyWith => _$ModuleModelCopyWithImpl(this as ModuleModel, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ModuleModel&&(identical(other.title, title) || other.title == title)&&(identical(other.icon, icon) || other.icon == icon)&&(identical(other.module, module) || other.module == module)); +} + + +@override +int get hashCode => Object.hash(runtimeType,title,icon,module); + +@override +String toString() { + return 'ModuleModel(title: $title, icon: $icon, module: $module)'; +} + + +} + +/// @nodoc +abstract mixin class $ModuleModelCopyWith<$Res> { + factory $ModuleModelCopyWith(ModuleModel value, $Res Function(ModuleModel) _then) = _$ModuleModelCopyWithImpl; +@useResult +$Res call({ + String title, String icon, Module module +}); + + + + +} +/// @nodoc +class _$ModuleModelCopyWithImpl<$Res> + implements $ModuleModelCopyWith<$Res> { + _$ModuleModelCopyWithImpl(this._self, this._then); + + final ModuleModel _self; + final $Res Function(ModuleModel) _then; + +/// Create a copy of ModuleModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? title = null,Object? icon = null,Object? module = null,}) { + return _then(_self.copyWith( +title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String,icon: null == icon ? _self.icon : icon // ignore: cast_nullable_to_non_nullable +as String,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as Module, + )); +} + +} + + +/// @nodoc + + +class _ModuleModel implements ModuleModel { + const _ModuleModel({required this.title, required this.icon, required this.module}); + + +@override final String title; +@override final String icon; +@override final Module module; + +/// Create a copy of ModuleModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ModuleModelCopyWith<_ModuleModel> get copyWith => __$ModuleModelCopyWithImpl<_ModuleModel>(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ModuleModel&&(identical(other.title, title) || other.title == title)&&(identical(other.icon, icon) || other.icon == icon)&&(identical(other.module, module) || other.module == module)); +} + + +@override +int get hashCode => Object.hash(runtimeType,title,icon,module); + +@override +String toString() { + return 'ModuleModel(title: $title, icon: $icon, module: $module)'; +} + + +} + +/// @nodoc +abstract mixin class _$ModuleModelCopyWith<$Res> implements $ModuleModelCopyWith<$Res> { + factory _$ModuleModelCopyWith(_ModuleModel value, $Res Function(_ModuleModel) _then) = __$ModuleModelCopyWithImpl; +@override @useResult +$Res call({ + String title, String icon, Module module +}); + + + + +} +/// @nodoc +class __$ModuleModelCopyWithImpl<$Res> + implements _$ModuleModelCopyWith<$Res> { + __$ModuleModelCopyWithImpl(this._self, this._then); + + final _ModuleModel _self; + final $Res Function(_ModuleModel) _then; + +/// Create a copy of ModuleModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? title = null,Object? icon = null,Object? module = null,}) { + return _then(_ModuleModel( +title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String,icon: null == icon ? _self.icon : icon // ignore: cast_nullable_to_non_nullable +as String,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as Module, + )); +} + + +} + +// dart format on diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.dart index 403f762..c14addc 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; part 'user_local_model.g.dart'; @@ -15,12 +16,16 @@ class UserLocalModel extends HiveObject { @HiveField(4) String? name; + @HiveField(5) + Module? module; + UserLocalModel({ this.username, this.password, this.token, this.refreshToken, this.name, + this.module, }); UserLocalModel copyWith({ @@ -29,6 +34,7 @@ class UserLocalModel extends HiveObject { String? token, String? refreshToken, String? name, + Module? module, }) { return UserLocalModel( username: username ?? this.username, @@ -36,6 +42,15 @@ class UserLocalModel extends HiveObject { token: token ?? this.token, refreshToken: refreshToken ?? this.refreshToken, name: name ?? this.name, + module: module ?? this.module, ); } } + +@HiveType(typeId: 1) +enum Module { + @HiveField(0) + liveStocks, + @HiveField(1) + inspection, +} diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart index 13f86a8..efaac19 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart @@ -22,13 +22,14 @@ class UserLocalModelAdapter extends TypeAdapter { token: fields[2] as String?, refreshToken: fields[3] as String?, name: fields[4] as String?, + module: fields[5] as Module?, ); } @override void write(BinaryWriter writer, UserLocalModel obj) { writer - ..writeByte(5) + ..writeByte(6) ..writeByte(0) ..write(obj.username) ..writeByte(1) @@ -38,7 +39,9 @@ class UserLocalModelAdapter extends TypeAdapter { ..writeByte(3) ..write(obj.refreshToken) ..writeByte(4) - ..write(obj.name); + ..write(obj.name) + ..writeByte(5) + ..write(obj.module); } @override @@ -51,3 +54,40 @@ class UserLocalModelAdapter extends TypeAdapter { runtimeType == other.runtimeType && typeId == other.typeId; } + +class ModuleAdapter extends TypeAdapter { + @override + final typeId = 1; + + @override + Module read(BinaryReader reader) { + switch (reader.readByte()) { + case 0: + return Module.liveStocks; + case 1: + return Module.inspection; + default: + return Module.liveStocks; + } + } + + @override + void write(BinaryWriter writer, Module obj) { + switch (obj) { + case Module.liveStocks: + writer.writeByte(0); + case Module.inspection: + writer.writeByte(1); + } + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ModuleAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index 78fc35b..39d33dd 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -1,20 +1,26 @@ import 'dart:convert'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_auth/hive_registrar.g.dart'; import 'package:rasadyar_core/core.dart'; class TokenStorageService extends GetxService { static const String _boxName = 'secureBox'; static const String _accessTokenKey = 'accessToken'; static const String _refreshTokenKey = 'refreshToken'; + static const String _moduleKey = 'moduleSelected'; final FlutterSecureStorage _secureStorage = FlutterSecureStorage(); final HiveLocalStorage _localStorage = diCore.get(); - RxnString accessToken = RxnString(); - RxnString refreshToken = RxnString(); - RxnString tsss = RxnString(); + RxnString accessToken = RxnString(); + RxnString refreshToken = RxnString(); + Rxn appModule = Rxn(null); Future init() async { + Hive.registerAdapters(); + IsolatedHive.registerAdapters(); + final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key'); final encryptionKey = encryptedKey != null @@ -42,6 +48,10 @@ class TokenStorageService extends GetxService { boxName: _boxName, key: _refreshTokenKey, ); + appModule.value = _localStorage.read( + boxName: _boxName, + key: _moduleKey, + ); } Future saveAccessToken(String token) async { @@ -64,6 +74,12 @@ class TokenStorageService extends GetxService { refreshToken.refresh(); } + Future saveModule(Module input) async { + await _localStorage.save(boxName: _boxName, key: _moduleKey, value: input); + appModule.value = input; + appModule.refresh(); + } + Future deleteTokens() async { await _localStorage.clear(_boxName); accessToken.value = null; diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart index b4abe2c..166b5cb 100644 --- a/packages/auth/lib/hive_registrar.g.dart +++ b/packages/auth/lib/hive_registrar.g.dart @@ -7,12 +7,14 @@ import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart extension HiveRegistrar on HiveInterface { void registerAdapters() { + registerAdapter(ModuleAdapter()); registerAdapter(UserLocalModelAdapter()); } } extension IsolatedHiveRegistrar on IsolatedHiveInterface { void registerAdapters() { + registerAdapter(ModuleAdapter()); registerAdapter(UserLocalModelAdapter()); } } diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index eacfb7c..59b8167 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; +import 'package:rasadyar_auth/data/models/local/module/module_model.dart'; import 'package:rasadyar_auth/data/models/request/login_request/login_request_model.dart'; import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; @@ -10,6 +11,8 @@ import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_core/core.dart'; +import '../../../data/models/local/user_local/user_local_model.dart'; + enum AuthType { useAndPass, otp } enum AuthStatus { init } @@ -42,6 +45,8 @@ class AuthLogic extends GetxController { AuthRepositoryImpl authRepository = diAuth.get(); + final Module _module = Get.arguments; + void startTimer() { _timer?.cancel(); secondsRemaining.value = 120; @@ -73,8 +78,8 @@ class AuthLogic extends GetxController { @override void onReady() { - // TODO: implement onReady super.onReady(); + iLog('module111 : ${_module.toString()}'); } @override @@ -106,14 +111,16 @@ class AuthLogic extends GetxController { Future submitLoginForm() async { if (!_isFormValid()) return; - + iLog('module222 : ${_module.toString()}'); final loginRequestModel = _buildLoginRequest(); isLoading.value = true; await safeCall( call: () => authRepository.login(authRequest: loginRequestModel.toJson()), onSuccess: (result) async { - await tokenStorageService.saveRefreshToken(result!.refresh!); - await tokenStorageService.saveAccessToken(result!.access!); + await tokenStorageService.saveModule(_module); + await tokenStorageService.saveRefreshToken(result?.refresh ?? ''); + await tokenStorageService.saveAccessToken(result?.access ?? ''); + //Get.offAndToNamed(Routes.home); }, onError: (error, stackTrace) { diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 90f764c..343c050 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -109,7 +109,10 @@ class AuthPage extends GetView { }, prefixIcon: Padding( padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: vecWidget(Assets.vecCallSvg), + child: Assets.vec.callSvg.svg( + width: 12, + height: 12, + ), ), suffixIcon: phoneController.value.text @@ -168,7 +171,10 @@ class AuthPage extends GetView { labelStyle: AppFonts.yekan13, prefixIcon: Padding( padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: vecWidget(Assets.vecKeySvg), + child: Assets.vec.keySvg.svg( + width: 12, + height: 12, + ), ), boxConstraints: const BoxConstraints( maxHeight: 34, diff --git a/packages/auth/lib/presentation/pages/modules/logic.dart b/packages/auth/lib/presentation/pages/modules/logic.dart index 87c35ee..bf9692c 100644 --- a/packages/auth/lib/presentation/pages/modules/logic.dart +++ b/packages/auth/lib/presentation/pages/modules/logic.dart @@ -1,7 +1,16 @@ +import 'package:rasadyar_auth/data/models/local/module/module_model.dart'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_core/core.dart'; class ModulesLogic extends GetxController { + List moduleList=[ + ModuleModel(title: 'بازرسی', icon: Assets.icons.inspection.path, module: Module.inspection), + ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks), + ]; + + + RxnInt selectedIndex = RxnInt(null); @override @@ -9,6 +18,9 @@ class ModulesLogic extends GetxController { super.onReady(); } + + + @override void onClose() { super.onClose(); diff --git a/packages/auth/lib/presentation/pages/modules/view.dart b/packages/auth/lib/presentation/pages/modules/view.dart index f1c4a0b..e3ebe32 100644 --- a/packages/auth/lib/presentation/pages/modules/view.dart +++ b/packages/auth/lib/presentation/pages/modules/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:rasadyar_auth/presentation/routes/pages.dart'; +import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -8,8 +9,37 @@ class ModulesPage extends GetView { @override Widget build(BuildContext context) { - final ModulesLogic logic = Get.put(ModulesLogic()); + return Scaffold( + appBar: AppBar( + title: Text( + 'انتخاب سامانه', + style: AppFonts.yekan18.copyWith(color: Colors.white), + ), + centerTitle: true, + backgroundColor: AppColor.blueNormal, + ), + body: GridView.builder( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 20), - return Container(); + itemBuilder: (context, index) { + final module = controller.moduleList[index]; + return CardIcon( + title: module.title, + icon: module.icon, + onTap: () { + controller.selectedIndex.value = index; + Get.toNamed(AuthPaths.auth, arguments: module.module); + }, + ); + }, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + physics: BouncingScrollPhysics(), + itemCount: controller.moduleList.length, + ), + ); } } diff --git a/packages/auth/lib/presentation/routes/pages.dart b/packages/auth/lib/presentation/routes/pages.dart index 11b8d56..5248b3d 100644 --- a/packages/auth/lib/presentation/routes/pages.dart +++ b/packages/auth/lib/presentation/routes/pages.dart @@ -1,3 +1,5 @@ +import 'package:rasadyar_auth/presentation/pages/modules/logic.dart'; +import 'package:rasadyar_auth/presentation/pages/modules/view.dart'; import 'package:rasadyar_auth/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_core/core.dart'; @@ -12,10 +14,9 @@ sealed class AuthPages { static List pages = [ GetPage( name: AuthPaths.moduleList, - page: () => AuthPage(), + page: () => ModulesPage(), binding: BindingsBuilder(() { - Get.lazyPut(() => AuthLogic()); - Get.lazyPut(() => CaptchaWidgetLogic()); + Get.lazyPut(() => ModulesLogic()); }), ), diff --git a/packages/auth/lib/presentation/widget/logo_widget.dart b/packages/auth/lib/presentation/widget/logo_widget.dart index ea4a5a9..4cf2a26 100644 --- a/packages/auth/lib/presentation/widget/logo_widget.dart +++ b/packages/auth/lib/presentation/widget/logo_widget.dart @@ -9,7 +9,10 @@ class LogoWidget extends StatelessWidget { return Column( children: [ Row(), - Image.asset(Assets.imagesInnerSplash, width: 120, height: 120), + Assets.images.innerSplash.image( + width: 150, + height: 150, + ), Text( 'سامانه رصدیار', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyNormal), diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 6108fd6..f4318ec 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -1,5 +1,6 @@ library; + //other packages export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_map/flutter_map.dart'; @@ -7,6 +8,7 @@ export 'package:flutter_map_animations/flutter_map_animations.dart'; export 'package:flutter_rating_bar/flutter_rating_bar.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; +export 'package:hive_ce_flutter/hive_flutter.dart'; //freezed export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; diff --git a/packages/core/lib/presentation/common/assets.dart b/packages/core/lib/presentation/common/assets.dart deleted file mode 100644 index 0e70b14..0000000 --- a/packages/core/lib/presentation/common/assets.dart +++ /dev/null @@ -1,72 +0,0 @@ -///This file is automatically generated. DO NOT EDIT, all your changes would be lost. -class Assets { - Assets._(); - - static const String iconsAdd = 'assets/icons/add.svg'; - static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; - static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; - static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg'; - static const String iconsCalendar = 'assets/icons/calendar.svg'; - static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; - static const String iconsCall = 'assets/icons/call.svg'; - static const String iconsDiagram = 'assets/icons/diagram.svg'; - static const String iconsDownload = 'assets/icons/download.svg'; - static const String iconsEdit = 'assets/icons/edit.svg'; - static const String iconsExcelDownload = 'assets/icons/excel_download.svg'; - static const String iconsFilter = 'assets/icons/filter.svg'; - static const String iconsGps = 'assets/icons/gps.svg'; - static const String iconsInformation = 'assets/icons/information.svg'; - static const String iconsKey = 'assets/icons/key.svg'; - static const String iconsLogout = 'assets/icons/logout.svg'; - static const String iconsMap = 'assets/icons/map.svg'; - static const String iconsMapMarker = 'assets/icons/map_marker.svg'; - static const String iconsMessageAdd = 'assets/icons/message_add.svg'; - static const String iconsPdfDownload = 'assets/icons/pdf_download.svg'; - static const String iconsPictureFrame = 'assets/icons/picture_frame.svg'; - static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; - static const String iconsProfileUser = 'assets/icons/profile_user.svg'; - static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg'; - static const String iconsScan = 'assets/icons/scan.svg'; - static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; - static const String iconsSecurityTime = 'assets/icons/security_time.svg'; - static const String iconsSetting = 'assets/icons/setting.svg'; - static const String iconsTagUser = 'assets/icons/tag_user.svg'; - static const String iconsTrash = 'assets/icons/trash.svg'; - static const String iconsUser = 'assets/icons/user.svg'; - static const String iconsUserSquare = 'assets/icons/user_square.svg'; - static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; - static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; - static const String vecAddSvg = 'assets/vec/add.svg.vec'; - static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; - static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; - static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec'; - static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; - static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; - static const String vecCallSvg = 'assets/vec/call.svg.vec'; - static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; - static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; - static const String vecEditSvg = 'assets/vec/edit.svg.vec'; - static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec'; - static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; - static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; - static const String vecInformationSvg = 'assets/vec/information.svg.vec'; - static const String vecKeySvg = 'assets/vec/key.svg.vec'; - static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; - static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; - static const String vecMapSvg = 'assets/vec/map.svg.vec'; - static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; - static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec'; - static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec'; - static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; - static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; - static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec'; - static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; - static const String vecScanSvg = 'assets/vec/scan.svg.vec'; - static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; - static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; - static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec'; - static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; - static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec'; - static const String vecUserSvg = 'assets/vec/user.svg.vec'; - -} diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart new file mode 100644 index 0000000..3ae3076 --- /dev/null +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -0,0 +1,451 @@ +/// GENERATED CODE - DO NOT MODIFY BY HAND +/// ***************************************************** +/// FlutterGen +/// ***************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use + +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart' as _svg; +import 'package:vector_graphics/vector_graphics.dart' as _vg; + +class $AssetsIconsGen { + const $AssetsIconsGen(); + + /// File path: assets/icons/add.svg + SvgGenImage get add => const SvgGenImage('assets/icons/add.svg'); + + /// File path: assets/icons/arrow_left.svg + SvgGenImage get arrowLeft => const SvgGenImage('assets/icons/arrow_left.svg'); + + /// File path: assets/icons/arrow_right.svg + SvgGenImage get arrowRight => const SvgGenImage('assets/icons/arrow_right.svg'); + + /// File path: assets/icons/bg_header_user_profile.svg + SvgGenImage get bgHeaderUserProfile => const SvgGenImage('assets/icons/bg_header_user_profile.svg'); + + /// File path: assets/icons/calendar.svg + SvgGenImage get calendar => const SvgGenImage('assets/icons/calendar.svg'); + + /// File path: assets/icons/calendar_search.svg + SvgGenImage get calendarSearch => const SvgGenImage('assets/icons/calendar_search.svg'); + + /// File path: assets/icons/call.svg + SvgGenImage get call => const SvgGenImage('assets/icons/call.svg'); + + /// File path: assets/icons/diagram.svg + SvgGenImage get diagram => const SvgGenImage('assets/icons/diagram.svg'); + + /// File path: assets/icons/download.svg + SvgGenImage get download => const SvgGenImage('assets/icons/download.svg'); + + /// File path: assets/icons/edit.svg + SvgGenImage get edit => const SvgGenImage('assets/icons/edit.svg'); + + /// File path: assets/icons/excel_download.svg + SvgGenImage get excelDownload => const SvgGenImage('assets/icons/excel_download.svg'); + + /// File path: assets/icons/filter.svg + SvgGenImage get filter => const SvgGenImage('assets/icons/filter.svg'); + + /// File path: assets/icons/gps.svg + SvgGenImage get gps => const SvgGenImage('assets/icons/gps.svg'); + + /// File path: assets/icons/information.svg + SvgGenImage get information => const SvgGenImage('assets/icons/information.svg'); + + /// File path: assets/icons/inspection.svg + SvgGenImage get inspection => const SvgGenImage('assets/icons/inspection.svg'); + + /// File path: assets/icons/key.svg + SvgGenImage get key => const SvgGenImage('assets/icons/key.svg'); + + /// File path: assets/icons/liveStock.svg + SvgGenImage get liveStock => const SvgGenImage('assets/icons/liveStock.svg'); + + /// File path: assets/icons/logout.svg + SvgGenImage get logout => const SvgGenImage('assets/icons/logout.svg'); + + /// File path: assets/icons/map.svg + SvgGenImage get map => const SvgGenImage('assets/icons/map.svg'); + + /// File path: assets/icons/map_marker.svg + SvgGenImage get mapMarker => const SvgGenImage('assets/icons/map_marker.svg'); + + /// File path: assets/icons/message_add.svg + SvgGenImage get messageAdd => const SvgGenImage('assets/icons/message_add.svg'); + + /// File path: assets/icons/pdf_download.svg + SvgGenImage get pdfDownload => const SvgGenImage('assets/icons/pdf_download.svg'); + + /// File path: assets/icons/picture_frame.svg + SvgGenImage get pictureFrame => const SvgGenImage('assets/icons/picture_frame.svg'); + + /// File path: assets/icons/profile_circle.svg + SvgGenImage get profileCircle => const SvgGenImage('assets/icons/profile_circle.svg'); + + /// File path: assets/icons/profile_user.svg + SvgGenImage get profileUser => const SvgGenImage('assets/icons/profile_user.svg'); + + /// File path: assets/icons/receipt_discount.svg + SvgGenImage get receiptDiscount => const SvgGenImage('assets/icons/receipt_discount.svg'); + + /// File path: assets/icons/scan.svg + SvgGenImage get scan => const SvgGenImage('assets/icons/scan.svg'); + + /// File path: assets/icons/scan_barcode.svg + SvgGenImage get scanBarcode => const SvgGenImage('assets/icons/scan_barcode.svg'); + + /// File path: assets/icons/security_time.svg + SvgGenImage get securityTime => const SvgGenImage('assets/icons/security_time.svg'); + + /// File path: assets/icons/setting.svg + SvgGenImage get setting => const SvgGenImage('assets/icons/setting.svg'); + + /// File path: assets/icons/tag_user.svg + SvgGenImage get tagUser => const SvgGenImage('assets/icons/tag_user.svg'); + + /// File path: assets/icons/trash.svg + SvgGenImage get trash => const SvgGenImage('assets/icons/trash.svg'); + + /// File path: assets/icons/user.svg + SvgGenImage get user => const SvgGenImage('assets/icons/user.svg'); + + /// File path: assets/icons/user_square.svg + SvgGenImage get userSquare => const SvgGenImage('assets/icons/user_square.svg'); + + /// List of all assets + List get values => [ + add, + arrowLeft, + arrowRight, + bgHeaderUserProfile, + calendar, + calendarSearch, + call, + diagram, + download, + edit, + excelDownload, + filter, + gps, + information, + inspection, + key, + liveStock, + logout, + map, + mapMarker, + messageAdd, + pdfDownload, + pictureFrame, + profileCircle, + profileUser, + receiptDiscount, + scan, + scanBarcode, + securityTime, + setting, + tagUser, + trash, + user, + userSquare, + ]; +} + +class $AssetsImagesGen { + const $AssetsImagesGen(); + + /// File path: assets/images/inner_splash.webp + AssetGenImage get innerSplash => const AssetGenImage('assets/images/inner_splash.webp'); + + /// File path: assets/images/outter_splash.webp + AssetGenImage get outterSplash => const AssetGenImage('assets/images/outter_splash.webp'); + + /// List of all assets + List get values => [innerSplash, outterSplash]; +} + +class $AssetsVecGen { + const $AssetsVecGen(); + + /// File path: assets/vec/add.svg.vec + SvgGenImage get addSvg => const SvgGenImage.vec('assets/vec/add.svg.vec'); + + /// File path: assets/vec/arrow_left.svg.vec + SvgGenImage get arrowLeftSvg => const SvgGenImage.vec('assets/vec/arrow_left.svg.vec'); + + /// File path: assets/vec/arrow_right.svg.vec + SvgGenImage get arrowRightSvg => const SvgGenImage.vec('assets/vec/arrow_right.svg.vec'); + + /// File path: assets/vec/bg_header_user_profile.svg.vec + SvgGenImage get bgHeaderUserProfileSvg => const SvgGenImage.vec('assets/vec/bg_header_user_profile.svg.vec'); + + /// File path: assets/vec/calendar.svg.vec + SvgGenImage get calendarSvg => const SvgGenImage.vec('assets/vec/calendar.svg.vec'); + + /// File path: assets/vec/calendar_search.svg.vec + SvgGenImage get calendarSearchSvg => const SvgGenImage.vec('assets/vec/calendar_search.svg.vec'); + + /// File path: assets/vec/call.svg.vec + SvgGenImage get callSvg => const SvgGenImage.vec('assets/vec/call.svg.vec'); + + /// File path: assets/vec/diagram.svg.vec + SvgGenImage get diagramSvg => const SvgGenImage.vec('assets/vec/diagram.svg.vec'); + + /// File path: assets/vec/download.svg.vec + SvgGenImage get downloadSvg => const SvgGenImage.vec('assets/vec/download.svg.vec'); + + /// File path: assets/vec/edit.svg.vec + SvgGenImage get editSvg => const SvgGenImage.vec('assets/vec/edit.svg.vec'); + + /// File path: assets/vec/excel_download.svg.vec + SvgGenImage get excelDownloadSvg => const SvgGenImage.vec('assets/vec/excel_download.svg.vec'); + + /// File path: assets/vec/filter.svg.vec + SvgGenImage get filterSvg => const SvgGenImage.vec('assets/vec/filter.svg.vec'); + + /// File path: assets/vec/gps.svg.vec + SvgGenImage get gpsSvg => const SvgGenImage.vec('assets/vec/gps.svg.vec'); + + /// File path: assets/vec/information.svg.vec + SvgGenImage get informationSvg => const SvgGenImage.vec('assets/vec/information.svg.vec'); + + /// File path: assets/vec/inspection.svg.vec + SvgGenImage get inspectionSvg => const SvgGenImage.vec('assets/vec/inspection.svg.vec'); + + /// File path: assets/vec/key.svg.vec + SvgGenImage get keySvg => const SvgGenImage.vec('assets/vec/key.svg.vec'); + + /// File path: assets/vec/liveStock.svg.vec + SvgGenImage get liveStockSvg => const SvgGenImage.vec('assets/vec/liveStock.svg.vec'); + + /// File path: assets/vec/logout.svg.vec + SvgGenImage get logoutSvg => const SvgGenImage.vec('assets/vec/logout.svg.vec'); + + /// File path: assets/vec/map.svg.vec + SvgGenImage get mapSvg => const SvgGenImage.vec('assets/vec/map.svg.vec'); + + /// File path: assets/vec/map_marker.svg.vec + SvgGenImage get mapMarkerSvg => const SvgGenImage.vec('assets/vec/map_marker.svg.vec'); + + /// File path: assets/vec/message_add.svg.vec + SvgGenImage get messageAddSvg => const SvgGenImage.vec('assets/vec/message_add.svg.vec'); + + /// File path: assets/vec/pdf_download.svg.vec + SvgGenImage get pdfDownloadSvg => const SvgGenImage.vec('assets/vec/pdf_download.svg.vec'); + + /// File path: assets/vec/picture_frame.svg.vec + SvgGenImage get pictureFrameSvg => const SvgGenImage.vec('assets/vec/picture_frame.svg.vec'); + + /// File path: assets/vec/profile_circle.svg.vec + SvgGenImage get profileCircleSvg => const SvgGenImage.vec('assets/vec/profile_circle.svg.vec'); + + /// File path: assets/vec/profile_user.svg.vec + SvgGenImage get profileUserSvg => const SvgGenImage.vec('assets/vec/profile_user.svg.vec'); + + /// File path: assets/vec/receipt_discount.svg.vec + SvgGenImage get receiptDiscountSvg => const SvgGenImage.vec('assets/vec/receipt_discount.svg.vec'); + + /// File path: assets/vec/scan.svg.vec + SvgGenImage get scanSvg => const SvgGenImage.vec('assets/vec/scan.svg.vec'); + + /// File path: assets/vec/scan_barcode.svg.vec + SvgGenImage get scanBarcodeSvg => const SvgGenImage.vec('assets/vec/scan_barcode.svg.vec'); + + /// File path: assets/vec/security_time.svg.vec + SvgGenImage get securityTimeSvg => const SvgGenImage.vec('assets/vec/security_time.svg.vec'); + + /// File path: assets/vec/setting.svg.vec + SvgGenImage get settingSvg => const SvgGenImage.vec('assets/vec/setting.svg.vec'); + + /// File path: assets/vec/tag_user.svg.vec + SvgGenImage get tagUserSvg => const SvgGenImage.vec('assets/vec/tag_user.svg.vec'); + + /// File path: assets/vec/trash.svg.vec + SvgGenImage get trashSvg => const SvgGenImage.vec('assets/vec/trash.svg.vec'); + + /// File path: assets/vec/user.svg.vec + SvgGenImage get userSvg => const SvgGenImage.vec('assets/vec/user.svg.vec'); + + /// File path: assets/vec/user_square.svg.vec + SvgGenImage get userSquareSvg => const SvgGenImage.vec('assets/vec/user_square.svg.vec'); + + /// List of all assets + List get values => [ + addSvg, + arrowLeftSvg, + arrowRightSvg, + bgHeaderUserProfileSvg, + calendarSvg, + calendarSearchSvg, + callSvg, + diagramSvg, + downloadSvg, + editSvg, + excelDownloadSvg, + filterSvg, + gpsSvg, + informationSvg, + inspectionSvg, + keySvg, + liveStockSvg, + logoutSvg, + mapSvg, + mapMarkerSvg, + messageAddSvg, + pdfDownloadSvg, + pictureFrameSvg, + profileCircleSvg, + profileUserSvg, + receiptDiscountSvg, + scanSvg, + scanBarcodeSvg, + securityTimeSvg, + settingSvg, + tagUserSvg, + trashSvg, + userSvg, + userSquareSvg, + ]; +} + +class Assets { + const Assets._(); + + static const $AssetsIconsGen icons = $AssetsIconsGen(); + static const $AssetsImagesGen images = $AssetsImagesGen(); + static const $AssetsVecGen vec = $AssetsVecGen(); +} + +class AssetGenImage { + const AssetGenImage(this._assetName, {this.size, this.flavors = const {}}); + + final String _assetName; + + final Size? size; + final Set flavors; + + Image image({ + Key? key, + AssetBundle? bundle, + ImageFrameBuilder? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + String? semanticLabel, + bool excludeFromSemantics = false, + double? scale, + double? width, + double? height, + Color? color, + Animation? opacity, + BlendMode? colorBlendMode, + BoxFit? fit, + AlignmentGeometry alignment = Alignment.center, + ImageRepeat repeat = ImageRepeat.noRepeat, + Rect? centerSlice, + bool matchTextDirection = false, + bool gaplessPlayback = true, + bool isAntiAlias = false, + String? package, + FilterQuality filterQuality = FilterQuality.medium, + int? cacheWidth, + int? cacheHeight, + }) { + return Image.asset( + _assetName, + key: key, + bundle: bundle, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + semanticLabel: semanticLabel, + excludeFromSemantics: excludeFromSemantics, + scale: scale, + width: width, + height: height, + color: color, + opacity: opacity, + colorBlendMode: colorBlendMode, + fit: fit, + alignment: alignment, + repeat: repeat, + centerSlice: centerSlice, + matchTextDirection: matchTextDirection, + gaplessPlayback: gaplessPlayback, + isAntiAlias: isAntiAlias, + package: package, + filterQuality: filterQuality, + cacheWidth: cacheWidth, + cacheHeight: cacheHeight, + ); + } + + ImageProvider provider({AssetBundle? bundle, String? package}) { + return AssetImage(_assetName, bundle: bundle, package: package); + } + + String get path => _assetName; + + String get keyName => _assetName; +} + +class SvgGenImage { + const SvgGenImage(this._assetName, {this.size, this.flavors = const {}}) : _isVecFormat = false; + + const SvgGenImage.vec(this._assetName, {this.size, this.flavors = const {}}) : _isVecFormat = true; + + final String _assetName; + final Size? size; + final Set flavors; + final bool _isVecFormat; + + _svg.SvgPicture svg({ + Key? key, + bool matchTextDirection = false, + AssetBundle? bundle, + String? package, + double? width, + double? height, + BoxFit fit = BoxFit.contain, + AlignmentGeometry alignment = Alignment.center, + bool allowDrawingOutsideViewBox = false, + WidgetBuilder? placeholderBuilder, + String? semanticsLabel, + bool excludeFromSemantics = false, + _svg.SvgTheme? theme, + ColorFilter? colorFilter, + Clip clipBehavior = Clip.hardEdge, + @deprecated Color? color, + @deprecated BlendMode colorBlendMode = BlendMode.srcIn, + @deprecated bool cacheColorFilter = false, + }) { + final _svg.BytesLoader loader; + if (_isVecFormat) { + loader = _vg.AssetBytesLoader(_assetName, assetBundle: bundle, packageName: package); + } else { + loader = _svg.SvgAssetLoader(_assetName, assetBundle: bundle, packageName: package, theme: theme); + } + return _svg.SvgPicture( + loader, + key: key, + matchTextDirection: matchTextDirection, + width: width, + height: height, + fit: fit, + alignment: alignment, + allowDrawingOutsideViewBox: allowDrawingOutsideViewBox, + placeholderBuilder: placeholderBuilder, + semanticsLabel: semanticsLabel, + excludeFromSemantics: excludeFromSemantics, + colorFilter: colorFilter ?? (color == null ? null : ColorFilter.mode(color, colorBlendMode)), + clipBehavior: clipBehavior, + cacheColorFilter: cacheColorFilter, + ); + } + + String get path => _assetName; + + String get keyName => _assetName; +} diff --git a/packages/core/lib/presentation/common/common.dart b/packages/core/lib/presentation/common/common.dart index c3e9fa3..36e4588 100644 --- a/packages/core/lib/presentation/common/common.dart +++ b/packages/core/lib/presentation/common/common.dart @@ -1,3 +1,3 @@ export 'app_color.dart'; export 'app_fonts.dart'; -export 'assets.dart'; +export 'assets.gen.dart'; diff --git a/packages/core/lib/presentation/common/fonts.gen.dart b/packages/core/lib/presentation/common/fonts.gen.dart new file mode 100644 index 0000000..66ad118 --- /dev/null +++ b/packages/core/lib/presentation/common/fonts.gen.dart @@ -0,0 +1,15 @@ +/// GENERATED CODE - DO NOT MODIFY BY HAND +/// ***************************************************** +/// FlutterGen +/// ***************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use + +class FontFamily { + FontFamily._(); + + /// Font family: yekan + static const String yekan = 'yekan'; +} diff --git a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart index ddcc71f..f2b50b3 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart @@ -3,7 +3,7 @@ import 'package:rasadyar_core/core.dart'; class WaveBottomNavigationItem { final String title; - final String icon; + final Widget icon; WaveBottomNavigationItem({required this.title, required this.icon}); } @@ -112,12 +112,7 @@ class _WaveBottomNavigationState extends State { children: [ Tooltip( message: item.title, - child: vecWidget( - item.icon, - color: Colors.white, - width: 32, - height: 32, - ), + child: item.icon ), /* Visibility( diff --git a/packages/core/lib/presentation/widget/buttons/fab.dart b/packages/core/lib/presentation/widget/buttons/fab.dart index 3dfe651..200f0ab 100644 --- a/packages/core/lib/presentation/widget/buttons/fab.dart +++ b/packages/core/lib/presentation/widget/buttons/fab.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; -import 'package:rasadyar_core/presentation/common/assets.dart'; import 'package:rasadyar_core/presentation/utils/color_utils.dart'; -import 'package:rasadyar_core/presentation/widget/vec_widget.dart'; +import '../../common/assets.gen.dart'; class RFab extends StatefulWidget { final VoidCallback? onPressed; @@ -22,7 +21,10 @@ class RFab extends StatefulWidget { RFab.smallAdd({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecAddSvg), + icon: Assets.vec.addSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.greenNormal, key: key, ); @@ -30,7 +32,10 @@ class RFab extends StatefulWidget { RFab.add({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecAddSvg), + icon: Assets.vec.addSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.greenNormal, key: key, ); @@ -41,7 +46,10 @@ class RFab extends StatefulWidget { RFab.smallEdit({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecEditSvg), + icon: Assets.vec.addSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -49,7 +57,10 @@ class RFab extends StatefulWidget { RFab.edit({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecEditSvg), + icon: Assets.vec.addSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -60,7 +71,10 @@ class RFab extends StatefulWidget { RFab.smallDelete({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecTrashSvg), + icon: Assets.vec.trashSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.redNormal, key: key, ); @@ -68,7 +82,10 @@ class RFab extends StatefulWidget { RFab.delete({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecTrashSvg), + icon: Assets.vec.trashSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.redNormal, key: key, ); @@ -79,7 +96,10 @@ class RFab extends StatefulWidget { RFab.smallAction({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecScanSvg), + icon: Assets.vec.scanSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -87,7 +107,10 @@ class RFab extends StatefulWidget { RFab.action({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecScanSvg), + icon: Assets.vec.scanSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -98,7 +121,10 @@ class RFab extends StatefulWidget { RFab.smallFilter({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecFilterSvg), + icon: Assets.vec.scanSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -106,7 +132,10 @@ class RFab extends StatefulWidget { RFab.filter({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecFilterSvg), + icon: Assets.vec.scanSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -117,7 +146,10 @@ class RFab extends StatefulWidget { RFab.smallDownload({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), + icon: Assets.vec.downloadSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -125,7 +157,10 @@ class RFab extends StatefulWidget { RFab.download({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), + icon: Assets.vec.downloadSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -136,7 +171,10 @@ class RFab extends StatefulWidget { RFab.smallExcel({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), + icon: Assets.vec.excelDownloadSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.greenDark, key: key, ); @@ -144,7 +182,10 @@ class RFab extends StatefulWidget { RFab.excel({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecDownloadSvg), + icon: Assets.vec.excelDownloadSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.greenDark, key: key, ); @@ -155,7 +196,10 @@ class RFab extends StatefulWidget { RFab.smallBack({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: vecWidget(Assets.vecArrowLeftSvg), + icon: Assets.vec.arrowLeftSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); @@ -163,7 +207,10 @@ class RFab extends StatefulWidget { RFab.back({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: vecWidget(Assets.vecArrowLeftSvg), + icon: Assets.vec.arrowLeftSvg.svg( + width: 20, + height: 20, + ), backgroundColor: AppColor.blueNormal, key: key, ); diff --git a/packages/core/lib/presentation/widget/buttons/fab_outlined.dart b/packages/core/lib/presentation/widget/buttons/fab_outlined.dart index fc9f209..2b408bd 100644 --- a/packages/core/lib/presentation/widget/buttons/fab_outlined.dart +++ b/packages/core/lib/presentation/widget/buttons/fab_outlined.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; -import 'package:rasadyar_core/presentation/common/assets.dart'; +import 'package:rasadyar_core/presentation/common/assets.gen.dart'; import 'package:rasadyar_core/presentation/utils/color_utils.dart'; -import 'package:rasadyar_core/presentation/widget/vec_widget.dart'; class RFabOutlined extends StatefulWidget { final Widget icon; @@ -69,10 +68,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.greenNormal, borderColor: AppColor.greenNormal, - icon: vecWidget2( - Assets.vecAddSvg, - - color: AppColor.greenNormal, + icon: Assets.vec.addSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -81,12 +83,14 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.greenNormal, - icon: vecWidget( - Assets.vecAddSvg, - color: - onPressed != null - ? AppColor.greenNormal - : AppColor.greenNormal.disabledColor, + + icon: Assets.vec.addSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -96,12 +100,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.greenNormal, borderColor: AppColor.greenNormal, - icon: vecWidget( - Assets.vecAddSvg, - color: - onPressed != null - ? AppColor.greenNormal - : AppColor.greenNormal.disabledColor, + icon: Assets.vec.addSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -110,12 +115,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.greenNormal, - icon: vecWidget( - Assets.vecAddSvg, - color: - onPressed != null - ? AppColor.greenNormal - : AppColor.greenNormal.disabledColor, + icon: Assets.vec.addSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -128,12 +134,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.editSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -142,12 +149,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.editSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -157,12 +165,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.editSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -171,12 +180,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecEditSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.editSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -189,12 +199,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.redNormal, borderColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, + icon: Assets.vec.trashSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -203,12 +214,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, + icon: Assets.vec.trashSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -218,12 +230,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.redNormal, borderColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, + icon: Assets.vec.trashSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -232,12 +245,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.redNormal, - icon: vecWidget( - Assets.vecTrashSvg, - color: - onPressed != null - ? AppColor.redNormal - : AppColor.redNormal.disabledColor, + icon: Assets.vec.trashSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.redNormal + : AppColor.redNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -250,12 +264,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.scanSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -264,12 +279,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.scanSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -279,12 +295,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.scanSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -293,12 +310,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecScanSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.scanSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -311,12 +329,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.filterSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -325,12 +344,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.filterSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -340,12 +360,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.filterSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -354,12 +375,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecFilterSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.filterSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -372,12 +394,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.downloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -386,12 +409,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.downloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -401,12 +425,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.downloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -415,12 +440,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.downloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -433,12 +459,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.greenDark, borderColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.excelDownloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -447,12 +474,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.excelDownloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -462,12 +490,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.greenDark, borderColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.excelDownloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -476,12 +505,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.greenDark, - icon: vecWidget( - Assets.vecDownloadSvg, - color: - onPressed != null - ? AppColor.greenDark - : AppColor.greenDark.disabledColor, + icon: Assets.vec.excelDownloadSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.greenNormal + : AppColor.greenNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -494,12 +524,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.arrowLeftSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -508,12 +539,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.arrowLeftSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -523,12 +555,13 @@ class RFabOutlined extends StatefulWidget { onPressed: onPressed, backgroundColor: AppColor.blueNormal, borderColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.arrowLeftSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -537,12 +570,13 @@ class RFabOutlined extends StatefulWidget { key: key, onPressed: onPressed, backgroundColor: AppColor.blueNormal, - icon: vecWidget( - Assets.vecArrowLeftSvg, - color: - onPressed != null - ? AppColor.blueNormal - : AppColor.blueNormal.disabledColor, + icon: Assets.vec.arrowLeftSvg.svg( + colorFilter: ColorFilter.mode( + onPressed != null + ? AppColor.blueNormal + : AppColor.blueNormal.disabledColor, + BlendMode.srcIn, + ), ), ); @@ -550,11 +584,12 @@ class RFabOutlined extends StatefulWidget { } class _RFabOutlinedState extends State { - bool isOnPressed =false; + bool isOnPressed = false; + @override Widget build(BuildContext context) { return OutlinedButton( - onPressed:widget.onPressed , + onPressed: widget.onPressed, style: ButtonStyle( side: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.disabled)) { @@ -598,8 +633,7 @@ class _RFabOutlinedState extends State { ), padding: WidgetStatePropertyAll(EdgeInsets.zero), ), - child: widget.icon + child: widget.icon, ); } } - diff --git a/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart b/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart new file mode 100644 index 0000000..510f146 --- /dev/null +++ b/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class CardIcon extends StatelessWidget { + const CardIcon({ + super.key, + required this.title, + required this.icon, + this.onTap, + }); + + final String title; + final String icon; + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide(color: AppColor.blueNormal, width: 1), + ), + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.white, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgGenImage(icon).svg(width: 50, height: 50), + const SizedBox(height: 8), + Text( + title, + style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/vec_widget.dart b/packages/core/lib/presentation/widget/vec_widget.dart index 4bf8b36..12bcda6 100644 --- a/packages/core/lib/presentation/widget/vec_widget.dart +++ b/packages/core/lib/presentation/widget/vec_widget.dart @@ -22,7 +22,7 @@ SvgPicture vecWidget( } Widget vecWidgetWithOnTap({ - required String assets, + required Widget child, required VoidCallback onTap, double? width, double? height, @@ -31,14 +31,7 @@ Widget vecWidgetWithOnTap({ }) { return InkWell( onTap: onTap, - child: SvgPicture( - AssetBytesLoader(assets), - width: width, - height: height, - fit: fit ?? BoxFit.contain, - colorFilter: - color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, - ), + child: child ); } diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 7175a76..0f3dc7b 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -14,3 +14,4 @@ export 'pagination/show_more.dart'; export 'tabs/new_tab.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; +export 'card/card_with_icon_with_border.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 467a430..553ad9b 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.4.4" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" args: dependency: transitive description: @@ -153,6 +161,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + color: + dependency: transitive + description: + name: color + sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb + url: "https://pub.dev" + source: hosted + version: "3.0.0" convert: dependency: transitive description: @@ -262,6 +278,22 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_gen_core: + dependency: transitive + description: + name: flutter_gen_core + sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc" + url: "https://pub.dev" + source: hosted + version: "5.10.0" + flutter_gen_runner: + dependency: "direct main" + description: + name: flutter_gen_runner + sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9 + url: "https://pub.dev" + source: hosted + version: "5.10.0" flutter_lints: dependency: "direct dev" description: @@ -493,6 +525,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + hashcodes: + dependency: transitive + description: + name: hashcodes + sha256: "80f9410a5b3c8e110c4b7604546034749259f5d6dcca63e0d3c17c9258f1a651" + url: "https://pub.dev" + source: hosted + version: "2.0.0" hive_ce: dependency: "direct main" description: @@ -541,6 +581,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image_size_getter: + dependency: transitive + description: + name: image_size_getter + sha256: "9a299e3af2ebbcfd1baf21456c3c884037ff524316c97d8e56035ea8fdf35653" + url: "https://pub.dev" + source: hosted + version: "2.4.0" intl: dependency: "direct main" description: @@ -885,6 +933,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + posix: + dependency: transitive + description: + name: posix + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + url: "https://pub.dev" + source: hosted + version: "6.0.2" pretty_dio_logger: dependency: "direct main" description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 1c25b27..a587f74 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -36,6 +36,9 @@ dependencies: flutter_svg: ^2.0.17 font_awesome_flutter: ^10.8.0 + #Generator + flutter_gen_runner: ^5.10.0 + ##state manger get: ^4.7.2 @@ -76,6 +79,7 @@ dev_dependencies: freezed: ^3.0.3 json_serializable: ^6.9.4 + ##test mocktail: ^1.0.4 get_test: ^4.0.1 @@ -85,3 +89,9 @@ dev_dependencies: flutter: uses-material-design: true + assets: + - assets/ + - assets/vec/ + - assets/icons/ + + diff --git a/packages/inspection/lib/presentation/action/view.dart b/packages/inspection/lib/presentation/action/view.dart index 1889549..a0d2ac5 100644 --- a/packages/inspection/lib/presentation/action/view.dart +++ b/packages/inspection/lib/presentation/action/view.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'logic.dart'; @@ -113,7 +112,7 @@ class ActionPage extends GetView { children: [ Container( height: 32, - margin: EdgeInsets.symmetric(horizontal: 22,vertical: 10), + margin: EdgeInsets.symmetric(horizontal: 22, vertical: 10), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, @@ -161,13 +160,13 @@ class ActionPage extends GetView { mainAxisAlignment: MainAxisAlignment.end, children: [ vecWidgetWithOnTap( - assets: Assets.vecPdfDownloadSvg, + child: Assets.vec.pdfDownloadSvg.svg(), onTap: () {}, width: 64, height: 64, ), vecWidgetWithOnTap( - assets: Assets.vecExcelDownloadSvg, + child: Assets.vec.excelDownloadSvg.svg(), onTap: () {}, width: 64, height: 64, @@ -220,7 +219,7 @@ class ActionPage extends GetView { } Widget headerWidget({ - required String icon, + required Widget icon, required String title, required VoidCallback onTap, bool isSelected = false, @@ -240,12 +239,7 @@ class ActionPage extends GetView { borderRadius: BorderRadius.circular(8), ), ), - child: vecWidget( - icon, - width: 40, - height: 40, - color: AppColor.blueNormal, - ), + child: icon, ), Text( title, @@ -279,7 +273,10 @@ class ActionPage extends GetView { padding: EdgeInsets.all(16), borderRadius: BorderRadius.circular(8), autoClose: true, - child: vecWidget(Assets.vecTrashSvg, width: 24, height: 24), + child: Assets.vec.trashSvg.svg( + width: 24, + height: 24, + ), ), ], ), @@ -372,7 +369,10 @@ class ActionPage extends GetView { bottomRight: Radius.circular(8), ), autoClose: true, - child: vecWidget(Assets.vecEditSvg, width: 24, height: 24), + child: Assets.vec.trashSvg.svg( + width: 24, + height: 24, + ), ), CustomSlidableAction( onPressed: (context) {}, @@ -384,7 +384,10 @@ class ActionPage extends GetView { bottomLeft: Radius.circular(8), ), autoClose: true, - child: vecWidget(Assets.vecTrashSvg, width: 24, height: 24), + child: Assets.vec.trashSvg.svg( + width: 24, + height: 24, + ), ), ], ), @@ -492,7 +495,7 @@ class ActionPage extends GetView { spacing: 12, children: [ vecWidgetWithOnTap( - assets: Assets.vecEditSvg, + child: Assets.vec.editSvg.svg(), onTap: () {}, width: 24, height: 24, @@ -506,7 +509,7 @@ class ActionPage extends GetView { ), ), vecWidgetWithOnTap( - assets: Assets.vecTrashSvg, + child: Assets.vec.trashSvg.svg(), width: 24, height: 24, color: AppColor.redNormal, @@ -649,7 +652,7 @@ class ActionPage extends GetView { children: [ Row(), Padding( - padding: const EdgeInsets.symmetric(horizontal: 22,vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 22, vertical: 10), child: Text( title, textAlign: TextAlign.center, diff --git a/packages/inspection/lib/presentation/add_mobile_inspector/view.dart b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart index 61a9aba..c39030c 100644 --- a/packages/inspection/lib/presentation/add_mobile_inspector/view.dart +++ b/packages/inspection/lib/presentation/add_mobile_inspector/view.dart @@ -14,11 +14,13 @@ class AddMobileInspectorPage extends GetView { backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'افزودن بازرس همراه', - leading: vecWidget( - Assets.vecMessageAddSvg, - color: Colors.white, + leading: Assets.vec.messageAddSvg.svg( width: 16, height: 16, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), ), additionalActions: [ RFab.smallAdd(onPressed: () => controller.countInspector.value++), diff --git a/packages/inspection/lib/presentation/add_supervision/view.dart b/packages/inspection/lib/presentation/add_supervision/view.dart index 46738a1..89fa9bd 100644 --- a/packages/inspection/lib/presentation/add_supervision/view.dart +++ b/packages/inspection/lib/presentation/add_supervision/view.dart @@ -13,11 +13,13 @@ class AddSupervisionPage extends GetView { backgroundColor: AppColor.lightGreyLight, appBar: RAppBar( title: 'ایجاد بازرسی', - leading: vecWidget( - Assets.vecMessageAddSvg, - color: Colors.white, + leading: Assets.vec.messageAddSvg.svg( width: 16, height: 16, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), ), ), body: Column( diff --git a/packages/inspection/lib/presentation/display_information/view.dart b/packages/inspection/lib/presentation/display_information/view.dart index 3adbe1f..33f879a 100644 --- a/packages/inspection/lib/presentation/display_information/view.dart +++ b/packages/inspection/lib/presentation/display_information/view.dart @@ -12,11 +12,13 @@ class DisplayInformationPage extends GetView { backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'نمایش اطلاعات', - leading: vecWidget( - Assets.vecMessageAddSvg, - color: AppColor.blueNormal, + leading: Assets.vec.messageAddSvg.svg( width: 16, height: 16, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), ), ), diff --git a/packages/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/filter/view.dart index c8b2271..3f7ee39 100644 --- a/packages/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/filter/view.dart @@ -74,7 +74,7 @@ class SupervisionFilterPage extends GetView { return RFab.small( backgroundColor: AppColor.greenNormal, isLoading: data.value, - icon: vecWidget(Assets.vecGpsSvg), + icon: Assets.vec.gpsSvg.svg(), onPressed: () async { controller.isLoading.value = true; await controller.determineCurrentPosition(); @@ -91,7 +91,7 @@ class SupervisionFilterPage extends GetView { bottom: 30, child: RFab.small( backgroundColor: AppColor.blueNormal, - icon: vecWidget(Assets.vecFilterSvg, width: 24, height: 24), + icon: Assets.vec.filterSvg.svg(width: 24,height: 24), onPressed: () => controller.filterBottomSheetController.toggle(), ), ); @@ -107,7 +107,10 @@ Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { child: SizedBox( width: 36, height: 36, - child: vecWidget(Assets.vecMapMarkerSvg,width: 30,height: 30,), + child:Assets.vec.mapMarkerSvg.svg( + width: 30, + height: 30, + ) ), ), ); @@ -318,7 +321,7 @@ Widget markerDetailsWidget() { ), Spacer(), vecWidgetWithOnTap( - assets: Assets.vecMapSvg, + child: Assets.vec.mapSvg.svg(), onTap: () { Get.toNamed(InspectionRoutes.inspectionLocationDetails); }, @@ -327,7 +330,7 @@ Widget markerDetailsWidget() { color: AppColor.blueNormal, ), vecWidgetWithOnTap( - assets: Assets.vecMessageAddSvg, + child: Assets.vec.messageAddSvg.svg(), width: 24, height: 24, color: AppColor.greenNormal, @@ -337,7 +340,7 @@ Widget markerDetailsWidget() { ), vecWidgetWithOnTap( - assets: Assets.vecSecurityTimeSvg, + child: Assets.vec.securityTimeSvg.svg(), color: AppColor.warning, height: 24, width: 24, @@ -531,7 +534,7 @@ Widget selectedLocationWidget({ bottomRight: Radius.circular(8), topRight: Radius.circular(8), ), - child: vecWidget(Assets.vecMapSvg, width: 24, height: 24), + child: Assets.vec.mapSvg.svg( width: 24, height: 24), ), CustomSlidableAction( onPressed: (context) { @@ -539,7 +542,7 @@ Widget selectedLocationWidget({ }, backgroundColor: AppColor.greenNormal, padding: EdgeInsets.all(16), - child: vecWidget(Assets.vecMessageAddSvg), + child: Assets.vec.messageAddSvg.svg(), ), CustomSlidableAction( onPressed: (context) {}, @@ -549,8 +552,8 @@ Widget selectedLocationWidget({ bottomLeft: Radius.circular(8), topLeft: Radius.circular(8), ), - child: vecWidget(Assets.vecSecurityTimeSvg), - ), + child: Assets.vec.securityTimeSvg.svg()), + ], ), child: GestureDetector( @@ -598,7 +601,7 @@ Widget selectedLocationWidget({ ), ], ), - vecWidget(Assets.vecScanBarcodeSvg), + Assets.vec.scanBarcodeSvg.svg(), ], ), ), diff --git a/packages/inspection/lib/presentation/profile/view.dart b/packages/inspection/lib/presentation/profile/view.dart index c6a321b..b125f1a 100644 --- a/packages/inspection/lib/presentation/profile/view.dart +++ b/packages/inspection/lib/presentation/profile/view.dart @@ -18,8 +18,7 @@ class ProfilePage extends GetView { alignment: Alignment.center, clipBehavior: Clip.none, children: [ - vecWidget(Assets.vecBgHeaderUserProfileSvg, fit: BoxFit.cover), - + Assets.vec.bgHeaderUserProfileSvg.svg(), Positioned( bottom: -20, left: 0, @@ -105,7 +104,7 @@ class ProfilePage extends GetView { onPressed: () { data.value = 0; }, - icon: Assets.vecProfileUserSvg, + icon: Assets.vec.profileUserSvg.path, selected: data.value == 0, ), cardActionWidget( @@ -113,7 +112,7 @@ class ProfilePage extends GetView { onPressed: () { data.value = 1; }, - icon: Assets.vecInformationSvg, + icon: Assets.vec.informationSvg.path, selected: data.value == 1, ), cardActionWidget( @@ -121,7 +120,7 @@ class ProfilePage extends GetView { onPressed: () { data.value = 2; }, - icon: Assets.vecReceiptDiscountSvg, + icon: Assets.vec.receiptDiscountSvg.path, selected: data.value == 2, ), ], @@ -129,9 +128,7 @@ class ProfilePage extends GetView { ); }, controller.selectedInformationType), - SizedBox( - height: 100, - ) + SizedBox(height: 100), ], ), ), @@ -159,34 +156,38 @@ class ProfilePage extends GetView { itemList( title: 'نام و نام خانوادگی', content: 'آیدا گل محمدی', - icon: Assets.vecUserSvg, + icon: Assets.vec.userSvg.path, ), itemList( title: 'موبایل', content: '09302654896', - icon: Assets.vecCallSvg, + icon: Assets.vec.callSvg.path, ), itemList( title: 'کدملی', content: 'نا مشخص', - icon: Assets.vecTagUserSvg, + icon: Assets.vec.tagUserSvg.path, ), itemList( title: 'شماره شناسنامه', content: 'نا مشخص', - icon: Assets.vecUserSquareSvg, + icon: Assets.vec.userSquareSvg.path, ), itemList( title: 'تاریخ تولد', content: '1404/10/12', - icon: Assets.vecCalendarSvg, + icon: Assets.vec.calendarSvg.path, ), itemList( title: 'استان', content: 'لرستان', - icon: Assets.vecPictureFrameSvg, + icon: Assets.vec.pictureFrameSvg.path, + ), + itemList( + title: 'شهر', + content: 'خرم آباد', + icon: Assets.vec.mapSvg.path, ), - itemList(title: 'شهر', content: 'خرم آباد', icon: Assets.vecMapSvg), ], ); } @@ -201,11 +202,10 @@ class ProfilePage extends GetView { if (icon != null) Padding( padding: const EdgeInsets.only(left: 8.0), - child: vecWidget( - icon, + child: SvgGenImage.vec(icon).svg( width: 20, height: 20, - color: AppColor.blueNormal, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ), Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), @@ -238,11 +238,13 @@ class ProfilePage extends GetView { borderRadius: BorderRadius.circular(8), ), ), - child: vecWidget( - icon, + child: SvgGenImage.vec(icon).svg( width: 40, height: 40, - color: selected ? AppColor.blueNormalActive : AppColor.blueNormal, + colorFilter: ColorFilter.mode( + selected ? AppColor.whiteLight : AppColor.blueNormal, + BlendMode.srcIn, + ), ), ), SizedBox(height: 2), diff --git a/packages/inspection/lib/presentation/registration_of_violation/view.dart b/packages/inspection/lib/presentation/registration_of_violation/view.dart index 9e75e0a..2efa87f 100644 --- a/packages/inspection/lib/presentation/registration_of_violation/view.dart +++ b/packages/inspection/lib/presentation/registration_of_violation/view.dart @@ -15,11 +15,13 @@ class RegistrationOfViolationPage backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'ثبت تخلف', - leading: vecWidget( - Assets.vecMessageAddSvg, - color: Colors.white, + leading: Assets.vec.messageAddSvg.svg( width: 16, height: 16, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), ), additionalActions: [ RFab.smallAdd(onPressed: () => controller.countViolation.value++), diff --git a/packages/inspection/lib/presentation/root/view.dart b/packages/inspection/lib/presentation/root/view.dart index 8b7faea..2994617 100644 --- a/packages/inspection/lib/presentation/root/view.dart +++ b/packages/inspection/lib/presentation/root/view.dart @@ -116,30 +116,54 @@ class RootPage extends GetView { ), bottomNavigationBar: WaveBottomNavigation( items: [ - WaveBottomNavigationItem(title: 'خانه', icon: Assets.vecMapSvg), + WaveBottomNavigationItem(title: 'خانه', icon: Assets.vec.mapSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + )), WaveBottomNavigationItem( title: 'عملیات', - icon: Assets.vecUserSvg, + icon: Assets.vec.userSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), WaveBottomNavigationItem( title: 'افزودن', - icon: Assets.vecAddSvg, + icon: Assets.vec.addSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), WaveBottomNavigationItem( title: 'آمار', - icon: Assets.vecDiagramSvg, + icon: Assets.vec.diagramSvg.svg(width: 32,height: 32,colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),), ), WaveBottomNavigationItem( title: 'تماس', - icon: Assets.vecCallSvg, + icon: Assets.vec.callSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), WaveBottomNavigationItem( title: 'مکان ', - icon: Assets.vecGpsSvg, + icon: Assets.vec.gpsSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), WaveBottomNavigationItem( title: 'تاریخ', - icon: Assets.vecCalendarSvg, + icon: Assets.vec.calendarSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), ], onPageChanged: (index) { diff --git a/packages/livestock/lib/presentation/page/root/logic.dart b/packages/livestock/lib/presentation/page/root/logic.dart new file mode 100644 index 0000000..e335077 --- /dev/null +++ b/packages/livestock/lib/presentation/page/root/logic.dart @@ -0,0 +1,17 @@ + + +import 'package:rasadyar_core/core.dart'; + +class RootLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart new file mode 100644 index 0000000..4725935 --- /dev/null +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'logic.dart'; + +class RootPage extends GetView { + const RootPage({super.key}); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/pubspec.lock b/pubspec.lock index 82b7839..14ce169 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.4.5" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" args: dependency: transitive description: @@ -153,6 +161,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + color: + dependency: transitive + description: + name: color + sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb + url: "https://pub.dev" + source: hosted + version: "3.0.0" convert: dependency: transitive description: @@ -262,6 +278,22 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_gen_core: + dependency: transitive + description: + name: flutter_gen_core + sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc" + url: "https://pub.dev" + source: hosted + version: "5.10.0" + flutter_gen_runner: + dependency: "direct dev" + description: + name: flutter_gen_runner + sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9 + url: "https://pub.dev" + source: hosted + version: "5.10.0" flutter_lints: dependency: "direct dev" description: @@ -493,6 +525,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + hashcodes: + dependency: transitive + description: + name: hashcodes + sha256: "80f9410a5b3c8e110c4b7604546034749259f5d6dcca63e0d3c17c9258f1a651" + url: "https://pub.dev" + source: hosted + version: "2.0.0" hive_ce: dependency: transitive description: @@ -541,6 +581,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image_size_getter: + dependency: transitive + description: + name: image_size_getter + sha256: "9a299e3af2ebbcfd1baf21456c3c884037ff524316c97d8e56035ea8fdf35653" + url: "https://pub.dev" + source: hosted + version: "2.4.0" intl: dependency: transitive description: @@ -885,6 +933,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + posix: + dependency: transitive + description: + name: posix + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + url: "https://pub.dev" + source: hosted + version: "6.0.2" pretty_dio_logger: dependency: transitive description: @@ -938,6 +994,13 @@ packages: relative: true source: path version: "1.0.1" + rasadyar_livestock: + dependency: "direct main" + description: + path: "packages/livestock" + relative: true + source: path + version: "1.0.0" rxdart: dependency: transitive description: From 7f72f2c70d3479aa88ca68ea47d62ba475020937 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 19 May 2025 16:17:01 +0330 Subject: [PATCH 071/256] feat : live stock module --- .../lib/presentation/action/logic.dart | 16 ++++++------ .../lib/presentation/routes/app_pages.dart | 25 +++++++++++++++++++ .../lib/presentation/routes/app_routes.dart | 9 +++++++ packages/livestock/pubspec.yaml | 10 ++++---- packages/livestock/test/livestock_test.dart | 3 +-- pubspec.yaml | 16 ++++++++++++ 6 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 packages/livestock/lib/presentation/routes/app_pages.dart create mode 100644 packages/livestock/lib/presentation/routes/app_routes.dart diff --git a/packages/inspection/lib/presentation/action/logic.dart b/packages/inspection/lib/presentation/action/logic.dart index 14cf098..6692de2 100644 --- a/packages/inspection/lib/presentation/action/logic.dart +++ b/packages/inspection/lib/presentation/action/logic.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; - class ActionLogic extends GetxController with GetTickerProviderStateMixin { late Rx slidController; bool showSlideHint = true; @@ -15,11 +15,11 @@ class ActionLogic extends GetxController with GetTickerProviderStateMixin { 'خروج از سامانه', ]; - List headersIcons = [ - Assets.vecProfileUserSvg, - Assets.vecCalendarSearchSvg, - Assets.vecDiagramSvg, - Assets.vecLogoutSvg, + List headersIcons = [ + Assets.vec.profileUserSvg.svg(), + Assets.vec.calendarSearchSvg.svg(), + Assets.vec.diagramSvg.svg(), + Assets.vec.logoutSvg.svg(), ]; RxList supervisionHistoryList = [false, false, false, false].obs; @@ -46,7 +46,6 @@ class ActionLogic extends GetxController with GetTickerProviderStateMixin { void onInit() { super.onInit(); slidController = SlidableController(this).obs; - } @override @@ -69,9 +68,8 @@ class ActionLogic extends GetxController with GetTickerProviderStateMixin { showSlideHint = !showSlideHint; } - void updateSelectedIndex(int index) { - if(index == selectedIndex.value) { + if (index == selectedIndex.value) { return; } previousIndex.value = selectedIndex.value; diff --git a/packages/livestock/lib/presentation/routes/app_pages.dart b/packages/livestock/lib/presentation/routes/app_pages.dart new file mode 100644 index 0000000..c699577 --- /dev/null +++ b/packages/livestock/lib/presentation/routes/app_pages.dart @@ -0,0 +1,25 @@ + +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/page/root/view.dart'; + + +part'app_routes.dart'; + +sealed class LiveStockPages { + LiveStockPages._(); + + static final pages = [ + GetPage( + name: LiveStockRoutes.init, + page: () => RootPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + + }), + ), + + + ]; +} + diff --git a/packages/livestock/lib/presentation/routes/app_routes.dart b/packages/livestock/lib/presentation/routes/app_routes.dart new file mode 100644 index 0000000..b563e83 --- /dev/null +++ b/packages/livestock/lib/presentation/routes/app_routes.dart @@ -0,0 +1,9 @@ + +part of 'app_pages.dart'; + +sealed class LiveStockRoutes { + LiveStockRoutes._(); + + static const init = '/liveStockRoutesInit'; + +} diff --git a/packages/livestock/pubspec.yaml b/packages/livestock/pubspec.yaml index 09d7557..9f8ba58 100644 --- a/packages/livestock/pubspec.yaml +++ b/packages/livestock/pubspec.yaml @@ -1,4 +1,4 @@ -name: livestock +name: rasadyar_livestock description: A starting point for Dart libraries or applications. version: 1.0.0 publish_to: 'none' @@ -9,9 +9,12 @@ environment: dependencies: - + flutter: + sdk: flutter rasadyar_core: path: ../core + rasadyar_auth: + path: ../auth ##code generation freezed_annotation: ^3.0.0 json_annotation: ^4.9.0 @@ -31,7 +34,4 @@ dev_dependencies: mocktail: ^1.0.4 get_test: ^4.0.1 -flutter: - uses-material-design: true - diff --git a/packages/livestock/test/livestock_test.dart b/packages/livestock/test/livestock_test.dart index dbd1d90..534cb37 100644 --- a/packages/livestock/test/livestock_test.dart +++ b/packages/livestock/test/livestock_test.dart @@ -1,5 +1,4 @@ -import 'package:livestock/livestock.dart'; -import 'package:test/test.dart'; + void main() { diff --git a/pubspec.yaml b/pubspec.yaml index 95fc0f1..b8726e5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,6 +24,9 @@ dependencies: rasadyar_auth: path: ./packages/auth + rasadyar_livestock: + path: ./packages/livestock + ##code generation @@ -38,6 +41,7 @@ dev_dependencies: hive_ce_generator: ^1.9.1 freezed: ^3.0.6 json_serializable: ^6.9.4 + flutter_gen_runner: ^5.10.0 ##test mocktail: ^1.0.4 @@ -56,7 +60,19 @@ flutter: - assets/logos/ - assets/vec/ + fonts: - family: yekan fonts: - asset: fonts/iranyekanregularfanum.ttf + + +flutter_gen: + output: packages/core/lib/presentation/common + line_length: 120 + # Optional + integrations: + image: true + flutter_svg: true + rive: false + lottie: false From ed75da4eaa5f47f2348bcdbfa129816ab5fd763d Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 21 May 2025 09:04:21 +0330 Subject: [PATCH 072/256] feat: new pages and with binding ... --- .../lib/presentation/page/action/logic.dart | 5 +++++ .../lib/presentation/page/action/view.dart | 12 ++++++++++++ .../lib/presentation/page/map/logic.dart | 5 +++++ .../lib/presentation/page/map/view.dart | 14 ++++++++++++++ .../lib/presentation/page/profile/logic.dart | 5 +++++ .../lib/presentation/page/profile/view.dart | 13 +++++++++++++ .../lib/presentation/page/root/logic.dart | 9 +++++++-- .../lib/presentation/page/root/view.dart | 10 +++++++++- .../lib/presentation/routes/app_pages.dart | 18 ++++++++++-------- .../lib/presentation/routes/app_routes.dart | 6 ++++-- 10 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 packages/livestock/lib/presentation/page/action/logic.dart create mode 100644 packages/livestock/lib/presentation/page/action/view.dart create mode 100644 packages/livestock/lib/presentation/page/map/logic.dart create mode 100644 packages/livestock/lib/presentation/page/map/view.dart create mode 100644 packages/livestock/lib/presentation/page/profile/logic.dart create mode 100644 packages/livestock/lib/presentation/page/profile/view.dart diff --git a/packages/livestock/lib/presentation/page/action/logic.dart b/packages/livestock/lib/presentation/page/action/logic.dart new file mode 100644 index 0000000..e540e8c --- /dev/null +++ b/packages/livestock/lib/presentation/page/action/logic.dart @@ -0,0 +1,5 @@ +import 'package:rasadyar_core/core.dart'; + +class ActionLogic extends GetxController { + +} diff --git a/packages/livestock/lib/presentation/page/action/view.dart b/packages/livestock/lib/presentation/page/action/view.dart new file mode 100644 index 0000000..3068f47 --- /dev/null +++ b/packages/livestock/lib/presentation/page/action/view.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'logic.dart'; + +class ActionPage extends GetView { + ActionPage({super.key}); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/packages/livestock/lib/presentation/page/map/logic.dart b/packages/livestock/lib/presentation/page/map/logic.dart new file mode 100644 index 0000000..73d5b78 --- /dev/null +++ b/packages/livestock/lib/presentation/page/map/logic.dart @@ -0,0 +1,5 @@ +import 'package:rasadyar_core/core.dart'; + +class MapLogic extends GetxController { + +} diff --git a/packages/livestock/lib/presentation/page/map/view.dart b/packages/livestock/lib/presentation/page/map/view.dart new file mode 100644 index 0000000..0bb76db --- /dev/null +++ b/packages/livestock/lib/presentation/page/map/view.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'logic.dart'; + +class MapPage extends GetView { + MapPage({super.key}); + + + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/packages/livestock/lib/presentation/page/profile/logic.dart b/packages/livestock/lib/presentation/page/profile/logic.dart new file mode 100644 index 0000000..811d534 --- /dev/null +++ b/packages/livestock/lib/presentation/page/profile/logic.dart @@ -0,0 +1,5 @@ +import 'package:rasadyar_core/core.dart'; + +class ProfileLogic extends GetxController { + +} diff --git a/packages/livestock/lib/presentation/page/profile/view.dart b/packages/livestock/lib/presentation/page/profile/view.dart new file mode 100644 index 0000000..1819ff5 --- /dev/null +++ b/packages/livestock/lib/presentation/page/profile/view.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class ProfilePage extends GetView { + ProfilePage({super.key}); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/packages/livestock/lib/presentation/page/root/logic.dart b/packages/livestock/lib/presentation/page/root/logic.dart index e335077..c6aceec 100644 --- a/packages/livestock/lib/presentation/page/root/logic.dart +++ b/packages/livestock/lib/presentation/page/root/logic.dart @@ -1,8 +1,13 @@ - - +import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/page/action/view.dart'; +import 'package:rasadyar_livestock/presentation/page/map/view.dart'; +import 'package:rasadyar_livestock/presentation/page/profile/view.dart'; class RootLogic extends GetxController { + List pages = [ActionPage(), MapPage(), ProfilePage()]; + RxInt indexedPage = 1.obs; + @override void onReady() { // TODO: implement onReady diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart index 4725935..88d0fc3 100644 --- a/packages/livestock/lib/presentation/page/root/view.dart +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -7,6 +7,14 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { - return Container(); + return Scaffold( + body: ObxValue((data) { + return IndexedStack( + children: controller.pages, + index: data.value, + sizing: StackFit.expand, + ); + }, controller.indexedPage), + ); } } diff --git a/packages/livestock/lib/presentation/routes/app_pages.dart b/packages/livestock/lib/presentation/routes/app_pages.dart index c699577..3795a4b 100644 --- a/packages/livestock/lib/presentation/routes/app_pages.dart +++ b/packages/livestock/lib/presentation/routes/app_pages.dart @@ -1,10 +1,11 @@ - import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/page/action/logic.dart'; +import 'package:rasadyar_livestock/presentation/page/map/logic.dart'; +import 'package:rasadyar_livestock/presentation/page/profile/logic.dart'; +import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/view.dart'; - - -part'app_routes.dart'; +part 'app_routes.dart'; sealed class LiveStockPages { LiveStockPages._(); @@ -15,11 +16,12 @@ sealed class LiveStockPages { page: () => RootPage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - + Get.put(RootLogic()); + BindingsBuilder.put(() => RootLogic()); + Get.lazyPut(() => ActionLogic()); + Get.lazyPut(() => MapLogic()); + Get.lazyPut(() => ProfileLogic()); }), ), - - ]; } - diff --git a/packages/livestock/lib/presentation/routes/app_routes.dart b/packages/livestock/lib/presentation/routes/app_routes.dart index b563e83..4c6eece 100644 --- a/packages/livestock/lib/presentation/routes/app_routes.dart +++ b/packages/livestock/lib/presentation/routes/app_routes.dart @@ -1,9 +1,11 @@ - part of 'app_pages.dart'; sealed class LiveStockRoutes { LiveStockRoutes._(); - static const init = '/liveStockRoutesInit'; + static const init = '/liveStock'; + static const action = '$init/liveStock'; + static const map = '$init/liveStock'; + static const profile = '$init/profile'; } From b5406a00a06a60f117336420bedb4cab31677699 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 21 May 2025 09:17:37 +0330 Subject: [PATCH 073/256] feat: map widget with controller --- .../core/lib/presentation/widget/map/logic.dart | 5 +++++ packages/core/lib/presentation/widget/map/view.dart | 13 +++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 packages/core/lib/presentation/widget/map/logic.dart create mode 100644 packages/core/lib/presentation/widget/map/view.dart diff --git a/packages/core/lib/presentation/widget/map/logic.dart b/packages/core/lib/presentation/widget/map/logic.dart new file mode 100644 index 0000000..40b1aa4 --- /dev/null +++ b/packages/core/lib/presentation/widget/map/logic.dart @@ -0,0 +1,5 @@ +import 'package:get/get.dart'; + +class MapLogic extends GetxController { + +} diff --git a/packages/core/lib/presentation/widget/map/view.dart b/packages/core/lib/presentation/widget/map/view.dart new file mode 100644 index 0000000..f71f1e0 --- /dev/null +++ b/packages/core/lib/presentation/widget/map/view.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class MapPage extends GetView { + const MapPage({super.key}); + + @override + Widget build(BuildContext context) { + return Container(); + } +} From 1ed8e69262fc97be884cc3a040542f2601013656 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 21 May 2025 14:43:26 +0330 Subject: [PATCH 074/256] feat: actions and map page --- assets/icons/search.svg | 6 + assets/vec/search.svg.vec | Bin 0 -> 203 bytes lib/presentations/common/assets.dart | 43 ++++ packages/core/lib/core.dart | 2 +- .../lib/presentation/common/app_fonts.dart | 9 + .../lib/presentation/common/assets.gen.dart | 8 + .../widget/app_bar/r_app_bar.dart | 23 +- .../bottom_navigation_1.dart | 13 +- .../presentation/widget/chips/r_chips.dart | 85 +++++++ .../lib/presentation/widget/map/logic.dart | 80 ++++++- .../lib/presentation/widget/map/view.dart | 69 +++++- .../core/lib/presentation/widget/widget.dart | 1 + .../lib/presentation/page/action/view.dart | 208 +++++++++++++++++- .../lib/presentation/page/map/logic.dart | 3 + .../lib/presentation/page/map/view.dart | 16 +- .../lib/presentation/page/root/logic.dart | 5 +- .../lib/presentation/page/root/view.dart | 40 +++- .../lib/presentation/routes/app_pages.dart | 4 + tools/vecGeneratoe.sh | 4 +- 19 files changed, 586 insertions(+), 33 deletions(-) create mode 100644 assets/icons/search.svg create mode 100644 assets/vec/search.svg.vec create mode 100644 lib/presentations/common/assets.dart create mode 100644 packages/core/lib/presentation/widget/chips/r_chips.dart diff --git a/assets/icons/search.svg b/assets/icons/search.svg new file mode 100644 index 0000000..4a4e42d --- /dev/null +++ b/assets/icons/search.svg @@ -0,0 +1,6 @@ + + + + diff --git a/assets/vec/search.svg.vec b/assets/vec/search.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..da0271d4916ce3d2156595941fc6690f9daf8a0a GIT binary patch literal 203 zcmYe&?O const SvgGenImage('assets/icons/scan_barcode.svg'); + /// File path: assets/icons/search.svg + SvgGenImage get search => const SvgGenImage('assets/icons/search.svg'); + /// File path: assets/icons/security_time.svg SvgGenImage get securityTime => const SvgGenImage('assets/icons/security_time.svg'); @@ -147,6 +150,7 @@ class $AssetsIconsGen { receiptDiscount, scan, scanBarcode, + search, securityTime, setting, tagUser, @@ -256,6 +260,9 @@ class $AssetsVecGen { /// File path: assets/vec/scan_barcode.svg.vec SvgGenImage get scanBarcodeSvg => const SvgGenImage.vec('assets/vec/scan_barcode.svg.vec'); + /// File path: assets/vec/search.svg.vec + SvgGenImage get searchSvg => const SvgGenImage.vec('assets/vec/search.svg.vec'); + /// File path: assets/vec/security_time.svg.vec SvgGenImage get securityTimeSvg => const SvgGenImage.vec('assets/vec/security_time.svg.vec'); @@ -304,6 +311,7 @@ class $AssetsVecGen { receiptDiscountSvg, scanSvg, scanBarcodeSvg, + searchSvg, securityTimeSvg, settingSvg, tagUserSvg, diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index 47f7da9..6db58bb 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -8,6 +8,8 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { final String title; final Color backgroundColor; final Color iconColor; + final bool hasBack; + final bool centerTitle; final TextStyle? titleTextStyle; final VoidCallback? onBackPressed; final List? additionalActions; @@ -22,6 +24,8 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { this.onBackPressed, this.additionalActions, this.leading, + this.hasBack = false, + this.centerTitle = false, }); @override @@ -32,6 +36,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { elevation: 0, excludeHeaderSemantics: true, scrolledUnderElevation: 0, + centerTitle: centerTitle, titleTextStyle: titleTextStyle ?? AppFonts.yekan16.copyWith(color:Colors.white), @@ -43,14 +48,18 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { ) : null, actions: [ if (additionalActions != null) ...additionalActions!, - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: IconButton( - onPressed: onBackPressed ?? () => Get.back(), - icon: const Icon(CupertinoIcons.chevron_back), - color: iconColor, + if(hasBack)...{ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: IconButton( + onPressed: onBackPressed ?? () => Get.back(), + icon: const Icon(CupertinoIcons.chevron_back), + color: iconColor, + ), ), - ), + } + + ], ); diff --git a/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart b/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart index 07f98f4..b5c569e 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart @@ -60,16 +60,17 @@ class BottomNavigation1Item extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - vecWidget( - icon, - width: 32, - height: 32, - color: isSelected ? AppColor.blueNormal : Colors.white, + SvgGenImage.vec(icon).svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode( + isSelected ? AppColor.blueNormal : Colors.white, + BlendMode.srcIn) ), const SizedBox(height: 5), Text( label, - style: AppFonts.yekan14.copyWith( + style: AppFonts.yekan10.copyWith( color: isSelected ? AppColor.blueNormal : Colors.white, ), ), diff --git a/packages/core/lib/presentation/widget/chips/r_chips.dart b/packages/core/lib/presentation/widget/chips/r_chips.dart new file mode 100644 index 0000000..a7f7d02 --- /dev/null +++ b/packages/core/lib/presentation/widget/chips/r_chips.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class CustomChip extends StatelessWidget { + final bool isSelected; + final String title; + final int index; + final Function(int) onTap; + final Color selectedColor; + final Color unSelectedColor; + + const CustomChip({ + super.key, + this.isSelected = false, + required this.title, + required this.index, + required this.onTap, + this.selectedColor = AppColor.blueNormal, + this.unSelectedColor = AppColor.whiteGreyNormal, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => onTap.call(index), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: isSelected ? selectedColor : unSelectedColor, + borderRadius: BorderRadius.circular(8), + border: + isSelected + ? Border.fromBorderSide(BorderSide.none) + : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + ), + child: Text( + title, + textAlign: TextAlign.center, + style: + isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) + : AppFonts.yekan10, + ), + ), + ); + } +} + +class RFilterChips extends StatelessWidget { + const RFilterChips({ + super.key, + this.isSelected = false, + required this.title, + required this.index, + required this.onTap, + this.selectedColor = AppColor.blueNormal, + this.unSelectedColor = AppColor.whiteGreyNormal, + }); + + final bool isSelected; + final String title; + final int index; + final Function(int) onTap; + final Color selectedColor; + final Color unSelectedColor; + + @override + Widget build(BuildContext context) { + return FilterChip( + labelStyle: isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.mediumGreyDarkActive) + : AppFonts.yekan10, + label: Text( + title, + textAlign: TextAlign.center), + deleteIconColor: Colors.red, + selected: isSelected, + selectedColor: selectedColor, + onSelected: (bool selected) { + onTap.call(index); + }, + ); + } +} diff --git a/packages/core/lib/presentation/widget/map/logic.dart b/packages/core/lib/presentation/widget/map/logic.dart index 40b1aa4..4435248 100644 --- a/packages/core/lib/presentation/widget/map/logic.dart +++ b/packages/core/lib/presentation/widget/map/logic.dart @@ -1,5 +1,83 @@ +import 'dart:async'; + +import 'package:flutter/animation.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:flutter_map_animations/flutter_map_animations.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; +import 'package:latlong2/latlong.dart'; -class MapLogic extends GetxController { +class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { + Rx currentLocation = LatLng(35.824891, 50.948025).obs; + String tileType = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'; + RxList markers = [].obs; + RxList allMarkers = [].obs; + Rx mapController = MapController().obs; + + late final AnimatedMapController animatedMapController; + Timer? _debounceTimer; + RxBool isLoading = false.obs; + + @override + void onInit() { + super.onInit(); + animatedMapController = AnimatedMapController( + vsync: this, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + cancelPreviousAnimations: true, + ); + determineCurrentPosition(); + } + + @override + void onClose() { + super.onClose(); + animatedMapController.dispose(); + mapController.close(); + } + + Future determineCurrentPosition() async { + final position = await Geolocator.getCurrentPosition( + locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), + ); + final latLng = LatLng(position.latitude, position.longitude); + + currentLocation.value = latLng; + markers.add(latLng); + animatedMapController.animateTo( + dest: latLng, + zoom: 18, + curve: Curves.easeInOut, + duration: const Duration(milliseconds: 1500), + ); + } + + void debouncedUpdateVisibleMarkers({required LatLng center}) { + _debounceTimer?.cancel(); + _debounceTimer = Timer(const Duration(milliseconds: 300), () { + final filtered = filterNearbyMarkers({ + 'markers': allMarkers, + 'centerLat': center.latitude, + 'centerLng': center.longitude, + 'radius': 1000.0, + }); + + markers.addAll(filtered); + }); + } + + List filterNearbyMarkers(Map args) { + final List rawMarkers = args['markers']; + final double centerLat = args['centerLat']; + final double centerLng = args['centerLng']; + final double radiusInMeters = args['radius']; + final center = LatLng(centerLat, centerLng); + final distance = Distance(); + + return rawMarkers + .where((marker) => distance(center, marker) <= radiusInMeters) + .toList(); + } } diff --git a/packages/core/lib/presentation/widget/map/view.dart b/packages/core/lib/presentation/widget/map/view.dart index f71f1e0..aa9e2cf 100644 --- a/packages/core/lib/presentation/widget/map/view.dart +++ b/packages/core/lib/presentation/widget/map/view.dart @@ -1,13 +1,76 @@ import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; import 'package:get/get.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/assets.gen.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; -class MapPage extends GetView { - const MapPage({super.key}); +class MapWidget extends GetView { + const MapWidget({super.key}); @override Widget build(BuildContext context) { - return Container(); + return Stack( + children: [_buildMap(), _buildGpsButton(), _buildFilterButton()], + ); + } + + Widget _buildMap() { + return ObxValue((currentLocation) { + return FlutterMap( + mapController: controller.animatedMapController.mapController, + options: MapOptions( + initialCenter: currentLocation.value, + initialZoom: 18, + onPositionChanged: (camera, hasGesture) { + controller.debouncedUpdateVisibleMarkers(center: camera.center); + }, + ), + children: [ + TileLayer(urlTemplate: controller.tileType), + /* ObxValue((markers) { + return MarkerLayer( + markers: + markers + .map((e) => markerWidget(marker: e, onTap: () {})) + .toList(), + ); + }, controller.markers),*/ + ], + ); + }, controller.currentLocation); + } + + Widget _buildGpsButton() { + return Positioned( + right: 10, + bottom: 83, + child: ObxValue((data) { + return RFab.small( + backgroundColor: AppColor.greenNormal, + isLoading: data.value, + icon: Assets.vec.gpsSvg.svg(), + onPressed: () async { + controller.isLoading.value = true; + await controller.determineCurrentPosition(); + controller.isLoading.value = false; + }, + ); + }, controller.isLoading), + ); + } + + Widget _buildFilterButton() { + return Positioned( + right: 10, + bottom: 30, + child: RFab.small( + backgroundColor: AppColor.blueNormal, + icon: Assets.vec.filterSvg.svg(width: 24, height: 24), + onPressed: () {}, + ), + ); } } diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 0f3dc7b..546efec 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -15,3 +15,4 @@ export 'tabs/new_tab.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; export 'card/card_with_icon_with_border.dart'; +export 'chips/r_chips.dart'; diff --git a/packages/livestock/lib/presentation/page/action/view.dart b/packages/livestock/lib/presentation/page/action/view.dart index 3068f47..2f7dfac 100644 --- a/packages/livestock/lib/presentation/page/action/view.dart +++ b/packages/livestock/lib/presentation/page/action/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; + import 'logic.dart'; class ActionPage extends GetView { @@ -7,6 +8,211 @@ class ActionPage extends GetView { @override Widget build(BuildContext context) { - return Container(); + return Scaffold( + appBar: RAppBar( + title: 'لیست درخواست‌ها', + hasBack: false, + centerTitle: true, + ), + body: Column( + children: [ + SizedBox(height: 16), + _searchWidget(), + SizedBox(height: 16), + SizedBox( + height: 50, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 12), + child: Row( + spacing: 12, + children: [ + CustomChip( + title: 'انتخاب فیلتر', + index: 0, + isSelected: true, + selectedColor: AppColor.blueNormal, + onTap: (index) {}, + ), + + RFilterChips( + title: 'درخواست‌های من', + index: 1, + isSelected: true, + selectedColor: AppColor.yellowNormal, + onTap: (index) {}, + ), + + RFilterChips( + title: 'در انتظار ثبت ', + index: 2, + selectedColor: AppColor.greenLightActive, + isSelected: true, + onTap: (index) {}, + ), + + RFilterChips( + title: 'ارجاع به تعاونی', + index: 3, + selectedColor: AppColor.blueLightHover, + isSelected: true, + onTap: (index) {}, + ), + ], + ), + ), + ), + SizedBox(height: 10), + Expanded( + child: ListView.separated( + itemCount: 10, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + separatorBuilder: (context, index) => SizedBox(height: 16), + itemBuilder: (context, index) { + return Container( + width: Get.width, + height: 75, + decoration: BoxDecoration( + color: + index < 3 + ? AppColor.yellowNormal + : index < 7 + ? AppColor.greenLightActive + : AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + SizedBox(width: 5), + Expanded( + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + ), + child: Row( + children: [ + SizedBox(width: 10), + Text( + 'محمد احمدی', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + fontWeight: FontWeight.w600, + ), + ), + SizedBox(width: 20), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + Text( + 'پنج شنبه 14 اردیبهشت', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + color: AppColor.darkGreyNormal, + ), + ), + Text( + ' همدان - نهاوند - روستای - همدان - نهاوند - روستای ', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + color: AppColor.darkGreyNormal, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ], + ), + ), + SizedBox(width: 20), + GestureDetector( + onTap: () { + // controller.onTapMap(); + }, + child: SizedBox( + width: 50, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Assets.vec.mapSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + SizedBox(height: 8), + Text( + 'مسیریابی', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + ), + + SizedBox(width: 20), + ], + ), + ), + ), + + Container( + width: 20, + child: Center( + child: RotatedBox( + quarterTurns: 3, + child: Text( + index < 3 + ? ' بازرسی' + : index < 7 + ? 'اطلاعات' + : 'ارجاع به تعاونی', + style: AppFonts.yekan8, + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + ); + }, + ), + ), + ], + ), + ); + } + + Widget _searchWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + onChanged: (value) { + //controller.search(value); + }, + controller: TextEditingController(), + ), + ); } } diff --git a/packages/livestock/lib/presentation/page/map/logic.dart b/packages/livestock/lib/presentation/page/map/logic.dart index 73d5b78..c54ed07 100644 --- a/packages/livestock/lib/presentation/page/map/logic.dart +++ b/packages/livestock/lib/presentation/page/map/logic.dart @@ -2,4 +2,7 @@ import 'package:rasadyar_core/core.dart'; class MapLogic extends GetxController { + + + } diff --git a/packages/livestock/lib/presentation/page/map/view.dart b/packages/livestock/lib/presentation/page/map/view.dart index 0bb76db..d05b39f 100644 --- a/packages/livestock/lib/presentation/page/map/view.dart +++ b/packages/livestock/lib/presentation/page/map/view.dart @@ -1,14 +1,22 @@ import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' as mt; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/map/view.dart'; + + import 'logic.dart'; class MapPage extends GetView { MapPage({super.key}); - - @override Widget build(BuildContext context) { - return Container(); + return Scaffold( + body: Stack( + children: [ + MapWidget(), + ], + ), + ); } -} +} \ No newline at end of file diff --git a/packages/livestock/lib/presentation/page/root/logic.dart b/packages/livestock/lib/presentation/page/root/logic.dart index c6aceec..843ec7b 100644 --- a/packages/livestock/lib/presentation/page/root/logic.dart +++ b/packages/livestock/lib/presentation/page/root/logic.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_livestock/presentation/page/profile/view.dart'; class RootLogic extends GetxController { List pages = [ActionPage(), MapPage(), ProfilePage()]; - RxInt indexedPage = 1.obs; + RxInt currentIndex = 1.obs; @override void onReady() { @@ -19,4 +19,7 @@ class RootLogic extends GetxController { // TODO: implement onClose super.onClose(); } + + void changePage(int i) => currentIndex.value = i; + } diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart index 88d0fc3..ca4c3ff 100644 --- a/packages/livestock/lib/presentation/page/root/view.dart +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; + import 'logic.dart'; class RootPage extends GetView { @@ -7,14 +8,39 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - body: ObxValue((data) { - return IndexedStack( + return ObxValue((currentIndex) { + return Scaffold( + body: IndexedStack( children: controller.pages, - index: data.value, + index: currentIndex.value, sizing: StackFit.expand, - ); - }, controller.indexedPage), - ); + ), + + bottomNavigationBar: BottomNavigation1( + items: [ + BottomNavigation1Item( + icon: Assets.vec.filterSvg.path, + label: 'درخواست‌ها', + isSelected: currentIndex.value == 0, + onTap: () => controller.changePage(0), + ), + + BottomNavigation1Item( + icon: Assets.vec.mapSvg.path, + label: 'نقشه', + isSelected: currentIndex.value == 1, + onTap: () => controller.changePage(1), + ), + + BottomNavigation1Item( + icon: Assets.vec.profileUserSvg.path, + label: 'پروفایل', + isSelected: currentIndex.value == 2, + onTap: () => controller.changePage(2), + ), + ], + ), + ); + }, controller.currentIndex); } } diff --git a/packages/livestock/lib/presentation/routes/app_pages.dart b/packages/livestock/lib/presentation/routes/app_pages.dart index 3795a4b..6570bf8 100644 --- a/packages/livestock/lib/presentation/routes/app_pages.dart +++ b/packages/livestock/lib/presentation/routes/app_pages.dart @@ -1,10 +1,12 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/map/logic.dart'; import 'package:rasadyar_livestock/presentation/page/action/logic.dart'; import 'package:rasadyar_livestock/presentation/page/map/logic.dart'; import 'package:rasadyar_livestock/presentation/page/profile/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/view.dart'; + part 'app_routes.dart'; sealed class LiveStockPages { @@ -21,6 +23,8 @@ sealed class LiveStockPages { Get.lazyPut(() => ActionLogic()); Get.lazyPut(() => MapLogic()); Get.lazyPut(() => ProfileLogic()); + Get.lazyPut(() => ProfileLogic()); + Get.lazyPut(() => MapWidgetLogic()); }), ), ]; diff --git a/tools/vecGeneratoe.sh b/tools/vecGeneratoe.sh index 1b84fb3..4c6cf89 100644 --- a/tools/vecGeneratoe.sh +++ b/tools/vecGeneratoe.sh @@ -11,8 +11,8 @@ PACKAGE_ABS_PATH="$SCRIPT_DIR/$PACKAGE_PATH" echo "🗃️ package path: $PACKAGE_ABS_PATH" # Directory to read files from -sourcePath="$PACKAGE_ABS_PATH/assets/icons" -targetPath="$PACKAGE_ABS_PATH/assets/vec" +sourcePath="../assets/icons" +targetPath="../assets/vec" echo "🗃️ sourcePath path: $sourcePath" echo "🗃️ targetPath path: $targetPath" From 10cb9d1f521947328b96b60b11be60f7086c5e3f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 24 May 2025 09:15:26 +0330 Subject: [PATCH 075/256] fix : map permission and marker --- .../lib/presentation/widget/map/logic.dart | 70 +++++++++- .../lib/presentation/widget/map/view.dart | 121 +++++++++++++++++- 2 files changed, 187 insertions(+), 4 deletions(-) diff --git a/packages/core/lib/presentation/widget/map/logic.dart b/packages/core/lib/presentation/widget/map/logic.dart index 4435248..0824b14 100644 --- a/packages/core/lib/presentation/widget/map/logic.dart +++ b/packages/core/lib/presentation/widget/map/logic.dart @@ -6,6 +6,9 @@ import 'package:flutter_map_animations/flutter_map_animations.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; import 'package:latlong2/latlong.dart'; +import 'package:rasadyar_core/utils/logger_utils.dart'; + +enum ErrorLocationType { serviceDisabled, permissionDenied, none } class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { Rx currentLocation = LatLng(35.824891, 50.948025).obs; @@ -14,7 +17,7 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { RxList markers = [].obs; RxList allMarkers = [].obs; Rx mapController = MapController().obs; - + RxList errorLocationType = RxList(); late final AnimatedMapController animatedMapController; Timer? _debounceTimer; RxBool isLoading = false.obs; @@ -28,6 +31,30 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { curve: Curves.easeInOut, cancelPreviousAnimations: true, ); + locationServiceEnabled().then((value) { + if (!value) { + errorLocationType.add(ErrorLocationType.serviceDisabled); + } + }); + + checkPermission().then((value) { + if (!value) { + errorLocationType.add(ErrorLocationType.permissionDenied); + } + }); + + listenToLocationServiceStatus().listen((event) { + if (!event) { + errorLocationType.add(ErrorLocationType.serviceDisabled); + } else { + errorLocationType.remove(ErrorLocationType.serviceDisabled); + } + }); + } + + @override + void onReady() { + super.onReady(); determineCurrentPosition(); } @@ -38,6 +65,47 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { mapController.close(); } + Stream listenToLocationServiceStatus() { + return Geolocator.getServiceStatusStream().map((status) { + return status == ServiceStatus.enabled; + }); + } + + Future locationServiceEnabled() async { + bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + return false; + } + return true; + } + + Future checkPermission({bool request = false}) async { + try { + final LocationPermission permission = await Geolocator.checkPermission(); + + switch (permission) { + case LocationPermission.denied: + final LocationPermission requestResult = + await Geolocator.requestPermission(); + return requestResult != LocationPermission.denied && + requestResult != LocationPermission.deniedForever; + + case LocationPermission.deniedForever: + return request ? await Geolocator.openAppSettings() : false; + + case LocationPermission.always: + case LocationPermission.whileInUse: + return true; + + default: + return false; + } + } catch (e) { + eLog(e); + return await Geolocator.openLocationSettings(); + } + } + Future determineCurrentPosition() async { final position = await Geolocator.getCurrentPosition( locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), diff --git a/packages/core/lib/presentation/widget/map/view.dart b/packages/core/lib/presentation/widget/map/view.dart index aa9e2cf..8fe6cc2 100644 --- a/packages/core/lib/presentation/widget/map/view.dart +++ b/packages/core/lib/presentation/widget/map/view.dart @@ -1,9 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; +import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; import 'package:rasadyar_core/presentation/common/assets.gen.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/elevated.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/outline_elevated.dart'; import 'logic.dart'; @@ -13,7 +18,99 @@ class MapWidget extends GetView { @override Widget build(BuildContext context) { return Stack( - children: [_buildMap(), _buildGpsButton(), _buildFilterButton()], + children: [ + ObxValue((errorType) { + if (errorType.isNotEmpty) { + if (errorType.contains(ErrorLocationType.serviceDisabled)) { + Future.microtask(() { + Get.defaultDialog( + title: 'خطا', + content: const Text('سرویس مکان‌یابی غیرفعال است'), + cancel: ROutlinedElevated( + text: 'بررسی مجدد', + width: 120, + textStyle: AppFonts.yekan16, + onPressed: () async { + var service = await controller.locationServiceEnabled(); + if (service) { + controller.errorLocationType.remove( + ErrorLocationType.serviceDisabled, + ); + Get.back(); + } + // Don't call Get.back() if service is still disabled + }, + ), + confirm: RElevated( + text: 'روشن کردن', + textStyle: AppFonts.yekan16, + width: 120, + onPressed: () async { + var res = await Geolocator.openLocationSettings(); + if (res) { + var service = + await controller.locationServiceEnabled(); + if (service) { + controller.errorLocationType.remove( + ErrorLocationType.serviceDisabled, + ); + Get.back(); + } + } + }, + ), + + contentPadding: EdgeInsets.all(8), + onWillPop: () async { + return controller.errorLocationType.isEmpty; + }, + barrierDismissible: false, + ); + }); + } else { + Future.microtask(() { + Get.defaultDialog( + title: 'خطا', + content: const Text( + ' دسترسی به سرویس مکان‌یابی غیرفعال است', + ), + cancel: ROutlinedElevated( + text: 'بررسی مجدد', + width: 120, + textStyle: AppFonts.yekan16, + onPressed: () async { + await controller.checkPermission(); + }, + ), + confirm: RElevated( + text: 'اجازه دادن', + textStyle: AppFonts.yekan16, + width: 120, + onPressed: () async { + var res = await controller.checkPermission( + request: true, + ); + if (res) { + controller.errorLocationType.remove( + ErrorLocationType.permissionDenied, + ); + Get.back(); + } + }, + ), + + contentPadding: EdgeInsets.all(8), + onWillPop: () async { + return controller.errorLocationType.isEmpty; + }, + barrierDismissible: false, + ); + }); + } + } + return const SizedBox.shrink(); + }, controller.errorLocationType), + _buildMap(), _buildGpsButton(), _buildFilterButton()], ); } @@ -30,14 +127,14 @@ class MapWidget extends GetView { ), children: [ TileLayer(urlTemplate: controller.tileType), - /* ObxValue((markers) { + ObxValue((markers) { return MarkerLayer( markers: markers .map((e) => markerWidget(marker: e, onTap: () {})) .toList(), ); - }, controller.markers),*/ + }, controller.markers), ], ); }, controller.currentLocation); @@ -73,4 +170,22 @@ class MapWidget extends GetView { ), ); } + + Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + return Marker( + point: marker, + child: GestureDetector( + onTap: onTap, + behavior: HitTestBehavior.opaque, + child: SizedBox( + width: 36, + height: 36, + child:Assets.vec.mapMarkerSvg.svg( + width: 30, + height: 30, + ) + ), + ), + ); + } } From 276c8dd1fe59e23a2c8420d2f045c4c84f49f085 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 24 May 2025 15:12:40 +0330 Subject: [PATCH 076/256] feat : request tagging and fix chips and fix overflow module in auht --- .../card/card_with_icon_with_border.dart | 2 +- .../presentation/widget/chips/r_chips.dart | 33 ++- .../lib/presentation/page/action/logic.dart | 5 - .../lib/presentation/page/action/view.dart | 218 --------------- .../page/request_tagging/logic.dart | 16 ++ .../page/request_tagging/view.dart | 46 ++++ .../lib/presentation/page/requests/logic.dart | 7 + .../lib/presentation/page/requests/view.dart | 255 ++++++++++++++++++ .../lib/presentation/page/root/logic.dart | 24 +- .../lib/presentation/page/root/view.dart | 83 ++++-- .../lib/presentation/routes/app_pages.dart | 18 +- .../lib/presentation/routes/app_routes.dart | 7 +- 12 files changed, 450 insertions(+), 264 deletions(-) delete mode 100644 packages/livestock/lib/presentation/page/action/logic.dart delete mode 100644 packages/livestock/lib/presentation/page/action/view.dart create mode 100644 packages/livestock/lib/presentation/page/request_tagging/logic.dart create mode 100644 packages/livestock/lib/presentation/page/request_tagging/view.dart create mode 100644 packages/livestock/lib/presentation/page/requests/logic.dart create mode 100644 packages/livestock/lib/presentation/page/requests/view.dart diff --git a/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart b/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart index 510f146..ca7d2b6 100644 --- a/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart +++ b/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart @@ -23,7 +23,7 @@ class CardIcon extends StatelessWidget { side: const BorderSide(color: AppColor.blueNormal, width: 1), ), child: Container( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), color: Colors.white, diff --git a/packages/core/lib/presentation/widget/chips/r_chips.dart b/packages/core/lib/presentation/widget/chips/r_chips.dart index a7f7d02..7788061 100644 --- a/packages/core/lib/presentation/widget/chips/r_chips.dart +++ b/packages/core/lib/presentation/widget/chips/r_chips.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; @@ -55,7 +56,7 @@ class RFilterChips extends StatelessWidget { required this.index, required this.onTap, this.selectedColor = AppColor.blueNormal, - this.unSelectedColor = AppColor.whiteGreyNormal, + this.unSelectedColor = AppColor.whiteGreyDark, }); final bool isSelected; @@ -66,7 +67,7 @@ class RFilterChips extends StatelessWidget { final Color unSelectedColor; @override - Widget build(BuildContext context) { + /* Widget build(BuildContext context) { return FilterChip( labelStyle: isSelected ? AppFonts.yekan10.copyWith(color: AppColor.mediumGreyDarkActive) @@ -74,12 +75,38 @@ class RFilterChips extends StatelessWidget { label: Text( title, textAlign: TextAlign.center), - deleteIconColor: Colors.red, selected: isSelected, + showCheckmark: false, // مخفی‌کردن چک‌مارک پیش‌فرض + avatar: isSelected + ? Icon( + Icons.star, // آیکون دلخواه به‌جای چک‌مارک + size: 18, + color: Colors.orange, + ) + : null, selectedColor: selectedColor, onSelected: (bool selected) { onTap.call(index); }, ); + }*/ + Widget build(BuildContext context) { + return RawChip( + label: Text(title), + labelStyle: isSelected + ? AppFonts.yekan10.copyWith(color: AppColor.mediumGreyDarkActive) + : AppFonts.yekan10, + selected: isSelected, + onSelected: (bool selected) => onTap(index), + backgroundColor: Colors.grey[200], + selectedColor: selectedColor, + showCheckmark: false, + shape: RoundedRectangleBorder( + borderRadius: const BorderRadius.all(Radius.circular(8.0)), + side: BorderSide(width: 1, color: isSelected? selectedColor :unSelectedColor), + ), + deleteIcon: Icon(CupertinoIcons.clear_circled), + onDeleted: isSelected ? () => onTap(index) : null, + ); } } diff --git a/packages/livestock/lib/presentation/page/action/logic.dart b/packages/livestock/lib/presentation/page/action/logic.dart deleted file mode 100644 index e540e8c..0000000 --- a/packages/livestock/lib/presentation/page/action/logic.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:rasadyar_core/core.dart'; - -class ActionLogic extends GetxController { - -} diff --git a/packages/livestock/lib/presentation/page/action/view.dart b/packages/livestock/lib/presentation/page/action/view.dart deleted file mode 100644 index 2f7dfac..0000000 --- a/packages/livestock/lib/presentation/page/action/view.dart +++ /dev/null @@ -1,218 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class ActionPage extends GetView { - ActionPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: RAppBar( - title: 'لیست درخواست‌ها', - hasBack: false, - centerTitle: true, - ), - body: Column( - children: [ - SizedBox(height: 16), - _searchWidget(), - SizedBox(height: 16), - SizedBox( - height: 50, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 12), - child: Row( - spacing: 12, - children: [ - CustomChip( - title: 'انتخاب فیلتر', - index: 0, - isSelected: true, - selectedColor: AppColor.blueNormal, - onTap: (index) {}, - ), - - RFilterChips( - title: 'درخواست‌های من', - index: 1, - isSelected: true, - selectedColor: AppColor.yellowNormal, - onTap: (index) {}, - ), - - RFilterChips( - title: 'در انتظار ثبت ', - index: 2, - selectedColor: AppColor.greenLightActive, - isSelected: true, - onTap: (index) {}, - ), - - RFilterChips( - title: 'ارجاع به تعاونی', - index: 3, - selectedColor: AppColor.blueLightHover, - isSelected: true, - onTap: (index) {}, - ), - ], - ), - ), - ), - SizedBox(height: 10), - Expanded( - child: ListView.separated( - itemCount: 10, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - separatorBuilder: (context, index) => SizedBox(height: 16), - itemBuilder: (context, index) { - return Container( - width: Get.width, - height: 75, - decoration: BoxDecoration( - color: - index < 3 - ? AppColor.yellowNormal - : index < 7 - ? AppColor.greenLightActive - : AppColor.blueLight, - borderRadius: BorderRadius.circular(8), - ), - child: Row( - children: [ - SizedBox(width: 5), - Expanded( - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topRight: Radius.circular(8), - bottomRight: Radius.circular(8), - ), - ), - child: Row( - children: [ - SizedBox(width: 10), - Text( - 'محمد احمدی', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.blueNormal, - fontWeight: FontWeight.w600, - ), - ), - SizedBox(width: 20), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - - children: [ - Text( - 'پنج شنبه 14 اردیبهشت', - textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.darkGreyNormal, - ), - ), - Text( - ' همدان - نهاوند - روستای - همدان - نهاوند - روستای ', - textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.darkGreyNormal, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - ], - ), - ), - SizedBox(width: 20), - GestureDetector( - onTap: () { - // controller.onTapMap(); - }, - child: SizedBox( - width: 50, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Assets.vec.mapSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - SizedBox(height: 8), - Text( - 'مسیریابی', - textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - ), - - SizedBox(width: 20), - ], - ), - ), - ), - - Container( - width: 20, - child: Center( - child: RotatedBox( - quarterTurns: 3, - child: Text( - index < 3 - ? ' بازرسی' - : index < 7 - ? 'اطلاعات' - : 'ارجاع به تعاونی', - style: AppFonts.yekan8, - textAlign: TextAlign.center, - ), - ), - ), - ), - ], - ), - ); - }, - ), - ), - ], - ), - ); - } - - Widget _searchWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: RTextField( - suffixIcon: Padding( - padding: const EdgeInsets.all(12.0), - child: Assets.vec.searchSvg.svg( - width: 10, - height: 10, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - hintText: 'جستجو', - onChanged: (value) { - //controller.search(value); - }, - controller: TextEditingController(), - ), - ); - } -} diff --git a/packages/livestock/lib/presentation/page/request_tagging/logic.dart b/packages/livestock/lib/presentation/page/request_tagging/logic.dart new file mode 100644 index 0000000..ee5f9ee --- /dev/null +++ b/packages/livestock/lib/presentation/page/request_tagging/logic.dart @@ -0,0 +1,16 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; + +class RequestTaggingLogic extends GetxController { + + + @override + void onReady() { + super.onReady(); + } + + @override + void onClose() { + super.onClose(); + } +} diff --git a/packages/livestock/lib/presentation/page/request_tagging/view.dart b/packages/livestock/lib/presentation/page/request_tagging/view.dart new file mode 100644 index 0000000..67d773a --- /dev/null +++ b/packages/livestock/lib/presentation/page/request_tagging/view.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class RequestTaggingPage extends GetView { + const RequestTaggingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Request Tagging'), + centerTitle: true, + actions: [ + IconButton( + icon: const Icon(Icons.search), + onPressed: () { + // Implement search functionality + }, + ), + ], + ), + body: Column( + children: [ + const SizedBox(height: 16), + + const SizedBox(height: 16), + Expanded( + child: ListView.builder( + itemCount: 10, // Replace with your data length + itemBuilder: (context, index) { + return ListTile( + title: Text('Request Item $index'), + onTap: () { + // Handle item tap + }, + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/packages/livestock/lib/presentation/page/requests/logic.dart b/packages/livestock/lib/presentation/page/requests/logic.dart new file mode 100644 index 0000000..9cb9154 --- /dev/null +++ b/packages/livestock/lib/presentation/page/requests/logic.dart @@ -0,0 +1,7 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; + +class RequestsLogic extends GetxController { + RxList filterSelected = [].obs; + +} diff --git a/packages/livestock/lib/presentation/page/requests/view.dart b/packages/livestock/lib/presentation/page/requests/view.dart new file mode 100644 index 0000000..966ea7c --- /dev/null +++ b/packages/livestock/lib/presentation/page/requests/view.dart @@ -0,0 +1,255 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; + +import 'logic.dart'; + +class RequestsPage extends GetView { + RequestsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: RAppBar( + title: 'لیست درخواست‌ها', + hasBack: false, + centerTitle: true, + ), + body: Column( + children: [ + SizedBox(height: 16), + _searchWidget(), + SizedBox(height: 16), + SizedBox( + height: 50, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 12), + child: ObxValue((data) { + return Row( + spacing: 12, + children: [ + CustomChip( + title: 'انتخاب فیلتر', + index: 0, + isSelected: true, + selectedColor: AppColor.blueNormal, + onTap: (index) {}, + ), + + RFilterChips( + title: 'درخواست‌های من', + index: 1, + isSelected: data.contains(1), + selectedColor: AppColor.yellowNormal, + onTap: (index) { + if (data.contains(1)) { + data.remove(1); + } else { + data.add(1); + } + }, + ), + + RFilterChips( + title: 'در انتظار ثبت ', + index: 2, + selectedColor: AppColor.greenLightActive, + isSelected: data.contains(2), + onTap: (index) { + if (data.contains(2)) { + data.remove(2); + } else { + data.add(2); + } + }, + ), + + RFilterChips( + title: 'ارجاع به تعاونی', + index: 3, + selectedColor: AppColor.blueLightHover, + isSelected: data.contains(3), + onTap: (index) { + if (data.contains(3)) { + data.remove(3); + } else { + data.add(3); + } + }, + ), + ], + ); + }, controller.filterSelected), + ), + ), + SizedBox(height: 10), + Expanded( + child: ListView.separated( + itemCount: 10, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + separatorBuilder: (context, index) => SizedBox(height: 16), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Get.toNamed(LiveStockRoutes.requestTagging,id: 0); + }, + child: Container( + width: Get.width, + height: 75, + decoration: BoxDecoration( + color: + index < 3 + ? AppColor.yellowNormal + : index < 7 + ? AppColor.greenLightActive + : AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + SizedBox(width: 5), + Expanded( + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + ), + child: Row( + children: [ + SizedBox(width: 10), + Text( + 'محمد احمدی', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + fontWeight: FontWeight.w600, + ), + ), + SizedBox(width: 20), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + Text( + 'پنج شنبه 14 اردیبهشت', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + color: AppColor.darkGreyNormal, + ), + ), + Text( + ' همدان - نهاوند - روستای - همدان - نهاوند - روستای ', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + color: AppColor.darkGreyNormal, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ], + ), + ), + SizedBox(width: 20), + GestureDetector( + onTap: () { + // controller.onTapMap(); + }, + child: SizedBox( + width: 50, + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Assets.vec.mapSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + SizedBox(height: 8), + Text( + 'مسیریابی', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + ), + + SizedBox(width: 20), + ], + ), + ), + ), + + Container( + width: 20, + child: Center( + child: RotatedBox( + quarterTurns: 3, + child: Text( + index < 3 + ? ' بازرسی' + : index < 7 + ? 'اطلاعات' + : 'ارجاع به تعاونی', + style: AppFonts.yekan8, + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ), + RElevated( + text: '+ ایجاد درخواست', + width: Get.width - 36, + height: 40, + textStyle: AppFonts.yekan18.copyWith(color: Colors.white), + onPressed: () { + //TODO + }, + ), + SizedBox(height: 10), + ], + ), + ); + } + + Widget _searchWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + onChanged: (value) { + //controller.search(value); + }, + controller: TextEditingController(), + ), + ); + } +} diff --git a/packages/livestock/lib/presentation/page/root/logic.dart b/packages/livestock/lib/presentation/page/root/logic.dart index 843ec7b..0aed723 100644 --- a/packages/livestock/lib/presentation/page/root/logic.dart +++ b/packages/livestock/lib/presentation/page/root/logic.dart @@ -1,11 +1,30 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_livestock/presentation/page/action/view.dart'; import 'package:rasadyar_livestock/presentation/page/map/view.dart'; import 'package:rasadyar_livestock/presentation/page/profile/view.dart'; +import 'package:rasadyar_livestock/presentation/page/request_tagging/view.dart'; +import 'package:rasadyar_livestock/presentation/page/requests/view.dart'; +import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; class RootLogic extends GetxController { - List pages = [ActionPage(), MapPage(), ProfilePage()]; + List pages = [ + Navigator( + key: Get.nestedKey(0), + initialRoute: LiveStockRoutes.requests, + onGenerateRoute: (settings) { + switch (settings.name) { + case LiveStockRoutes.requests: + return GetPageRoute(page: () => RequestsPage()); + case LiveStockRoutes.requestTagging: + return GetPageRoute(page: () => RequestTaggingPage()); + default: + return GetPageRoute(page: () => RequestsPage()); + } + }, + ), + MapPage(), + ProfilePage(), + ]; RxInt currentIndex = 1.obs; @override @@ -21,5 +40,4 @@ class RootLogic extends GetxController { } void changePage(int i) => currentIndex.value = i; - } diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart index ca4c3ff..879add1 100644 --- a/packages/livestock/lib/presentation/page/root/view.dart +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -9,36 +9,65 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { return ObxValue((currentIndex) { - return Scaffold( - body: IndexedStack( - children: controller.pages, - index: currentIndex.value, - sizing: StackFit.expand, - ), + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + final navigatorKey = Get.nestedKey(currentIndex); + eLog('Pop invoked with result: $result, didPop: $didPop'); + navigatorKey?.currentState?.pop(); - bottomNavigationBar: BottomNavigation1( - items: [ - BottomNavigation1Item( - icon: Assets.vec.filterSvg.path, - label: 'درخواست‌ها', - isSelected: currentIndex.value == 0, - onTap: () => controller.changePage(0), - ), - BottomNavigation1Item( - icon: Assets.vec.mapSvg.path, - label: 'نقشه', - isSelected: currentIndex.value == 1, - onTap: () => controller.changePage(1), - ), + /*eLog('Pop invoked with result: $result, didPop: $didPop'); + iLog(Get.currentRoute); + iLog(Get.previousRoute); - BottomNavigation1Item( - icon: Assets.vec.profileUserSvg.path, - label: 'پروفایل', - isSelected: currentIndex.value == 2, - onTap: () => controller.changePage(2), - ), - ], + final navigatorKey = Get.nestedKey(currentIndex); + + if (currentIndex.value == 0 && + navigatorKey != null && + navigatorKey.currentState != null) { + if (navigatorKey.currentState!.canPop()) { + navigatorKey.currentState!.pop(); + return; + } + + if (!didPop) { + return; + } + }*/ + }, + + child: Scaffold( + body: IndexedStack( + children: controller.pages, + index: currentIndex.value, + sizing: StackFit.expand, + ), + + bottomNavigationBar: BottomNavigation1( + items: [ + BottomNavigation1Item( + icon: Assets.vec.filterSvg.path, + label: 'درخواست‌ها', + isSelected: currentIndex.value == 0, + onTap: () => controller.changePage(0), + ), + + BottomNavigation1Item( + icon: Assets.vec.mapSvg.path, + label: 'نقشه', + isSelected: currentIndex.value == 1, + onTap: () => controller.changePage(1), + ), + + BottomNavigation1Item( + icon: Assets.vec.profileUserSvg.path, + label: 'پروفایل', + isSelected: currentIndex.value == 2, + onTap: () => controller.changePage(2), + ), + ], + ), ), ); }, controller.currentIndex); diff --git a/packages/livestock/lib/presentation/routes/app_pages.dart b/packages/livestock/lib/presentation/routes/app_pages.dart index 6570bf8..b74d313 100644 --- a/packages/livestock/lib/presentation/routes/app_pages.dart +++ b/packages/livestock/lib/presentation/routes/app_pages.dart @@ -1,9 +1,11 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/map/logic.dart'; -import 'package:rasadyar_livestock/presentation/page/action/logic.dart'; import 'package:rasadyar_livestock/presentation/page/map/logic.dart'; import 'package:rasadyar_livestock/presentation/page/profile/logic.dart'; +import 'package:rasadyar_livestock/presentation/page/request_tagging/logic.dart'; +import 'package:rasadyar_livestock/presentation/page/request_tagging/view.dart'; +import 'package:rasadyar_livestock/presentation/page/requests/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/view.dart'; @@ -19,13 +21,23 @@ sealed class LiveStockPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.put(RootLogic()); - BindingsBuilder.put(() => RootLogic()); - Get.lazyPut(() => ActionLogic()); + Get.lazyPut(() => RequestsLogic()); Get.lazyPut(() => MapLogic()); Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => MapWidgetLogic()); }), + children: [ + GetPage( + name: LiveStockRoutes.requestTagging, + page: () => RequestTaggingPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => RequestTaggingLogic()); + }), + ), + ] ), + ]; } diff --git a/packages/livestock/lib/presentation/routes/app_routes.dart b/packages/livestock/lib/presentation/routes/app_routes.dart index 4c6eece..616d5ee 100644 --- a/packages/livestock/lib/presentation/routes/app_routes.dart +++ b/packages/livestock/lib/presentation/routes/app_routes.dart @@ -4,8 +4,7 @@ sealed class LiveStockRoutes { LiveStockRoutes._(); static const init = '/liveStock'; - static const action = '$init/liveStock'; - static const map = '$init/liveStock'; - static const profile = '$init/profile'; - + static const requests = '/requests'; + static const profile = '/profile'; + static const requestTagging = '$init/tagging'; } From 45778a986601dc05c8e15f0c050119a3a1223708 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 25 May 2025 16:54:43 +0330 Subject: [PATCH 077/256] feat : request and request tagging --- assets/icons/place_holder.svg | 1 + assets/images/place_holder.png | Bin 0 -> 23331 bytes lib/presentation/common/assets.dart | 80 ++++++ .../lib/presentation/common/assets.gen.dart | 9 +- .../widget/app_bar/r_app_bar.dart | 6 +- .../lib/presentation/widget/buttons/fab.dart | 81 ++---- .../widget/buttons/outline_elevated_icon.dart | 4 +- .../draggable_bottom_sheet2.dart | 74 ++++++ .../draggable_bottom_sheet_controller.dart | 7 +- .../widget/map/custom_marker.dart | 10 + .../lib/presentation/widget/map/logic.dart | 27 +- .../lib/presentation/widget/map/view.dart | 62 +++-- .../core/lib/presentation/widget/widget.dart | 1 + .../lib/presentation/page/map/logic.dart | 2 +- .../lib/presentation/page/map/view.dart | 18 +- .../page/request_tagging/logic.dart | 3 +- .../page/request_tagging/view.dart | 123 ++++++--- .../lib/presentation/page/requests/view.dart | 2 +- .../lib/presentation/page/root/view.dart | 6 +- .../lib/presentation/page/tagging/logic.dart | 15 ++ .../lib/presentation/page/tagging/view.dart | 239 ++++++++++++++++++ .../lib/presentation/routes/app_pages.dart | 25 +- .../lib/presentation/routes/app_routes.dart | 5 +- 23 files changed, 655 insertions(+), 145 deletions(-) create mode 100644 assets/icons/place_holder.svg create mode 100644 assets/images/place_holder.png create mode 100644 lib/presentation/common/assets.dart create mode 100644 packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart create mode 100644 packages/core/lib/presentation/widget/map/custom_marker.dart create mode 100644 packages/livestock/lib/presentation/page/tagging/logic.dart create mode 100644 packages/livestock/lib/presentation/page/tagging/view.dart diff --git a/assets/icons/place_holder.svg b/assets/icons/place_holder.svg new file mode 100644 index 0000000..cfd772b --- /dev/null +++ b/assets/icons/place_holder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/place_holder.png b/assets/images/place_holder.png new file mode 100644 index 0000000000000000000000000000000000000000..fe12c5a005e81ec1e5d1acb2da3ee323980a0a75 GIT binary patch literal 23331 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 literal 0 HcmV?d00001 diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart new file mode 100644 index 0000000..295cf2d --- /dev/null +++ b/lib/presentation/common/assets.dart @@ -0,0 +1,80 @@ +///This file is automatically generated. DO NOT EDIT, all your changes would be lost. +class Assets { + Assets._(); + + static const String iconsAdd = 'assets/icons/add.svg'; + static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; + static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg'; + static const String iconsCalendar = 'assets/icons/calendar.svg'; + static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; + static const String iconsCall = 'assets/icons/call.svg'; + static const String iconsDiagram = 'assets/icons/diagram.svg'; + static const String iconsDownload = 'assets/icons/download.svg'; + static const String iconsEdit = 'assets/icons/edit.svg'; + static const String iconsExcelDownload = 'assets/icons/excel_download.svg'; + static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsGps = 'assets/icons/gps.svg'; + static const String iconsInformation = 'assets/icons/information.svg'; + static const String iconsInspection = 'assets/icons/inspection.svg'; + static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsLiveStock = 'assets/icons/liveStock.svg'; + static const String iconsLogout = 'assets/icons/logout.svg'; + static const String iconsMap = 'assets/icons/map.svg'; + static const String iconsMapMarker = 'assets/icons/map_marker.svg'; + static const String iconsMessageAdd = 'assets/icons/message_add.svg'; + static const String iconsPdfDownload = 'assets/icons/pdf_download.svg'; + static const String iconsPictureFrame = 'assets/icons/picture_frame.svg'; + static const String iconsPlaceHolder = 'assets/icons/place_holder.svg'; + static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; + static const String iconsProfileUser = 'assets/icons/profile_user.svg'; + static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg'; + static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; + static const String iconsSearch = 'assets/icons/search.svg'; + static const String iconsSecurityTime = 'assets/icons/security_time.svg'; + static const String iconsSetting = 'assets/icons/setting.svg'; + static const String iconsTagUser = 'assets/icons/tag_user.svg'; + static const String iconsTrash = 'assets/icons/trash.svg'; + static const String iconsUser = 'assets/icons/user.svg'; + static const String iconsUserSquare = 'assets/icons/user_square.svg'; + static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; + static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; + static const String imagesPlaceHolder = 'assets/images/place_holder.png'; + static const String vecAddSvg = 'assets/vec/add.svg.vec'; + static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; + static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec'; + static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; + static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; + static const String vecCallSvg = 'assets/vec/call.svg.vec'; + static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; + static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; + static const String vecEditSvg = 'assets/vec/edit.svg.vec'; + static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec'; + static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; + static const String vecInformationSvg = 'assets/vec/information.svg.vec'; + static const String vecInspectionSvg = 'assets/vec/inspection.svg.vec'; + static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecLiveStockSvg = 'assets/vec/liveStock.svg.vec'; + static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; + static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; + static const String vecMapSvg = 'assets/vec/map.svg.vec'; + static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; + static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec'; + static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec'; + static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; + static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec'; + static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; + static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecSearchSvg = 'assets/vec/search.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; + static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; + static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec'; + static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; + static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec'; + static const String vecUserSvg = 'assets/vec/user.svg.vec'; + +} diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 815f89f..7604588 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -84,6 +84,9 @@ class $AssetsIconsGen { /// File path: assets/icons/picture_frame.svg SvgGenImage get pictureFrame => const SvgGenImage('assets/icons/picture_frame.svg'); + /// File path: assets/icons/place_holder.svg + SvgGenImage get placeHolder => const SvgGenImage('assets/icons/place_holder.svg'); + /// File path: assets/icons/profile_circle.svg SvgGenImage get profileCircle => const SvgGenImage('assets/icons/profile_circle.svg'); @@ -145,6 +148,7 @@ class $AssetsIconsGen { messageAdd, pdfDownload, pictureFrame, + placeHolder, profileCircle, profileUser, receiptDiscount, @@ -169,8 +173,11 @@ class $AssetsImagesGen { /// File path: assets/images/outter_splash.webp AssetGenImage get outterSplash => const AssetGenImage('assets/images/outter_splash.webp'); + /// File path: assets/images/place_holder.png + AssetGenImage get placeHolder => const AssetGenImage('assets/images/place_holder.png'); + /// List of all assets - List get values => [innerSplash, outterSplash]; + List get values => [innerSplash, outterSplash, placeHolder]; } class $AssetsVecGen { diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index 6db58bb..67bec05 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -13,6 +13,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { final TextStyle? titleTextStyle; final VoidCallback? onBackPressed; final List? additionalActions; + final int? leadingWidth; final Widget? leading; const RAppBar({ @@ -24,8 +25,9 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { this.onBackPressed, this.additionalActions, this.leading, - this.hasBack = false, + this.hasBack = true, this.centerTitle = false, + this.leadingWidth }); @override @@ -41,11 +43,13 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { titleTextStyle ?? AppFonts.yekan16.copyWith(color:Colors.white), title: Text(title), + leadingWidth: leadingWidth?.toDouble(), leading:leading!=null ? Padding( padding: const EdgeInsets.only(right: 16), child: leading, ) : null, + titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, if(hasBack)...{ diff --git a/packages/core/lib/presentation/widget/buttons/fab.dart b/packages/core/lib/presentation/widget/buttons/fab.dart index 200f0ab..3a33df7 100644 --- a/packages/core/lib/presentation/widget/buttons/fab.dart +++ b/packages/core/lib/presentation/widget/buttons/fab.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/utils/color_utils.dart'; + import '../../common/assets.gen.dart'; class RFab extends StatefulWidget { @@ -21,10 +22,7 @@ class RFab extends StatefulWidget { RFab.smallAdd({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 20, height: 20), backgroundColor: AppColor.greenNormal, key: key, ); @@ -32,10 +30,7 @@ class RFab extends StatefulWidget { RFab.add({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 40, height: 40), backgroundColor: AppColor.greenNormal, key: key, ); @@ -46,10 +41,7 @@ class RFab extends StatefulWidget { RFab.smallEdit({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -57,10 +49,7 @@ class RFab extends StatefulWidget { RFab.edit({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -71,10 +60,7 @@ class RFab extends StatefulWidget { RFab.smallDelete({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.trashSvg.svg(width: 20, height: 20), backgroundColor: AppColor.redNormal, key: key, ); @@ -82,10 +68,7 @@ class RFab extends StatefulWidget { RFab.delete({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.trashSvg.svg(width: 20, height: 20), backgroundColor: AppColor.redNormal, key: key, ); @@ -96,10 +79,7 @@ class RFab extends StatefulWidget { RFab.smallAction({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -107,10 +87,7 @@ class RFab extends StatefulWidget { RFab.action({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -121,10 +98,7 @@ class RFab extends StatefulWidget { RFab.smallFilter({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -132,10 +106,7 @@ class RFab extends StatefulWidget { RFab.filter({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -146,10 +117,7 @@ class RFab extends StatefulWidget { RFab.smallDownload({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.downloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.downloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -157,10 +125,7 @@ class RFab extends StatefulWidget { RFab.download({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.downloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.downloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -171,10 +136,7 @@ class RFab extends StatefulWidget { RFab.smallExcel({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.excelDownloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.excelDownloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.greenDark, key: key, ); @@ -182,10 +144,7 @@ class RFab extends StatefulWidget { RFab.excel({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.excelDownloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.excelDownloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.greenDark, key: key, ); @@ -196,10 +155,7 @@ class RFab extends StatefulWidget { RFab.smallBack({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.arrowLeftSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.arrowLeftSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -207,10 +163,7 @@ class RFab extends StatefulWidget { RFab.back({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.arrowLeftSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.arrowLeftSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart index 7afef0e..d4c57a0 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart @@ -32,10 +32,10 @@ class ROutlinedElevatedIcon extends StatefulWidget { Widget? icon; @override - State createState() => _ROutlinedElevatedStateIcon(); + State createState() => _ROutlinedElevatedIconState(); } -class _ROutlinedElevatedStateIcon extends State { +class _ROutlinedElevatedIconState extends State { @override Widget build(BuildContext context) { return OutlinedButton.icon( diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart new file mode 100644 index 0000000..91826d5 --- /dev/null +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'draggable_bottom_sheet_controller.dart'; + + +class DraggableBottomSheet2 extends GetView { + final Color? backgroundColor; + + const DraggableBottomSheet2({super.key, this.backgroundColor = Colors.white}); + + @override + Widget build(BuildContext context) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (controller.isVisible.value && !controller.isVisible.value) { + controller.show(); + } + }); + + return ObxValue((data) { + return Stack( + children: [ + // پس‌زمینه تیره + Positioned.fill( + child: GestureDetector( + onTap: () {}, + child: Container(color: Colors.black54), + ), + ), + // محتوای BottomSheet + AnimatedPositioned( + duration: Duration(milliseconds: 300), + curve: Curves.easeOut, + left: 0, + right: 0, + bottom: 0, + child: GestureDetector( + onVerticalDragUpdate: (details) { + controller.updateHeight(details.primaryDelta); + }, + child: Container( + height: 350, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 10, + ), + ], + ), + child: Column( + children: [ + GestureDetector( + onTap: () {}, + child: Container( + padding: EdgeInsets.all(10), + child: Icon(Icons.drag_handle), + ), + ), + Expanded( + child: controller.items[data.value], + ), + ], + ), + ), + ), + ), + ], + ); + }, controller.currentIndex); + } +} diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart index 5a1caef..2bf39e1 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart @@ -129,7 +129,8 @@ import 'draggable_bottom_sheet.dart'; class DraggableBottomSheetController extends GetxController { final RxBool isVisible = false.obs; final RxDouble currentHeight = 200.0.obs; - + RxList items = [].obs; + RxInt currentIndex = 0.obs; late double initialHeight; late double minHeight; late double maxHeight; @@ -158,9 +159,5 @@ class DraggableBottomSheetController extends GetxController { } } - @override - void onInit() { - super.onInit(); - } } diff --git a/packages/core/lib/presentation/widget/map/custom_marker.dart b/packages/core/lib/presentation/widget/map/custom_marker.dart new file mode 100644 index 0000000..d1e5cae --- /dev/null +++ b/packages/core/lib/presentation/widget/map/custom_marker.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; +import 'package:latlong2/latlong.dart'; + +class CustomMarker { + final LatLng point; + final VoidCallback? onTap; +final int? id; + + CustomMarker({ this.id, required this.point, this.onTap}); +} \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/map/logic.dart b/packages/core/lib/presentation/widget/map/logic.dart index 0824b14..78ab225 100644 --- a/packages/core/lib/presentation/widget/map/logic.dart +++ b/packages/core/lib/presentation/widget/map/logic.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:flutter/animation.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_animations/flutter_map_animations.dart'; import 'package:geolocator/geolocator.dart'; @@ -8,13 +8,16 @@ import 'package:get/get.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/utils/logger_utils.dart'; +import 'custom_marker.dart'; + enum ErrorLocationType { serviceDisabled, permissionDenied, none } class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { Rx currentLocation = LatLng(35.824891, 50.948025).obs; String tileType = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'; - RxList markers = [].obs; + + RxList markers = [].obs; RxList allMarkers = [].obs; Rx mapController = MapController().obs; RxList errorLocationType = RxList(); @@ -61,6 +64,7 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { @override void onClose() { super.onClose(); + _debounceTimer?.cancel(); animatedMapController.dispose(); mapController.close(); } @@ -113,7 +117,9 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { final latLng = LatLng(position.latitude, position.longitude); currentLocation.value = latLng; - markers.add(latLng); + markers.add( + CustomMarker(id: -1, point: latLng, ), + ); animatedMapController.animateTo( dest: latLng, zoom: 18, @@ -132,7 +138,7 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { 'radius': 1000.0, }); - markers.addAll(filtered); + // markers.addAll(filtered); }); } @@ -148,4 +154,17 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { .where((marker) => distance(center, marker) <= radiusInMeters) .toList(); } + + void addMarker(CustomMarker marker) { + markers.add(marker); + } + + void setMarkers(List newMarkers) { + markers.value = newMarkers; + } + + void clearMarkers() { + markers.clear(); + } + } diff --git a/packages/core/lib/presentation/widget/map/view.dart b/packages/core/lib/presentation/widget/map/view.dart index 8fe6cc2..4204919 100644 --- a/packages/core/lib/presentation/widget/map/view.dart +++ b/packages/core/lib/presentation/widget/map/view.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; -import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/common/app_fonts.dart'; import 'package:rasadyar_core/presentation/common/assets.gen.dart'; @@ -13,7 +12,16 @@ import 'package:rasadyar_core/presentation/widget/buttons/outline_elevated.dart' import 'logic.dart'; class MapWidget extends GetView { - const MapWidget({super.key}); + final VoidCallback? initOnTap; + final Widget? initMarkerWidget; + final Widget markerWidget; + + const MapWidget({ + this.initOnTap, + this.initMarkerWidget, + required this.markerWidget, + super.key, + }); @override Widget build(BuildContext context) { @@ -48,8 +56,7 @@ class MapWidget extends GetView { onPressed: () async { var res = await Geolocator.openLocationSettings(); if (res) { - var service = - await controller.locationServiceEnabled(); + var service = await controller.locationServiceEnabled(); if (service) { controller.errorLocationType.remove( ErrorLocationType.serviceDisabled, @@ -59,7 +66,6 @@ class MapWidget extends GetView { } }, ), - contentPadding: EdgeInsets.all(8), onWillPop: () async { return controller.errorLocationType.isEmpty; @@ -71,9 +77,7 @@ class MapWidget extends GetView { Future.microtask(() { Get.defaultDialog( title: 'خطا', - content: const Text( - ' دسترسی به سرویس مکان‌یابی غیرفعال است', - ), + content: const Text(' دسترسی به سرویس مکان‌یابی غیرفعال است'), cancel: ROutlinedElevated( text: 'بررسی مجدد', width: 120, @@ -87,9 +91,7 @@ class MapWidget extends GetView { textStyle: AppFonts.yekan16, width: 120, onPressed: () async { - var res = await controller.checkPermission( - request: true, - ); + var res = await controller.checkPermission(request: true); if (res) { controller.errorLocationType.remove( ErrorLocationType.permissionDenied, @@ -110,7 +112,10 @@ class MapWidget extends GetView { } return const SizedBox.shrink(); }, controller.errorLocationType), - _buildMap(), _buildGpsButton(), _buildFilterButton()], + _buildMap(), + _buildGpsButton(), + _buildFilterButton(), + ], ); } @@ -122,16 +127,30 @@ class MapWidget extends GetView { initialCenter: currentLocation.value, initialZoom: 18, onPositionChanged: (camera, hasGesture) { - controller.debouncedUpdateVisibleMarkers(center: camera.center); + if (hasGesture) { + controller.debouncedUpdateVisibleMarkers(center: camera.center); + } + //controller.debouncedUpdateVisibleMarkers(center: camera.center); }, ), children: [ TileLayer(urlTemplate: controller.tileType), - ObxValue((markers) { + ObxValue((markers) { return MarkerLayer( markers: markers - .map((e) => markerWidget(marker: e, onTap: () {})) + .map( + (e) => Marker( + point: e.point, + child: GestureDetector( + onTap: e.id != -1 ? e.onTap : initOnTap, + child: + e.id != -1 + ? markerWidget + : initMarkerWidget ?? SizedBox.shrink(), + ), + ), + ) .toList(), ); }, controller.markers), @@ -171,21 +190,18 @@ class MapWidget extends GetView { ); } - Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + /*Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { return Marker( point: marker, child: GestureDetector( onTap: onTap, behavior: HitTestBehavior.opaque, child: SizedBox( - width: 36, - height: 36, - child:Assets.vec.mapMarkerSvg.svg( - width: 30, - height: 30, - ) + width: 36, + height: 36, + child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30), ), ), ); - } + }*/ } diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 546efec..bdcab01 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -6,6 +6,7 @@ export 'buttons/outline_elevated.dart'; export 'buttons/outline_elevated_icon.dart'; export 'buttons/text_button.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; +export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; export 'inputs/r_input.dart'; diff --git a/packages/livestock/lib/presentation/page/map/logic.dart b/packages/livestock/lib/presentation/page/map/logic.dart index c54ed07..04370f3 100644 --- a/packages/livestock/lib/presentation/page/map/logic.dart +++ b/packages/livestock/lib/presentation/page/map/logic.dart @@ -2,7 +2,7 @@ import 'package:rasadyar_core/core.dart'; class MapLogic extends GetxController { - + var ss = Get.find(); } diff --git a/packages/livestock/lib/presentation/page/map/view.dart b/packages/livestock/lib/presentation/page/map/view.dart index d05b39f..6935217 100644 --- a/packages/livestock/lib/presentation/page/map/view.dart +++ b/packages/livestock/lib/presentation/page/map/view.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter/material.dart' as mt; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/map/view.dart'; - - import 'logic.dart'; class MapPage extends GetView { @@ -14,9 +11,20 @@ class MapPage extends GetView { return Scaffold( body: Stack( children: [ - MapWidget(), + MapWidget( + markerWidget: Icon(Icons.pin_drop_rounded), + initOnTap: () { + + }, + initMarkerWidget: Assets.vec.mapMarkerSvg.svg( + width: 30, + height: 30, + ), + ), + ], ), ); } -} \ No newline at end of file +} + diff --git a/packages/livestock/lib/presentation/page/request_tagging/logic.dart b/packages/livestock/lib/presentation/page/request_tagging/logic.dart index ee5f9ee..de94cdb 100644 --- a/packages/livestock/lib/presentation/page/request_tagging/logic.dart +++ b/packages/livestock/lib/presentation/page/request_tagging/logic.dart @@ -1,9 +1,10 @@ +import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; class RequestTaggingLogic extends GetxController { - +final TextEditingController phoneController = TextEditingController(); @override void onReady() { super.onReady(); diff --git a/packages/livestock/lib/presentation/page/request_tagging/view.dart b/packages/livestock/lib/presentation/page/request_tagging/view.dart index 67d773a..0ff57ed 100644 --- a/packages/livestock/lib/presentation/page/request_tagging/view.dart +++ b/packages/livestock/lib/presentation/page/request_tagging/view.dart @@ -1,5 +1,7 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; import 'logic.dart'; @@ -9,37 +11,98 @@ class RequestTaggingPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Request Tagging'), - centerTitle: true, - actions: [ - IconButton( - icon: const Icon(Icons.search), - onPressed: () { - // Implement search functionality - }, - ), - ], + backgroundColor: Colors.white, + appBar: RAppBar( + title: 'درخواست پلاک کوبی', + leadingWidth: 40, + leading: Assets.vec.messageAddSvg.svg(width: 12, height: 12), ), - body: Column( - children: [ - const SizedBox(height: 16), - - const SizedBox(height: 16), - Expanded( - child: ListView.builder( - itemCount: 10, // Replace with your data length - itemBuilder: (context, index) { - return ListTile( - title: Text('Request Item $index'), - onTap: () { - // Handle item tap - }, - ); - }, + body: Padding( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + child: Column( + children: [ + RTextField( + controller: controller.phoneController, + label: 'تلفن دامدار', ), - ), - ], + + SizedBox( + width: Get.width, + height: 356, + child: Card( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Expanded( + child: Container( + width: Get.width, + + decoration: BoxDecoration( + color: AppColor.lightGreyNormal, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Assets.images.placeHolder.image( + height: 150, + width: 200, + ), + ), + ), + ), + SizedBox(height: 15), + Container( + width: Get.width, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + ' تصویر گله', + style: AppFonts.yekan14.copyWith( + color: Colors.white, + ), + ), + Icon( + CupertinoIcons.arrow_up_doc, + color: Colors.white, + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + + Spacer(), + + + + RElevated( + text: 'ارسال تصویر گله', + onPressed: () { + Get.toNamed(LiveStockRoutes.tagging); + }, + height: 40, + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + ), + ], + ), ), ); } diff --git a/packages/livestock/lib/presentation/page/requests/view.dart b/packages/livestock/lib/presentation/page/requests/view.dart index 966ea7c..b656387 100644 --- a/packages/livestock/lib/presentation/page/requests/view.dart +++ b/packages/livestock/lib/presentation/page/requests/view.dart @@ -93,7 +93,7 @@ class RequestsPage extends GetView { itemBuilder: (context, index) { return GestureDetector( onTap: () { - Get.toNamed(LiveStockRoutes.requestTagging,id: 0); + Get.toNamed(LiveStockRoutes.requestTagging); }, child: Container( width: Get.width, diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart index 879add1..f506375 100644 --- a/packages/livestock/lib/presentation/page/root/view.dart +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -9,6 +9,7 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { return ObxValue((currentIndex) { + return PopScope( canPop: false, onPopInvokedWithResult: (didPop, result) { @@ -16,7 +17,6 @@ class RootPage extends GetView { eLog('Pop invoked with result: $result, didPop: $didPop'); navigatorKey?.currentState?.pop(); - /*eLog('Pop invoked with result: $result, didPop: $didPop'); iLog(Get.currentRoute); iLog(Get.previousRoute); @@ -39,11 +39,11 @@ class RootPage extends GetView { child: Scaffold( body: IndexedStack( - children: controller.pages, + children: [...controller.pages], index: currentIndex.value, sizing: StackFit.expand, ), - + extendBody: true, bottomNavigationBar: BottomNavigation1( items: [ BottomNavigation1Item( diff --git a/packages/livestock/lib/presentation/page/tagging/logic.dart b/packages/livestock/lib/presentation/page/tagging/logic.dart new file mode 100644 index 0000000..f543973 --- /dev/null +++ b/packages/livestock/lib/presentation/page/tagging/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class TaggingLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/livestock/lib/presentation/page/tagging/view.dart b/packages/livestock/lib/presentation/page/tagging/view.dart new file mode 100644 index 0000000..6bb7f25 --- /dev/null +++ b/packages/livestock/lib/presentation/page/tagging/view.dart @@ -0,0 +1,239 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; + +import 'logic.dart'; + +class TaggingPage extends GetView { + const TaggingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: RAppBar( + title: 'پلاک کوبی', + leadingWidth: 40, + leading: Assets.vec.messageAddSvg.svg(width: 12, height: 12), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Container( + height: 40, + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight), + ), + alignment: Alignment.center, + child: Text('آمار ثبت شده : سبک 5 و سنگین 8 راس'), + ), + ), + SizedBox(width: 4), + IconButton( + onPressed: () {}, + style: IconButton.styleFrom( + backgroundColor: AppColor.blueNormal, + fixedSize: Size(40, 40), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + icon: Assets.vec.editSvg.svg(), + ), + ], + ), + + Expanded( + child: Card( + clipBehavior: Clip.hardEdge, + color: Colors.white, + child: Stack( + fit: StackFit.expand, + children: [ + GridView.builder( + padding: EdgeInsets.symmetric( + horizontal: 20, + vertical: 10, + ), + itemCount: 20, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 12, + mainAxisSpacing: 8, + ), + itemBuilder: (context, index) { + return Container( + decoration: ShapeDecoration( + color: AppColor.lightGreyLightHover, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: AppColor.blackLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + Assets.vec.trashSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), + ), + ], + ), + Text( + 'گوسفند ماده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + SizedBox(height: 10), + Text( + 'سن : 18 ماه', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormal, + ), + ), + Text( + 'نوع نژاد', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), + ), + Text( + '1212115112512', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'نوع پلاک', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), + ), + ], + ), + ), + ); + }, + ), + + Positioned( + bottom: 10, + right: 3, + child: RFab.add( + onPressed: () { + Get.bottomSheet( + Container( + padding: EdgeInsets.all(20), + color: Colors.white, + height: 300, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 40, + width: Get.width, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 1, + color: AppColor.darkGreyLight, + ), + ), + child: GestureDetector( + onTap: () { + + }, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'گونه دام', + style: AppFonts.yekan14, + ), + Icon(CupertinoIcons.chevron_up), + ], + ), + ), + ), + /* DropdownMenu( + width: Get.width, + + dropdownMenuEntries: [ + DropdownMenuEntry( + value: 'گوسفند', + label: 'گوسفند', + ), + DropdownMenuEntry( + value: 'بز', + label: 'بز', + ), + DropdownMenuEntry( + value: 'گوساله', + label: 'گوساله', + ), + ], + ),*/ + ], + ), + ), + isScrollControlled: true, + ); + }, + ), + ), + ], + ), + ), + ), + + SizedBox(height: 10), + + RElevated( + text: 'ثبت نهایی و ارسال به اتحادیه', + textStyle: AppFonts.yekan18, + height: 40, + backgroundColor: AppColor.greenNormal, + onPressed: () {}, + isFullWidth: true, + ), + ], + ), + ), + ); + } +} diff --git a/packages/livestock/lib/presentation/routes/app_pages.dart b/packages/livestock/lib/presentation/routes/app_pages.dart index b74d313..1ca33e7 100644 --- a/packages/livestock/lib/presentation/routes/app_pages.dart +++ b/packages/livestock/lib/presentation/routes/app_pages.dart @@ -8,6 +8,8 @@ import 'package:rasadyar_livestock/presentation/page/request_tagging/view.dart'; import 'package:rasadyar_livestock/presentation/page/requests/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/view.dart'; +import 'package:rasadyar_livestock/presentation/page/tagging/logic.dart'; +import 'package:rasadyar_livestock/presentation/page/tagging/view.dart'; part 'app_routes.dart'; @@ -26,18 +28,35 @@ sealed class LiveStockPages { Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => MapWidgetLogic()); + Get.lazyPut(() => DraggableBottomSheetController()); }), children: [ - GetPage( + /*GetPage( name: LiveStockRoutes.requestTagging, page: () => RequestTaggingPage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => RequestTaggingLogic()); }), - ), - ] + ),*/ + ], ), + GetPage( + name: LiveStockRoutes.requestTagging, + page: () => RequestTaggingPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => RequestTaggingLogic()); + }), + ), + GetPage( + name: LiveStockRoutes.tagging, + page: () => TaggingPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => TaggingLogic()); + }), + ), ]; } diff --git a/packages/livestock/lib/presentation/routes/app_routes.dart b/packages/livestock/lib/presentation/routes/app_routes.dart index 616d5ee..95a777a 100644 --- a/packages/livestock/lib/presentation/routes/app_routes.dart +++ b/packages/livestock/lib/presentation/routes/app_routes.dart @@ -6,5 +6,8 @@ sealed class LiveStockRoutes { static const init = '/liveStock'; static const requests = '/requests'; static const profile = '/profile'; - static const requestTagging = '$init/tagging'; + + //static const requestTagging = '$init/tagging'; + static const requestTagging = '$requests/tagging'; + static const tagging = '/tagging'; } From 5ca69760e64d467aaf33b47de8f0a88fc3871bf8 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 12:11:12 +0330 Subject: [PATCH 078/256] feat : new text input with fixed hint --- .../widget/inputs/input_fixed_hint.dart | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 packages/core/lib/presentation/widget/inputs/input_fixed_hint.dart diff --git a/packages/core/lib/presentation/widget/inputs/input_fixed_hint.dart b/packages/core/lib/presentation/widget/inputs/input_fixed_hint.dart new file mode 100644 index 0000000..ad4004b --- /dev/null +++ b/packages/core/lib/presentation/widget/inputs/input_fixed_hint.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; + +import '../../common/app_color.dart'; +import '../../common/app_fonts.dart' show AppFonts; + +enum InputType { text, number, email, password } + +class TextFiledFixedHint extends StatefulWidget { + const TextFiledFixedHint({ + super.key, + required this.hintText, + required this.onChanged, + this.inputType = InputType.text, + this.initialValue, + this.controller, + this.keyboardType, + this.textInputAction, + this.enabled, + this.readOnly, + this.maxLines, + this.minLines, + }); + + final String hintText; + final InputType inputType; + + final ValueChanged? onChanged; + final String? initialValue; + final TextEditingController? controller; + final TextInputType? keyboardType; + final TextInputAction? textInputAction; + final bool? enabled; + final bool? readOnly; + final int? maxLines; + final int? minLines; + + @override + State createState() => _TextFiledFixedHintState(); +} + +class _TextFiledFixedHintState extends State { + TextEditingController? tmpController; + + @override + void initState() { + super.initState(); + if (widget.controller == null) { + tmpController = TextEditingController(text: widget.initialValue); + if (widget.initialValue != null) { + tmpController?.text = widget.initialValue!; + } + } else { + tmpController = widget.controller; + } + } + + @override + Widget build(BuildContext context) { + return Container( + height: 40, + width: MediaQuery.of(context).size.width, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(top: 3), + child: Text(widget.hintText, style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive)), + ), + Expanded( + child: TextField( + controller: tmpController, + keyboardType: widget.inputType == InputType.number ? TextInputType.number : widget.keyboardType, + textInputAction: widget.textInputAction, + onChanged: widget.onChanged, + enabled: widget.enabled, + readOnly: widget.readOnly ?? false, + maxLines: widget.maxLines ?? 1, + minLines: widget.minLines ?? 1, + cursorHeight: 25, + textAlignVertical: TextAlignVertical.top, + obscureText: widget.inputType == InputType.password, + textAlign: widget.inputType == InputType.number ? TextAlign.start : TextAlign.start, + textDirection: widget.inputType == InputType.number ? TextDirection.ltr : TextDirection.rtl, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive), + decoration: InputDecoration(border: InputBorder.none), + ), + ), + ], + ), + ); + } +} From 363e810070813d113b34e314cc67eb97a40ca2b6 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 12:11:33 +0330 Subject: [PATCH 079/256] feat : overlay dropdown list --- .../widget/overlay_dropdown_widget/view.dart | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart new file mode 100644 index 0000000..8d8496d --- /dev/null +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -0,0 +1,143 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + + + +class OverlayDropdownWidget extends StatefulWidget { + final List items; + final T? selectedItem; + final T? initialValue; + final Widget Function(T item) itemBuilder; + final Widget Function(T? selected) labelBuilder; + final void Function(T selected)? onChanged; + final EdgeInsets? contentPadding; + + const OverlayDropdownWidget({ + super.key, + required this.items, + required this.itemBuilder, + required this.labelBuilder, + this.initialValue, + this.onChanged, + this.selectedItem, + this.contentPadding + }); + + @override + State> createState() => _OverlayDropdownState(); +} + +class _OverlayDropdownState extends State> { + final GlobalKey _key = GlobalKey(); + OverlayEntry? _overlayEntry; + final RxBool _isOpen = false.obs; + T? selectedItem ; + + @override + void initState() { + super.initState(); + selectedItem = widget.selectedItem ?? widget.initialValue; + } + + void _showOverlay() { + final renderBox = _key.currentContext!.findRenderObject() as RenderBox; + final size = renderBox.size; + final offset = renderBox.localToGlobal(Offset.zero); + + _overlayEntry = OverlayEntry( + builder: + (_) => GestureDetector( + onTap: _removeOverlay, + behavior: HitTestBehavior.translucent, + child: Stack( + children: [ + Positioned( + left: offset.dx, + top: offset.dy + size.height + 4, + width: size.width, + child: Material( + elevation: 4, + borderRadius: BorderRadius.circular(8), + child: Container( + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + child: ListView( + padding: EdgeInsets.zero, + shrinkWrap: true, + children: + widget.items.map((item) { + return InkWell( + onTap: () { + widget.onChanged?.call(item); + setState(() { + selectedItem = item; + }); + _removeOverlay(); + }, + child: Padding( + padding:widget.contentPadding?? const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: widget.itemBuilder(item), + ), + ); + }).toList(), + ), + ), + ), + ), + ], + ), + ), + ); + + Overlay.of(context).insert(_overlayEntry!); + _isOpen.value = true; + } + + void _removeOverlay() { + _overlayEntry?.remove(); + _overlayEntry = null; + _isOpen.value = false; + } + + @override + void dispose() { + _removeOverlay(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + key: _key, + onTap: () { + _isOpen.value ? _removeOverlay() : _showOverlay(); + }, + child: Container( + height: 40, + width: Get.width, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + widget.labelBuilder(selectedItem), + Icon( + _isOpen.value + ? CupertinoIcons.chevron_up + : CupertinoIcons.chevron_down, + ), + ], + ), + ), + ); + } +} From 3e868e415848c08cede612786fb69a0346be1197 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 12:11:51 +0330 Subject: [PATCH 080/256] fix : font size --- packages/core/lib/presentation/widget/buttons/elevated.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/lib/presentation/widget/buttons/elevated.dart b/packages/core/lib/presentation/widget/buttons/elevated.dart index bcbe124..01f9743 100644 --- a/packages/core/lib/presentation/widget/buttons/elevated.dart +++ b/packages/core/lib/presentation/widget/buttons/elevated.dart @@ -49,7 +49,7 @@ class RElevated extends StatelessWidget { ), minimumSize: Size(isFullWidth ? double.infinity : width, height), padding: EdgeInsets.zero, - textStyle: textStyle ?? AppFonts.yekan24, + textStyle: textStyle ?? AppFonts.yekan18, ), child: isLoading From b1f08ce0dc1ffafc0e814d46472911cdd160a7ea Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 12:12:30 +0330 Subject: [PATCH 081/256] chore: barrel new widget --- packages/core/lib/presentation/widget/widget.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index bdcab01..8888a00 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -17,3 +17,5 @@ export 'tabs/tab.dart'; export 'vec_widget.dart'; export 'card/card_with_icon_with_border.dart'; export 'chips/r_chips.dart'; +export 'overlay_dropdown_widget/view.dart'; +export 'inputs/input_fixed_hint.dart'; From 2dbe8a2489a036559c72a568ee974ab4ea4a585c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 12:13:07 +0330 Subject: [PATCH 082/256] feat : tagging page and add livestock tagging --- .../lib/presentation/page/tagging/logic.dart | 4 +- .../lib/presentation/page/tagging/view.dart | 447 +++++++++++------- 2 files changed, 290 insertions(+), 161 deletions(-) diff --git a/packages/livestock/lib/presentation/page/tagging/logic.dart b/packages/livestock/lib/presentation/page/tagging/logic.dart index f543973..c60d7ff 100644 --- a/packages/livestock/lib/presentation/page/tagging/logic.dart +++ b/packages/livestock/lib/presentation/page/tagging/logic.dart @@ -1,6 +1,8 @@ -import 'package:get/get.dart'; +import 'package:rasadyar_core/core.dart'; class TaggingLogic extends GetxController { + RxInt selectedSegment = 0.obs; + @override void onReady() { // TODO: implement onReady diff --git a/packages/livestock/lib/presentation/page/tagging/view.dart b/packages/livestock/lib/presentation/page/tagging/view.dart index 6bb7f25..19babe1 100644 --- a/packages/livestock/lib/presentation/page/tagging/view.dart +++ b/packages/livestock/lib/presentation/page/tagging/view.dart @@ -37,15 +37,18 @@ class TaggingPage extends GetView { ), SizedBox(width: 4), IconButton( - onPressed: () {}, + onPressed:() { + Get.bottomSheet( + _buildBottomSheet(), + isScrollControlled: true, + ); + }, style: IconButton.styleFrom( backgroundColor: AppColor.blueNormal, fixedSize: Size(40, 40), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), - icon: Assets.vec.editSvg.svg(), + icon: Assets.vec.addSvg.svg(), ), ], ), @@ -54,169 +57,74 @@ class TaggingPage extends GetView { child: Card( clipBehavior: Clip.hardEdge, color: Colors.white, - child: Stack( - fit: StackFit.expand, - children: [ - GridView.builder( - padding: EdgeInsets.symmetric( - horizontal: 20, - vertical: 10, + child: GridView.builder( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + itemCount: 20, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 12, + mainAxisSpacing: 8, + ), + itemBuilder: (context, index) { + return Container( + decoration: ShapeDecoration( + color: AppColor.lightGreyLightHover, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blackLightHover), + borderRadius: BorderRadius.circular(8), + ), ), - itemCount: 20, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 12, - mainAxisSpacing: 8, - ), - itemBuilder: (context, index) { - return Container( - decoration: ShapeDecoration( - color: AppColor.lightGreyLightHover, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1, - color: AppColor.blackLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Assets.vec.editSvg.svg( - width: 16, - height: 16, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - Assets.vec.trashSvg.svg( - width: 16, - height: 16, - colorFilter: ColorFilter.mode( - AppColor.error, - BlendMode.srcIn, - ), - ), - ], + Assets.vec.editSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), - Text( - 'گوسفند ماده', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - SizedBox(height: 10), - Text( - 'سن : 18 ماه', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyNormal, - ), - ), - Text( - 'نوع نژاد', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), - ), - Text( - '1212115112512', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'نوع پلاک', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), + Assets.vec.trashSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), ), ], ), - ), - ); - }, - ), - - Positioned( - bottom: 10, - right: 3, - child: RFab.add( - onPressed: () { - Get.bottomSheet( - Container( - padding: EdgeInsets.all(20), - color: Colors.white, - height: 300, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - height: 40, - width: Get.width, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all( - width: 1, - color: AppColor.darkGreyLight, - ), - ), - child: GestureDetector( - onTap: () { - - }, - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - 'گونه دام', - style: AppFonts.yekan14, - ), - Icon(CupertinoIcons.chevron_up), - ], - ), - ), - ), - /* DropdownMenu( - width: Get.width, - - dropdownMenuEntries: [ - DropdownMenuEntry( - value: 'گوسفند', - label: 'گوسفند', - ), - DropdownMenuEntry( - value: 'بز', - label: 'بز', - ), - DropdownMenuEntry( - value: 'گوساله', - label: 'گوساله', - ), - ], - ),*/ - ], - ), + Text( + 'گوسفند ماده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), - isScrollControlled: true, - ); - }, + SizedBox(height: 10), + Text( + 'سن : 18 ماه', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyNormal), + ), + Text( + 'نوع نژاد', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + Text( + '1212115112512', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + Text( + 'نوع پلاک', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), ), - ), - ], + ); + }, ), ), ), @@ -236,4 +144,223 @@ class TaggingPage extends GetView { ), ); } + + Container _buildBottomSheet() { + return Container( + padding: EdgeInsets.all(20), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(25), + topRight: Radius.circular(25), + ), + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 3, + width: 50, + decoration: BoxDecoration( + color: AppColor.darkGreyDark, + borderRadius: BorderRadius.circular(8), + ), + ), + ], + ), + + SizedBox(height: 3), + + OverlayDropdownWidget( + items: [ + 'گوسفند ماده', + 'گوسفند نر', + 'بز ماده', + 'بز نر', + 'گوساله ماده', + 'گوساله نر', + ], + onChanged: (value) { + print('Selected: $value'); + }, + itemBuilder: (item) => Text(item), + labelBuilder: (item) => Text(item ?? 'گونه دام'), + ), + Container( + height: 40, + width: Get.width, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تاریخ تولد', + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive), + ), + Text( + '1404/5/5', + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive), + ), + ], + ), + ), + ObxValue((data) { + return CupertinoSlidingSegmentedControl( + children: { + 0: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Text( + 'نر', + style: AppFonts.yekan14.copyWith( + color: + data.value == 0 + ? AppColor.whiteGreyLight + : AppColor.darkGreyNormalActive, + ), + ), + ), + 1: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Text( + 'ماده', + style: AppFonts.yekan14.copyWith( + color: + data.value == 1 + ? AppColor.whiteGreyLight + : AppColor.darkGreyNormalActive, + ), + ), + ), + }, + onValueChanged: (int? value) { + if (value != null) { + controller.selectedSegment.value = value; + } + }, + + proportionalWidth: true, + groupValue: data.value, + thumbColor: AppColor.blueNormal, + backgroundColor: CupertinoColors.systemGrey6, + ); + }, controller.selectedSegment), + + OverlayDropdownWidget( + items: ['نوع نژاد 1', 'نوع نژاد 2', 'نوع نژاد 3'], + onChanged: (value) { + print('Selected Breed: $value'); + }, + itemBuilder: (item) => Text(item), + labelBuilder: (item) => Text(item ?? 'نژاد'), + ), + + TextFiledFixedHint( + inputType: InputType.number, + hintText: 'پلاک مادر ', + onChanged: (String value) { + eLog('Mother Tag: $value'); + }, + ), + TextFiledFixedHint( + inputType: InputType.number, + hintText: 'پلاک پدر ', + onChanged: (String value) { + eLog('father Tag: $value'); + }, + ), + TextFiledFixedHint( + inputType: InputType.number, + hintText: 'پلاک دام', + onChanged: (String value) { + eLog('father Tag: $value'); + }, + ), + OverlayDropdownWidget( + items: ['نوع پلاک 1', 'نوع پلاک 2', 'نوع پلاک 3'], + onChanged: (value) { + print('Selected Breed: $value'); + }, + itemBuilder: (item) => Text(item), + labelBuilder: (item) => Text(item ?? 'نوع پلاک'), + ), + + SizedBox( + width: Get.width, + height: 350, + child: Card( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Expanded( + child: Container( + width: Get.width, + decoration: BoxDecoration( + color: AppColor.lightGreyNormal, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Assets.images.placeHolder.image(height: 150, width: 200), + ), + ), + ), + SizedBox(height: 15), + Container( + width: Get.width, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تصویر دام', + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + Icon(CupertinoIcons.arrow_up_doc, color: Colors.white), + ], + ), + ), + ), + ], + ), + ), + ), + ), + + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: RElevated( + text: 'افزودن دام به گله', + textStyle: AppFonts.yekan18.copyWith(color: Colors.white), + width: Get.width, + backgroundColor: AppColor.greenNormal, + height: 40, + onPressed: () { + Get.back(); + }, + ), + ), + ], + ), + ), + ); + } } From 2898cc8fbf6a2116eb11417d58f0a8933d0c6124 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 12:43:59 +0330 Subject: [PATCH 083/256] feat : base widget for bottom sheet --- .../bottom_sheet/base_bottom_sheet.dart | 57 +++++++++++++++++++ .../core/lib/presentation/widget/widget.dart | 1 + 2 files changed, 58 insertions(+) create mode 100644 packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart new file mode 100644 index 0000000..e628b35 --- /dev/null +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -0,0 +1,57 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; + +class BaseBottomSheet extends StatelessWidget { + const BaseBottomSheet({super.key, required this.child}); + + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(vertical: 15, horizontal: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + SizedBox( + width: MediaQuery.of(context).size.width, + height: 20, + child: Stack( + alignment: AlignmentDirectional.center, + children: [ + Container( + height: 3, + width: 50, + decoration: BoxDecoration(color: AppColor.darkGreyDark, borderRadius: BorderRadius.circular(8)), + ), + + Positioned( + left: 0, + child: IconButton( + onPressed: () { + Navigator.of(context).pop(); + }, + icon: Icon(CupertinoIcons.clear_circled), + ), + ), + ], + ), + ), + + SizedBox(height: 2), + + child, + ], + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 8888a00..52c3f21 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -19,3 +19,4 @@ export 'card/card_with_icon_with_border.dart'; export 'chips/r_chips.dart'; export 'overlay_dropdown_widget/view.dart'; export 'inputs/input_fixed_hint.dart'; +export 'bottom_sheet/base_bottom_sheet.dart'; From 1c2e4822979616896fa613ce6ddbc38d5c1ceee7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 12:46:15 +0330 Subject: [PATCH 084/256] refactor : extract to widget's --- .../lib/presentation/page/tagging/view.dart | 421 +++++++++--------- 1 file changed, 200 insertions(+), 221 deletions(-) diff --git a/packages/livestock/lib/presentation/page/tagging/view.dart b/packages/livestock/lib/presentation/page/tagging/view.dart index 19babe1..9dcd936 100644 --- a/packages/livestock/lib/presentation/page/tagging/view.dart +++ b/packages/livestock/lib/presentation/page/tagging/view.dart @@ -1,7 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -37,11 +36,8 @@ class TaggingPage extends GetView { ), SizedBox(width: 4), IconButton( - onPressed:() { - Get.bottomSheet( - _buildBottomSheet(), - isScrollControlled: true, - ); + onPressed: () { + Get.bottomSheet(_buildBottomSheet(), isScrollControlled: true); }, style: IconButton.styleFrom( backgroundColor: AppColor.blueNormal, @@ -145,222 +141,205 @@ class TaggingPage extends GetView { ); } - Container _buildBottomSheet() { + Widget _buildBottomSheet() { + return BaseBottomSheet( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + _buildLiveStockSpecies(), + _buildLivestockBirthday(), + _buildLivestockGender(), + + _buildLivestockBreed(), + + _buildMotherTagNumber(), + _buildFatherTagNumber(), + _buildTagNumber(), + _buildTagType(), + + _buildLiveStockImage(), + + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: RElevated( + text: 'افزودن دام به گله', + textStyle: AppFonts.yekan18.copyWith(color: Colors.white), + width: Get.width, + backgroundColor: AppColor.greenNormal, + height: 40, + onPressed: () { + Get.back(); + }, + ), + ), + ], + ), + ); + } + + SizedBox _buildLiveStockImage() { + return SizedBox( + width: Get.width, + height: 350, + child: Card( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Expanded( + child: Container( + width: Get.width, + decoration: BoxDecoration(color: AppColor.lightGreyNormal, borderRadius: BorderRadius.circular(8)), + child: Center(child: Assets.images.placeHolder.image(height: 150, width: 200)), + ), + ), + SizedBox(height: 15), + Container( + width: Get.width, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('تصویر دام', style: AppFonts.yekan14.copyWith(color: Colors.white)), + Icon(CupertinoIcons.arrow_up_doc, color: Colors.white), + ], + ), + ), + ), + ], + ), + ), + ), + ); + } + + OverlayDropdownWidget _buildTagType() { + return OverlayDropdownWidget( + items: ['نوع پلاک 1', 'نوع پلاک 2', 'نوع پلاک 3'], + onChanged: (value) { + print('Selected Breed: $value'); + }, + itemBuilder: (item) => Text(item), + labelBuilder: (item) => Text(item ?? 'نوع پلاک'), + ); + } + + TextFiledFixedHint _buildTagNumber() { + return TextFiledFixedHint( + inputType: InputType.number, + hintText: 'پلاک دام', + onChanged: (String value) { + eLog('father Tag: $value'); + }, + ); + } + + TextFiledFixedHint _buildFatherTagNumber() { + return TextFiledFixedHint( + inputType: InputType.number, + hintText: 'پلاک پدر ', + onChanged: (String value) { + eLog('father Tag: $value'); + }, + ); + } + + TextFiledFixedHint _buildMotherTagNumber() { + return TextFiledFixedHint( + inputType: InputType.number, + hintText: 'پلاک مادر ', + onChanged: (String value) { + eLog('Mother Tag: $value'); + }, + ); + } + + OverlayDropdownWidget _buildLivestockBreed() { + return OverlayDropdownWidget( + items: ['نوع نژاد 1', 'نوع نژاد 2', 'نوع نژاد 3'], + onChanged: (value) { + print('Selected Breed: $value'); + }, + itemBuilder: (item) => Text(item), + labelBuilder: (item) => Text(item ?? 'نژاد'), + ); + } + + ObxValue _buildLivestockGender() { + return ObxValue( + (data) => CupertinoSlidingSegmentedControl( + children: { + 0: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Text( + 'نر', + style: AppFonts.yekan14.copyWith( + color: data.value == 0 ? AppColor.whiteGreyLight : AppColor.darkGreyNormalActive, + ), + ), + ), + 1: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Text( + 'ماده', + style: AppFonts.yekan14.copyWith( + color: data.value == 1 ? AppColor.whiteGreyLight : AppColor.darkGreyNormalActive, + ), + ), + ), + }, + onValueChanged: (int? value) { + if (value != null) { + controller.selectedSegment.value = value; + } + }, + + proportionalWidth: true, + groupValue: data.value, + thumbColor: AppColor.blueNormal, + backgroundColor: CupertinoColors.systemGrey6, + ), + controller.selectedSegment, + ); + } + + Container _buildLivestockBirthday() { return Container( - padding: EdgeInsets.all(20), + height: 40, + width: Get.width, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('تاریخ تولد', style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive)), + Text('1404/5/5', style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive)), + ], + ), + ); + } - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(25), - topRight: Radius.circular(25), - ), - ), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - height: 3, - width: 50, - decoration: BoxDecoration( - color: AppColor.darkGreyDark, - borderRadius: BorderRadius.circular(8), - ), - ), - ], - ), - - SizedBox(height: 3), - - OverlayDropdownWidget( - items: [ - 'گوسفند ماده', - 'گوسفند نر', - 'بز ماده', - 'بز نر', - 'گوساله ماده', - 'گوساله نر', - ], - onChanged: (value) { - print('Selected: $value'); - }, - itemBuilder: (item) => Text(item), - labelBuilder: (item) => Text(item ?? 'گونه دام'), - ), - Container( - height: 40, - width: Get.width, - padding: const EdgeInsets.symmetric(horizontal: 12), - decoration: BoxDecoration( - border: Border.all(color: AppColor.darkGreyLight), - borderRadius: BorderRadius.circular(8), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'تاریخ تولد', - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive), - ), - Text( - '1404/5/5', - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyNormalActive), - ), - ], - ), - ), - ObxValue((data) { - return CupertinoSlidingSegmentedControl( - children: { - 0: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Text( - 'نر', - style: AppFonts.yekan14.copyWith( - color: - data.value == 0 - ? AppColor.whiteGreyLight - : AppColor.darkGreyNormalActive, - ), - ), - ), - 1: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Text( - 'ماده', - style: AppFonts.yekan14.copyWith( - color: - data.value == 1 - ? AppColor.whiteGreyLight - : AppColor.darkGreyNormalActive, - ), - ), - ), - }, - onValueChanged: (int? value) { - if (value != null) { - controller.selectedSegment.value = value; - } - }, - - proportionalWidth: true, - groupValue: data.value, - thumbColor: AppColor.blueNormal, - backgroundColor: CupertinoColors.systemGrey6, - ); - }, controller.selectedSegment), - - OverlayDropdownWidget( - items: ['نوع نژاد 1', 'نوع نژاد 2', 'نوع نژاد 3'], - onChanged: (value) { - print('Selected Breed: $value'); - }, - itemBuilder: (item) => Text(item), - labelBuilder: (item) => Text(item ?? 'نژاد'), - ), - - TextFiledFixedHint( - inputType: InputType.number, - hintText: 'پلاک مادر ', - onChanged: (String value) { - eLog('Mother Tag: $value'); - }, - ), - TextFiledFixedHint( - inputType: InputType.number, - hintText: 'پلاک پدر ', - onChanged: (String value) { - eLog('father Tag: $value'); - }, - ), - TextFiledFixedHint( - inputType: InputType.number, - hintText: 'پلاک دام', - onChanged: (String value) { - eLog('father Tag: $value'); - }, - ), - OverlayDropdownWidget( - items: ['نوع پلاک 1', 'نوع پلاک 2', 'نوع پلاک 3'], - onChanged: (value) { - print('Selected Breed: $value'); - }, - itemBuilder: (item) => Text(item), - labelBuilder: (item) => Text(item ?? 'نوع پلاک'), - ), - - SizedBox( - width: Get.width, - height: 350, - child: Card( - color: Colors.white, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Expanded( - child: Container( - width: Get.width, - decoration: BoxDecoration( - color: AppColor.lightGreyNormal, - borderRadius: BorderRadius.circular(8), - ), - child: Center( - child: Assets.images.placeHolder.image(height: 150, width: 200), - ), - ), - ), - SizedBox(height: 15), - Container( - width: Get.width, - height: 40, - clipBehavior: Clip.antiAlias, - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'تصویر دام', - style: AppFonts.yekan14.copyWith(color: Colors.white), - ), - Icon(CupertinoIcons.arrow_up_doc, color: Colors.white), - ], - ), - ), - ), - ], - ), - ), - ), - ), - - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: RElevated( - text: 'افزودن دام به گله', - textStyle: AppFonts.yekan18.copyWith(color: Colors.white), - width: Get.width, - backgroundColor: AppColor.greenNormal, - height: 40, - onPressed: () { - Get.back(); - }, - ), - ), - ], - ), - ), - ); + OverlayDropdownWidget _buildLiveStockSpecies() { + return OverlayDropdownWidget( + items: ['گوسفند ماده', 'گوسفند نر', 'بز ماده', 'بز نر', 'گوساله ماده', 'گوساله نر'], + onChanged: (value) { + print('Selected: $value'); + }, + itemBuilder: (item) => Text(item), + labelBuilder: (item) => Text(item ?? 'گونه دام'), + ); } } From aa724c72a48769563b75b4b183573f54a07d239c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 26 May 2025 14:00:52 +0330 Subject: [PATCH 085/256] refactor : request page and fix padding's --- .../lib/presentation/page/requests/logic.dart | 2 + .../lib/presentation/page/requests/view.dart | 442 ++++++++++-------- 2 files changed, 238 insertions(+), 206 deletions(-) diff --git a/packages/livestock/lib/presentation/page/requests/logic.dart b/packages/livestock/lib/presentation/page/requests/logic.dart index 9cb9154..bf98dd3 100644 --- a/packages/livestock/lib/presentation/page/requests/logic.dart +++ b/packages/livestock/lib/presentation/page/requests/logic.dart @@ -4,4 +4,6 @@ import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; class RequestsLogic extends GetxController { RxList filterSelected = [].obs; + RxBool isFilterShowed = false.obs; + } diff --git a/packages/livestock/lib/presentation/page/requests/view.dart b/packages/livestock/lib/presentation/page/requests/view.dart index b656387..54b9dc8 100644 --- a/packages/livestock/lib/presentation/page/requests/view.dart +++ b/packages/livestock/lib/presentation/page/requests/view.dart @@ -10,213 +10,13 @@ class RequestsPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar( - title: 'لیست درخواست‌ها', - hasBack: false, - centerTitle: true, - ), + appBar: RAppBar(title: 'لیست درخواست‌ها', hasBack: false, centerTitle: true), body: Column( children: [ - SizedBox(height: 16), - _searchWidget(), - SizedBox(height: 16), - SizedBox( - height: 50, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 12), - child: ObxValue((data) { - return Row( - spacing: 12, - children: [ - CustomChip( - title: 'انتخاب فیلتر', - index: 0, - isSelected: true, - selectedColor: AppColor.blueNormal, - onTap: (index) {}, - ), - - RFilterChips( - title: 'درخواست‌های من', - index: 1, - isSelected: data.contains(1), - selectedColor: AppColor.yellowNormal, - onTap: (index) { - if (data.contains(1)) { - data.remove(1); - } else { - data.add(1); - } - }, - ), - - RFilterChips( - title: 'در انتظار ثبت ', - index: 2, - selectedColor: AppColor.greenLightActive, - isSelected: data.contains(2), - onTap: (index) { - if (data.contains(2)) { - data.remove(2); - } else { - data.add(2); - } - }, - ), - - RFilterChips( - title: 'ارجاع به تعاونی', - index: 3, - selectedColor: AppColor.blueLightHover, - isSelected: data.contains(3), - onTap: (index) { - if (data.contains(3)) { - data.remove(3); - } else { - data.add(3); - } - }, - ), - ], - ); - }, controller.filterSelected), - ), - ), - SizedBox(height: 10), - Expanded( - child: ListView.separated( - itemCount: 10, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - separatorBuilder: (context, index) => SizedBox(height: 16), - itemBuilder: (context, index) { - return GestureDetector( - onTap: () { - Get.toNamed(LiveStockRoutes.requestTagging); - }, - child: Container( - width: Get.width, - height: 75, - decoration: BoxDecoration( - color: - index < 3 - ? AppColor.yellowNormal - : index < 7 - ? AppColor.greenLightActive - : AppColor.blueLight, - borderRadius: BorderRadius.circular(8), - ), - child: Row( - children: [ - SizedBox(width: 5), - Expanded( - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topRight: Radius.circular(8), - bottomRight: Radius.circular(8), - ), - ), - child: Row( - children: [ - SizedBox(width: 10), - Text( - 'محمد احمدی', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.blueNormal, - fontWeight: FontWeight.w600, - ), - ), - SizedBox(width: 20), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - - children: [ - Text( - 'پنج شنبه 14 اردیبهشت', - textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.darkGreyNormal, - ), - ), - Text( - ' همدان - نهاوند - روستای - همدان - نهاوند - روستای ', - textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.darkGreyNormal, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - ], - ), - ), - SizedBox(width: 20), - GestureDetector( - onTap: () { - // controller.onTapMap(); - }, - child: SizedBox( - width: 50, - child: Column( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Assets.vec.mapSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - SizedBox(height: 8), - Text( - 'مسیریابی', - textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - ), - - SizedBox(width: 20), - ], - ), - ), - ), - - Container( - width: 20, - child: Center( - child: RotatedBox( - quarterTurns: 3, - child: Text( - index < 3 - ? ' بازرسی' - : index < 7 - ? 'اطلاعات' - : 'ارجاع به تعاونی', - style: AppFonts.yekan8, - textAlign: TextAlign.center, - ), - ), - ), - ), - ], - ), - ), - ); - }, - ), - ), + SizedBox(height: 8), + _buildSearchAndFilter(), + _buildFilterWidget(), + _buildListOfContent(), RElevated( text: '+ ایجاد درخواست', width: Get.width - 36, @@ -232,9 +32,239 @@ class RequestsPage extends GetView { ); } + Expanded _buildListOfContent() { + return Expanded( + child: ListView.separated( + shrinkWrap: true, + itemCount: 10, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: controller.isFilterShowed.value ? 5 : 10), + separatorBuilder: (context, index) => SizedBox(height: 6), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Get.toNamed(LiveStockRoutes.requestTagging); + }, + child: Container( + width: Get.width, + height: 75, + decoration: BoxDecoration( + color: + index < 3 + ? AppColor.yellowNormal + : index < 7 + ? AppColor.greenLightActive + : AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + SizedBox(width: 5), + Expanded( + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + border: Border.all( + color: + index < 3 + ? AppColor.yellowNormal + : index < 7 + ? AppColor.greenLightActive + : AppColor.blueLight, + width: 2, + ), + ), + child: Row( + children: [ + SizedBox(width: 10), + Text( + 'محمد احمدی', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + fontWeight: FontWeight.w600, + ), + ), + SizedBox(width: 20), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + Text( + 'پنج شنبه 14 اردیبهشت', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyNormal), + ), + Text( + ' همدان - نهاوند - روستای - همدان - نهاوند - روستای ', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyNormal), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ], + ), + ), + SizedBox(width: 20), + GestureDetector( + onTap: () { + // controller.onTapMap(); + }, + child: SizedBox( + width: 50, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Assets.vec.mapSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + SizedBox(height: 8), + Text( + 'مسیریابی', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + + SizedBox(width: 20), + ], + ), + ), + ), + + Container( + width: 20, + child: Center( + child: RotatedBox( + quarterTurns: 3, + child: Text( + index < 3 + ? ' بازرسی' + : index < 7 + ? 'اطلاعات' + : 'ارجاع به تعاونی', + style: AppFonts.yekan8, + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ); + } + + Row _buildSearchAndFilter() { + return Row( + children: [ + Padding( + padding: const EdgeInsets.only(right: 10.0), + child: IconButton( + onPressed: () { + controller.isFilterShowed.value = !controller.isFilterShowed.value; + }, + + style: IconButton.styleFrom( + backgroundColor: AppColor.blueNormal, + fixedSize: Size(40, 40), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + icon: Assets.vec.filterSvg.svg(), + ), + ), + Expanded(child: _searchWidget()), + ], + ); + } + + ObxValue _buildFilterWidget() { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 45 : 0, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 12), + child: ObxValue((data) { + return Row( + spacing: 12, + children: [ + CustomChip( + title: 'انتخاب فیلتر', + index: 0, + isSelected: true, + selectedColor: AppColor.blueNormal, + onTap: (index) {}, + ), + + RFilterChips( + title: 'درخواست‌های من', + index: 1, + isSelected: data.contains(1), + selectedColor: AppColor.yellowNormal, + onTap: (index) { + if (data.contains(1)) { + data.remove(1); + } else { + data.add(1); + } + }, + ), + + RFilterChips( + title: 'در انتظار ثبت ', + index: 2, + selectedColor: AppColor.greenLightActive, + isSelected: data.contains(2), + onTap: (index) { + if (data.contains(2)) { + data.remove(2); + } else { + data.add(2); + } + }, + ), + + RFilterChips( + title: 'ارجاع به تعاونی', + index: 3, + selectedColor: AppColor.blueLightHover, + isSelected: data.contains(3), + onTap: (index) { + if (data.contains(3)) { + data.remove(3); + } else { + data.add(3); + } + }, + ), + ], + ); + }, controller.filterSelected), + ), + ); + }, controller.isFilterShowed); + } + Widget _searchWidget() { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.only(right: 8.0, left: 20.0), child: RTextField( suffixIcon: Padding( padding: const EdgeInsets.all(12.0), From 04b8fe593f3ec05d671c779cd8a8562a20eed37d Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 27 May 2025 08:48:35 +0330 Subject: [PATCH 086/256] fix : bottom sheet height --- .../presentation/widget/bottom_sheet/base_bottom_sheet.dart | 4 +++- packages/livestock/lib/presentation/page/tagging/view.dart | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart index e628b35..c685305 100644 --- a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -3,13 +3,15 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; class BaseBottomSheet extends StatelessWidget { - const BaseBottomSheet({super.key, required this.child}); + const BaseBottomSheet({super.key, required this.child, this.height}); final Widget child; + final double? height; @override Widget build(BuildContext context) { return Container( + height: height ?? MediaQuery.of(context).size.height * 0.85, padding: EdgeInsets.symmetric(vertical: 15, horizontal: 20), decoration: BoxDecoration( color: Colors.white, diff --git a/packages/livestock/lib/presentation/page/tagging/view.dart b/packages/livestock/lib/presentation/page/tagging/view.dart index 9dcd936..235d4c0 100644 --- a/packages/livestock/lib/presentation/page/tagging/view.dart +++ b/packages/livestock/lib/presentation/page/tagging/view.dart @@ -37,7 +37,10 @@ class TaggingPage extends GetView { SizedBox(width: 4), IconButton( onPressed: () { - Get.bottomSheet(_buildBottomSheet(), isScrollControlled: true); + Get.bottomSheet( + _buildBottomSheet(), + isScrollControlled: true, + ); }, style: IconButton.styleFrom( backgroundColor: AppColor.blueNormal, From a3327dd708e5155df9f97bef131b18a720549a91 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 27 May 2025 12:21:18 +0330 Subject: [PATCH 087/256] feat : add counter list --- .../lib/presentation/page/requests/view.dart | 75 ++++++++++++------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/packages/livestock/lib/presentation/page/requests/view.dart b/packages/livestock/lib/presentation/page/requests/view.dart index 54b9dc8..2b73f22 100644 --- a/packages/livestock/lib/presentation/page/requests/view.dart +++ b/packages/livestock/lib/presentation/page/requests/view.dart @@ -34,30 +34,32 @@ class RequestsPage extends GetView { Expanded _buildListOfContent() { return Expanded( - child: ListView.separated( - shrinkWrap: true, - itemCount: 10, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: controller.isFilterShowed.value ? 5 : 10), - separatorBuilder: (context, index) => SizedBox(height: 6), - itemBuilder: (context, index) { - return GestureDetector( - onTap: () { - Get.toNamed(LiveStockRoutes.requestTagging); - }, - child: Container( - width: Get.width, - height: 75, - decoration: BoxDecoration( - color: - index < 3 - ? AppColor.yellowNormal - : index < 7 - ? AppColor.greenLightActive - : AppColor.blueLight, - borderRadius: BorderRadius.circular(8), - ), - child: Row( + child: ListView.separated( + shrinkWrap: true, + itemCount: 10, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 50), + separatorBuilder: (context, index) => SizedBox(height: 6), + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + Get.toNamed(LiveStockRoutes.requestTagging); + }, + child: Container( + width: Get.width, + height: 75, + decoration: BoxDecoration( + color: + index < 3 + ? AppColor.yellowNormal + : index < 7 + ? AppColor.greenLightActive + : AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + ), + child: Stack( + children: [ + Row( children: [ SizedBox(width: 5), Expanded( @@ -161,11 +163,26 @@ class RequestsPage extends GetView { ), ], ), - ), - ); - }, - ), - ); + Positioned( + top: 5, + right: 10, + + child:Container( + padding: EdgeInsets.all(4), + alignment: AlignmentDirectional.center, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black54,), + child: Text((index*20).toString(),style: AppFonts.yekan12.copyWith(color: Colors.white),), + ), + ), + ], + ), + ), + ); + }, + ), + ); } Row _buildSearchAndFilter() { From b935f3f12ae205536d9643ab126cdc30571d8b06 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 27 May 2025 14:31:50 +0330 Subject: [PATCH 088/256] feat : content list --- assets/icons/virtual_tag.svg | 1 + assets/vec/place_holder.svg.vec | Bin 0 -> 5160 bytes assets/vec/virtual_tag.svg.vec | Bin 0 -> 1725 bytes lib/presentation/common/assets.dart | 36 +-- .../lib/presentation/common/assets.gen.dart | 12 + .../lib/presentation/page/tagging/view.dart | 281 +++++++++++++----- 6 files changed, 223 insertions(+), 107 deletions(-) create mode 100644 assets/icons/virtual_tag.svg create mode 100644 assets/vec/place_holder.svg.vec create mode 100644 assets/vec/virtual_tag.svg.vec diff --git a/assets/icons/virtual_tag.svg b/assets/icons/virtual_tag.svg new file mode 100644 index 0000000..1f8b8aa --- /dev/null +++ b/assets/icons/virtual_tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/vec/place_holder.svg.vec b/assets/vec/place_holder.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..caeb6bf3555827d9e81281726165faf16f3603fd GIT binary patch literal 5160 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 KQ6Uiy4gCukGL5eQ literal 0 HcmV?d00001 diff --git a/assets/vec/virtual_tag.svg.vec b/assets/vec/virtual_tag.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..3d6d199286f982295e9d2982b8ee96f77fe7fc5e GIT binary patch literal 1725 zcmZuydr(wW96tA6Koka%M*+Jm4v$d`2{HpqLhh%ypo2)_Ac!`gf;A{Gm5ov=C|WZO zWQYPQAgnBcYapOF7Q2*2H5y^WqflOEqoQGplv3Qzy}Q@?qjTrX_dCDyxWDiFokz;T z!-VlCge(`UQW!WXaD)hg(mQImz%il~P(LPctZ41+Y!Nt4wA@3I1kOsdhJLv%aMsjP zFod|!MF`6>EW^-h`B;{V5&g7GfRKH(PT;jW0$*=!q_#1_>@!B($PM(*-3wCr6S6)(fJM$fVpeYf)@|s* zVDvGhUHS$b(I9PGJ6%_U);5iVC6@}#ZTjEg&rX^DZ)}t>>{}Cp_8f$M*o2-(dB}cf zLhX)R6g)PeD<&7APfYkDFc;kvJ!a=3b;<Q`fAw>hV`0q>40lj>k*LUj?_7gC~leu zwRJNF3tplenz8aU;3_mBFd-JsO^ujLPlSE09%U69k$L){vafjz!8_}TYabR5^>j)xPjmujJ#c7TI_4YrQhA^L(2x|?>u(mKfTD;O&>Q)DF5 z3y|oMnP+SX?bPV{#DLeIc%rbP zjruug-fBc)K0)EFPho#=l0QT-xPF{JME&dEyvyfXHQ_u(yN_BR$EhIJ|I5Ri4=wft z2Z3j`uyb7ibz2oyAM-;YhRw>-L4BW2**7^sk`7sSHY|aOBjMV29^&+!!grqlb}jJz9pGuc8pM z@&xXzjl$!r75Mo63akz}3FQfT#<*%EEnJHCglY^)`$kLe0UPsP74yM)NXbwL;$0Vt zjO{uJ6+#`7o(qSF;&~JCRClbUKY_Nz@d^04s9ZvYP%8C{XdYiG%{TXlTE const SvgGenImage('assets/icons/user_square.svg'); + /// File path: assets/icons/virtual_tag.svg + SvgGenImage get virtualTag => const SvgGenImage('assets/icons/virtual_tag.svg'); + /// List of all assets List get values => [ add, @@ -161,6 +164,7 @@ class $AssetsIconsGen { trash, user, userSquare, + virtualTag, ]; } @@ -252,6 +256,9 @@ class $AssetsVecGen { /// File path: assets/vec/picture_frame.svg.vec SvgGenImage get pictureFrameSvg => const SvgGenImage.vec('assets/vec/picture_frame.svg.vec'); + /// File path: assets/vec/place_holder.svg.vec + SvgGenImage get placeHolderSvg => const SvgGenImage.vec('assets/vec/place_holder.svg.vec'); + /// File path: assets/vec/profile_circle.svg.vec SvgGenImage get profileCircleSvg => const SvgGenImage.vec('assets/vec/profile_circle.svg.vec'); @@ -288,6 +295,9 @@ class $AssetsVecGen { /// File path: assets/vec/user_square.svg.vec SvgGenImage get userSquareSvg => const SvgGenImage.vec('assets/vec/user_square.svg.vec'); + /// File path: assets/vec/virtual_tag.svg.vec + SvgGenImage get virtualTagSvg => const SvgGenImage.vec('assets/vec/virtual_tag.svg.vec'); + /// List of all assets List get values => [ addSvg, @@ -313,6 +323,7 @@ class $AssetsVecGen { messageAddSvg, pdfDownloadSvg, pictureFrameSvg, + placeHolderSvg, profileCircleSvg, profileUserSvg, receiptDiscountSvg, @@ -325,6 +336,7 @@ class $AssetsVecGen { trashSvg, userSvg, userSquareSvg, + virtualTagSvg, ]; } diff --git a/packages/livestock/lib/presentation/page/tagging/view.dart b/packages/livestock/lib/presentation/page/tagging/view.dart index 235d4c0..8623a91 100644 --- a/packages/livestock/lib/presentation/page/tagging/view.dart +++ b/packages/livestock/lib/presentation/page/tagging/view.dart @@ -37,10 +37,7 @@ class TaggingPage extends GetView { SizedBox(width: 4), IconButton( onPressed: () { - Get.bottomSheet( - _buildBottomSheet(), - isScrollControlled: true, - ); + Get.bottomSheet(_buildBottomSheet(), isScrollControlled: true); }, style: IconButton.styleFrom( backgroundColor: AppColor.blueNormal, @@ -53,78 +50,139 @@ class TaggingPage extends GetView { ), Expanded( - child: Card( - clipBehavior: Clip.hardEdge, - color: Colors.white, - child: GridView.builder( - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - itemCount: 20, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 12, - mainAxisSpacing: 8, - ), - itemBuilder: (context, index) { - return Container( - decoration: ShapeDecoration( - color: AppColor.lightGreyLightHover, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blackLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + itemCount: 20, + itemBuilder: (context, index) { + return Container( + width: Get.width, + height: 85, + decoration: BoxDecoration( + color: + index < 5 + ? AppColor.yellowNormal + : index < 12 + ? AppColor.greenLightActive + : AppColor.blueLight, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + SizedBox(width: 5), + Expanded( + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + border: Border.all( + color: + index < 5 + ? AppColor.yellowNormal + : index < 12 + ? AppColor.greenLightActive + : AppColor.blueLight, + width: 2, + ), + ), + child: Column( children: [ - Assets.vec.editSvg.svg( - width: 16, - height: 16, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - Assets.vec.trashSvg.svg( - width: 16, - height: 16, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), - ), + SizedBox(height: 10), + Expanded(child: Row( + children: [ + SizedBox(width: 10,), + Container( + padding: EdgeInsets.all(8), + alignment: AlignmentDirectional.center, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black54,), + child: Text((index+1).toString(),style: AppFonts.yekan18.copyWith(color: Colors.white),), + ), + + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + padding: EdgeInsets.all(8), + alignment: AlignmentDirectional.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.black26,), + child: Text('ماده',style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark),), + ), + Container( + padding: EdgeInsets.all(8), + alignment: AlignmentDirectional.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.black26,), + child: Text('18 ماه',style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark),), + ), + Container( + padding: EdgeInsets.all(8), + alignment: AlignmentDirectional.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.black26,), + child: Text('سرابی',style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark),), + ), + ], + ), + ), + ], + )), + SizedBox(height: 10), + Expanded(child: + Row( + children: [ + SizedBox(width: 10,), + Text('پلاک : 1212115112512', style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark)), + Spacer(), + Assets.vec.editSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + SizedBox(width: 10), + Assets.vec.trashSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn)), + SizedBox(width: 10,), + ], + + )), + ], ), - Text( - 'گوسفند ماده', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - SizedBox(height: 10), - Text( - 'سن : 18 ماه', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyNormal), - ), - Text( - 'نوع نژاد', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - Text( - '1212115112512', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - Text( - 'نوع پلاک', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - ], + ), ), - ), - ); - }, - ), + + Container( + width: 20, + child: Center( + child: RotatedBox( + quarterTurns: 3, + child: Text( + index < 5 + ? 'گاو' + : index < 12 + ? 'گوسفند' + : 'مرغ', + style: AppFonts.yekan8, + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + ); + }, separatorBuilder: (BuildContext context, int index) =>SizedBox(height: 4,) ), ), @@ -144,6 +202,85 @@ class TaggingPage extends GetView { ); } + Widget _buildOldPage() { + return Expanded( + child: Card( + clipBehavior: Clip.hardEdge, + color: Colors.white, + child: GridView.builder( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + itemCount: 20, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 12, + mainAxisSpacing: 8, + ), + itemBuilder: (context, index) { + return Container( + decoration: ShapeDecoration( + color: AppColor.lightGreyLightHover, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blackLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Assets.vec.trashSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ], + ), + Text( + 'گوسفند ماده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + SizedBox(height: 10), + Text( + 'سن : 18 ماه', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyNormal), + ), + Text( + 'نوع نژاد', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + Text( + '1212115112512', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + Text( + 'نوع پلاک', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + ); + }, + ), + ), + ); + + } + Widget _buildBottomSheet() { return BaseBottomSheet( child: Column( From b86a2d986ebfe334b0fa6f81aedaed457570295f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 28 May 2025 14:15:19 +0330 Subject: [PATCH 089/256] feat : new tagging page --- assets/icons/tag_label.svg | 4 + assets/icons/virtual.svg | 24 + assets/icons/virtual_tag.svg | 1 - assets/vec/tag_label.svg.vec | Bin 0 -> 487 bytes assets/vec/virtual.svg.vec | Bin 0 -> 11224 bytes assets/vec/virtual_tag.svg.vec | Bin 1725 -> 0 bytes lib/presentation/common/assets.dart | 46 -- .../lib/presentation/common/assets.gen.dart | 20 +- .../bottom_sheet/base_bottom_sheet.dart | 5 +- .../lib/presentation/page/tagging/logic.dart | 3 + .../lib/presentation/page/tagging/view.dart | 635 +++++++++++++----- tools/runner.sh | 5 +- 12 files changed, 509 insertions(+), 234 deletions(-) create mode 100644 assets/icons/tag_label.svg create mode 100644 assets/icons/virtual.svg delete mode 100644 assets/icons/virtual_tag.svg create mode 100644 assets/vec/tag_label.svg.vec create mode 100644 assets/vec/virtual.svg.vec delete mode 100644 assets/vec/virtual_tag.svg.vec delete mode 100644 lib/presentation/common/assets.dart diff --git a/assets/icons/tag_label.svg b/assets/icons/tag_label.svg new file mode 100644 index 0000000..7db9b38 --- /dev/null +++ b/assets/icons/tag_label.svg @@ -0,0 +1,4 @@ + + + diff --git a/assets/icons/virtual.svg b/assets/icons/virtual.svg new file mode 100644 index 0000000..b3563c1 --- /dev/null +++ b/assets/icons/virtual.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/virtual_tag.svg b/assets/icons/virtual_tag.svg deleted file mode 100644 index 1f8b8aa..0000000 --- a/assets/icons/virtual_tag.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/vec/tag_label.svg.vec b/assets/vec/tag_label.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..7afb4cd8e5999ee56f01bc2e1cc232da9f6e1b5a GIT binary patch literal 487 zcmYe&?O&Hu~{4FCVjy2dd4XJ7!b6@W4g_KZL=X$A%caUf=3 zWC8<5CJ1C^0CAaxSdh0v>*_B+m+nd!Lpa_Z_||b35KT`O2ZqlgH7H^_#=dem2M4=SGe)s%IUvtP&lg+zlPPem6N<2q=N+ zyN);PL41(k?iF@`X+`;dF#YxRZ!o>hh0zJ5j)8&238W81^XJ~UWVBzxRZ@S|=6)wjm_d~&SsDZm9pV4;*5DoGVh+dhs x-T@?E6+FoSq#i^&%T$5slc_CWc@Pa!528W(LGmDTVdfjifnwwTe;@^lIsjfytH1yN literal 0 HcmV?d00001 diff --git a/assets/vec/virtual.svg.vec b/assets/vec/virtual.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..13b9ec3a2de7d3874214a0df0bbfc7d6bf510ac1 GIT binary patch literal 11224 zcma)icU%_BvMoUcL;*n*Bu7CqD4B0+Nk&u*C@KmV0ryrEML|$<&Il+55D_yX62zQy z4%-Ok>^A54>ci*xopblS?>_!neA7MMGd0~+t5)?yi%bbgQwfPBkdR1(rvHqbpVAT% zKYwaSN=O(>@SoIw`ID6XZ!R4Z_mt>C)~byU7nO-#lsea8Hbh@T00e9{6jO|2^7!Hly<-b#*BpP? zKTV>0M~6Y8D4S$LM&aSf#q@{VSlo4~B9*YQpuww1!D1Xt`c~7bzs4bG-6}fgF%i~R zm(zyO2+SC^oC3bh#4EchT3<5@xfZKvqbM4SBCC16IXLxVHP!Z>3stuonlNoHMwQjj z=a#uBdsRbg+GCLBTuV+p=Hpn=TG|{D3l+t+^yjEJeA!k@pA{EiL&X}ZJiP!yQ4QT& z6Az8atI1?x0=_y|Q*6*eTh>@yn@4a}v7AR8WvfGSp8jp(cl9 zNS`eunOjMaGApIu-yw2WJbpGTBjfuEpnrQg-H~5_fpROU&?XL3>?^6JR~%G>E9v-` zSVU!3l4^S_^qVV5CMFiA$5qjNsaR;LtRjc3`3P*UqJtObLAIcZF3ZisKv5+PnHYmR z7^*_Gp-%;720kbs6-Wt!4}P?aq)j;iFv}Q1c6MVhbFx2Oo*#y!h7qKTNTkghN2eCe!sSOZ z$a?2IRGv$7+q{NT#q{RDiKdw7UJ36WYk10M4V9?7HTcT z*{K=mvo8VZW3wPJGXV(!IoR1Z0YfPd-Adx|cU~d#$`@d+)M5yuWAW~JDU{blW9r8; zWamdADx@4+@BD#`vT{uGh(PJ3axCpP1rP3&qg^TtcwNqO1|#)zIecr!BH%|kawCHH z8JFOK`KS);5j`AA-^wASH5g@&$`NtY8*xYZzUYBSDlNxzD`&ijFUP|=8yt@*!~Er@ z2w75!u!H(YIbXtaY4WocVQ55etVk?C;}~VEH_U_N{_gxPIoMSs%kP_o(vi||YRtf^ zfUjiWmjPL~7j*Y(I!euM({`&2n0TD0bC=Vga`_-xE=t3Q*nPa$)6g2VnLz0Ee!x&dieV6%~m zexxCD(gyaG=@`*@9qHc7K-0n16y%qQ)2Eix$1a)J+fqh$+cKagDxhc4>6raFlYK-Q zY(i3~>*HiR-am`nEfSGX7Q%Zp4kpV2=tlMo*xj_H?-`+xIip99BZnhwmM+OR4aH|0 zT`K?S5B)4%x;WSmI~VHFp{;({Ggy+YYk1?zu*1U5aNzu$GGW3X5oWB76&B_?<68X? zA%Ctt?7mqE-#^&k><|TErm_VrMDImY)J;G=y9uXV3~{+ZT{yH=7q1t&2%QbI5p5AE zMAm3v`%@{QXuB#r?1qY#{ZPOGseHF77rUV6rJcLao%>23QiZb3S?Nei1Iq<&jTzH|pY@M@Q^5X|-e?_3f!iCfjpq$~O%vocaru z4|r0Ix)#Z;Z4^;=S2cvZ4b|4XNtDWWQ=kEzNWN=2AoLnkjA? z%C%JSQdgwBdp!-2s}jwT*+kP<-V=rOsiT^_-aEJaAOTAjaS4>?@ctncTY@QRZq=+>i9Ufl`gg$z+1PKa$BtsvHl?0$U5_$I!0=x zBG_r1CHKt(Vd-?0aRgCxS;~2I6s_; z*M?7k7cM=}!kXPf;CoUFd#p!egq=3}R)yekvNqf`ry|N;2YU5?K=fD-oTGDq$)n{VZkw8iAk_rRbmdCq{i=jOi6o*eWbW#k^>wb}zxg+_^9;FT(c^ zF_;~jkDTwZ2y4iOo=zOB{WDOxF%Ea+6JVwm&pvfJJg>$>_re$qdK%ArIsiKF;&EQz z2MOomxxat~De)+@abaH?kMTe3*-ymd#WP!&o?L(%*;d?V0s1+cv%iYN-z!b|o#ta# zXCoZwJqLLv2H4hZ2AUl7Q5+o3K2i^db*Er&f*y8U55wqjde~Jqf#bOzCJY*j>l%7^ z_dO7S)_TaUABIX-J&uh-FldY(Mn4~f`zd;uFYk+8bM&!$xG%>I1H8Y%aktO_omYE9 zGu{Ae%)PKV!T?^)9?S;~@CNQU=V5>f*@39-s*kBtfdMadq4^9r`mPrmR(PRvqdd-J z`XFF~1a2?)#_+HYWN6}z3tykoNhL4bx_z6z{Oyk69#^Q-BjAJlIjWc^g5ir3G*QVJ ze;wXSALm-*&FQ_&hm1HbY$w^{eXzl2E6s^i!nO;ms7*~4KgTU4_n%*Bc6I?BT6~`# zbj_#2k0)qPWp2kl2rkH_x{LMX`6`FDOV*RRW)3}1-@^Vjk3L`DOubujNPX0L8fKG8 zu01zUS4*NT^BTx5;JBc=ekXZWoe*tus-^T%TSQ8NVzITwD)y2?Td32 zNjR^fIx{cP-%Beg)^LI-Dr5ysUzjQ~pR%-L-&f|B(x-KMMa?(ZcLhlZQ|z#3=* z!7PQ+wZ;mA_r#K?_evqWb0|F&ZVE1W{xqpoktUxKXjY&L$+}rlKj%mq-N}^p&&Z`G zQ%or3OCH@BZ$k6l=JUH7Q*dAbogZyTYVJj(ebb2iZs=WZld=q*qcXXbyZ#s=4;U_l$ScPkOJYq)8H? z$Kphl*JPpm<+EGGVkLB+F{kq^ z?*T97sD`v6(F-re8nf^6LS~u?rNw(eKi`Zwu{R>LtSF|?-I62+`=VH|q|CHYh<;~6yE;$CVK-a$nNg@3>O=kxF*v?)1U>B(4>`w)%*hk+ zeOEN?yOG5HCZ6^xq@e%1WC}4&#iOqo)Y~Tw!5Vq|jnknWP(o8P({XGvyKMtNy5<;TbVy3VR?2V1>_~8$E_U{cQgfWF6^b4&{WPDj&OS_Hsze6 zI{P%v`7ToQ=rqWCUFS8GhSXP&=*sFexTd_Pzq@DPk*Op`4$s8(J6&*Ud^XM=mxuT4 zT#TNtgh#pg*k`K>`6Go$J*tjv3yLwlj}9&*E{6FOBN&V;WqX+8<@QpfAGd?EK^ZLc zT=8{K8T%#=44GI4l{fyl5nBeMxq;X)tBn2Jcy#7|V!!^|ziUWJNhorx{*Po>Qrcg9 z=|NaFMk(0g?8mGQtj*3s=fk$RWR`_6TU&^2o@ZjoF)Rh+Z}#KdBawZb3H!~tu>5I& zfoCHSGgKd!3)nui=Qz-h{k9{=M^g;lBEs{1MsS?wi7yNF5nSNU99tJvea7HWPfhlx zQ_)*T1F0*cQ52?yosNl6U#^2iW72U!!U&hMayagoW7)$Tj)4|v(8|TWah7N^%;o2` zf`UaZ`*CaZ`kKQr#0GkmIUG}L5$2u)*WI>o`s;Upy`rDetc za0b$ng3ncM7||<*Z7yK2>M#6#T|=^ygo?Q1zvVwXjCh10;>)SpDR`?h5HlK+J8-gp zGU~1Zi$5gc)==P(O(KdGijY4y9_fy*oX^hZJj9vfbvR;X_2)T9vt8{`rsoIiorLp6 zKKy-v);uq^J2-}VVr~iXUiN^`9fA9KaC{SS{Pp16#SISy4~|8y%qu+D2CnE8>B&66 z1#_Bwq2=g^_ zf7|uBe_)tC!Cq~9};K(_1IsYAo<%i}lw+Y}iJ&U>4VAOg4 z0X5@6kO`TFfNy^A^qz>U3w}tk8V|3<{=7EEu#JW?PYGfk6~OixjiSE;xKALOQv;ZH zjl>!C0Om#`_+5swrZa*$)?jSX90A!){=8pCFrOL3dwV2~?(oC9BV*X!%)_>ZqUSkx zTuqvW5E&1?HUrzq1F=u$z(&@a^O{&R)egeW?QuMhKQekPKyK?`XdRE^+;Rx}g*fIl z0dR?mWuGt%w=L#le%vrbw$I~d8pgh59;7OU@wfklzwMzR*+s(Tzu4^GmZj8xBbohs zGpFg&UXpzOu_Xd_#Y)hkNLMuf)gsJ~vqew+T%q`+3G5CP3E@QsoZ~I#+(;X9maJy} z-Uo@HI|Qe7YKU4|Anda1iKQ#X2pQ)TFyfh$aCCo5?ZIvjj zvUow0x0DEyYEQ^Ta_<@Kr_-$3fGoiqlop( zg}fJsndg)W-qJ0kpwuXojjJQ|PDcdiptYpoe@~cNRZS5Cr08qe3hMS$g|?Yiu=Zq1 z{i~N#sml@}zLvhLOdyvHTWHwy33U3@W>R&YNptJB(y;4^bY<9f3Mx$J zzPo67b~bq?9pLB7qfMiZQJ#DOOI#=XMcY$kjmo@dCONstN0_ zc~t+G77PmVNw0?v%K16phUnl#zXIyIQ3uIBoQuEE!J)AQVqS%qK1GydY{@*ikUS#n zAeEd!hOG|J(oLl6o1EZOK9yGVaDZ#oa5Bpf;i8HM{csGN##C$lLIg2j-a>}B9?K(JSltp=^IvAsnMQQ#zIQk)zWZr7QCnJ+|3pKH?XD0aw z8i?fUuTQE&=2aG%T~kAZGv~$XY8bvfpBC=u1=+w7631hQq2;9aKpE#pSCH*k1!x6U zah@lO3u@Ig%10XR(Up|3_A?o|ET;$OUa)psLYtx=(famG8f@{92FPTPwDCRqvMrt7 zzrE9Oy}I!hoxYz-3OBA%S!pgEyKtG5KjzTZn`dck_Z)Iub)2S8$)dA1hnTCU)BWpv z=<(oGigDOMD|RGuUfV)1f5ec1Z4-I4{Yi5-Hd6SxiPS!_g;wnuL(?m_)3mTaniADa zCtHV5!;WqAy(WNybvMyY#ZlCHtA=)7_N87Qs;NlPmEty3Q9zU#Ya^@4agQ2lHm{{Y zQeA0wz!uW}^ColSJ=C*vgRuMF87e!wLx?iELdOjE3WtntQLx)tVM*IPS|9mT&@_5T zD`As46>th=7;)Zba$`jgEcSCr) z@hN#-ye7=-_lz=ETo(3~zM{ad>x3=yzL243s*n*N4S$CS;c#G=4nHB4FULMRP{?21 z4f;nX3JOCNLD@3|r`8_G{gf=ct5w1LiN%6$J8Lk#YlJ_B_GW*&LwI+#HwKno5Po)2 zgVCv*g4(p-_YwJ+=GF1)|&>DEw3>`nF{rJ(+3JMBxq*R_VEjKsA6hkyM~XZjz%{#V!g zAHBstm_LXG(q3NyYvrX>?Fkf4EvCCcge_-sD9A}*jWdnT7m0AHJc;?d3r;ws&=wCHWm*) zL6Yr8K*edgb=#bCjdPsGa(vu&nXK9zA$~8tdgeNCk{0J9t=nfC+rZk?Ft3)p)}oI{A9xmAWavc4D4miDT_j5XD-+YP=-mo6Irs(@(C4 znPa2qJKeK4!}|6wG})yetonbXqdQDctpA48?;7E+ocDC(PXo9&eWF>$dYH57EBiVF zET8qAB7BYD(fXYvGL2yTSJL2ioZ6e-}*WhKM~3#b~TjNSnPyi$}Q3=v?wLm4wz3%l@AnRO}w zQu#em<}N^^UoWwjM+C@ zV`h>ObNhbiI^PI0T1?Sph7peXo8r?XBka3lf}_2RAhpQ|=|>IW6RO|Q-_216!T@8e z9H5B}ulr*APIWvn<}r$TGnX~Th;UWb>@3lquY#f4Hn^VBgX__Ce zmSYXqt=+NQ&Js88DKc+2h1zWuL=HA&Zqyr>D)jNJRSVI@dbsqb9{N1d1I&3n3i^2Z z%mgxN`gro#4DKiNvHqbY?=gME+_pjUTRpC~^yl14m-9>q6ohDVeZ~o=WY36yv}S~;Tgs2)Xo+6M*qT_E@U7ZvR-V6E%PK{ztI58u1nzCdVNG3`N1(w7mqVOa~)b6kB+=0qb|Cv1H7Oq8}v}~ z?Kx}zMqH*PQFG->Ca6OE~WNL09@)b&R`aw-pLyr4YBq z8akt;dCl5zo+ZtBk{!l;k!BsfKkmeJVm-qFD>`>(J2*qKNxI{^hJBYp*hn{Ate0fn z!wp@6Bv?0h!%?sAw5^*6jrE^-UNhVLEf3 zc#B-39MQJq28~j%$NH~VS!1(9ap#M4d$|QPU!5np&&E(PILEwG7eDpRQk|q0u01== z`Ib5^W}KvZ-&7%KeVjDcC}VWPVcJxv$opeIwO4jSz=7TLWxE{WqFU*~%P!c~)I?ez zrI|NxrGr-`xPKkj#lO;DPMc_-@jJF*HMLE+O6vz#(X+#?H0H}1)<~C=?#o&#QCq_L z**fxJ-AyKbJ-sc-r%O{f4szWtY*sVbk6Fq3-agK4s%g05ajJi~hRzF@=-ZJsWJEXV zx^5Na)ZV8?*UdE0{S9rAZ6W((5?s^YNlmtLusFMyb0B3nz1T&1yVPO)Z5!p5YN2HG z7P5V)%eDCRT;DTbJ!BP`{%wwc`?X}hk+q|bD_MtRU;81SG_2gvxG|q=}3WhH$7cdqvT&C8@$iZf#g31L7nOoKU| zDiyPi(2q5dBCZRYpsA$@H?J7sZGI6}eKJ7T@FLzH`ndY45bs%PL+F%LuJK4==h_r3z4(@7hNQq}?LGRe z%lcEv4f>{*!an38NoOTv|BREgNj@3z%MQ_{K1s-q*~4cO7GZOGD+vSQaCFcXKJzl0 z>oOZiPiH#s?F}^T@>G~yUQd0iCNc-vNL5)A_-w~!dRiKcU61QHw;YRPr+U5~1idl! zoE!6*l{xj)h0jDBY~DiB^GD!$L>=#q0PLvRNWPYXv3XxDuYEsw$yU?a$3ECGwUU(A zuvU0zHGfARq(s!xnBKnF`gtwq>wdVEwVqzT^Mkp{*%vQ= zY^G}=e!O1J(A#_;+*|XKPP>5POc&Pw+|Z)go$FmrIAW*5nreU6{M6XT*l>-e4{I)# zm~5cMXwLN~UAAjKt_2#P^&9JtWP;Vjrd;(&6IVQP`p~p zdgzC#oR^!kRyu>V7aR6-v*9qx0nNoRXgnoC){+>!DfPtV6*1_{HKFR2G0>^<#vhe2 z%*}joWpxZ|++#cHYAYxF$@*LjYj}%z9mimEcp}aO$DqgiM5K+5flqQ01`LmZoH6U% zRxw!dcP3i9#&Dd=#q(j&*l&`Lmh-b%M=W6eF%vlng{-SiXZ@`ZNyd@P6N>QOFC6x+ zMa*BOVsLa3BnMB1*P0?2noLBW^F?rx4CR?go``&hN(jpcvOe%sWuLu4^@l zFx+=o$GZKpFc8&^g?x5r3?76PvJJ*#u1X=gUJ2v+Ujd(?n2Lv%1&F>9fvFGk;gK^P zI&<>*JiwpWx;Kw=uNmmyBad~?nRw!m%UW6#c2CM-eK-n8&f@(sn>FGL?5Ug$owPKz z&uoq@NzBipS(l7u-VqJ=%~7yf8jbB+rm^j!QPwa4pAJOx_X_0aibkCMF#hJzybk=~ zyCNDd9euDkBN`XOz40g|8gI(Ia5gC#YmRuLWl=N+lnq2Sk2@+vfd5SK{jOZ+i)P)z z5w*)^v(7ev`PVGm_-xzp+deu@emt(ZnPc12Ag+y?@$-yC?-n!Oe*s+cVGgp{o4Jq~Yk&fOJ2QAh*mLYL$5B&T zIAob)(hG}@@v0k5c|HrSm-glQv<0t8BbX>!vb_zN<6E-Usn0yo3Q=ctc`O?grs#BN zx9zVr`B`|(rar7uIzjG7Z&WOG!D@e1_OTqxCMh#A_Z+RrvEK(9^`v+``16^i2ej;= z7>`hs>R_yt*~9tKV0cS6cU*6ms-rsZAw1p|K6^Bj>#JMorq?j2I&b5cI1-=onklI? z24#nm#4V<^~87sL4KI=9akt$m$V&+s_i?8Q=Gn~)9 z)$>`iKVb4^3u(qj;n1^sj;V97Gi)2RHN|1tvKFqbCc^Dra$2!+fm`f@xdWFKY9x_u%3m~Y0M zsE~b(71w2okbA=pZ>+`f!Vy#F6>;5)Fkog8uMwYr?MDqsIf*X6P7{%j>+kcO*A=yo$+rMnyQQ?v9&%ZU}1F^vO39nT? zAK3bhK39!LvS%00-==k-f9XtaAOHXW literal 0 HcmV?d00001 diff --git a/assets/vec/virtual_tag.svg.vec b/assets/vec/virtual_tag.svg.vec deleted file mode 100644 index 3d6d199286f982295e9d2982b8ee96f77fe7fc5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmZuydr(wW96tA6Koka%M*+Jm4v$d`2{HpqLhh%ypo2)_Ac!`gf;A{Gm5ov=C|WZO zWQYPQAgnBcYapOF7Q2*2H5y^WqflOEqoQGplv3Qzy}Q@?qjTrX_dCDyxWDiFokz;T z!-VlCge(`UQW!WXaD)hg(mQImz%il~P(LPctZ41+Y!Nt4wA@3I1kOsdhJLv%aMsjP zFod|!MF`6>EW^-h`B;{V5&g7GfRKH(PT;jW0$*=!q_#1_>@!B($PM(*-3wCr6S6)(fJM$fVpeYf)@|s* zVDvGhUHS$b(I9PGJ6%_U);5iVC6@}#ZTjEg&rX^DZ)}t>>{}Cp_8f$M*o2-(dB}cf zLhX)R6g)PeD<&7APfYkDFc;kvJ!a=3b;<Q`fAw>hV`0q>40lj>k*LUj?_7gC~leu zwRJNF3tplenz8aU;3_mBFd-JsO^ujLPlSE09%U69k$L){vafjz!8_}TYabR5^>j)xPjmujJ#c7TI_4YrQhA^L(2x|?>u(mKfTD;O&>Q)DF5 z3y|oMnP+SX?bPV{#DLeIc%rbP zjruug-fBc)K0)EFPho#=l0QT-xPF{JME&dEyvyfXHQ_u(yN_BR$EhIJ|I5Ri4=wft z2Z3j`uyb7ibz2oyAM-;YhRw>-L4BW2**7^sk`7sSHY|aOBjMV29^&+!!grqlb}jJz9pGuc8pM z@&xXzjl$!r75Mo63akz}3FQfT#<*%EEnJHCglY^)`$kLe0UPsP74yM)NXbwL;$0Vt zjO{uJ6+#`7o(qSF;&~JCRClbUKY_Nz@d^04s9ZvYP%8C{XdYiG%{TXlTE const SvgGenImage('assets/icons/setting.svg'); + /// File path: assets/icons/tag_label.svg + SvgGenImage get tagLabel => const SvgGenImage('assets/icons/tag_label.svg'); + /// File path: assets/icons/tag_user.svg SvgGenImage get tagUser => const SvgGenImage('assets/icons/tag_user.svg'); @@ -123,8 +126,8 @@ class $AssetsIconsGen { /// File path: assets/icons/user_square.svg SvgGenImage get userSquare => const SvgGenImage('assets/icons/user_square.svg'); - /// File path: assets/icons/virtual_tag.svg - SvgGenImage get virtualTag => const SvgGenImage('assets/icons/virtual_tag.svg'); + /// File path: assets/icons/virtual.svg + SvgGenImage get virtual => const SvgGenImage('assets/icons/virtual.svg'); /// List of all assets List get values => [ @@ -160,11 +163,12 @@ class $AssetsIconsGen { search, securityTime, setting, + tagLabel, tagUser, trash, user, userSquare, - virtualTag, + virtual, ]; } @@ -283,6 +287,9 @@ class $AssetsVecGen { /// File path: assets/vec/setting.svg.vec SvgGenImage get settingSvg => const SvgGenImage.vec('assets/vec/setting.svg.vec'); + /// File path: assets/vec/tag_label.svg.vec + SvgGenImage get tagLabelSvg => const SvgGenImage.vec('assets/vec/tag_label.svg.vec'); + /// File path: assets/vec/tag_user.svg.vec SvgGenImage get tagUserSvg => const SvgGenImage.vec('assets/vec/tag_user.svg.vec'); @@ -295,8 +302,8 @@ class $AssetsVecGen { /// File path: assets/vec/user_square.svg.vec SvgGenImage get userSquareSvg => const SvgGenImage.vec('assets/vec/user_square.svg.vec'); - /// File path: assets/vec/virtual_tag.svg.vec - SvgGenImage get virtualTagSvg => const SvgGenImage.vec('assets/vec/virtual_tag.svg.vec'); + /// File path: assets/vec/virtual.svg.vec + SvgGenImage get virtualSvg => const SvgGenImage.vec('assets/vec/virtual.svg.vec'); /// List of all assets List get values => [ @@ -332,11 +339,12 @@ class $AssetsVecGen { searchSvg, securityTimeSvg, settingSvg, + tagLabelSvg, tagUserSvg, trashSvg, userSvg, userSquareSvg, - virtualTagSvg, + virtualSvg, ]; } diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart index c685305..cb646f0 100644 --- a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -3,10 +3,11 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; class BaseBottomSheet extends StatelessWidget { - const BaseBottomSheet({super.key, required this.child, this.height}); + const BaseBottomSheet({super.key, required this.child, this.height, this.bgColor}); final Widget child; final double? height; + final Color? bgColor; @override Widget build(BuildContext context) { @@ -14,7 +15,7 @@ class BaseBottomSheet extends StatelessWidget { height: height ?? MediaQuery.of(context).size.height * 0.85, padding: EdgeInsets.symmetric(vertical: 15, horizontal: 20), decoration: BoxDecoration( - color: Colors.white, + color:bgColor?? Colors.white, borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), ), child: SingleChildScrollView( diff --git a/packages/livestock/lib/presentation/page/tagging/logic.dart b/packages/livestock/lib/presentation/page/tagging/logic.dart index c60d7ff..30e8316 100644 --- a/packages/livestock/lib/presentation/page/tagging/logic.dart +++ b/packages/livestock/lib/presentation/page/tagging/logic.dart @@ -2,6 +2,9 @@ import 'package:rasadyar_core/core.dart'; class TaggingLogic extends GetxController { RxInt selectedSegment = 0.obs; + RxBool searchIsSelected = false.obs; + RxBool filterIsSelected = false.obs; + RxList filterSelected = [].obs; @override void onReady() { diff --git a/packages/livestock/lib/presentation/page/tagging/view.dart b/packages/livestock/lib/presentation/page/tagging/view.dart index 8623a91..6e21741 100644 --- a/packages/livestock/lib/presentation/page/tagging/view.dart +++ b/packages/livestock/lib/presentation/page/tagging/view.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'logic.dart'; @@ -15,190 +16,194 @@ class TaggingPage extends GetView { title: 'پلاک کوبی', leadingWidth: 40, leading: Assets.vec.messageAddSvg.svg(width: 12, height: 12), + additionalActions: [ + GestureDetector( + onTap: () { + if (controller.searchIsSelected.value) { + controller.searchIsSelected.value = !controller.searchIsSelected.value; + } + controller.filterIsSelected.value = !controller.filterIsSelected.value; + }, + child: Assets.icons.filter.svg(width: 20, height: 20), + ), + SizedBox(width: 16), + GestureDetector( + onTap: () { + if (controller.filterIsSelected.value) { + controller.filterIsSelected.value = !controller.filterIsSelected.value; + } + controller.searchIsSelected.value = !controller.searchIsSelected.value; + }, + child: Assets.icons.search.svg(width: 20, height: 20), + ), + ], ), - body: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), - child: Column( - children: [ - Row( - children: [ - Expanded( - child: Container( - height: 40, - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight), - ), - alignment: Alignment.center, - child: Text('آمار ثبت شده : سبک 5 و سنگین 8 راس'), - ), + body: Stack( + children: [ + Column( + children: [ + _buildFilterWidget(), + _buildSearchWidget(), + _buildInfoDetails(), + _buildListContent(), + SizedBox(height: 10), + + Padding( + padding: const EdgeInsets.fromLTRB(35, 0, 35, 20), + child: RElevated( + text: 'ثبت نهایی و ارسال به اتحادیه', + textStyle: AppFonts.yekan18, + height: 40, + backgroundColor: AppColor.greenNormal, + onPressed: () {}, + isFullWidth: true, ), - SizedBox(width: 4), - IconButton( - onPressed: () { - Get.bottomSheet(_buildBottomSheet(), isScrollControlled: true); - }, - style: IconButton.styleFrom( - backgroundColor: AppColor.blueNormal, - fixedSize: Size(40, 40), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ], + ), + Positioned( + right: 10, + bottom: 75, + child: RFab.add( + onPressed: () { + Get.bottomSheet(_buildBottomSheet(), isScrollControlled: true); + }, + ), + ), + ], + ), + ); + } + + Container _buildInfoDetails() { + return Container( + height: 40, + margin: EdgeInsets.fromLTRB(15, 10, 15, 2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight), + ), + alignment: Alignment.center, + child: Text('پلاک شده : سبک 5 و سنگین 8 راس'), + ); + } + + Expanded _buildListContent() { + return Expanded( + child: ListView.separated( + padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10), + itemCount: 20, + physics: BouncingScrollPhysics(), + cacheExtent: 280, + addRepaintBoundaries: true, + itemBuilder: (context, index) { + return _buildItemList(index); + }, + separatorBuilder: (BuildContext context, int index) => SizedBox(height: 6), + ), + ); + } + + Stack _buildItemList(int index) { + return Stack( + clipBehavior: Clip.none, + children: [ + Container( + width: Get.width, + height: 75, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 2, + color: + index < 5 + ? AppColor.yellowNormal + : index < 12 + ? AppColor.greenLightActive + : AppColor.blueLight, + ), + ), + child: Row( + children: [ + SizedBox(width: 30), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.bottomSheet(_buildInfoBottomSheet(), isScrollControlled: true); + }, + child: Stack( + clipBehavior: Clip.none, + children: [ + Text('123456789012346', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + Positioned(top: -20, right: -10, child: Assets.icons.virtual.svg(width: 20, height: 20)), + ], + ), + ), + Spacer(), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('گوسفند ماده', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + SizedBox(height: 4), + Text('نوع نژاد', style: AppFonts.yekan14.copyWith(color: AppColor.bgDark)), + ], + ), + Spacer(), + Text('18 ماه', style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark)), + Spacer(), + Padding( + padding: const EdgeInsets.symmetric(vertical: 6), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ], + ), + ), + SizedBox(width: 8), + ], + ), + ), + Positioned( + right: -12, + top: 0, + bottom: 0, + child: Container( + width: 30, + height: 30, + child: Stack( + alignment: Alignment.center, + children: [ + Assets.vec.tagLabelSvg.svg(width: 30, height: 30), + Positioned( + bottom: 25, + right: 2, + left: 2, + child: Text( + (index > 10 ? index * 1000 : index + 1).toString(), + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + fontSize: ((index > 10 ? index * 1000 : index + 1).toString()).length > 3 ? 6 : 8, + color: AppColor.blueDarkActive, + ), + textScaler: TextScaler.linear(1.5), ), - icon: Assets.vec.addSvg.svg(), ), ], ), - - Expanded( - child: ListView.separated( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), - itemCount: 20, - itemBuilder: (context, index) { - return Container( - width: Get.width, - height: 85, - decoration: BoxDecoration( - color: - index < 5 - ? AppColor.yellowNormal - : index < 12 - ? AppColor.greenLightActive - : AppColor.blueLight, - borderRadius: BorderRadius.circular(8), - ), - child: Row( - children: [ - SizedBox(width: 5), - Expanded( - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topRight: Radius.circular(8), - bottomRight: Radius.circular(8), - ), - border: Border.all( - color: - index < 5 - ? AppColor.yellowNormal - : index < 12 - ? AppColor.greenLightActive - : AppColor.blueLight, - width: 2, - ), - ), - child: Column( - children: [ - SizedBox(height: 10), - Expanded(child: Row( - children: [ - SizedBox(width: 10,), - Container( - padding: EdgeInsets.all(8), - alignment: AlignmentDirectional.center, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.black54,), - child: Text((index+1).toString(),style: AppFonts.yekan18.copyWith(color: Colors.white),), - ), - - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Container( - padding: EdgeInsets.all(8), - alignment: AlignmentDirectional.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.black26,), - child: Text('ماده',style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark),), - ), - Container( - padding: EdgeInsets.all(8), - alignment: AlignmentDirectional.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.black26,), - child: Text('18 ماه',style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark),), - ), - Container( - padding: EdgeInsets.all(8), - alignment: AlignmentDirectional.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.black26,), - child: Text('سرابی',style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark),), - ), - ], - ), - ), - ], - )), - SizedBox(height: 10), - Expanded(child: - Row( - children: [ - SizedBox(width: 10,), - Text('پلاک : 1212115112512', style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark)), - Spacer(), - Assets.vec.editSvg.svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - SizedBox(width: 10), - Assets.vec.trashSvg.svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn)), - SizedBox(width: 10,), - ], - - )), - - ], - ), - ), - ), - - Container( - width: 20, - child: Center( - child: RotatedBox( - quarterTurns: 3, - child: Text( - index < 5 - ? 'گاو' - : index < 12 - ? 'گوسفند' - : 'مرغ', - style: AppFonts.yekan8, - textAlign: TextAlign.center, - ), - ), - ), - ), - ], - ), - ); - }, separatorBuilder: (BuildContext context, int index) =>SizedBox(height: 4,) - ), - ), - - SizedBox(height: 10), - - RElevated( - text: 'ثبت نهایی و ارسال به اتحادیه', - textStyle: AppFonts.yekan18, - height: 40, - backgroundColor: AppColor.greenNormal, - onPressed: () {}, - isFullWidth: true, - ), - ], + ), ), - ), + ], ); } @@ -278,7 +283,6 @@ class TaggingPage extends GetView { ), ), ); - } Widget _buildBottomSheet() { @@ -319,6 +323,178 @@ class TaggingPage extends GetView { ); } + Widget _buildInfoBottomSheet() { + return BaseBottomSheet( + height: Get.height * 0.5, + bgColor: const Color(0xFFF5F5F5), + child: Card( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Text('محمد احمدی', style: AppFonts.yekan14), + + GestureDetector( + onTap: () { + _buildDeleteDialog(onConfirm: () { + + }); + }, + child: Assets.vec.trashSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.all(8), + decoration: BoxDecoration(color: AppColor.blueLightHover), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تاریخ ثبت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + Text( + '1404/2/2', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'شماره پلاک', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + Text( + '123456789012346', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'جنسیت ', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + Text( + 'ماده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'نوع نژاد', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + Text( + 'افشاری', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'نوع گله', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + Text( + 'روستایی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'شهر', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + Text( + 'کرج', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'سن', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + Text( + '18 ماه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + ], + ), + ), + ), + ); + } + + void _buildDeleteDialog({required VoidCallback onConfirm}) { + Get.defaultDialog( + title: 'حذف دام', + middleText: 'آیا از حذف این دام مطمئن هستید؟', + confirm: ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), + onPressed: onConfirm, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ); + } + SizedBox _buildLiveStockImage() { return SizedBox( width: Get.width, @@ -482,4 +658,107 @@ class TaggingPage extends GetView { labelBuilder: (item) => Text(item ?? 'گونه دام'), ); } + + ObxValue _buildFilterWidget() { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 12), + child: ObxValue((data) { + return Row( + spacing: 12, + children: [ + CustomChip( + title: 'انتخاب فیلتر', + index: 0, + isSelected: true, + selectedColor: AppColor.blueNormal, + onTap: (index) {}, + ), + + RFilterChips( + title: 'درخواست‌های من', + index: 1, + isSelected: data.contains(1), + selectedColor: AppColor.yellowNormal, + onTap: (index) { + if (data.contains(1)) { + data.remove(1); + } else { + data.add(1); + } + }, + ), + + RFilterChips( + title: 'در انتظار ثبت ', + index: 2, + selectedColor: AppColor.greenLightActive, + isSelected: data.contains(2), + onTap: (index) { + if (data.contains(2)) { + data.remove(2); + } else { + data.add(2); + } + }, + ), + + RFilterChips( + title: 'ارجاع به تعاونی', + index: 3, + selectedColor: AppColor.blueLightHover, + isSelected: data.contains(3), + onTap: (index) { + if (data.contains(3)) { + data.remove(3); + } else { + data.add(3); + } + }, + ), + ], + ); + }, controller.filterSelected), + ), + ); + }, controller.filterIsSelected); + } + + ObxValue _buildSearchWidget() { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.only(right: 8.0, left: 20.0), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + onChanged: (value) { + //controller.search(value); + }, + controller: TextEditingController(), + ), + ), + ), + ); + }, controller.searchIsSelected); + } } diff --git a/tools/runner.sh b/tools/runner.sh index e0b9992..1931741 100644 --- a/tools/runner.sh +++ b/tools/runner.sh @@ -1 +1,4 @@ -dart run build_runner build --delete-conflicting-outputs \ No newline at end of file +cd ../ +dart run build_runner build --delete-conflicting-outputs + + From 7dbb66465c453ab18789970dcb60647a3adeaa58 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 2 Jun 2025 09:38:02 +0330 Subject: [PATCH 090/256] feat : refresh login test: core --- lib/main.dart | 2 - .../data/services/token_storage_service.dart | 44 ++----- packages/auth/lib/data/utils/safe_call.dart | 61 ++++++++++ packages/auth/lib/hive_registrar.g.dart | 3 +- .../lib/presentation/pages/auth/logic.dart | 4 +- .../presentation/widget/captcha/logic.dart | 4 +- .../build/unit_test_assets/AssetManifest.json | 1 + .../lib/assets/flutter_map_logo.png | Bin 0 -> 2424 bytes .../lib/presentation/utils/color_utils.dart | 2 +- packages/core/lib/utils/safe_call_utils.dart | 59 ++++++--- .../local/hive_local_storage.dart | 112 ++++++++++++++++++ .../infrastructure/local/i_local_storage.dart | 44 +++++++ .../infrastructure/remote/dio_form_data.dart | 23 ++++ .../remote/dio_remote_test.dart | 0 .../infrastructure/remote/dio_response.dart | 20 ++++ .../remote/interfaces/i_form_data.dart | 6 + .../remote/interfaces/i_http_client.dart | 54 +++++++++ .../remote/interfaces/i_http_response.dart | 6 + .../remote/interfaces/i_remote.dart | 4 + packages/core/test/injection/di_test.dart | 18 +++ .../presentation/common/app_color_test.dart | 43 +++++++ .../presentation/utils/color_utils_test.dart | 35 ++++++ .../utils/list_extensions_test.dart | 53 +++++++++ pubspec.yaml | 2 +- 24 files changed, 538 insertions(+), 62 deletions(-) create mode 100644 packages/auth/lib/data/utils/safe_call.dart create mode 100644 packages/core/build/unit_test_assets/AssetManifest.json create mode 100644 packages/core/build/unit_test_assets/packages/flutter_map/lib/assets/flutter_map_logo.png create mode 100644 packages/core/test/infrastructure/local/hive_local_storage.dart create mode 100644 packages/core/test/infrastructure/local/i_local_storage.dart create mode 100644 packages/core/test/infrastructure/remote/dio_form_data.dart create mode 100644 packages/core/test/infrastructure/remote/dio_remote_test.dart create mode 100644 packages/core/test/infrastructure/remote/dio_response.dart create mode 100644 packages/core/test/infrastructure/remote/interfaces/i_form_data.dart create mode 100644 packages/core/test/infrastructure/remote/interfaces/i_http_client.dart create mode 100644 packages/core/test/infrastructure/remote/interfaces/i_http_response.dart create mode 100644 packages/core/test/infrastructure/remote/interfaces/i_remote.dart create mode 100644 packages/core/test/injection/di_test.dart create mode 100644 packages/core/test/presentation/common/app_color_test.dart create mode 100644 packages/core/test/presentation/utils/color_utils_test.dart create mode 100644 packages/core/test/presentation/utils/list_extensions_test.dart diff --git a/lib/main.dart b/lib/main.dart index 42195b2..395decd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,9 +2,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; - import 'package:rasadyar_core/core.dart'; - import 'infrastructure/di/di.dart'; import 'infrastructure/service/auth_service.dart'; diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index 39d33dd..0c56166 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -18,58 +18,32 @@ class TokenStorageService extends GetxService { Rxn appModule = Rxn(null); Future init() async { + await Hive.initFlutter(); Hive.registerAdapters(); - IsolatedHive.registerAdapters(); final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key'); - final encryptionKey = - encryptedKey != null - ? base64Url.decode(encryptedKey) - : Hive.generateSecureKey(); + final encryptionKey = encryptedKey != null ? base64Url.decode(encryptedKey) : Hive.generateSecureKey(); if (encryptedKey == null) { - await _secureStorage.write( - key: 'hive_enc_key', - value: base64UrlEncode(encryptionKey), - ); + await _secureStorage.write(key: 'hive_enc_key', value: base64UrlEncode(encryptionKey)); } await _localStorage.init(); - await _localStorage.openBox( - _boxName, - encryptionCipher: HiveAesCipher(encryptionKey), - ); + await _localStorage.openBox(_boxName, encryptionCipher: HiveAesCipher(encryptionKey)); - accessToken.value = _localStorage.read( - boxName: _boxName, - key: _accessTokenKey, - ); - refreshToken.value = _localStorage.read( - boxName: _boxName, - key: _refreshTokenKey, - ); - appModule.value = _localStorage.read( - boxName: _boxName, - key: _moduleKey, - ); + accessToken.value = _localStorage.read(boxName: _boxName, key: _accessTokenKey); + refreshToken.value = _localStorage.read(boxName: _boxName, key: _refreshTokenKey); + appModule.value = _localStorage.read(boxName: _boxName, key: _moduleKey); } Future saveAccessToken(String token) async { - await _localStorage.save( - boxName: _boxName, - key: _accessTokenKey, - value: token, - ); + await _localStorage.save(boxName: _boxName, key: _accessTokenKey, value: token); accessToken.value = token; accessToken.refresh(); } Future saveRefreshToken(String token) async { - await _localStorage.save( - boxName: _boxName, - key: _refreshTokenKey, - value: token, - ); + await _localStorage.save(boxName: _boxName, key: _refreshTokenKey, value: token); refreshToken.value = token; refreshToken.refresh(); } diff --git a/packages/auth/lib/data/utils/safe_call.dart b/packages/auth/lib/data/utils/safe_call.dart new file mode 100644 index 0000000..6d08637 --- /dev/null +++ b/packages/auth/lib/data/utils/safe_call.dart @@ -0,0 +1,61 @@ +import 'package:flutter/foundation.dart'; +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../models/response/auth/auth_response_model.dart'; +import '../services/token_storage_service.dart'; + +Future safeCall({ + required AppAsyncCallback call, + Function(T result)? onSuccess, + ErrorCallback? onError, + VoidCallback? onComplete, + bool showLoading = false, + bool showError = false, + bool showSuccess = false, + bool showToast = false, + bool showSnackBar = false, + Function()? onShowLoading, + Function()? onHideLoading, + Function()? onShowSuccessMessage, + Function()? onShowErrorMessage, +}) { + final authRepository = diAuth.get(); + TokenStorageService tokenStorageService = Get.find(); + + return gSafeCall( + call: call, + onSuccess: onSuccess, + onError: onError, + onComplete: onComplete, + showLoading: showLoading, + showError: showError, + showSuccess: showSuccess, + showToast: showToast, + showSnackBar: showSnackBar, + onShowLoading: onShowLoading, + onHideLoading: onHideLoading, + onShowSuccessMessage: onShowSuccessMessage, + onShowErrorMessage: onShowErrorMessage, + retryOnAuthError: true, + onTokenRefresh: () { + var token = tokenStorageService.refreshToken.value; + authRepository + .loginWithRefreshToken(authRequest: {"refresh_token": token}) + .then((value) async { + if (value is AuthResponseModel) { + await tokenStorageService.saveAccessToken(value.access!); + } else { + throw Exception("Failed to refresh token"); + } + }) + .catchError((error) { + if (kDebugMode) { + print('Error during token refresh: $error'); + } + throw error; + }); + }, + ); +} diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart index 166b5cb..b46fdff 100644 --- a/packages/auth/lib/hive_registrar.g.dart +++ b/packages/auth/lib/hive_registrar.g.dart @@ -7,8 +7,9 @@ import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart extension HiveRegistrar on HiveInterface { void registerAdapters() { - registerAdapter(ModuleAdapter()); registerAdapter(UserLocalModelAdapter()); + registerAdapter(ModuleAdapter()); + } } diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 59b8167..624328a 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -8,6 +8,7 @@ import 'package:rasadyar_auth/data/models/request/login_request/login_request_mo import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_auth/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_core/core.dart'; @@ -73,7 +74,6 @@ class AuthLogic extends GetxController { @override void onInit() { super.onInit(); - tokenStorageService.init(); } @override @@ -120,8 +120,6 @@ class AuthLogic extends GetxController { await tokenStorageService.saveModule(_module); await tokenStorageService.saveRefreshToken(result?.refresh ?? ''); await tokenStorageService.saveAccessToken(result?.access ?? ''); - - //Get.offAndToNamed(Routes.home); }, onError: (error, stackTrace) { if (error is DioException) { diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart index 4adb51c..6a89f38 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/di/auth_di.dart'; import 'package:rasadyar_auth/data/models/response/captcha/captcha_response_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_core/core.dart'; -class CaptchaWidgetLogic extends GetxController - with StateMixin { +class CaptchaWidgetLogic extends GetxController with StateMixin { Rx textController = TextEditingController().obs; RxnString captchaKey = RxnString(); GlobalKey formKey = GlobalKey(); diff --git a/packages/core/build/unit_test_assets/AssetManifest.json b/packages/core/build/unit_test_assets/AssetManifest.json new file mode 100644 index 0000000..52a2006 --- /dev/null +++ b/packages/core/build/unit_test_assets/AssetManifest.json @@ -0,0 +1 @@ +{"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"],"packages/flutter_map/lib/assets/flutter_map_logo.png":["packages/flutter_map/lib/assets/flutter_map_logo.png"],"packages/font_awesome_flutter/lib/fonts/fa-brands-400.ttf":["packages/font_awesome_flutter/lib/fonts/fa-brands-400.ttf"],"packages/font_awesome_flutter/lib/fonts/fa-regular-400.ttf":["packages/font_awesome_flutter/lib/fonts/fa-regular-400.ttf"],"packages/font_awesome_flutter/lib/fonts/fa-solid-900.ttf":["packages/font_awesome_flutter/lib/fonts/fa-solid-900.ttf"]} \ No newline at end of file diff --git a/packages/core/build/unit_test_assets/packages/flutter_map/lib/assets/flutter_map_logo.png b/packages/core/build/unit_test_assets/packages/flutter_map/lib/assets/flutter_map_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8603d0a3d2a91580f77171968c7d13e73fd1482a GIT binary patch literal 2424 zcmV-;35WKHP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2@Od^K~#8N)th^8 zRMj2Fzvu2|H@gcVFS45uO?Wi8V1NXs1mzVTiWS?A+B#IFl};ZXmp&faVYrU_TJF82@glPx-Mmqth(C%= zU2*Ev(8#sa)ZqFN1#7^U=SccA=db*-&YQ9F*jG~oTU4PiH22SCVTQI!$Qg!d?1_b)!u zepXbCl6MAtxTdj@5bdu_e3_`q3e1G71m>pjk<;&sDvP`_;G^ah3#mbl5`uD3m0c+9 zWO?EC>+`~>0ZUeGuFyhQzF@4S6$3kl|ms+_=fiFe(;o>g_N=d7Gy z8PKqD(-%!b{y;#Aczh#x$UTI+U6baitV2!u^F@C<`6FH?^-Xs+x?mn>MUQp$1~7*h z*yrhoCgNPf&JaWR0xp+mp~jb8ktq|;VL8T2 zsqsUrytHX^pUTwNipx;EdmsG4O3Zdsbm|&(lj7P-&meOAP0>o809%#6_x37n^lWp- zh2a=_bapOel(^lf^?Bf7%4A`=?%Ir~J4lu_-NEvL99l^^6TcTlOnie+XB{B87}M~d z7nt}HheRti)@U)b6byMYqJzRWS??8fh4zJ_acpF&==mseRv{EkqDO7|)2)Rv^ zxG2s?3Ho3DHKG}a=hSG1D5WOG1oDwj2XDjMNnxTk{=J z4PE=6LDa#TpU7;s|I2V85}S17C&JtCwleTflqn6cN4};ih^hh;gC;>Id+qN1zhoo- zmS~k3g+y+&?1U$SY+IHy%aR&kjXcZtMHL|wyG%rw_)Bbgb+c@rE%6-5$(kdGdr||m zvY?gl%7a0Ky@qvM{8xma?k=Md+mR{*RBr3yTb(SjZP^E;|4nLu zZ~Z-(SrLSnO;0}UdA9G_|0^ru5sw#vhrfrJJAN?k;jUo@C`?nEPAYeJsx9=<;t#)O)j5Ta)o(m~s33CNA&2kte5)IG6lT+2cH}v1j6V(^c_*B58?Gsa{OHkA9gTrT-M6QK6SlX2MavScXLmFz%qrjrC-=0&-8HBH10{1*DD!?@gj z23JmfWL5Y2Z^EV0ESSJH0%POU+>T%~j#7>8Y;J3_){ngH+=N%3!*JW{qGE(TA2(s8 zV-r|T!`_w{HhvW-UhV9Df(mTyKfCDg$u+I$-Ue}@ivhQCN4f51AD1# zGekjGE^0e@M#L75GY>xtOnhW2o>N$>VfKCMM`{Tkn<$>+*Z`-b5^qzw!Ht>AvzHGB zOUn<1+unImgyWb}17yV8c(*NwS(f?VN6gAO===80&qSEOlo_BRzFS|0i{v3hAN+>n zJIx&G@gTB&2TXR7O~#ZMpep`+^lR3RV${?kdgm9!6?I}?x(_D%RGW&N8{kyDO}u$C zjGJpkB#$0mjCj-SB1%q94aiiyg{C3;z=KLlfwCzd{mM2Gr6y+vsECghu0fakTZ!TY zW~dUewap?*Pi)KGptFial$x9vpdvob#19qkLMT{`fIs;SkND=hKxfVrQF6>+2=UeH zM3kPa8=xwFkcsD?h6o`Dg{qR8K)qhXHf<46a$;MyTFXY3tQz1{yiGb2;!U@uoCSQT z==DoQBuCZ^$W**dN)y}#h~KtW1c}7fZs0EKmcSOrS+Y&=)Qg(HQ#DMxa3b+jJQj zpep|R{p+o}z-J?UXz4iS*aS=L1oUNzbuu_Mz^Ql}WfKD8Td@pdQT@2JPJMnD^A?Cm z4Mzs3i2qA;Zi09lB@=>`qbATm0Op)(tIRPL)G;N_#!~rND&kw2_}xjw+c-7Bm^cZ{s8}I$_ct-)QkRQ(;0vuk%H`O|DHC*YkW6 zZ^KP^wBzsS(X(&DXz%k?yv?~tKOQ@ueG@DN`7Yij7ba-aMZ8V6P0)Vvo#`Xq#x|i> z(uC6DlBAv1);CQ2!dW8uB;JOb&>}e#%FD`=eurL*#*pyOgxB*%v^MX=+sG~l6ZEtw zCZG+*$n&C{02lvwe{)`nw@J4g;&FZ8gN}|@M3{hfSKTs#roOJEYfY(?z^Zw;sjufveass|v<& qbV%3rH@dpIb}X&0Pw`(J!2bax8AXs4WjQGT0000= 0 && amount <= 1, 'مقدار تیرگی باید بین 0 و 1 باشد'); + assert(amount >= 0 && amount <= 1, 'Amount must be between 0 and 1'); final hslColor = HSLColor.fromColor(this); final newLightness = (hslColor.lightness - amount).clamp(0.0, 1.0); final hslDarkerColor = hslColor.withLightness(newLightness); diff --git a/packages/core/lib/utils/safe_call_utils.dart b/packages/core/lib/utils/safe_call_utils.dart index e210b40..c4baa0b 100644 --- a/packages/core/lib/utils/safe_call_utils.dart +++ b/packages/core/lib/utils/safe_call_utils.dart @@ -1,14 +1,17 @@ -import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; -import 'package:rasadyar_core/core.dart'; -typedef AsyncCallback = Future Function(); +import '../core.dart'; + +typedef AppAsyncCallback = Future Function(); typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace); typedef VoidCallback = void Function(); -// تعریف دقیق تابع safeCall -Future safeCall({ - required AsyncCallback call, +/// this is global safe call function +/// A utility function to safely cal l an asynchronous function with error +/// handling and optional loading, success, and error messages. +/// +Future gSafeCall({ + required AppAsyncCallback call, Function(T result)? onSuccess, ErrorCallback? onError, VoidCallback? onComplete, @@ -17,6 +20,8 @@ Future safeCall({ bool showSuccess = false, bool showToast = false, bool showSnackBar = false, + bool retryOnAuthError = false, + Function()? onTokenRefresh, Function()? onShowLoading, Function()? onHideLoading, Function()? onShowSuccessMessage, @@ -34,18 +39,34 @@ Future safeCall({ } onSuccess?.call(result); - - } catch (error, stackTrace) { - if (showError) { - (onShowErrorMessage ?? _defaultShowErrorMessage)(); + if (retryOnAuthError && isTokenExpiredError(error)) { + try { + await onTokenRefresh?.call(); + final retryResult = await call(); + if (showSuccess) { + (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); + } + onSuccess?.call(retryResult); + return; + } catch (retryError, retryStackTrace) { + if (showError) { + (onShowErrorMessage ?? _defaultShowErrorMessage)(); + } + onError?.call(retryError, retryStackTrace); + if (kDebugMode) { + print('safeCall retry error: $retryError\n$retryStackTrace'); + } + } + } else { + if (showError) { + (onShowErrorMessage ?? _defaultShowErrorMessage)(); + } + onError?.call(error, stackTrace); + if (kDebugMode) { + print('safeCall error: $error\n$stackTrace'); + } } - - onError?.call(error, stackTrace); - if (kDebugMode) { - print('safeCall error: $error\n$stackTrace'); - } - } finally { if (showLoading) { (onHideLoading ?? _defaultHideLoading)(); @@ -69,4 +90,8 @@ void _defaultShowSuccessMessage() { void _defaultShowErrorMessage() { // پیاده‌سازی پیش‌فرض -} \ No newline at end of file +} + +bool isTokenExpiredError(dynamic error) { + return error is DioException && error.response?.statusCode == 401; +} diff --git a/packages/core/test/infrastructure/local/hive_local_storage.dart b/packages/core/test/infrastructure/local/hive_local_storage.dart new file mode 100644 index 0000000..53b7b55 --- /dev/null +++ b/packages/core/test/infrastructure/local/hive_local_storage.dart @@ -0,0 +1,112 @@ +import 'package:flutter/foundation.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'i_local_storage.dart'; + +class HiveLocalStorage implements ILocalStorage { + HiveLocalStorage() { + Hive.initFlutter(); + } + + final Map _boxes = {}; + + @override + Future init() async => await Hive.initFlutter(); + + @override + Future openBox( + String boxName, { + HiveCipher? encryptionCipher, + bool crashRecovery = true, + String? path, + Uint8List? bytes, + String? collection, + }) async { + if (!_boxes.containsKey(boxName)) { + final box = await Hive.openBox( + boxName, + encryptionCipher: encryptionCipher, + crashRecovery: crashRecovery, + ); + _boxes[boxName] = box; + } + } + + @override + T? read({required String boxName, required String key}) { + try { + Box? box = getBox(boxName); + return box?.get(key) as T?; + } on Exception catch (e) { + eLog(e); + return null; + } + } + + @override + Future add({required String boxName, required dynamic value}) async { + Box? box = getBox(boxName); + await box?.add(value); + } + + @override + Future addAll({ + required String boxName, + required Iterable values, + }) async { + Box? box = getBox(boxName); + await box?.addAll(values); + } + + Box? getBox(String boxName) { + final box = _boxes[boxName]; + if (box is Box) { + return box; + } else { + throw Exception('Box $boxName is not of exist'); + } + } + + @override + Future clear(String boxName) async { + await _boxes[boxName]?.clear(); + } + + @override + Future close(String boxName) async => await _boxes[boxName]?.close(); + + @override + Future deleteValue({ + required String boxName, + required String key, + }) async { + Box? box = getBox(boxName); + await box?.delete(key); + } + + @override + Future save({ + required String boxName, + required String key, + required value, + }) async { + Box? box = getBox(boxName); + await box?.put(key, value); + } + + @override + Future saveAll({required String boxName, required Map entries}) async { + Box? box = getBox(boxName); + await box?.putAll(entries); + } + + @override + Future saveAt({ + required String boxName, + required int index, + required value, + }) async { + Box? box = getBox(boxName); + await box?.putAt(index, value); + } +} diff --git a/packages/core/test/infrastructure/local/i_local_storage.dart b/packages/core/test/infrastructure/local/i_local_storage.dart new file mode 100644 index 0000000..7cb4f49 --- /dev/null +++ b/packages/core/test/infrastructure/local/i_local_storage.dart @@ -0,0 +1,44 @@ +import 'package:flutter/foundation.dart'; +import 'package:hive_ce/hive.dart'; + +abstract class ILocalStorage { + Future init(); + + Future openBox( + String boxName, { + HiveCipher? encryptionCipher, + bool crashRecovery = true, + String? path, + Uint8List? bytes, + String? collection, + }); + + T? read({required String boxName, required String key}); + + Future deleteValue({required String boxName, required String key}); + + Future add({required String boxName, required E value}); + + Future addAll({required String boxName, required Iterable values}); + + Future clear(String boxName); + + Future close(String boxName); + + Future save({ + required String boxName, + required String key, + required dynamic value, + }); + + Future saveAt({ + required String boxName, + required int index, + required dynamic value, + }); + + Future saveAll({ + required String boxName, + required Map entries, + }); +} diff --git a/packages/core/test/infrastructure/remote/dio_form_data.dart b/packages/core/test/infrastructure/remote/dio_form_data.dart new file mode 100644 index 0000000..8e74832 --- /dev/null +++ b/packages/core/test/infrastructure/remote/dio_form_data.dart @@ -0,0 +1,23 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; + +import 'interfaces/i_form_data.dart'; + +class DioFormData implements IFormData { + final FormData _formData = FormData(); + + @override + void addFile(String field, Uint8List bytes, String filename) { + _formData.files.add(MapEntry( + field, + MultipartFile.fromBytes(bytes, filename: filename), + )); + } + + @override + void addField(String key, String value) { + _formData.fields.add(MapEntry(key, value)); + } + + FormData get raw => _formData; +} diff --git a/packages/core/test/infrastructure/remote/dio_remote_test.dart b/packages/core/test/infrastructure/remote/dio_remote_test.dart new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/test/infrastructure/remote/dio_response.dart b/packages/core/test/infrastructure/remote/dio_response.dart new file mode 100644 index 0000000..30f54eb --- /dev/null +++ b/packages/core/test/infrastructure/remote/dio_response.dart @@ -0,0 +1,20 @@ +import 'interfaces/i_http_response.dart'; +import 'package:dio/dio.dart'; + +class DioResponse implements IHttpResponse { + final Response _response; + + DioResponse(this._response); + + @override + T? get data => _response.data; + + @override + int get statusCode => _response.statusCode ?? 0; + + @override + Map? get headers => _response.headers.map; + + @override + bool get isSuccessful => statusCode >= 200 && statusCode < 300; +} diff --git a/packages/core/test/infrastructure/remote/interfaces/i_form_data.dart b/packages/core/test/infrastructure/remote/interfaces/i_form_data.dart new file mode 100644 index 0000000..ddbda85 --- /dev/null +++ b/packages/core/test/infrastructure/remote/interfaces/i_form_data.dart @@ -0,0 +1,6 @@ +import 'package:flutter/foundation.dart'; + +abstract class IFormData{ + void addFile(String field, Uint8List bytes, String filename); + void addField(String key, String value); +} \ No newline at end of file diff --git a/packages/core/test/infrastructure/remote/interfaces/i_http_client.dart b/packages/core/test/infrastructure/remote/interfaces/i_http_client.dart new file mode 100644 index 0000000..9550c18 --- /dev/null +++ b/packages/core/test/infrastructure/remote/interfaces/i_http_client.dart @@ -0,0 +1,54 @@ + +import 'dart:typed_data'; +import 'package:dio/dio.dart'; +import 'i_form_data.dart'; +import 'i_http_response.dart'; + +abstract class IHttpClient { + Future init(); + + Future> get( + String path, { + Map? queryParameters, + Map? headers, + ProgressCallback? onReceiveProgress, + }); + + + Future> post( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }); + + Future> put( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }); + + Future> delete( + String path, { + dynamic data, + Map? queryParameters, + Map? headers, + }); + + Future> download( + String url, { + ProgressCallback? onReceiveProgress, + }); + + Future> upload( + String path, { + required IFormData formData, + Map? headers, + ProgressCallback? onSendProgress, + }); +} diff --git a/packages/core/test/infrastructure/remote/interfaces/i_http_response.dart b/packages/core/test/infrastructure/remote/interfaces/i_http_response.dart new file mode 100644 index 0000000..461146a --- /dev/null +++ b/packages/core/test/infrastructure/remote/interfaces/i_http_response.dart @@ -0,0 +1,6 @@ +abstract class IHttpResponse { + T? get data; + int get statusCode; + Map? get headers; + bool get isSuccessful; +} diff --git a/packages/core/test/infrastructure/remote/interfaces/i_remote.dart b/packages/core/test/infrastructure/remote/interfaces/i_remote.dart new file mode 100644 index 0000000..648883b --- /dev/null +++ b/packages/core/test/infrastructure/remote/interfaces/i_remote.dart @@ -0,0 +1,4 @@ +abstract class IRemote{ + Future init(); +} + diff --git a/packages/core/test/injection/di_test.dart b/packages/core/test/injection/di_test.dart new file mode 100644 index 0000000..369847c --- /dev/null +++ b/packages/core/test/injection/di_test.dart @@ -0,0 +1,18 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:logger/logger.dart'; +import 'package:rasadyar_core/core.dart'; + +void main() { + setUp(() async { + await setupAllCoreProvider(); + }); + + group('di', () { + test('is ready', () { + expect(diCore.isRegistered(), isTrue); + expect(diCore.isRegistered(), isTrue); + expect(diCore.get(), isA()); + expect(diCore.get(), isA()); + }); + }); +} diff --git a/packages/core/test/presentation/common/app_color_test.dart b/packages/core/test/presentation/common/app_color_test.dart new file mode 100644 index 0000000..34a174f --- /dev/null +++ b/packages/core/test/presentation/common/app_color_test.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; + + +void main() { + group('AppColor', () { + test('blue colors', () { + expect(AppColor.blueLight, const Color(0xFFeaefff)); + expect(AppColor.blueLightHover, const Color(0xFFe0e7ff)); + expect(AppColor.blueLightActive, const Color(0xFFbecdff)); + expect(AppColor.blueNormal, const Color(0xFF2d5fff)); + expect(AppColor.blueNormalHover, const Color(0xFF2956e6)); + expect(AppColor.blueNormalActive, const Color(0xFF244ccc)); + expect(AppColor.blueDark, const Color(0xFF2247bf)); + expect(AppColor.blueDarkHover, const Color(0xFF1b3999)); + expect(AppColor.blueDarkActive, const Color(0xFF142b73)); + expect(AppColor.blueDarker, const Color(0xFF102159)); + }); + + test('green colors', () { + expect(AppColor.greenLight, const Color(0xFFe6faf5)); + expect(AppColor.greenLightHover, const Color(0xFFd9f7f0)); + expect(AppColor.greenLightActive, const Color(0xFFb0efdf)); + expect(AppColor.greenNormal, const Color(0xFF00cc99)); + expect(AppColor.greenNormalHover, const Color(0xFF00b88a)); + expect(AppColor.greenNormalActive, const Color(0xFF00a37a)); + expect(AppColor.greenDark, const Color(0xFF009973)); + expect(AppColor.greenDarkHover, const Color(0xFF007a5c)); + expect(AppColor.greenDarkActive, const Color(0xFF005c45)); + expect(AppColor.greenDarker, const Color(0xFF004736)); + }); + + test('category colors', () { + expect(AppColor.confirm, AppColor.greenNormalActive); + expect(AppColor.warning, AppColor.yellowNormal); + expect(AppColor.error, AppColor.redNormal); + expect(AppColor.info, AppColor.tealNormal); + }); + + + }); +} \ No newline at end of file diff --git a/packages/core/test/presentation/utils/color_utils_test.dart b/packages/core/test/presentation/utils/color_utils_test.dart new file mode 100644 index 0000000..c628757 --- /dev/null +++ b/packages/core/test/presentation/utils/color_utils_test.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:rasadyar_core/presentation/utils/color_utils.dart'; + +void main() { + group('ColorUtils extension', () { + const baseColor = Color(0xFF42A5F5); + + test('disabledColor returns color with alpha 38', () { + Color disabled = baseColor.disabledColor; + expect(disabled.a, 0.14901960784313725); + expect(disabled.r, baseColor.r); + expect(disabled.g, baseColor.g); + expect(disabled.b, baseColor.b); + }); + + test('hoverColor returns color darkened by 0.5', () { + Color hover = baseColor.hoverColor; + final expected = + HSLColor.fromColor( + baseColor, + ).withLightness((HSLColor.fromColor(baseColor).lightness - 0.5).clamp(0.0, 1.0)).toColor(); + expect(hover.g, expected.g); + }); + + test('pressedColor returns color darkened by 0.1', () { + Color pressed = baseColor.pressedColor; + final expected = + HSLColor.fromColor( + baseColor, + ).withLightness((HSLColor.fromColor(baseColor).lightness - 0.1).clamp(0.0, 1.0)).toColor(); + expect(pressed.r, expected.r); + }); + }); +} diff --git a/packages/core/test/presentation/utils/list_extensions_test.dart b/packages/core/test/presentation/utils/list_extensions_test.dart new file mode 100644 index 0000000..d3a3e76 --- /dev/null +++ b/packages/core/test/presentation/utils/list_extensions_test.dart @@ -0,0 +1,53 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:rasadyar_core/presentation/utils/list_extensions.dart'; + +void main(){ + group('toggle test', (){ + + List list = [1, 2, 3]; + + test('should remove item if it exists', () { + list.toggle(2); + expect(list, [1, 3]); + }); + + + test('should add item if it not exists', () { + list.toggle(10); + expect(list, [1, 3 , 10]); + }); + + + + + }); + group('insert to first item' ,(){ + + List list = [1, 2, 3]; + + test('should insert item at start if it does not exist', () { + list.ensureContainsAtStart(0); + expect(list, [0, 1, 2, 3]); + }); + + test('should not insert item at start if it already exists', () { + list.ensureContainsAtStart(2); + expect(list, [0, 1, 2, 3]); + }); + + + + }); + group('clear and add item' ,(){ + + List list = [1, 2, 3]; + + test('must be clear and add item ', () { + list.resetWith(20); + expect(list, [20]); + }); + + + + }); +} diff --git a/pubspec.yaml b/pubspec.yaml index b8726e5..2ec5d9e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_app description: "A new Flutter project." publish_to: 'none' -version: 1.0.0+1 +version: 1.2.0+2 environment: sdk: ^3.7.2 From f646eac8b0bd2c0c28488127326b7fb7376b77df Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 2 Jun 2025 09:40:52 +0330 Subject: [PATCH 091/256] chore : optimize --- packages/auth/lib/presentation/pages/auth/logic.dart | 1 - .../test/infrastructure/remote/interfaces/i_http_client.dart | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 624328a..37b2e2e 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; -import 'package:rasadyar_auth/data/models/local/module/module_model.dart'; import 'package:rasadyar_auth/data/models/request/login_request/login_request_model.dart'; import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; diff --git a/packages/core/test/infrastructure/remote/interfaces/i_http_client.dart b/packages/core/test/infrastructure/remote/interfaces/i_http_client.dart index 9550c18..3e6327c 100644 --- a/packages/core/test/infrastructure/remote/interfaces/i_http_client.dart +++ b/packages/core/test/infrastructure/remote/interfaces/i_http_client.dart @@ -1,5 +1,4 @@ -import 'dart:typed_data'; import 'package:dio/dio.dart'; import 'i_form_data.dart'; import 'i_http_response.dart'; From 288915b354c6a802047a3b38a459d4ce44a6c822 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 2 Jun 2025 09:52:39 +0330 Subject: [PATCH 092/256] chore : upgrade flutter version --- packages/auth/pubspec.yaml | 2 +- packages/core/pubspec.lock | 66 +++++------ packages/core/pubspec.yaml | 4 +- packages/inspection/pubspec.lock | 182 ++++++++++++++++++++++++++++--- packages/inspection/pubspec.yaml | 2 +- packages/livestock/pubspec.yaml | 2 +- pubspec.lock | 54 ++++----- pubspec.yaml | 2 +- 8 files changed, 233 insertions(+), 81 deletions(-) diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml index aa2237c..11617ca 100644 --- a/packages/auth/pubspec.yaml +++ b/packages/auth/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: 'none' environment: - sdk: ^3.7.2 + sdk: ^3.8.1 flutter: ">=1.17.0" dependencies: diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 553ad9b..42a3880 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: analyzer - sha256: "13c1e6c6fd460522ea840abec3f677cc226f5fec7872c04ad7b425517ccf54f7" + sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" url: "https://pub.dev" source: hosted - version: "7.4.4" + version: "7.4.5" archive: dependency: transitive description: @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: built_value - sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + sha256: "082001b5c3dc495d4a42f1d5789990505df20d8547d42507c29050af6933ee27" url: "https://pub.dev" source: hosted - version: "8.9.5" + version: "8.10.1" characters: dependency: transitive description: @@ -205,10 +205,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" dartx: dependency: "direct main" description: @@ -245,10 +245,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -441,10 +441,10 @@ packages: dependency: "direct main" description: name: geolocator - sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 + sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc url: "https://pub.dev" source: hosted - version: "14.0.0" + version: "14.0.1" geolocator_android: dependency: transitive description: @@ -537,34 +537,34 @@ packages: dependency: "direct main" description: name: hive_ce - sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e + sha256: "708bb39050998707c5d422752159f91944d3c81ab42d80e1bd0ee37d8e130658" url: "https://pub.dev" source: hosted - version: "2.11.1" + version: "2.11.3" hive_ce_flutter: dependency: "direct main" description: name: hive_ce_flutter - sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" + sha256: a0989670652eab097b47544f1e5a4456e861b1b01b050098ea0b80a5fabe9909 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.1" hive_ce_generator: dependency: "direct dev" description: name: hive_ce_generator - sha256: "84940c2fd3cb1d1eb318892cdb666bc0b8023f365f28aefe09b9e5a7222bc740" + sha256: "609678c10ebee7503505a0007050af40a0a4f498b1fb7def3220df341e573a89" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.2" http: dependency: transitive description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" http_multi_server: dependency: transitive description: @@ -593,10 +593,10 @@ packages: dependency: "direct main" description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" io: dependency: transitive description: @@ -609,10 +609,10 @@ packages: dependency: transitive description: name: isolate_channel - sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df + sha256: f3d36f783b301e6b312c3450eeb2656b0e7d1db81331af2a151d9083a3f6b18d url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.2+1" js: dependency: transitive description: @@ -649,10 +649,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -1150,10 +1150,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" url: "https://pub.dev" source: hosted - version: "1.1.16" + version: "1.1.17" vector_math: dependency: transitive description: @@ -1166,10 +1166,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" watcher: dependency: transitive description: @@ -1190,10 +1190,10 @@ packages: dependency: transitive description: name: web_socket - sha256: bfe6f435f6ec49cb6c01da1e275ae4228719e59a6b067048c51e72d9d63bcc4b + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" web_socket_channel: dependency: transitive description: @@ -1251,5 +1251,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.7.2 <4.0.0" + dart: ">=3.8.1 <4.0.0" flutter: ">=3.27.0" diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index a587f74..346a62b 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.7.2 + sdk: ^3.8.1 dependencies: flutter: @@ -51,7 +51,7 @@ dependencies: encrypt: ^5.0.3 #L10N tools - intl: ^0.19.0 + intl: ^0.20.2 #Map diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock index 793f1ae..50a6a53 100644 --- a/packages/inspection/pubspec.lock +++ b/packages/inspection/pubspec.lock @@ -1,6 +1,30 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f + url: "https://pub.dev" + source: hosted + version: "82.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" + url: "https://pub.dev" + source: hosted + version: "7.4.5" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" args: dependency: transitive description: @@ -25,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + build: + dependency: transitive + description: + name: build + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + url: "https://pub.dev" + source: hosted + version: "2.4.2" characters: dependency: transitive description: @@ -49,6 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + color: + dependency: transitive + description: + name: color + sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb + url: "https://pub.dev" + source: hosted + version: "3.0.0" convert: dependency: transitive description: @@ -81,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af" + url: "https://pub.dev" + source: hosted + version: "3.1.0" dartx: dependency: transitive description: @@ -121,6 +169,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" fixnum: dependency: transitive description: @@ -134,6 +190,22 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_gen_core: + dependency: transitive + description: + name: flutter_gen_core + sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc" + url: "https://pub.dev" + source: hosted + version: "5.10.0" + flutter_gen_runner: + dependency: transitive + description: + name: flutter_gen_runner + sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9 + url: "https://pub.dev" + source: hosted + version: "5.10.0" flutter_localizations: dependency: transitive description: flutter @@ -252,10 +324,10 @@ packages: dependency: transitive description: name: geolocator - sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 + sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc url: "https://pub.dev" source: hosted - version: "14.0.0" + version: "14.0.1" geolocator_android: dependency: transitive description: @@ -312,30 +384,46 @@ packages: url: "https://pub.dev" source: hosted version: "8.0.3" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + hashcodes: + dependency: transitive + description: + name: hashcodes + sha256: "80f9410a5b3c8e110c4b7604546034749259f5d6dcca63e0d3c17c9258f1a651" + url: "https://pub.dev" + source: hosted + version: "2.0.0" hive_ce: dependency: transitive description: name: hive_ce - sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e + sha256: "708bb39050998707c5d422752159f91944d3c81ab42d80e1bd0ee37d8e130658" url: "https://pub.dev" source: hosted - version: "2.11.1" + version: "2.11.3" hive_ce_flutter: dependency: transitive description: name: hive_ce_flutter - sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" + sha256: a0989670652eab097b47544f1e5a4456e861b1b01b050098ea0b80a5fabe9909 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.1" http: dependency: transitive description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" http_parser: dependency: transitive description: @@ -344,22 +432,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image_size_getter: + dependency: transitive + description: + name: image_size_getter + sha256: "9a299e3af2ebbcfd1baf21456c3c884037ff524316c97d8e56035ea8fdf35653" + url: "https://pub.dev" + source: hosted + version: "2.4.0" intl: dependency: transitive description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" isolate_channel: dependency: transitive description: name: isolate_channel - sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df + sha256: f3d36f783b301e6b312c3450eeb2656b0e7d1db81331af2a151d9083a3f6b18d url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.2+1" js: dependency: transitive description: @@ -400,6 +496,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.5.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" material_color_utilities: dependency: transitive description: @@ -424,6 +528,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" path: dependency: transitive description: @@ -584,6 +704,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + posix: + dependency: transitive + description: + name: posix + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + url: "https://pub.dev" + source: hosted + version: "6.0.2" pretty_dio_logger: dependency: transitive description: @@ -600,6 +728,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" rasadyar_auth: dependency: "direct main" description: @@ -719,10 +855,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" url: "https://pub.dev" source: hosted - version: "1.1.16" + version: "1.1.17" vector_math: dependency: transitive description: @@ -731,6 +867,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" web: dependency: transitive description: @@ -771,6 +915,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: - dart: ">=3.7.2 <4.0.0" + dart: ">=3.8.1 <4.0.0" flutter: ">=3.27.0" diff --git a/packages/inspection/pubspec.yaml b/packages/inspection/pubspec.yaml index 474c698..2af4c35 100644 --- a/packages/inspection/pubspec.yaml +++ b/packages/inspection/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.1 environment: - sdk: ^3.7.2 + sdk: ^3.8.1 dependencies: flutter: diff --git a/packages/livestock/pubspec.yaml b/packages/livestock/pubspec.yaml index 9f8ba58..3819913 100644 --- a/packages/livestock/pubspec.yaml +++ b/packages/livestock/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: 'none' # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.7.2 + sdk: ^3.8.1 dependencies: diff --git a/pubspec.lock b/pubspec.lock index 14ce169..1b4461c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: built_value - sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + sha256: "082001b5c3dc495d4a42f1d5789990505df20d8547d42507c29050af6933ee27" url: "https://pub.dev" source: hosted - version: "8.9.5" + version: "8.10.1" characters: dependency: transitive description: @@ -205,10 +205,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" dartx: dependency: transitive description: @@ -245,10 +245,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -441,10 +441,10 @@ packages: dependency: transitive description: name: geolocator - sha256: e7ebfa04ce451daf39b5499108c973189a71a919aa53c1204effda1c5b93b822 + sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc url: "https://pub.dev" source: hosted - version: "14.0.0" + version: "14.0.1" geolocator_android: dependency: transitive description: @@ -537,26 +537,26 @@ packages: dependency: transitive description: name: hive_ce - sha256: fdc19336f03ecd01dbc1d1afe69d87ed9336bdf996c5374a25f9c21ef5f2989e + sha256: "708bb39050998707c5d422752159f91944d3c81ab42d80e1bd0ee37d8e130658" url: "https://pub.dev" source: hosted - version: "2.11.1" + version: "2.11.3" hive_ce_flutter: dependency: transitive description: name: hive_ce_flutter - sha256: "5eaf57a5af980eda63ddaa8c34d618dc446f76fe79410f2a283522744291c05c" + sha256: a0989670652eab097b47544f1e5a4456e861b1b01b050098ea0b80a5fabe9909 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.1" hive_ce_generator: dependency: "direct dev" description: name: hive_ce_generator - sha256: "84940c2fd3cb1d1eb318892cdb666bc0b8023f365f28aefe09b9e5a7222bc740" + sha256: "609678c10ebee7503505a0007050af40a0a4f498b1fb7def3220df341e573a89" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.2" http: dependency: transitive description: @@ -593,10 +593,10 @@ packages: dependency: transitive description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" io: dependency: transitive description: @@ -609,10 +609,10 @@ packages: dependency: transitive description: name: isolate_channel - sha256: bafedfbcc1e9796ada179b5dac7043b33eb85d35204b089ca37d480d9c0068df + sha256: f3d36f783b301e6b312c3450eeb2656b0e7d1db81331af2a151d9083a3f6b18d url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.2+1" js: dependency: transitive description: @@ -649,10 +649,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -1178,10 +1178,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" url: "https://pub.dev" source: hosted - version: "1.1.16" + version: "1.1.17" vector_math: dependency: transitive description: @@ -1194,10 +1194,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" watcher: dependency: transitive description: @@ -1279,5 +1279,5 @@ packages: source: hosted version: "2.1.0" sdks: - dart: ">=3.7.2 <4.0.0" + dart: ">=3.8.1 <4.0.0" flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 2ec5d9e..189dc00 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.2.0+2 environment: - sdk: ^3.7.2 + sdk: ^3.8.1 dependencies: flutter: From faa8f310db8bb3ac7054d9d462465c233f4eae1e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 2 Jun 2025 10:30:19 +0330 Subject: [PATCH 093/256] fix : obscure password in auth --- .../lib/presentation/pages/auth/logic.dart | 4 +- .../lib/presentation/pages/auth/view.dart | 2 +- packages/auth/pubspec.yaml | 2 +- .../presentation/widget/inputs/r_input.dart | 48 +++++++------------ 4 files changed, 21 insertions(+), 35 deletions(-) diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 37b2e2e..68fc5eb 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -24,7 +24,7 @@ class AuthLogic extends GetxController { Rx> formKeyOtp = GlobalKey().obs; Rx> formKeySentOtp = GlobalKey().obs; - Rx phoneNumberController = TextEditingController().obs; + Rx usernameController = TextEditingController().obs; Rx passwordController = TextEditingController().obs; Rx phoneOtpNumberController = TextEditingController().obs; @@ -95,7 +95,7 @@ class AuthLogic extends GetxController { } LoginRequestModel _buildLoginRequest() { - final phone = phoneNumberController.value.text; + final phone = usernameController.value.text; final pass = passwordController.value.text; final code = captchaController.textController.value.text; final key = captchaController.captchaKey.value; diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 343c050..aae44e6 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -144,7 +144,7 @@ class AuthPage extends GetView { minWidth: 40, ), ), - controller.phoneNumberController, + controller.usernameController, ), const SizedBox(height: 26), ObxValue( diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml index 11617ca..09c3e4f 100644 --- a/packages/auth/pubspec.yaml +++ b/packages/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: rasadyar_auth description: "A new Flutter project." -version: 0.0.1 +version: 1.0.2 publish_to: 'none' diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 2780b59..37ec8ff 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -2,12 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -enum RTextFieldVariant { - normal, - noBorder, - password, - passwordNoBorder, -} +enum RTextFieldVariant { normal, noBorder, password, passwordNoBorder } class RTextField extends StatefulWidget { final TextEditingController controller; @@ -69,29 +64,21 @@ class RTextField extends StatefulWidget { this.onSubmitted, }); - @override State createState() => _RTextFieldState(); bool get _isPassword => variant == RTextFieldVariant.password; + bool get _noBorder => variant == RTextFieldVariant.noBorder; + bool get _passwordNoBorder => variant == RTextFieldVariant.passwordNoBorder; - - InputBorder get _inputBorder => - _noBorder || _passwordNoBorder ? InputBorder.none : OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: AppColor.lightGreyDarkActive, - width: 1, - ), - ); - - - - - - + InputBorder get _inputBorder => _noBorder || _passwordNoBorder + ? InputBorder.none + : OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.lightGreyDarkActive, width: 1), + ); } class _RTextFieldState extends State { @@ -103,7 +90,11 @@ class _RTextFieldState extends State { if (widget.initText != null) { widget.controller.text = widget.initText!; } - obscure = widget.obscure; + if (widget._isPassword) { + obscure = true; + } else { + obscure = widget.obscure; + } } @override @@ -126,10 +117,7 @@ class _RTextFieldState extends State { obscure = !obscure; }); }, - child: Icon( - obscure ? CupertinoIcons.eye : CupertinoIcons.eye_slash, - color: AppColor.darkGreyDarkActive, - ), + child: Icon(obscure ? CupertinoIcons.eye : CupertinoIcons.eye_slash, color: AppColor.darkGreyDarkActive), ), ); } @@ -165,9 +153,7 @@ class _RTextFieldState extends State { hintText: widget.hintText, labelText: widget.label, alignLabelWithHint: true, - labelStyle: AppFonts.yekan14 - .copyWith(color: AppColor.lightGreyDarkActive) - .merge(widget.labelStyle), + labelStyle: AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarkActive).merge(widget.labelStyle), filled: widget.filled || widget._noBorder || widget._passwordNoBorder, fillColor: widget.filledColor, counter: widget.showCounter ? null : const SizedBox(), @@ -179,4 +165,4 @@ class _RTextFieldState extends State { ), ); } -} \ No newline at end of file +} From ce4966a78dbd0843a373210fe8e112c1f20e78af Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 2 Jun 2025 10:37:56 +0330 Subject: [PATCH 094/256] fix : app bar no back --- .../widget/app_bar/r_app_bar.dart | 32 +++++++++++-------- .../lib/presentation/filter/view.dart | 1 + 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index 67bec05..563a2c2 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -16,6 +16,20 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { final int? leadingWidth; final Widget? leading; + const RAppBar.noBack({ + super.key, + required this.title, + this.backgroundColor = AppColor.blueNormal, + this.iconColor = Colors.white, + this.titleTextStyle, + this.onBackPressed, + this.additionalActions, + this.leading, + this.hasBack = false, + this.centerTitle = false, + this.leadingWidth, + }); + const RAppBar({ super.key, required this.title, @@ -27,7 +41,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { this.leading, this.hasBack = true, this.centerTitle = false, - this.leadingWidth + this.leadingWidth, }); @override @@ -39,20 +53,15 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { excludeHeaderSemantics: true, scrolledUnderElevation: 0, centerTitle: centerTitle, - titleTextStyle: - titleTextStyle ?? - AppFonts.yekan16.copyWith(color:Colors.white), + titleTextStyle: titleTextStyle ?? AppFonts.yekan16.copyWith(color: Colors.white), title: Text(title), leadingWidth: leadingWidth?.toDouble(), - leading:leading!=null ? Padding( - padding: const EdgeInsets.only(right: 16), - child: leading, - ) : null, + leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 16), child: leading) : null, titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, - if(hasBack)...{ + if (hasBack) ...{ Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: IconButton( @@ -61,10 +70,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { color: iconColor, ), ), - } - - - + }, ], ); } diff --git a/packages/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/filter/view.dart index 3f7ee39..6a65bc1 100644 --- a/packages/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/filter/view.dart @@ -11,6 +11,7 @@ class SupervisionFilterPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( + appBar: RAppBar.noBack(title: 'نقشه'), body: PopScope( canPop: !controller.bottomSheetManager.isAnyVisible, onPopInvokedWithResult: (didPop, result) { From 8622785385e2c4c00c0fe5efd60eefbbb62773c0 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 2 Jun 2025 11:45:02 +0330 Subject: [PATCH 095/256] feat : app bar --- .../lib/presentation/filter/view.dart | 199 ++++++------------ 1 file changed, 66 insertions(+), 133 deletions(-) diff --git a/packages/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/filter/view.dart index 6a65bc1..1508409 100644 --- a/packages/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/filter/view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'logic.dart'; @@ -11,24 +11,41 @@ class SupervisionFilterPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar.noBack(title: 'نقشه'), + appBar: RAppBar.noBack(title: 'نقشه', additionalActions: [_searchButton(), _filterButton()]), body: PopScope( canPop: !controller.bottomSheetManager.isAnyVisible, onPopInvokedWithResult: (didPop, result) { controller.bottomSheetManager.closeFirstVisible(); }, child: Stack( - children: [ - _buildMap(), - _buildGpsButton(), - _buildFilterButton(), - Obx(() => controller.bottomSheetManager.buildVisibleSheet()), - ], + children: [_buildMap(), _buildGpsButton(), Obx(() => controller.bottomSheetManager.buildVisibleSheet())], ), ), ); } + GestureDetector _searchButton() { + return GestureDetector( + onTap: () async{ + + }, + child: Assets.vec.searchSvg + .svg(width: 24, height: 24, colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn)) + .paddingOnly(left: 16), + ); + } + + GestureDetector _filterButton() { + return GestureDetector( + onTap: () { + controller.filterBottomSheetController.toggle(); + }, + child: Assets.vec.filterSvg + .svg(width: 24, height: 24, colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn)) + .paddingOnly(left: 16), + ); + } + Widget _buildMap() { return ObxValue((currentLocation) { return FlutterMap( @@ -41,25 +58,19 @@ class SupervisionFilterPage extends GetView { }, ), children: [ - TileLayer( - urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - ), + TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'), ObxValue((markers) { return MarkerLayer( - markers: - markers - .map( - (e) => markerWidget( - marker: e, - onTap: () { - controller - .selectedLocationBottomSheetController - .isVisible - .value = true; - }, - ), - ) - .toList(), + markers: markers + .map( + (e) => markerWidget( + marker: e, + onTap: () { + controller.selectedLocationBottomSheetController.isVisible.value = true; + }, + ), + ) + .toList(), ); }, controller.markers), ], @@ -70,12 +81,12 @@ class SupervisionFilterPage extends GetView { Widget _buildGpsButton() { return Positioned( right: 10, - bottom: 83, + bottom: 15, child: ObxValue((data) { - return RFab.small( + return RFab( backgroundColor: AppColor.greenNormal, isLoading: data.value, - icon: Assets.vec.gpsSvg.svg(), + icon: Assets.vec.gpsSvg.svg(width: 28, height: 28), onPressed: () async { controller.isLoading.value = true; await controller.determineCurrentPosition(); @@ -85,18 +96,6 @@ class SupervisionFilterPage extends GetView { }, controller.isLoading), ); } - - Widget _buildFilterButton() { - return Positioned( - right: 10, - bottom: 30, - child: RFab.small( - backgroundColor: AppColor.blueNormal, - icon: Assets.vec.filterSvg.svg(width: 24,height: 24), - onPressed: () => controller.filterBottomSheetController.toggle(), - ), - ); - } } Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { @@ -105,14 +104,7 @@ Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { child: GestureDetector( onTap: onTap, behavior: HitTestBehavior.opaque, - child: SizedBox( - width: 36, - height: 36, - child:Assets.vec.mapMarkerSvg.svg( - width: 30, - height: 30, - ) - ), + child: SizedBox(width: 36, height: 36, child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30)), ), ); } @@ -316,9 +308,7 @@ Widget markerDetailsWidget() { Text( 'داود خرم پور', textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover), ), Spacer(), vecWidgetWithOnTap( @@ -355,9 +345,7 @@ Widget markerDetailsWidget() { padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), decoration: ShapeDecoration( color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - ), + shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppColor.blueLightHover)), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -365,16 +353,12 @@ Widget markerDetailsWidget() { Text( 'باقی مانده', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '0 کیلوگرم', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -387,16 +371,12 @@ Widget markerDetailsWidget() { Text( 'شماره همراه', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '0326598653', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -408,17 +388,13 @@ Widget markerDetailsWidget() { Text( 'آخرین فعالیت', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '1409/12/12', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -430,16 +406,12 @@ Widget markerDetailsWidget() { Text( 'موجودی', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '5کیلوگرم', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -454,16 +426,12 @@ Widget markerDetailsWidget() { Text( 'فروش رفته', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '0 کیلوگرم', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -473,12 +441,7 @@ Widget markerDetailsWidget() { ); } -Widget customChip({ - bool isSelected = false, - required String title, - required int index, - required Function(int) onTap, -}) { +Widget customChip({bool isSelected = false, required String title, required int index, required Function(int) onTap}) { return GestureDetector( onTap: () { onTap.call(index); @@ -489,18 +452,14 @@ Widget customChip({ decoration: BoxDecoration( color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, borderRadius: BorderRadius.circular(8), - border: - isSelected - ? Border.fromBorderSide(BorderSide.none) - : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), + border: isSelected + ? Border.fromBorderSide(BorderSide.none) + : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), ), child: Text( title, textAlign: TextAlign.center, - style: - isSelected - ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) - : AppFonts.yekan10, + style: isSelected ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) : AppFonts.yekan10, ), ), ); @@ -531,11 +490,8 @@ Widget selectedLocationWidget({ backgroundColor: AppColor.blueNormal, foregroundColor: Colors.white, padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(8), - topRight: Radius.circular(8), - ), - child: Assets.vec.mapSvg.svg( width: 24, height: 24), + borderRadius: BorderRadius.only(bottomRight: Radius.circular(8), topRight: Radius.circular(8)), + child: Assets.vec.mapSvg.svg(width: 24, height: 24), ), CustomSlidableAction( onPressed: (context) { @@ -549,12 +505,9 @@ Widget selectedLocationWidget({ onPressed: (context) {}, backgroundColor: AppColor.warning, padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(8), - topLeft: Radius.circular(8), - ), - child: Assets.vec.securityTimeSvg.svg()), - + borderRadius: BorderRadius.only(bottomLeft: Radius.circular(8), topLeft: Radius.circular(8)), + child: Assets.vec.securityTimeSvg.svg(), + ), ], ), child: GestureDetector( @@ -572,34 +525,14 @@ Widget selectedLocationWidget({ children: [ Column( children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'گوشت و مرغ', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), + Text('داود خرم مهری پور', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text('گوشت و مرغ', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover)), ], ), Column( children: [ - Text( - 'باقی مانده', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), + Text('باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text('0 کیلوگرم', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover)), ], ), Assets.vec.scanBarcodeSvg.svg(), From ae18a5f648f765a715a5f7e6e3d0791e31aa6dd0 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 3 Jun 2025 16:55:49 +0330 Subject: [PATCH 096/256] feat : captcha widget --- lib/presentations/common/assets.dart | 43 -------- .../local/user_local/user_local_model.dart | 2 + .../local/user_local/user_local_model.g.dart | 4 + .../lib/data/services/auth_middelware.dart | 4 +- packages/auth/lib/hive_registrar.g.dart | 3 +- .../lib/presentation/pages/modules/logic.dart | 1 + .../presentation/widget/captcha/logic.dart | 18 ++-- .../lib/presentation/widget/captcha/view.dart | 98 +++++++++++-------- tools/runner.sh | 2 - 9 files changed, 76 insertions(+), 99 deletions(-) delete mode 100644 lib/presentations/common/assets.dart diff --git a/lib/presentations/common/assets.dart b/lib/presentations/common/assets.dart deleted file mode 100644 index 2ee3b2b..0000000 --- a/lib/presentations/common/assets.dart +++ /dev/null @@ -1,43 +0,0 @@ -///This file is automatically generated. DO NOT EDIT, all your changes would be lost. -class Assets { - Assets._(); - - static const String iconsAdd = 'assets/icons/add.svg'; - static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; - static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; - static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg'; - static const String iconsCalendar = 'assets/icons/calendar.svg'; - static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; - static const String iconsCall = 'assets/icons/call.svg'; - static const String iconsDiagram = 'assets/icons/diagram.svg'; - static const String iconsDownload = 'assets/icons/download.svg'; - static const String iconsEdit = 'assets/icons/edit.svg'; - static const String iconsExcelDownload = 'assets/icons/excel_download.svg'; - static const String iconsFilter = 'assets/icons/filter.svg'; - static const String iconsGps = 'assets/icons/gps.svg'; - static const String iconsInformation = 'assets/icons/information.svg'; - static const String iconsInspection = 'assets/icons/inspection.svg'; - static const String iconsKey = 'assets/icons/key.svg'; - static const String iconsLiveStock = 'assets/icons/liveStock.svg'; - static const String iconsLogout = 'assets/icons/logout.svg'; - static const String iconsMap = 'assets/icons/map.svg'; - static const String iconsMapMarker = 'assets/icons/map_marker.svg'; - static const String iconsMessageAdd = 'assets/icons/message_add.svg'; - static const String iconsPdfDownload = 'assets/icons/pdf_download.svg'; - static const String iconsPictureFrame = 'assets/icons/picture_frame.svg'; - static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; - static const String iconsProfileUser = 'assets/icons/profile_user.svg'; - static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg'; - static const String iconsScan = 'assets/icons/scan.svg'; - static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; - static const String iconsSearch = 'assets/icons/search.svg'; - static const String iconsSecurityTime = 'assets/icons/security_time.svg'; - static const String iconsSetting = 'assets/icons/setting.svg'; - static const String iconsTagUser = 'assets/icons/tag_user.svg'; - static const String iconsTrash = 'assets/icons/trash.svg'; - static const String iconsUser = 'assets/icons/user.svg'; - static const String iconsUserSquare = 'assets/icons/user_square.svg'; - static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; - static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; - -} diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.dart index c14addc..0f603f6 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.dart @@ -53,4 +53,6 @@ enum Module { liveStocks, @HiveField(1) inspection, + @HiveField(2) + chicken, } diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart index efaac19..8a40c52 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart @@ -66,6 +66,8 @@ class ModuleAdapter extends TypeAdapter { return Module.liveStocks; case 1: return Module.inspection; + case 2: + return Module.chicken; default: return Module.liveStocks; } @@ -78,6 +80,8 @@ class ModuleAdapter extends TypeAdapter { writer.writeByte(0); case Module.inspection: writer.writeByte(1); + case Module.chicken: + writer.writeByte(2); } } diff --git a/packages/auth/lib/data/services/auth_middelware.dart b/packages/auth/lib/data/services/auth_middelware.dart index ba907ce..14b6227 100644 --- a/packages/auth/lib/data/services/auth_middelware.dart +++ b/packages/auth/lib/data/services/auth_middelware.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/di/auth_di.dart'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; @@ -14,7 +14,7 @@ class AuthMiddleware extends GetMiddleware { final accessToken = tokenService.accessToken.value; if (refreshToken == null || accessToken == null) { - return RouteSettings(name: AuthPaths.moduleList); + return RouteSettings(name: AuthPaths.auth, arguments: Module.chicken); } return super.redirect(route); } diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/auth/lib/hive_registrar.g.dart index b46fdff..166b5cb 100644 --- a/packages/auth/lib/hive_registrar.g.dart +++ b/packages/auth/lib/hive_registrar.g.dart @@ -7,9 +7,8 @@ import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart extension HiveRegistrar on HiveInterface { void registerAdapters() { - registerAdapter(UserLocalModelAdapter()); registerAdapter(ModuleAdapter()); - + registerAdapter(UserLocalModelAdapter()); } } diff --git a/packages/auth/lib/presentation/pages/modules/logic.dart b/packages/auth/lib/presentation/pages/modules/logic.dart index bf9692c..56637e5 100644 --- a/packages/auth/lib/presentation/pages/modules/logic.dart +++ b/packages/auth/lib/presentation/pages/modules/logic.dart @@ -7,6 +7,7 @@ class ModulesLogic extends GetxController { List moduleList=[ ModuleModel(title: 'بازرسی', icon: Assets.icons.inspection.path, module: Module.inspection), ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks), + ModuleModel(title: 'مرغ', icon: Assets.icons.liveStock.path, module: Module.chicken), ]; diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart index 6a89f38..a24052a 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -1,8 +1,9 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/di/auth_di.dart'; import 'package:rasadyar_auth/data/models/response/captcha/captcha_response_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_core/core.dart'; class CaptchaWidgetLogic extends GetxController with StateMixin { @@ -10,6 +11,7 @@ class CaptchaWidgetLogic extends GetxController with StateMixin formKey = GlobalKey(); AuthRepositoryImpl authRepository = diAuth.get(); + final Random random = Random(); @override void onInit() { @@ -27,15 +29,9 @@ class CaptchaWidgetLogic extends GetxController with StateMixin getCaptcha() async { change(null, status: RxStatus.loading()); textController.value.clear(); - safeCall( - call: () async => await authRepository.captcha(), - onSuccess: (value) { - captchaKey.value = value?.captchaKey; - change(value, status: RxStatus.success()); - }, - onError: (error, stackTrace) { - change(null, status: RxStatus.error(error.toString())); - }, - ); + await Future.delayed(Duration(milliseconds: 800)); + captchaKey.value = (random.nextInt(999999)+1000).toString(); + change(value, status: RxStatus.success()); + } } diff --git a/packages/auth/lib/presentation/widget/captcha/view.dart b/packages/auth/lib/presentation/widget/captcha/view.dart index d606b7b..125eb9e 100644 --- a/packages/auth/lib/presentation/widget/captcha/view.dart +++ b/packages/auth/lib/presentation/widget/captcha/view.dart @@ -1,4 +1,4 @@ -import 'dart:convert'; +import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -16,35 +16,33 @@ class CaptchaWidget extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( - onTap: controller.getCaptcha, - child: Container( - width: 135, - height: 50, - clipBehavior: Clip.antiAliasWithSaveLayer, - decoration: BoxDecoration( - color: AppColor.whiteNormalHover, - border: Border.all(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(8), - ), - child: controller.obx( - (state) => - Image.memory( - base64Decode(state?.captchaImage ?? ''), - fit: BoxFit.cover, - ), - onLoading: const Center( - child: CupertinoActivityIndicator(color: AppColor.blueNormal), + onTap: controller.getCaptcha, + child: Container( + width: 135, + height: 50, + clipBehavior: Clip.antiAliasWithSaveLayer, + decoration: BoxDecoration( + color: AppColor.whiteNormalHover, + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(8), + ), + child: controller.obx( + (state) => Center( + child: Stack( + alignment: Alignment.center, + children: [ + CustomPaint(size: const Size(135, 50), painter: _CaptchaLinePainter()), + Text(controller.captchaKey.value ?? 'دوباره سعی کنید', style: AppFonts.yekan24Bold), + ], ), - onError: (error) { - return const Center( - child: Text( - 'خطا در بارگذاری کد امنیتی', - style: AppFonts.yekan13, - ), - ); - }, ), - )), + onLoading: const Center(child: CupertinoActivityIndicator(color: AppColor.blueNormal)), + onError: (error) { + return const Center(child: Text('خطا در بارگذاری کد امنیتی', style: AppFonts.yekan13)); + }, + ), + ), + ), const SizedBox(width: 8), Expanded( @@ -55,19 +53,11 @@ class CaptchaWidget extends GetView { return RTextField( label: 'کد امنیتی', controller: data.value, - keyboardType: TextInputType.numberWithOptions( - decimal: false, - signed: false, - ), + keyboardType: TextInputType.numberWithOptions(decimal: false, signed: false), maxLines: 1, maxLength: 6, - suffixIcon: - (data.value.text - .trim() - .isNotEmpty ?? false) - ? clearButton( - () => controller.textController.value.clear(), - ) + suffixIcon: (data.value.text.trim().isNotEmpty ?? false) + ? clearButton(() => controller.textController.value.clear()) : null, onSubmitted: (data) {}, @@ -86,3 +76,33 @@ class CaptchaWidget extends GetView { ); } } + +class _CaptchaLinePainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final random = Random(); + final paint1 = Paint() + ..color = Color.fromRGBO(random.nextInt(255), random.nextInt(255), random.nextInt(255), 1) + ..strokeWidth = 2; + final paint2 = Paint() + ..color = Color.fromRGBO(random.nextInt(255), random.nextInt(255), random.nextInt(255), 1) + ..strokeWidth = 2; + +// First line: top-left to bottom-right + canvas.drawLine( + Offset(0, 0), + Offset(size.width, size.height), + paint1, + ); + +// Second line: bottom-left to top-right + canvas.drawLine( + Offset(0, size.height), + Offset(size.width, 0), + paint2, + ); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/tools/runner.sh b/tools/runner.sh index 1931741..ad699f9 100644 --- a/tools/runner.sh +++ b/tools/runner.sh @@ -1,4 +1,2 @@ cd ../ dart run build_runner build --delete-conflicting-outputs - - From 2b4c019c551a4b40513cdbb2aa677d7b6ad23301 Mon Sep 17 00:00:00 2001 From: MrM Date: Tue, 3 Jun 2025 22:52:21 +0330 Subject: [PATCH 097/256] feat : auth for new module --- .../lib/data/common/dio_error_handler.dart | 29 +-- .../auth/lib/data/common/dio_manager.dart | 2 +- packages/auth/lib/data/di/auth_di.dart | 9 +- .../local/user_local/user_local_model.dart | 13 ++ .../local/user_local/user_local_model.g.dart | 10 +- .../response/user_info/user_info_model.dart | 18 ++ .../user_profile_model.dart | 30 +++ .../data/repositories/auth_repository.dart | 10 +- .../repositories/auth_repository_imp.dart | 25 ++- .../data/services/token_storage_service.dart | 16 ++ .../lib/presentation/pages/auth/logic.dart | 73 ++++++- .../lib/presentation/pages/auth/view.dart | 179 +++++++++--------- .../lib/presentation/widget/captcha/view.dart | 15 +- packages/core/lib/core.dart | 10 +- .../lib/infrastructure/remote/dio_remote.dart | 6 +- tools/package_builder.sh | 2 +- 16 files changed, 314 insertions(+), 133 deletions(-) create mode 100644 packages/auth/lib/data/models/response/user_info/user_info_model.dart create mode 100644 packages/auth/lib/data/models/response/user_profile_model/user_profile_model.dart diff --git a/packages/auth/lib/data/common/dio_error_handler.dart b/packages/auth/lib/data/common/dio_error_handler.dart index 963707c..57f29bc 100644 --- a/packages/auth/lib/data/common/dio_error_handler.dart +++ b/packages/auth/lib/data/common/dio_error_handler.dart @@ -5,10 +5,14 @@ class DioErrorHandler { void handle(DioException error) { switch (error.response?.statusCode) { case 401: - _handle401(); + _handleGeneric(error); break; case 403: - _handle403(); + _handleGeneric(error); + break; + + case 410: + _handle410(); break; default: _handleGeneric(error); @@ -16,21 +20,22 @@ class DioErrorHandler { } //wrong password/user name => "detail": "No active account found with the given credentials" - 401 - void _handle401() { - Get.showSnackbar( - _errorSnackBar('نام کاربری یا رمز عبور اشتباه است'), - ); + void _handle410() { + Get.showSnackbar(_errorSnackBar('نام کاربری یا رمز عبور اشتباه است')); } //wrong captcha => "detail": "Captcha code is incorrect" - 403 - void _handle403() { - Get.showSnackbar( - _errorSnackBar('کد امنیتی اشتباه است'), - ); - } + void _handle403() {} void _handleGeneric(DioException error) { - // General error handling + Get.showSnackbar( + _errorSnackBar( + error.response?.data.keys.first == 'is_user' + ? 'کاربر با این شماره تلفن وجود ندارد' + : error.response?.data[error.response?.data.keys.first] ?? + 'خطا در برقراری ارتباط با سرور', + ), + ); } GetSnackBar _errorSnackBar(String message) { diff --git a/packages/auth/lib/data/common/dio_manager.dart b/packages/auth/lib/data/common/dio_manager.dart index 441485a..2c920a0 100644 --- a/packages/auth/lib/data/common/dio_manager.dart +++ b/packages/auth/lib/data/common/dio_manager.dart @@ -12,7 +12,7 @@ class DioRemoteManager { ApiEnvironment env = ApiEnvironment.dam, ]) async { if (_currentEnv != env) { - _currentClient = DioRemote(env.baseUrl); + _currentClient = DioRemote(baseUrl: env.baseUrl); await _currentClient?.init(); _currentEnv = env; } diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 190715f..cc89573 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -1,7 +1,6 @@ import 'package:rasadyar_auth/data/common/constant.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; import '../common/dio_manager.dart'; @@ -10,12 +9,16 @@ GetIt diAuth = GetIt.instance; Future setupAuthDI() async { diAuth.registerLazySingleton(() => DioRemoteManager()); + diAuth.registerLazySingleton(() => DioRemote()); + /* final manager = diAuth.get(); + final dioRemote = await manager.setEnvironment(ApiEnvironment.dam);*/ - final manager = diAuth.get(); - final dioRemote = await manager.setEnvironment(ApiEnvironment.dam); + final dioRemote = diAuth.get(); + await dioRemote.init(); diAuth.registerCachedFactory( () => AuthRepositoryImpl(dioRemote), ); + diAuth.registerLazySingleton(() => DioErrorHandler()); } diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.dart index 0f603f6..0e18269 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.dart @@ -19,6 +19,12 @@ class UserLocalModel extends HiveObject { @HiveField(5) Module? module; + @HiveField(6) + String? backend; + + @HiveField(7) + String? apiKey; + UserLocalModel({ this.username, this.password, @@ -26,6 +32,8 @@ class UserLocalModel extends HiveObject { this.refreshToken, this.name, this.module, + this.backend, + this.apiKey, }); UserLocalModel copyWith({ @@ -35,6 +43,9 @@ class UserLocalModel extends HiveObject { String? refreshToken, String? name, Module? module, + String? backend, + String? apiKey, + }) { return UserLocalModel( username: username ?? this.username, @@ -43,6 +54,8 @@ class UserLocalModel extends HiveObject { refreshToken: refreshToken ?? this.refreshToken, name: name ?? this.name, module: module ?? this.module, + backend: backend ?? this.backend, + apiKey: apiKey ?? this.apiKey, ); } } diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart index 8a40c52..93e49af 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart @@ -23,13 +23,15 @@ class UserLocalModelAdapter extends TypeAdapter { refreshToken: fields[3] as String?, name: fields[4] as String?, module: fields[5] as Module?, + backend: fields[6] as String?, + apiKey: fields[7] as String?, ); } @override void write(BinaryWriter writer, UserLocalModel obj) { writer - ..writeByte(6) + ..writeByte(8) ..writeByte(0) ..write(obj.username) ..writeByte(1) @@ -41,7 +43,11 @@ class UserLocalModelAdapter extends TypeAdapter { ..writeByte(4) ..write(obj.name) ..writeByte(5) - ..write(obj.module); + ..write(obj.module) + ..writeByte(6) + ..write(obj.backend) + ..writeByte(7) + ..write(obj.apiKey); } @override diff --git a/packages/auth/lib/data/models/response/user_info/user_info_model.dart b/packages/auth/lib/data/models/response/user_info/user_info_model.dart new file mode 100644 index 0000000..e1a94ea --- /dev/null +++ b/packages/auth/lib/data/models/response/user_info/user_info_model.dart @@ -0,0 +1,18 @@ +import 'package:rasadyar_core/core.dart'; + +part 'user_info_model.freezed.dart'; + +part 'user_info_model.g.dart'; + +@freezed +abstract class UserInfoModel with _$UserInfoModel { + const factory UserInfoModel({ + bool? isUser, + String? address, + String? backend, + String? apiKey, + }) = _UserInfoModel ; + + factory UserInfoModel.fromJson(Map json) => + _$UserInfoModelFromJson(json); +} \ No newline at end of file diff --git a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.dart b/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.dart new file mode 100644 index 0000000..70a9a40 --- /dev/null +++ b/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.dart @@ -0,0 +1,30 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user_profile_model.freezed.dart'; + +part 'user_profile_model.g.dart'; + +@freezed +abstract class UserProfileModel with _$UserProfileModel { + const factory UserProfileModel({ + String? accessToken, + String? expiresIn, + String? scope, + String? expireTime, + String? mobile, + String? fullname, + String? firstname, + String? lastname, + String? city, + String? province, + String? nationalCode, + String? nationalId, + String? birthday, + String? image, + int? baseOrder, + List? role, + }) = _UserProfileModel; + + factory UserProfileModel.fromJson(Map json) => + _$UserProfileModelFromJson(json); +} diff --git a/packages/auth/lib/data/repositories/auth_repository.dart b/packages/auth/lib/data/repositories/auth_repository.dart index eb68705..2f5464c 100644 --- a/packages/auth/lib/data/repositories/auth_repository.dart +++ b/packages/auth/lib/data/repositories/auth_repository.dart @@ -1,12 +1,11 @@ - +import 'package:rasadyar_auth/data/models/response/user_info/user_info_model.dart'; import '../models/response/auth/auth_response_model.dart'; import '../models/response/captcha/captcha_response_model.dart'; +import '../models/response/user_profile_model/user_profile_model.dart'; abstract class AuthRepository { - Future login({ - required Map authRequest, - }); + Future login({required Map authRequest}); Future captcha(); @@ -14,10 +13,9 @@ abstract class AuthRepository { Future hasAuthenticated(); - Future loginWithRefreshToken({ required Map authRequest, }); - + Future getUserInfo(String phoneNumber); } diff --git a/packages/auth/lib/data/repositories/auth_repository_imp.dart b/packages/auth/lib/data/repositories/auth_repository_imp.dart index 6f03fc0..c2ef5d1 100644 --- a/packages/auth/lib/data/repositories/auth_repository_imp.dart +++ b/packages/auth/lib/data/repositories/auth_repository_imp.dart @@ -1,3 +1,5 @@ +import 'package:rasadyar_auth/data/models/response/user_info/user_info_model.dart'; +import 'package:rasadyar_auth/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_core/core.dart'; import '../models/response/auth/auth_response_model.dart'; @@ -11,13 +13,13 @@ class AuthRepositoryImpl implements AuthRepository { AuthRepositoryImpl(this._httpClient); @override - Future login({ + Future login({ required Map authRequest, }) async { - var res = await _httpClient.post( - '$_BASE_URL/login/', + var res = await _httpClient.post( + '/api/login/', data: authRequest, - fromJson: AuthResponseModel.fromJson, + fromJson: UserProfileModel.fromJson, headers: {'Content-Type': 'application/json'}, ); return res.data; @@ -59,4 +61,19 @@ class AuthRepositoryImpl implements AuthRepository { return response.data ?? false; } + + @override + Future getUserInfo(String phoneNumber) async { + var res = await _httpClient.post( + 'https://userbackend.rasadyaar.ir/api/send_otp/', + data: { + "mobile": phoneNumber, + "state": "" + }, + fromJson: UserInfoModel.fromJson, + headers: {'Content-Type': 'application/json'}, + ); + return res.data; + + } } diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index 0c56166..816a5b6 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -8,6 +8,8 @@ class TokenStorageService extends GetxService { static const String _boxName = 'secureBox'; static const String _accessTokenKey = 'accessToken'; static const String _refreshTokenKey = 'refreshToken'; + static const String _baseUrlKey = 'baseUrl'; + static const String _apiKey = 'apiKey'; static const String _moduleKey = 'moduleSelected'; final FlutterSecureStorage _secureStorage = FlutterSecureStorage(); @@ -15,6 +17,7 @@ class TokenStorageService extends GetxService { RxnString accessToken = RxnString(); RxnString refreshToken = RxnString(); + RxnString baseurl= RxnString(); Rxn appModule = Rxn(null); Future init() async { @@ -34,6 +37,7 @@ class TokenStorageService extends GetxService { accessToken.value = _localStorage.read(boxName: _boxName, key: _accessTokenKey); refreshToken.value = _localStorage.read(boxName: _boxName, key: _refreshTokenKey); appModule.value = _localStorage.read(boxName: _boxName, key: _moduleKey); + baseurl.value = _localStorage.read(boxName: _boxName, key: _baseUrlKey); } Future saveAccessToken(String token) async { @@ -59,4 +63,16 @@ class TokenStorageService extends GetxService { accessToken.value = null; refreshToken.value = null; } + + + Future saveBaseUrl(String url) async { + await _localStorage.save(boxName: _boxName, key: _baseUrlKey, value: url); + baseurl.value = url; + baseurl.refresh(); + } + + Future saveApiKey(String key) async { + await _localStorage.save(boxName: _boxName, key: _apiKey, value: key); + + } } diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 37b2e2e..31c6607 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -5,6 +5,8 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; import 'package:rasadyar_auth/data/models/request/login_request/login_request_model.dart'; import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; +import 'package:rasadyar_auth/data/models/response/user_info/user_info_model.dart'; +import 'package:rasadyar_auth/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; @@ -34,6 +36,7 @@ class AuthLogic extends GetxController { RxnString phoneNumber = RxnString(null); RxBool isLoading = false.obs; + RxBool isDisabled = true.obs; TokenStorageService tokenStorageService = Get.find(); Rx authType = AuthType.useAndPass.obs; @@ -108,7 +111,7 @@ class AuthLogic extends GetxController { ); } - Future submitLoginForm() async { + /*Future submitLoginForm() async { if (!_isFormValid()) return; iLog('module222 : ${_module.toString()}'); final loginRequestModel = _buildLoginRequest(); @@ -128,5 +131,73 @@ class AuthLogic extends GetxController { }, ); isLoading.value = false; + }*/ + + Future submitLoginForm2() async { + if (!_isFormValid()) return; + + isLoading.value = true; + await safeCall( + call: () => authRepository.login( + authRequest: { + "username": phoneNumberController.value.text, + "password": passwordController.value.text, + }, + ), + onSuccess: (result) async { + await tokenStorageService.saveModule(_module); + await tokenStorageService.saveAccessToken(result?.accessToken ?? ''); + await tokenStorageService.saveRefreshToken(result?.accessToken ?? ''); + }, + onError: (error, stackTrace) { + if (error is DioException) { + diAuth.get().handle(error); + } + captchaController.getCaptcha(); + }, + ); + isLoading.value = false; + } + + Future getUserInfo(String value) async { + isLoading.value = true; + await safeCall( + call: () async => await authRepository.getUserInfo(value), + onSuccess: (result) async { + if (result != null) { + diAuth.registerSingleton( + DioRemote(baseUrl: result.backend), + instanceName: 'newDioRemote', + ); + await tokenStorageService.saveApiKey(result.apiKey ?? ''); + await tokenStorageService.saveBaseUrl(result.backend ?? ''); + } + }, + onError: (error, stackTrace) { + if (error is DioException) { + diAuth.get().handle(error); + } + captchaController.getCaptcha(); + }, + ); + isLoading.value = false; + } + + GetSnackBar _errorSnackBar(String message) { + return GetSnackBar( + titleText: Text( + 'خطا', + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + messageText: Text( + message, + style: AppFonts.yekan12.copyWith(color: Colors.white), + ), + backgroundColor: AppColor.error, + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: 12, + duration: Duration(milliseconds: 3500), + snackPosition: SnackPosition.TOP, + ); } } diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 343c050..1002a4f 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -27,7 +27,7 @@ class AuthPage extends GetView { } }, controller.authType), - SizedBox(height: 50), + /* SizedBox(height: 50), RichText( text: TextSpan( children: [ @@ -80,7 +80,7 @@ class AuthPage extends GetView { ], ), ); - }, controller.authType), + }, controller.authType),*/ ], ), ), @@ -94,118 +94,109 @@ class AuthPage extends GetView { key: controller.formKey, child: Column( children: [ - ObxValue( - (phoneController) => - RTextField( - label: 'نام کاربری', - maxLength: 11, - maxLines: 1, - controller: phoneController.value, - keyboardType: TextInputType.text, - initText: phoneController.value.text, - onChanged: (value) { - phoneController.value.text = value; - phoneController.refresh(); - }, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: Assets.vec.callSvg.svg( - width: 12, - height: 12, - ), - ), - suffixIcon: - phoneController.value.text - .trim() - .isNotEmpty - ? clearButton(() { - phoneController.value.clear(); - phoneController.refresh(); + RTextField( + label: 'نام کاربری', + maxLength: 11, + maxLines: 1, + controller: controller.phoneNumberController.value, + keyboardType: TextInputType.number, + initText: controller.phoneNumberController.value.text, + onChanged: (value) async { + controller.phoneNumberController.value.text = value; + controller.phoneNumberController.refresh(); + if (value.length == 11) { + await controller.getUserInfo(value); + } + }, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: Assets.vec.callSvg.svg(width: 12, height: 12), + ), + suffixIcon: + controller.phoneNumberController.value.text.trim().isNotEmpty + ? clearButton(() { + controller.phoneNumberController.value.clear(); + controller.phoneNumberController.refresh(); }) - : null, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ شماره موبایل را وارد کنید'; - } - /*else if (value.length < 11) { - return '⚠️ شماره موبایل باید 11 رقم باشد'; - }*/ - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - boxConstraints: const BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - ), - controller.phoneNumberController, + : null, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), + labelStyle: AppFonts.yekan13, + boxConstraints: const BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), ), const SizedBox(height: 26), ObxValue( - (passwordController) => - RTextField( - label: 'رمز عبور', - filled: false, - controller: passwordController.value, - variant: RTextFieldVariant.password, - initText: passwordController.value.text, - onChanged: (value) { - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; - } - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: Assets.vec.keySvg.svg( - width: 12, - height: 12, - ), - ), - boxConstraints: const BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - ), + (passwordController) => RTextField( + label: 'رمز عبور', + filled: false, + obscure: true, + controller: passwordController.value, + variant: RTextFieldVariant.password, + initText: passwordController.value.text, + onChanged: (value) { + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + labelStyle: AppFonts.yekan13, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: Assets.vec.keySvg.svg(width: 12, height: 12), + ), + boxConstraints: const BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + ), controller.passwordController, ), SizedBox(height: 26), CaptchaWidget(), SizedBox(height: 23), - ObxValue((data) { + + Obx(() { return RElevated( text: 'ورود', - isLoading: data.value, - onPressed: () async { - await controller.submitLoginForm(); - }, + isLoading: controller.isLoading.value, + onPressed: controller.isDisabled.value + ? null + : () async { + await controller.submitLoginForm2(); + }, width: Get.width, height: 48, ); - }, controller.isLoading), + }), ], ), ), ); } -/* + /* Widget sendCodeForm() { return ObxValue((data) { return Form( diff --git a/packages/auth/lib/presentation/widget/captcha/view.dart b/packages/auth/lib/presentation/widget/captcha/view.dart index 125eb9e..b225220 100644 --- a/packages/auth/lib/presentation/widget/captcha/view.dart +++ b/packages/auth/lib/presentation/widget/captcha/view.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/presentation/pages/auth/logic.dart'; import 'package:rasadyar_auth/presentation/widget/clear_button.dart'; import 'package:rasadyar_core/core.dart'; @@ -64,9 +65,19 @@ class CaptchaWidget extends GetView { validator: (value) { if (value == null || value.isEmpty) { return 'کد امنیتی را وارد کنید'; + } else if (controller.captchaKey.value != null && controller.captchaKey.value != value) { + return 'کد امنیتی اشتباه است'; } return null; }, + onChanged: (pass) { + if(pass.length== 6) { + if(controller.formKey.currentState?.validate()??false) { + Get.find().isDisabled.value = false; + + } + } + }, style: AppFonts.yekan13, ); }, controller.textController), @@ -82,10 +93,10 @@ class _CaptchaLinePainter extends CustomPainter { void paint(Canvas canvas, Size size) { final random = Random(); final paint1 = Paint() - ..color = Color.fromRGBO(random.nextInt(255), random.nextInt(255), random.nextInt(255), 1) + ..color = Colors.deepOrange ..strokeWidth = 2; final paint2 = Paint() - ..color = Color.fromRGBO(random.nextInt(255), random.nextInt(255), random.nextInt(255), 1) + ..color =Colors.blue ..strokeWidth = 2; // First line: top-left to bottom-right diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 0197984..bdaabab 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -1,6 +1,5 @@ library; - //other packages export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_map/flutter_map.dart'; @@ -9,13 +8,17 @@ export 'package:flutter_rating_bar/flutter_rating_bar.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:hive_ce_flutter/hive_flutter.dart'; + //freezed export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; -export 'package:get/get.dart'; +export 'package:get/get.dart' hide FormData, MultipartFile, Response; + //di export 'package:get_it/get_it.dart'; export 'injection/di.dart'; +export 'package:dio/dio.dart'; +export 'package:pretty_dio_logger/pretty_dio_logger.dart'; //local storage export 'package:hive_ce_flutter/hive_flutter.dart'; @@ -26,13 +29,12 @@ export 'infrastructure/local/hive_local_storage.dart'; //export 'package:encrypt/encrypt.dart' show Encrypted; //Map and location -export 'package:latlong2/latlong.dart' ; +export 'package:latlong2/latlong.dart'; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; - //network export 'infrastructure/remote/dio_form_data.dart'; export 'infrastructure/remote/dio_remote.dart'; diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index c8f0189..dc92ede 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -7,14 +7,14 @@ import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart' import 'interfaces/i_http_client.dart'; class DioRemote implements IHttpClient { - final String baseUrl; + String? baseUrl; late final Dio _dio; - DioRemote(this.baseUrl); + DioRemote({this.baseUrl}); @override Future init() async { - final dio = Dio(BaseOptions(baseUrl: baseUrl)); + final dio = Dio(BaseOptions(baseUrl: baseUrl??'')); if (kDebugMode) { dio.interceptors.add(PrettyDioLogger( requestHeader: true, diff --git a/tools/package_builder.sh b/tools/package_builder.sh index c14cc59..369f0a5 100644 --- a/tools/package_builder.sh +++ b/tools/package_builder.sh @@ -1,2 +1,2 @@ #!/bin/bash -dart create --template=package ../packages/livestock \ No newline at end of file +dart create --template=package ../packages/chicken \ No newline at end of file From 880ef4c17529e25098908cbeb57df9fc088c3236 Mon Sep 17 00:00:00 2001 From: MrM Date: Tue, 3 Jun 2025 22:52:33 +0330 Subject: [PATCH 098/256] feat : auth for new module --- .../user_info/user_info_model.freezed.dart | 157 ++++++++++++++ .../response/user_info/user_info_model.g.dart | 23 ++ .../user_profile_model.freezed.dart | 201 ++++++++++++++++++ .../user_profile_model.g.dart | 47 ++++ 4 files changed, 428 insertions(+) create mode 100644 packages/auth/lib/data/models/response/user_info/user_info_model.freezed.dart create mode 100644 packages/auth/lib/data/models/response/user_info/user_info_model.g.dart create mode 100644 packages/auth/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart create mode 100644 packages/auth/lib/data/models/response/user_profile_model/user_profile_model.g.dart diff --git a/packages/auth/lib/data/models/response/user_info/user_info_model.freezed.dart b/packages/auth/lib/data/models/response/user_info/user_info_model.freezed.dart new file mode 100644 index 0000000..bbb225d --- /dev/null +++ b/packages/auth/lib/data/models/response/user_info/user_info_model.freezed.dart @@ -0,0 +1,157 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user_info_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$UserInfoModel { + + bool? get isUser; String? get address; String? get backend; String? get apiKey; +/// Create a copy of UserInfoModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserInfoModelCopyWith get copyWith => _$UserInfoModelCopyWithImpl(this as UserInfoModel, _$identity); + + /// Serializes this UserInfoModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UserInfoModel&&(identical(other.isUser, isUser) || other.isUser == isUser)&&(identical(other.address, address) || other.address == address)&&(identical(other.backend, backend) || other.backend == backend)&&(identical(other.apiKey, apiKey) || other.apiKey == apiKey)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,isUser,address,backend,apiKey); + +@override +String toString() { + return 'UserInfoModel(isUser: $isUser, address: $address, backend: $backend, apiKey: $apiKey)'; +} + + +} + +/// @nodoc +abstract mixin class $UserInfoModelCopyWith<$Res> { + factory $UserInfoModelCopyWith(UserInfoModel value, $Res Function(UserInfoModel) _then) = _$UserInfoModelCopyWithImpl; +@useResult +$Res call({ + bool? isUser, String? address, String? backend, String? apiKey +}); + + + + +} +/// @nodoc +class _$UserInfoModelCopyWithImpl<$Res> + implements $UserInfoModelCopyWith<$Res> { + _$UserInfoModelCopyWithImpl(this._self, this._then); + + final UserInfoModel _self; + final $Res Function(UserInfoModel) _then; + +/// Create a copy of UserInfoModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? isUser = freezed,Object? address = freezed,Object? backend = freezed,Object? apiKey = freezed,}) { + return _then(_self.copyWith( +isUser: freezed == isUser ? _self.isUser : isUser // ignore: cast_nullable_to_non_nullable +as bool?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,backend: freezed == backend ? _self.backend : backend // ignore: cast_nullable_to_non_nullable +as String?,apiKey: freezed == apiKey ? _self.apiKey : apiKey // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _UserInfoModel implements UserInfoModel { + const _UserInfoModel({this.isUser, this.address, this.backend, this.apiKey}); + factory _UserInfoModel.fromJson(Map json) => _$UserInfoModelFromJson(json); + +@override final bool? isUser; +@override final String? address; +@override final String? backend; +@override final String? apiKey; + +/// Create a copy of UserInfoModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserInfoModelCopyWith<_UserInfoModel> get copyWith => __$UserInfoModelCopyWithImpl<_UserInfoModel>(this, _$identity); + +@override +Map toJson() { + return _$UserInfoModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _UserInfoModel&&(identical(other.isUser, isUser) || other.isUser == isUser)&&(identical(other.address, address) || other.address == address)&&(identical(other.backend, backend) || other.backend == backend)&&(identical(other.apiKey, apiKey) || other.apiKey == apiKey)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,isUser,address,backend,apiKey); + +@override +String toString() { + return 'UserInfoModel(isUser: $isUser, address: $address, backend: $backend, apiKey: $apiKey)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserInfoModelCopyWith<$Res> implements $UserInfoModelCopyWith<$Res> { + factory _$UserInfoModelCopyWith(_UserInfoModel value, $Res Function(_UserInfoModel) _then) = __$UserInfoModelCopyWithImpl; +@override @useResult +$Res call({ + bool? isUser, String? address, String? backend, String? apiKey +}); + + + + +} +/// @nodoc +class __$UserInfoModelCopyWithImpl<$Res> + implements _$UserInfoModelCopyWith<$Res> { + __$UserInfoModelCopyWithImpl(this._self, this._then); + + final _UserInfoModel _self; + final $Res Function(_UserInfoModel) _then; + +/// Create a copy of UserInfoModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? isUser = freezed,Object? address = freezed,Object? backend = freezed,Object? apiKey = freezed,}) { + return _then(_UserInfoModel( +isUser: freezed == isUser ? _self.isUser : isUser // ignore: cast_nullable_to_non_nullable +as bool?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,backend: freezed == backend ? _self.backend : backend // ignore: cast_nullable_to_non_nullable +as String?,apiKey: freezed == apiKey ? _self.apiKey : apiKey // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/auth/lib/data/models/response/user_info/user_info_model.g.dart b/packages/auth/lib/data/models/response/user_info/user_info_model.g.dart new file mode 100644 index 0000000..2c8f1c4 --- /dev/null +++ b/packages/auth/lib/data/models/response/user_info/user_info_model.g.dart @@ -0,0 +1,23 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_info_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_UserInfoModel _$UserInfoModelFromJson(Map json) => + _UserInfoModel( + isUser: json['is_user'] as bool?, + address: json['address'] as String?, + backend: json['backend'] as String?, + apiKey: json['api_key'] as String?, + ); + +Map _$UserInfoModelToJson(_UserInfoModel instance) => + { + 'is_user': instance.isUser, + 'address': instance.address, + 'backend': instance.backend, + 'api_key': instance.apiKey, + }; diff --git a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart b/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart new file mode 100644 index 0000000..0f5e570 --- /dev/null +++ b/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart @@ -0,0 +1,201 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user_profile_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$UserProfileModel { + + String? get accessToken; String? get expiresIn; String? get scope; String? get expireTime; String? get mobile; String? get fullname; String? get firstname; String? get lastname; String? get city; String? get province; String? get nationalCode; String? get nationalId; String? get birthday; String? get image; int? get baseOrder; List? get role; +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserProfileModelCopyWith get copyWith => _$UserProfileModelCopyWithImpl(this as UserProfileModel, _$identity); + + /// Serializes this UserProfileModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UserProfileModel&&(identical(other.accessToken, accessToken) || other.accessToken == accessToken)&&(identical(other.expiresIn, expiresIn) || other.expiresIn == expiresIn)&&(identical(other.scope, scope) || other.scope == scope)&&(identical(other.expireTime, expireTime) || other.expireTime == expireTime)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstname, firstname) || other.firstname == firstname)&&(identical(other.lastname, lastname) || other.lastname == lastname)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&(identical(other.image, image) || other.image == image)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&const DeepCollectionEquality().equals(other.role, role)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,accessToken,expiresIn,scope,expireTime,mobile,fullname,firstname,lastname,city,province,nationalCode,nationalId,birthday,image,baseOrder,const DeepCollectionEquality().hash(role)); + +@override +String toString() { + return 'UserProfileModel(accessToken: $accessToken, expiresIn: $expiresIn, scope: $scope, expireTime: $expireTime, mobile: $mobile, fullname: $fullname, firstname: $firstname, lastname: $lastname, city: $city, province: $province, nationalCode: $nationalCode, nationalId: $nationalId, birthday: $birthday, image: $image, baseOrder: $baseOrder, role: $role)'; +} + + +} + +/// @nodoc +abstract mixin class $UserProfileModelCopyWith<$Res> { + factory $UserProfileModelCopyWith(UserProfileModel value, $Res Function(UserProfileModel) _then) = _$UserProfileModelCopyWithImpl; +@useResult +$Res call({ + String? accessToken, String? expiresIn, String? scope, String? expireTime, String? mobile, String? fullname, String? firstname, String? lastname, String? city, String? province, String? nationalCode, String? nationalId, String? birthday, String? image, int? baseOrder, List? role +}); + + + + +} +/// @nodoc +class _$UserProfileModelCopyWithImpl<$Res> + implements $UserProfileModelCopyWith<$Res> { + _$UserProfileModelCopyWithImpl(this._self, this._then); + + final UserProfileModel _self; + final $Res Function(UserProfileModel) _then; + +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? accessToken = freezed,Object? expiresIn = freezed,Object? scope = freezed,Object? expireTime = freezed,Object? mobile = freezed,Object? fullname = freezed,Object? firstname = freezed,Object? lastname = freezed,Object? city = freezed,Object? province = freezed,Object? nationalCode = freezed,Object? nationalId = freezed,Object? birthday = freezed,Object? image = freezed,Object? baseOrder = freezed,Object? role = freezed,}) { + return _then(_self.copyWith( +accessToken: freezed == accessToken ? _self.accessToken : accessToken // ignore: cast_nullable_to_non_nullable +as String?,expiresIn: freezed == expiresIn ? _self.expiresIn : expiresIn // ignore: cast_nullable_to_non_nullable +as String?,scope: freezed == scope ? _self.scope : scope // ignore: cast_nullable_to_non_nullable +as String?,expireTime: freezed == expireTime ? _self.expireTime : expireTime // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstname: freezed == firstname ? _self.firstname : firstname // ignore: cast_nullable_to_non_nullable +as String?,lastname: freezed == lastname ? _self.lastname : lastname // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,birthday: freezed == birthday ? _self.birthday : birthday // ignore: cast_nullable_to_non_nullable +as String?,image: freezed == image ? _self.image : image // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _UserProfileModel implements UserProfileModel { + const _UserProfileModel({this.accessToken, this.expiresIn, this.scope, this.expireTime, this.mobile, this.fullname, this.firstname, this.lastname, this.city, this.province, this.nationalCode, this.nationalId, this.birthday, this.image, this.baseOrder, final List? role}): _role = role; + factory _UserProfileModel.fromJson(Map json) => _$UserProfileModelFromJson(json); + +@override final String? accessToken; +@override final String? expiresIn; +@override final String? scope; +@override final String? expireTime; +@override final String? mobile; +@override final String? fullname; +@override final String? firstname; +@override final String? lastname; +@override final String? city; +@override final String? province; +@override final String? nationalCode; +@override final String? nationalId; +@override final String? birthday; +@override final String? image; +@override final int? baseOrder; + final List? _role; +@override List? get role { + final value = _role; + if (value == null) return null; + if (_role is EqualUnmodifiableListView) return _role; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserProfileModelCopyWith<_UserProfileModel> get copyWith => __$UserProfileModelCopyWithImpl<_UserProfileModel>(this, _$identity); + +@override +Map toJson() { + return _$UserProfileModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _UserProfileModel&&(identical(other.accessToken, accessToken) || other.accessToken == accessToken)&&(identical(other.expiresIn, expiresIn) || other.expiresIn == expiresIn)&&(identical(other.scope, scope) || other.scope == scope)&&(identical(other.expireTime, expireTime) || other.expireTime == expireTime)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstname, firstname) || other.firstname == firstname)&&(identical(other.lastname, lastname) || other.lastname == lastname)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&(identical(other.image, image) || other.image == image)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&const DeepCollectionEquality().equals(other._role, _role)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,accessToken,expiresIn,scope,expireTime,mobile,fullname,firstname,lastname,city,province,nationalCode,nationalId,birthday,image,baseOrder,const DeepCollectionEquality().hash(_role)); + +@override +String toString() { + return 'UserProfileModel(accessToken: $accessToken, expiresIn: $expiresIn, scope: $scope, expireTime: $expireTime, mobile: $mobile, fullname: $fullname, firstname: $firstname, lastname: $lastname, city: $city, province: $province, nationalCode: $nationalCode, nationalId: $nationalId, birthday: $birthday, image: $image, baseOrder: $baseOrder, role: $role)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserProfileModelCopyWith<$Res> implements $UserProfileModelCopyWith<$Res> { + factory _$UserProfileModelCopyWith(_UserProfileModel value, $Res Function(_UserProfileModel) _then) = __$UserProfileModelCopyWithImpl; +@override @useResult +$Res call({ + String? accessToken, String? expiresIn, String? scope, String? expireTime, String? mobile, String? fullname, String? firstname, String? lastname, String? city, String? province, String? nationalCode, String? nationalId, String? birthday, String? image, int? baseOrder, List? role +}); + + + + +} +/// @nodoc +class __$UserProfileModelCopyWithImpl<$Res> + implements _$UserProfileModelCopyWith<$Res> { + __$UserProfileModelCopyWithImpl(this._self, this._then); + + final _UserProfileModel _self; + final $Res Function(_UserProfileModel) _then; + +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? accessToken = freezed,Object? expiresIn = freezed,Object? scope = freezed,Object? expireTime = freezed,Object? mobile = freezed,Object? fullname = freezed,Object? firstname = freezed,Object? lastname = freezed,Object? city = freezed,Object? province = freezed,Object? nationalCode = freezed,Object? nationalId = freezed,Object? birthday = freezed,Object? image = freezed,Object? baseOrder = freezed,Object? role = freezed,}) { + return _then(_UserProfileModel( +accessToken: freezed == accessToken ? _self.accessToken : accessToken // ignore: cast_nullable_to_non_nullable +as String?,expiresIn: freezed == expiresIn ? _self.expiresIn : expiresIn // ignore: cast_nullable_to_non_nullable +as String?,scope: freezed == scope ? _self.scope : scope // ignore: cast_nullable_to_non_nullable +as String?,expireTime: freezed == expireTime ? _self.expireTime : expireTime // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstname: freezed == firstname ? _self.firstname : firstname // ignore: cast_nullable_to_non_nullable +as String?,lastname: freezed == lastname ? _self.lastname : lastname // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,birthday: freezed == birthday ? _self.birthday : birthday // ignore: cast_nullable_to_non_nullable +as String?,image: freezed == image ? _self.image : image // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,role: freezed == role ? _self._role : role // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + + +} + +// dart format on diff --git a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.g.dart b/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.g.dart new file mode 100644 index 0000000..df72e0e --- /dev/null +++ b/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_profile_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_UserProfileModel _$UserProfileModelFromJson(Map json) => + _UserProfileModel( + accessToken: json['access_token'] as String?, + expiresIn: json['expires_in'] as String?, + scope: json['scope'] as String?, + expireTime: json['expire_time'] as String?, + mobile: json['mobile'] as String?, + fullname: json['fullname'] as String?, + firstname: json['firstname'] as String?, + lastname: json['lastname'] as String?, + city: json['city'] as String?, + province: json['province'] as String?, + nationalCode: json['national_code'] as String?, + nationalId: json['national_id'] as String?, + birthday: json['birthday'] as String?, + image: json['image'] as String?, + baseOrder: (json['base_order'] as num?)?.toInt(), + role: (json['role'] as List?)?.map((e) => e as String).toList(), + ); + +Map _$UserProfileModelToJson(_UserProfileModel instance) => + { + 'access_token': instance.accessToken, + 'expires_in': instance.expiresIn, + 'scope': instance.scope, + 'expire_time': instance.expireTime, + 'mobile': instance.mobile, + 'fullname': instance.fullname, + 'firstname': instance.firstname, + 'lastname': instance.lastname, + 'city': instance.city, + 'province': instance.province, + 'national_code': instance.nationalCode, + 'national_id': instance.nationalId, + 'birthday': instance.birthday, + 'image': instance.image, + 'base_order': instance.baseOrder, + 'role': instance.role, + }; From 5d5956c7f28962944ba5b730adb8cd292d80a86b Mon Sep 17 00:00:00 2001 From: MrM Date: Tue, 3 Jun 2025 23:26:38 +0330 Subject: [PATCH 099/256] feat : package chicken and added to app --- lib/infrastructure/service/auth_service.dart | 2 +- lib/presentation/routes/app_pages.dart | 9 +- lib/res/assets_res.dart | 11 +++ lib/res/font_res.dart | 12 +++ packages/chicken/.gitignore | 7 ++ packages/chicken/CHANGELOG.md | 3 + packages/chicken/README.md | 39 +++++++++ packages/chicken/analysis_options.yaml | 30 +++++++ packages/chicken/lib/chicken.dart | 9 ++ .../lib/presentation/pages/root/logic.dart | 33 ++++++++ .../lib/presentation/pages/root/view.dart | 82 +++++++++++++++++++ .../lib/presentation/routes/pages.dart | 23 ++++++ .../lib/presentation/routes/routes.dart | 6 ++ .../presentation/widget/cluster_marker.dart | 59 +++++++++++++ packages/chicken/pubspec.yaml | 34 ++++++++ packages/chicken/test/chicken_test.dart | 16 ++++ pubspec.lock | 7 ++ pubspec.yaml | 4 + 18 files changed, 383 insertions(+), 3 deletions(-) create mode 100644 lib/res/assets_res.dart create mode 100644 lib/res/font_res.dart create mode 100644 packages/chicken/.gitignore create mode 100644 packages/chicken/CHANGELOG.md create mode 100644 packages/chicken/README.md create mode 100644 packages/chicken/analysis_options.yaml create mode 100644 packages/chicken/lib/chicken.dart create mode 100644 packages/chicken/lib/presentation/pages/root/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/root/view.dart create mode 100644 packages/chicken/lib/presentation/routes/pages.dart create mode 100644 packages/chicken/lib/presentation/routes/routes.dart create mode 100644 packages/chicken/lib/presentation/widget/cluster_marker.dart create mode 100644 packages/chicken/pubspec.yaml create mode 100644 packages/chicken/test/chicken_test.dart diff --git a/lib/infrastructure/service/auth_service.dart b/lib/infrastructure/service/auth_service.dart index 9a4a12f..6ad04fa 100644 --- a/lib/infrastructure/service/auth_service.dart +++ b/lib/infrastructure/service/auth_service.dart @@ -25,7 +25,7 @@ class AuthService extends GetxService { everAll([accessRes, refAccessRes], (_) { if (accessRes.value && refAccessRes.value) { var targetPage = getTargetPage(tokenService.appModule.value); - Get.offAndToNamed(targetPage); + Get.offAllNamed(targetPage); } }); } diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 8e5f373..2800452 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -4,6 +4,8 @@ import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_auth/presentation/routes/pages.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/presentation/routes/pages.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/inspection.dart'; import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; @@ -27,6 +29,7 @@ sealed class AppPages { ...InspectionPages.pages, ...AuthPages.pages, ...LiveStockPages.pages, + ...ChickenPages.pages, ]; } @@ -37,7 +40,9 @@ String getTargetPage(Module? value) { return InspectionRoutes.inspection; case Module.liveStocks: return LiveStockRoutes.init; + case Module.chicken: + return ChickenRoutes.init; default: - return InspectionRoutes.inspection; + return ChickenRoutes.init; } -} \ No newline at end of file +} diff --git a/lib/res/assets_res.dart b/lib/res/assets_res.dart new file mode 100644 index 0000000..3ed9350 --- /dev/null +++ b/lib/res/assets_res.dart @@ -0,0 +1,11 @@ +// Generated file. Do not edit. +// This file is generated by the iFlutter + +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars +class AssetsRes { + AssetsRes._(); + + static const String PROJECT_NAME = 'rasadyar_app'; + static const String PROJECT_VERSION = '1.2.0+2'; +} diff --git a/lib/res/font_res.dart b/lib/res/font_res.dart new file mode 100644 index 0000000..38a512e --- /dev/null +++ b/lib/res/font_res.dart @@ -0,0 +1,12 @@ +// Generated file. Do not edit. +// This file is generated by the iFlutter + +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars +class FontRes { + FontRes._(); + + static const String PROJECT_NAME = 'rasadyar_app'; + static const String PROJECT_VERSION = '1.2.0+2'; + static const String IRANYEKANREGULARFANUM = 'iranyekanregularfanum'; +} diff --git a/packages/chicken/.gitignore b/packages/chicken/.gitignore new file mode 100644 index 0000000..3cceda5 --- /dev/null +++ b/packages/chicken/.gitignore @@ -0,0 +1,7 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ + +# Avoid committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock diff --git a/packages/chicken/CHANGELOG.md b/packages/chicken/CHANGELOG.md new file mode 100644 index 0000000..effe43c --- /dev/null +++ b/packages/chicken/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/packages/chicken/README.md b/packages/chicken/README.md new file mode 100644 index 0000000..8831761 --- /dev/null +++ b/packages/chicken/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/chicken/analysis_options.yaml b/packages/chicken/analysis_options.yaml new file mode 100644 index 0000000..dee8927 --- /dev/null +++ b/packages/chicken/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/packages/chicken/lib/chicken.dart b/packages/chicken/lib/chicken.dart new file mode 100644 index 0000000..7f7bfe9 --- /dev/null +++ b/packages/chicken/lib/chicken.dart @@ -0,0 +1,9 @@ +/// Support for doing something awesome. +/// +/// More dartdocs go here. +library; + +export 'presentation/routes/pages.dart'; +export 'presentation/routes/routes.dart'; +export 'presentation/pages/root/view.dart'; +export 'presentation/pages/root/logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart new file mode 100644 index 0000000..638a409 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + + +enum ErrorLocationType { serviceDisabled, permissionDenied, none } + +class RootLogic extends GetxController { + RxInt currentIndex = 0.obs; + List pages = [ + Container(color: Colors.deepOrange,), + Container(color: Colors.amberAccent,), + Container(color: Colors.black,), + ]; + RxList errorLocationType = RxList(); + + + + @override + void onReady() { + super.onReady(); + + } + + void changePage(int index) { + currentIndex.value = index; + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart new file mode 100644 index 0000000..071cdfa --- /dev/null +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class RootPage extends GetView { + const RootPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + ObxValue( + (currentIndex) => IndexedStack( + index: currentIndex.value, + children: controller.pages, + ), + controller.currentIndex, + ), + + ], + ), + bottomNavigationBar: WaveBottomNavigation( + items: [ + WaveBottomNavigationItem(title: 'خانه', icon: Assets.vec.mapSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + )), + WaveBottomNavigationItem( + title: 'عملیات', + icon: Assets.vec.userSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'افزودن', + icon: Assets.vec.addSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'آمار', + icon: Assets.vec.diagramSvg.svg(width: 32,height: 32,colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),), + ), + WaveBottomNavigationItem( + title: 'تماس', + icon: Assets.vec.callSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'مکان ', + icon: Assets.vec.gpsSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'تاریخ', + icon: Assets.vec.calendarSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + ], + onPageChanged: (index) { + controller.changePage(index); + }, + ), + ); + } +} diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart new file mode 100644 index 0000000..b9676b9 --- /dev/null +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -0,0 +1,23 @@ + +import 'package:chicken/presentation/pages/root/view.dart'; +import 'package:chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_core/core.dart'; + + +sealed class ChickenPages { + ChickenPages._(); + + static final pages = [ + GetPage( + name: ChickenRoutes.init, + page: () => RootPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + + }), + ), + + + ]; +} diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart new file mode 100644 index 0000000..9fe67b5 --- /dev/null +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -0,0 +1,6 @@ +sealed class ChickenRoutes { + ChickenRoutes._(); + + static const init = '/chicken/init'; + +} diff --git a/packages/chicken/lib/presentation/widget/cluster_marker.dart b/packages/chicken/lib/presentation/widget/cluster_marker.dart new file mode 100644 index 0000000..4c8d82a --- /dev/null +++ b/packages/chicken/lib/presentation/widget/cluster_marker.dart @@ -0,0 +1,59 @@ + +import 'package:flutter/material.dart'; + +class AnimatedClusterMarker extends StatefulWidget { + final int count; + + const AnimatedClusterMarker({super.key, required this.count}); + + @override + State createState() => _AnimatedClusterMarkerState(); +} + +class _AnimatedClusterMarkerState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + + @override + void initState() { + super.initState(); + + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 300), + )..forward(); // start animation + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ScaleTransition( + scale: CurvedAnimation(parent: _controller, curve: Curves.easeOutBack), + child: Opacity( + opacity: _controller.value, + child: Container( + width: 40, + height: 40, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.blueAccent, + shape: BoxShape.circle, + border: Border.all(color: Colors.white, width: 2), + ), + child: Text( + widget.count.toString(), + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ); + } +} diff --git a/packages/chicken/pubspec.yaml b/packages/chicken/pubspec.yaml new file mode 100644 index 0000000..17cc275 --- /dev/null +++ b/packages/chicken/pubspec.yaml @@ -0,0 +1,34 @@ +name: rasadyar_chicken +description: A starting point for Dart libraries or applications. +version: 1.0.0 +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.8.1 + + +dependencies: + flutter: + sdk: flutter + rasadyar_core: + path: ../core + rasadyar_auth: + path: ../auth + ##code generation + freezed_annotation: ^3.0.0 + json_annotation: ^4.9.0 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + lints: ^5.0.0 + test: ^1.24.0 + ##code generation + build_runner: ^2.4.15 + hive_ce_generator: ^1.9.1 + freezed: ^3.0.6 + json_serializable: ^6.9.4 + + ##test + mocktail: ^1.0.4 + get_test: ^4.0.1 diff --git a/packages/chicken/test/chicken_test.dart b/packages/chicken/test/chicken_test.dart new file mode 100644 index 0000000..a8c331b --- /dev/null +++ b/packages/chicken/test/chicken_test.dart @@ -0,0 +1,16 @@ +import 'package:chicken/chicken.dart'; +import 'package:test/test.dart'; + +void main() { + group('A group of tests', () { + final awesome = Awesome(); + + setUp(() { + // Additional setup goes here. + }); + + test('First Test', () { + expect(awesome.isAwesome, isTrue); + }); + }); +} diff --git a/pubspec.lock b/pubspec.lock index 1b4461c..cddd973 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -980,6 +980,13 @@ packages: relative: true source: path version: "0.0.1" + rasadyar_chicken: + dependency: "direct main" + description: + path: "packages/chicken" + relative: true + source: path + version: "1.0.0" rasadyar_core: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 189dc00..69a73b6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,6 +27,10 @@ dependencies: rasadyar_livestock: path: ./packages/livestock + rasadyar_chicken: + path: ./packages/chicken + + ##code generation From 151fa10641503b0d7be949aa70c22850802cb911 Mon Sep 17 00:00:00 2001 From: MrM Date: Tue, 3 Jun 2025 23:27:29 +0330 Subject: [PATCH 100/256] fix : route and pages --- packages/chicken/lib/presentation/routes/pages.dart | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index b9676b9..bcc7a8e 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,10 +1,8 @@ - -import 'package:chicken/presentation/pages/root/view.dart'; -import 'package:chicken/presentation/routes/routes.dart'; import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; - sealed class ChickenPages { ChickenPages._(); @@ -13,11 +11,7 @@ sealed class ChickenPages { name: ChickenRoutes.init, page: () => RootPage(), middlewares: [AuthMiddleware()], - binding: BindingsBuilder(() { - - }), + binding: BindingsBuilder(() {}), ), - - ]; } From 5849466e3bc3e49feb8cbd5ba35ca4a7cb6c5f6b Mon Sep 17 00:00:00 2001 From: MrM Date: Tue, 3 Jun 2025 23:57:25 +0330 Subject: [PATCH 101/256] fix : auth --- packages/auth/lib/data/di/auth_di.dart | 15 +++++++++++---- .../auth/lib/presentation/pages/auth/logic.dart | 9 +++------ .../lib/presentation/widget/captcha/logic.dart | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index cc89573..5accae7 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -16,9 +16,16 @@ Future setupAuthDI() async { final dioRemote = diAuth.get(); await dioRemote.init(); - diAuth.registerCachedFactory( - () => AuthRepositoryImpl(dioRemote), - ); - + diAuth.registerSingleton(AuthRepositoryImpl(dioRemote)); diAuth.registerLazySingleton(() => DioErrorHandler()); } + +Future newSetupAuthDI(String newUrl) async { + diAuth.registerLazySingleton(() => DioRemote(baseUrl: newUrl),instanceName: 'newRemote'); + final dioRemote = diAuth.get(instanceName: 'newRemote'); + await dioRemote.init(); + diAuth.registerSingleton( + AuthRepositoryImpl(dioRemote), + instanceName: 'newUrl', + ); +} diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 31c6607..0c6093a 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -135,10 +135,10 @@ class AuthLogic extends GetxController { Future submitLoginForm2() async { if (!_isFormValid()) return; - + AuthRepositoryImpl authTmp = diAuth.get(instanceName: 'newUrl'); isLoading.value = true; await safeCall( - call: () => authRepository.login( + call: () => authTmp.login( authRequest: { "username": phoneNumberController.value.text, "password": passwordController.value.text, @@ -165,10 +165,7 @@ class AuthLogic extends GetxController { call: () async => await authRepository.getUserInfo(value), onSuccess: (result) async { if (result != null) { - diAuth.registerSingleton( - DioRemote(baseUrl: result.backend), - instanceName: 'newDioRemote', - ); + await newSetupAuthDI(result.backend ?? ''); await tokenStorageService.saveApiKey(result.apiKey ?? ''); await tokenStorageService.saveBaseUrl(result.backend ?? ''); } diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart index a24052a..ef21e40 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -30,7 +30,7 @@ class CaptchaWidgetLogic extends GetxController with StateMixin Date: Thu, 5 Jun 2025 23:26:44 +0330 Subject: [PATCH 102/256] feat : chicken root page , inventory , sale in province --- assets/icons/inside.svg | 1 + assets/icons/outside.svg | 27 + assets/icons/whare_house.svg | 1 + lib/infrastructure/di/di.dart | 2 + lib/res/assets_res.dart | 3 + packages/auth/lib/data/di/auth_di.dart | 2 - packages/chicken/build.yaml | 6 + .../chicken/lib/data/common/constant.dart | 14 + .../lib/data/common/dio_error_handler.dart | 58 + .../chicken/lib/data/common/dio_manager.dart | 33 + packages/chicken/lib/data/di/chicken_di.dart | 19 + .../conform_allocation.dart | 18 + .../conform_allocation.freezed.dart | 160 + .../conform_allocation.g.dart | 25 + .../steward_allocation_request.dart | 20 + .../steward_allocation_request.freezed.dart | 166 + .../steward_allocation_request.g.dart | 33 + .../submit_steward_allocation.dart | 26 + .../submit_steward_allocation.freezed.dart | 184 ++ .../submit_steward_allocation.g.dart | 43 + .../allocated_made/allocated_made.dart | 227 ++ .../allocated_made.freezed.dart | 1899 ++++++++++++ .../allocated_made/allocated_made.g.dart | 373 +++ .../bar_information/bar_information.dart | 25 + .../bar_information.freezed.dart | 181 ++ .../bar_information/bar_information.g.dart | 47 + .../models/response/guild/guild_model.dart | 28 + .../response/guild/guild_model.freezed.dart | 320 ++ .../models/response/guild/guild_model.g.dart | 36 + .../response/guild_profile/guild_profile.dart | 160 + .../guild_profile/guild_profile.freezed.dart | 1521 +++++++++ .../guild_profile/guild_profile.g.dart | 244 ++ .../imported_loads_model.dart | 311 ++ .../imported_loads_model.freezed.dart | 2744 +++++++++++++++++ .../imported_loads_model.g.dart | 491 +++ .../response/inventory/inventory_model.dart | 56 + .../inventory/inventory_model.freezed.dart | 274 ++ .../response/inventory/inventory_model.g.dart | 127 + .../kill_house_distribution_info.dart | 15 + .../kill_house_distribution_info.freezed.dart | 151 + .../kill_house_distribution_info.g.dart | 22 + .../roles_products/roles_products.dart | 67 + .../roles_products.freezed.dart | 423 +++ .../roles_products/roles_products.g.dart | 141 + .../waiting_arrival/waiting_arrival.dart | 266 ++ .../waiting_arrival.freezed.dart | 2733 ++++++++++++++++ .../waiting_arrival/waiting_arrival.g.dart | 440 +++ .../data/repositories/chicken_repository.dart | 60 + .../repositories/chicken_repository_imp.dart | 194 ++ .../pages/entering_the_warehouse/logic.dart | 151 + .../entering_the_warehouse/string_utils.dart | 25 + .../pages/entering_the_warehouse/view.dart | 600 ++++ .../lib/presentation/pages/root/logic.dart | 118 +- .../lib/presentation/pages/root/view.dart | 507 ++- .../pages/sales_within_province/logic.dart | 213 ++ .../pages/sales_within_province/view.dart | 574 ++++ .../lib/presentation/routes/pages.dart | 27 +- .../lib/presentation/routes/routes.dart | 5 +- packages/chicken/test/chicken_test.dart | 16 - packages/core/lib/core.dart | 1 + .../lib/infrastructure/remote/dio_remote.dart | 43 +- .../lib/presentation/common/assets.gen.dart | 12 + .../lib/presentation/common/fonts.gen.dart | 4 +- .../presentation/utils/data_time_utils.dart | 8 + .../presentation/utils/list_extensions.dart | 4 +- .../core/lib/presentation/utils/utils.dart | 3 +- packages/core/lib/utils/date_time_utils.dart | 10 + pubspec.yaml | 3 + 68 files changed, 16615 insertions(+), 126 deletions(-) create mode 100644 assets/icons/inside.svg create mode 100644 assets/icons/outside.svg create mode 100644 assets/icons/whare_house.svg create mode 100644 packages/chicken/build.yaml create mode 100644 packages/chicken/lib/data/common/constant.dart create mode 100644 packages/chicken/lib/data/common/dio_error_handler.dart create mode 100644 packages/chicken/lib/data/common/dio_manager.dart create mode 100644 packages/chicken/lib/data/di/chicken_di.dart create mode 100644 packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.dart create mode 100644 packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart create mode 100644 packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.g.dart create mode 100644 packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.dart create mode 100644 packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart create mode 100644 packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.g.dart create mode 100644 packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.dart create mode 100644 packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart create mode 100644 packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.g.dart create mode 100644 packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart create mode 100644 packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart create mode 100644 packages/chicken/lib/data/models/response/bar_information/bar_information.dart create mode 100644 packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/bar_information/bar_information.g.dart create mode 100644 packages/chicken/lib/data/models/response/guild/guild_model.dart create mode 100644 packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/guild/guild_model.g.dart create mode 100644 packages/chicken/lib/data/models/response/guild_profile/guild_profile.dart create mode 100644 packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/guild_profile/guild_profile.g.dart create mode 100644 packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart create mode 100644 packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart create mode 100644 packages/chicken/lib/data/models/response/inventory/inventory_model.dart create mode 100644 packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/inventory/inventory_model.g.dart create mode 100644 packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart create mode 100644 packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.g.dart create mode 100644 packages/chicken/lib/data/models/response/roles_products/roles_products.dart create mode 100644 packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/roles_products/roles_products.g.dart create mode 100644 packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart create mode 100644 packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart create mode 100644 packages/chicken/lib/data/repositories/chicken_repository.dart create mode 100644 packages/chicken/lib/data/repositories/chicken_repository_imp.dart create mode 100644 packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart create mode 100644 packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_within_province/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_within_province/view.dart delete mode 100644 packages/chicken/test/chicken_test.dart create mode 100644 packages/core/lib/presentation/utils/data_time_utils.dart create mode 100644 packages/core/lib/utils/date_time_utils.dart diff --git a/assets/icons/inside.svg b/assets/icons/inside.svg new file mode 100644 index 0000000..88704db --- /dev/null +++ b/assets/icons/inside.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/outside.svg b/assets/icons/outside.svg new file mode 100644 index 0000000..72b6978 --- /dev/null +++ b/assets/icons/outside.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/whare_house.svg b/assets/icons/whare_house.svg new file mode 100644 index 0000000..5033d61 --- /dev/null +++ b/assets/icons/whare_house.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index b7107fb..1058c46 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -1,5 +1,6 @@ import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_core/core.dart'; final di = GetIt.instance; @@ -8,6 +9,7 @@ Future setupInjection() async{ await setupAuthDI(); await setupAllCoreProvider(); + } diff --git a/lib/res/assets_res.dart b/lib/res/assets_res.dart index 3ed9350..18ff89e 100644 --- a/lib/res/assets_res.dart +++ b/lib/res/assets_res.dart @@ -8,4 +8,7 @@ class AssetsRes { static const String PROJECT_NAME = 'rasadyar_app'; static const String PROJECT_VERSION = '1.2.0+2'; + static const String INSIDE = 'assets/icons/inside.svg'; + static const String OUTSIDE = 'assets/icons/outside.svg'; + static const String WHARE_HOUSE = 'assets/icons/whare_house.svg'; } diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 5accae7..e6b40cd 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -11,8 +11,6 @@ Future setupAuthDI() async { diAuth.registerLazySingleton(() => DioRemoteManager()); diAuth.registerLazySingleton(() => DioRemote()); - /* final manager = diAuth.get(); - final dioRemote = await manager.setEnvironment(ApiEnvironment.dam);*/ final dioRemote = diAuth.get(); await dioRemote.init(); diff --git a/packages/chicken/build.yaml b/packages/chicken/build.yaml new file mode 100644 index 0000000..840029b --- /dev/null +++ b/packages/chicken/build.yaml @@ -0,0 +1,6 @@ +targets: + $default: + builders: + json_serializable: + options: + field_rename: snake \ No newline at end of file diff --git a/packages/chicken/lib/data/common/constant.dart b/packages/chicken/lib/data/common/constant.dart new file mode 100644 index 0000000..c0b0982 --- /dev/null +++ b/packages/chicken/lib/data/common/constant.dart @@ -0,0 +1,14 @@ +enum ApiEnvironment { + dam(url: 'https://api.dam.rasadyar.net/'); + + const ApiEnvironment({required this.url}); + + final String url; + + String get baseUrl { + switch (this) { + case ApiEnvironment.dam: + return url; + } + } +} diff --git a/packages/chicken/lib/data/common/dio_error_handler.dart b/packages/chicken/lib/data/common/dio_error_handler.dart new file mode 100644 index 0000000..57f29bc --- /dev/null +++ b/packages/chicken/lib/data/common/dio_error_handler.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class DioErrorHandler { + void handle(DioException error) { + switch (error.response?.statusCode) { + case 401: + _handleGeneric(error); + break; + case 403: + _handleGeneric(error); + break; + + case 410: + _handle410(); + break; + default: + _handleGeneric(error); + } + } + + //wrong password/user name => "detail": "No active account found with the given credentials" - 401 + void _handle410() { + Get.showSnackbar(_errorSnackBar('نام کاربری یا رمز عبور اشتباه است')); + } + + //wrong captcha => "detail": "Captcha code is incorrect" - 403 + void _handle403() {} + + void _handleGeneric(DioException error) { + Get.showSnackbar( + _errorSnackBar( + error.response?.data.keys.first == 'is_user' + ? 'کاربر با این شماره تلفن وجود ندارد' + : error.response?.data[error.response?.data.keys.first] ?? + 'خطا در برقراری ارتباط با سرور', + ), + ); + } + + GetSnackBar _errorSnackBar(String message) { + return GetSnackBar( + titleText: Text( + 'خطا', + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + messageText: Text( + message, + style: AppFonts.yekan12.copyWith(color: Colors.white), + ), + backgroundColor: AppColor.error, + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: 12, + duration: Duration(milliseconds: 3500), + snackPosition: SnackPosition.TOP, + ); + } +} diff --git a/packages/chicken/lib/data/common/dio_manager.dart b/packages/chicken/lib/data/common/dio_manager.dart new file mode 100644 index 0000000..e6d2946 --- /dev/null +++ b/packages/chicken/lib/data/common/dio_manager.dart @@ -0,0 +1,33 @@ +import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../di/chicken_di.dart'; +import 'constant.dart'; + +class DioRemoteManager { + DioRemote? _currentClient; + ApiEnvironment? _currentEnv; + + Future setEnvironment([ + ApiEnvironment env = ApiEnvironment.dam, + ]) async { + if (_currentEnv != env) { + _currentClient = DioRemote(baseUrl: env.baseUrl); + await _currentClient?.init(); + _currentEnv = env; + } + return _currentClient!; + } + + DioRemote get currentClient { + if (_currentClient == null) { + throw Exception('Call setEnvironment() before accessing DioRemote.'); + } + + return _currentClient!; + } + + ApiEnvironment? get currentEnv => _currentEnv; +} + + diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart new file mode 100644 index 0000000..5746bed --- /dev/null +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -0,0 +1,19 @@ +import 'package:rasadyar_auth/data/di/auth_di.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; +import 'package:rasadyar_core/core.dart'; + +GetIt diChicken = GetIt.instance; + +Future setupChickenDI() async { + var tokenService = Get.find(); + + diAuth.registerLazySingleton( + () => DioRemote(baseUrl: tokenService.baseurl.value), + ); + final dioRemote = diAuth.get(); + await dioRemote.init(); + diAuth.registerLazySingleton( + () => ChickenRepositoryImpl(dioRemote), + ); +} diff --git a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.dart b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.dart new file mode 100644 index 0000000..34cb139 --- /dev/null +++ b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.dart @@ -0,0 +1,18 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'conform_allocation.freezed.dart'; +part 'conform_allocation.g.dart'; + +@freezed +abstract class ConformAllocation with _$ConformAllocation { + factory ConformAllocation({ + String? allocation_key, + int? number_of_carcasses, + int? weight_of_carcasses, + int? amount, + int? total_amount, + }) = _ConformAllocation; + + factory ConformAllocation.fromJson(Map json) => + _$ConformAllocationFromJson(json); +} diff --git a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart new file mode 100644 index 0000000..b08cbcb --- /dev/null +++ b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart @@ -0,0 +1,160 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'conform_allocation.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$ConformAllocation { + + String? get allocation_key; int? get number_of_carcasses; int? get weight_of_carcasses; int? get amount; int? get total_amount; +/// Create a copy of ConformAllocation +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ConformAllocationCopyWith get copyWith => _$ConformAllocationCopyWithImpl(this as ConformAllocation, _$identity); + + /// Serializes this ConformAllocation to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ConformAllocation&&(identical(other.allocation_key, allocation_key) || other.allocation_key == allocation_key)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,allocation_key,number_of_carcasses,weight_of_carcasses,amount,total_amount); + +@override +String toString() { + return 'ConformAllocation(allocation_key: $allocation_key, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, amount: $amount, total_amount: $total_amount)'; +} + + +} + +/// @nodoc +abstract mixin class $ConformAllocationCopyWith<$Res> { + factory $ConformAllocationCopyWith(ConformAllocation value, $Res Function(ConformAllocation) _then) = _$ConformAllocationCopyWithImpl; +@useResult +$Res call({ + String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount +}); + + + + +} +/// @nodoc +class _$ConformAllocationCopyWithImpl<$Res> + implements $ConformAllocationCopyWith<$Res> { + _$ConformAllocationCopyWithImpl(this._self, this._then); + + final ConformAllocation _self; + final $Res Function(ConformAllocation) _then; + +/// Create a copy of ConformAllocation +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? allocation_key = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? amount = freezed,Object? total_amount = freezed,}) { + return _then(_self.copyWith( +allocation_key: freezed == allocation_key ? _self.allocation_key : allocation_key // ignore: cast_nullable_to_non_nullable +as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ConformAllocation implements ConformAllocation { + _ConformAllocation({this.allocation_key, this.number_of_carcasses, this.weight_of_carcasses, this.amount, this.total_amount}); + factory _ConformAllocation.fromJson(Map json) => _$ConformAllocationFromJson(json); + +@override final String? allocation_key; +@override final int? number_of_carcasses; +@override final int? weight_of_carcasses; +@override final int? amount; +@override final int? total_amount; + +/// Create a copy of ConformAllocation +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ConformAllocationCopyWith<_ConformAllocation> get copyWith => __$ConformAllocationCopyWithImpl<_ConformAllocation>(this, _$identity); + +@override +Map toJson() { + return _$ConformAllocationToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ConformAllocation&&(identical(other.allocation_key, allocation_key) || other.allocation_key == allocation_key)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,allocation_key,number_of_carcasses,weight_of_carcasses,amount,total_amount); + +@override +String toString() { + return 'ConformAllocation(allocation_key: $allocation_key, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, amount: $amount, total_amount: $total_amount)'; +} + + +} + +/// @nodoc +abstract mixin class _$ConformAllocationCopyWith<$Res> implements $ConformAllocationCopyWith<$Res> { + factory _$ConformAllocationCopyWith(_ConformAllocation value, $Res Function(_ConformAllocation) _then) = __$ConformAllocationCopyWithImpl; +@override @useResult +$Res call({ + String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount +}); + + + + +} +/// @nodoc +class __$ConformAllocationCopyWithImpl<$Res> + implements _$ConformAllocationCopyWith<$Res> { + __$ConformAllocationCopyWithImpl(this._self, this._then); + + final _ConformAllocation _self; + final $Res Function(_ConformAllocation) _then; + +/// Create a copy of ConformAllocation +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? allocation_key = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? amount = freezed,Object? total_amount = freezed,}) { + return _then(_ConformAllocation( +allocation_key: freezed == allocation_key ? _self.allocation_key : allocation_key // ignore: cast_nullable_to_non_nullable +as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.g.dart b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.g.dart new file mode 100644 index 0000000..a4a1b45 --- /dev/null +++ b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'conform_allocation.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_ConformAllocation _$ConformAllocationFromJson(Map json) => + _ConformAllocation( + allocation_key: json['allocation_key'] as String?, + number_of_carcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weight_of_carcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + amount: (json['amount'] as num?)?.toInt(), + total_amount: (json['total_amount'] as num?)?.toInt(), + ); + +Map _$ConformAllocationToJson(_ConformAllocation instance) => + { + 'allocation_key': instance.allocation_key, + 'number_of_carcasses': instance.number_of_carcasses, + 'weight_of_carcasses': instance.weight_of_carcasses, + 'amount': instance.amount, + 'total_amount': instance.total_amount, + }; diff --git a/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.dart b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.dart new file mode 100644 index 0000000..d041ddf --- /dev/null +++ b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.dart @@ -0,0 +1,20 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'steward_allocation_request.freezed.dart'; +part 'steward_allocation_request.g.dart'; + +@freezed +abstract class StewardAllocationRequest with _$StewardAllocationRequest { + const factory StewardAllocationRequest({ + bool? checkAllocation, + String? allocationKey, + String? state, + int? registrationCode, + int? receiverRealNumberOfCarcasses, + int? receiverRealWeightOfCarcasses, + int? weightLossOfCarcasses, + }) = _StewardAllocationRequest; + + factory StewardAllocationRequest.fromJson(Map json) => + _$StewardAllocationRequestFromJson(json); +} diff --git a/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart new file mode 100644 index 0000000..c19c23e --- /dev/null +++ b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart @@ -0,0 +1,166 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'steward_allocation_request.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$StewardAllocationRequest { + + bool? get checkAllocation; String? get allocationKey; String? get state; int? get registrationCode; int? get receiverRealNumberOfCarcasses; int? get receiverRealWeightOfCarcasses; int? get weightLossOfCarcasses; +/// Create a copy of StewardAllocationRequest +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StewardAllocationRequestCopyWith get copyWith => _$StewardAllocationRequestCopyWithImpl(this as StewardAllocationRequest, _$identity); + + /// Serializes this StewardAllocationRequest to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardAllocationRequest&&(identical(other.checkAllocation, checkAllocation) || other.checkAllocation == checkAllocation)&&(identical(other.allocationKey, allocationKey) || other.allocationKey == allocationKey)&&(identical(other.state, state) || other.state == state)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,checkAllocation,allocationKey,state,registrationCode,receiverRealNumberOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses); + +@override +String toString() { + return 'StewardAllocationRequest(checkAllocation: $checkAllocation, allocationKey: $allocationKey, state: $state, registrationCode: $registrationCode, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses)'; +} + + +} + +/// @nodoc +abstract mixin class $StewardAllocationRequestCopyWith<$Res> { + factory $StewardAllocationRequestCopyWith(StewardAllocationRequest value, $Res Function(StewardAllocationRequest) _then) = _$StewardAllocationRequestCopyWithImpl; +@useResult +$Res call({ + bool? checkAllocation, String? allocationKey, String? state, int? registrationCode, int? receiverRealNumberOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses +}); + + + + +} +/// @nodoc +class _$StewardAllocationRequestCopyWithImpl<$Res> + implements $StewardAllocationRequestCopyWith<$Res> { + _$StewardAllocationRequestCopyWithImpl(this._self, this._then); + + final StewardAllocationRequest _self; + final $Res Function(StewardAllocationRequest) _then; + +/// Create a copy of StewardAllocationRequest +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? checkAllocation = freezed,Object? allocationKey = freezed,Object? state = freezed,Object? registrationCode = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,}) { + return _then(_self.copyWith( +checkAllocation: freezed == checkAllocation ? _self.checkAllocation : checkAllocation // ignore: cast_nullable_to_non_nullable +as bool?,allocationKey: freezed == allocationKey ? _self.allocationKey : allocationKey // ignore: cast_nullable_to_non_nullable +as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _StewardAllocationRequest implements StewardAllocationRequest { + const _StewardAllocationRequest({this.checkAllocation, this.allocationKey, this.state, this.registrationCode, this.receiverRealNumberOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses}); + factory _StewardAllocationRequest.fromJson(Map json) => _$StewardAllocationRequestFromJson(json); + +@override final bool? checkAllocation; +@override final String? allocationKey; +@override final String? state; +@override final int? registrationCode; +@override final int? receiverRealNumberOfCarcasses; +@override final int? receiverRealWeightOfCarcasses; +@override final int? weightLossOfCarcasses; + +/// Create a copy of StewardAllocationRequest +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$StewardAllocationRequestCopyWith<_StewardAllocationRequest> get copyWith => __$StewardAllocationRequestCopyWithImpl<_StewardAllocationRequest>(this, _$identity); + +@override +Map toJson() { + return _$StewardAllocationRequestToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardAllocationRequest&&(identical(other.checkAllocation, checkAllocation) || other.checkAllocation == checkAllocation)&&(identical(other.allocationKey, allocationKey) || other.allocationKey == allocationKey)&&(identical(other.state, state) || other.state == state)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,checkAllocation,allocationKey,state,registrationCode,receiverRealNumberOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses); + +@override +String toString() { + return 'StewardAllocationRequest(checkAllocation: $checkAllocation, allocationKey: $allocationKey, state: $state, registrationCode: $registrationCode, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses)'; +} + + +} + +/// @nodoc +abstract mixin class _$StewardAllocationRequestCopyWith<$Res> implements $StewardAllocationRequestCopyWith<$Res> { + factory _$StewardAllocationRequestCopyWith(_StewardAllocationRequest value, $Res Function(_StewardAllocationRequest) _then) = __$StewardAllocationRequestCopyWithImpl; +@override @useResult +$Res call({ + bool? checkAllocation, String? allocationKey, String? state, int? registrationCode, int? receiverRealNumberOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses +}); + + + + +} +/// @nodoc +class __$StewardAllocationRequestCopyWithImpl<$Res> + implements _$StewardAllocationRequestCopyWith<$Res> { + __$StewardAllocationRequestCopyWithImpl(this._self, this._then); + + final _StewardAllocationRequest _self; + final $Res Function(_StewardAllocationRequest) _then; + +/// Create a copy of StewardAllocationRequest +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? checkAllocation = freezed,Object? allocationKey = freezed,Object? state = freezed,Object? registrationCode = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,}) { + return _then(_StewardAllocationRequest( +checkAllocation: freezed == checkAllocation ? _self.checkAllocation : checkAllocation // ignore: cast_nullable_to_non_nullable +as bool?,allocationKey: freezed == allocationKey ? _self.allocationKey : allocationKey // ignore: cast_nullable_to_non_nullable +as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.g.dart b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.g.dart new file mode 100644 index 0000000..d463989 --- /dev/null +++ b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'steward_allocation_request.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_StewardAllocationRequest _$StewardAllocationRequestFromJson( + Map json, +) => _StewardAllocationRequest( + checkAllocation: json['check_allocation'] as bool?, + allocationKey: json['allocation_key'] as String?, + state: json['state'] as String?, + registrationCode: (json['registration_code'] as num?)?.toInt(), + receiverRealNumberOfCarcasses: + (json['receiver_real_number_of_carcasses'] as num?)?.toInt(), + receiverRealWeightOfCarcasses: + (json['receiver_real_weight_of_carcasses'] as num?)?.toInt(), + weightLossOfCarcasses: (json['weight_loss_of_carcasses'] as num?)?.toInt(), +); + +Map _$StewardAllocationRequestToJson( + _StewardAllocationRequest instance, +) => { + 'check_allocation': instance.checkAllocation, + 'allocation_key': instance.allocationKey, + 'state': instance.state, + 'registration_code': instance.registrationCode, + 'receiver_real_number_of_carcasses': instance.receiverRealNumberOfCarcasses, + 'receiver_real_weight_of_carcasses': instance.receiverRealWeightOfCarcasses, + 'weight_loss_of_carcasses': instance.weightLossOfCarcasses, +}; diff --git a/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.dart b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.dart new file mode 100644 index 0000000..8833933 --- /dev/null +++ b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.dart @@ -0,0 +1,26 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'submit_steward_allocation.freezed.dart'; +part 'submit_steward_allocation.g.dart'; + +@freezed +abstract class SubmitStewardAllocation with _$SubmitStewardAllocation { + const factory SubmitStewardAllocation({ + String? sellerType, + String? buyerType, + String? guildKey, + String? productKey, + String? type, + String? allocationType, + int? numberOfCarcasses, + int? weightOfCarcasses, + String? sellType, + int? amount, + int? totalAmount, + bool? approvedPriceStatus, + String? date, + }) = _SubmitStewardAllocation; + + factory SubmitStewardAllocation.fromJson(Map json) => + _$SubmitStewardAllocationFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart new file mode 100644 index 0000000..257af6e --- /dev/null +++ b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart @@ -0,0 +1,184 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'submit_steward_allocation.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$SubmitStewardAllocation { + + String? get sellerType; String? get buyerType; String? get guildKey; String? get productKey; String? get type; String? get allocationType; int? get numberOfCarcasses; int? get weightOfCarcasses; String? get sellType; int? get amount; int? get totalAmount; bool? get approvedPriceStatus; String? get date; +/// Create a copy of SubmitStewardAllocation +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SubmitStewardAllocationCopyWith get copyWith => _$SubmitStewardAllocationCopyWithImpl(this as SubmitStewardAllocation, _$identity); + + /// Serializes this SubmitStewardAllocation to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SubmitStewardAllocation&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.buyerType, buyerType) || other.buyerType == buyerType)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.type, type) || other.type == type)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.date, date) || other.date == date)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,sellerType,buyerType,guildKey,productKey,type,allocationType,numberOfCarcasses,weightOfCarcasses,sellType,amount,totalAmount,approvedPriceStatus,date); + +@override +String toString() { + return 'SubmitStewardAllocation(sellerType: $sellerType, buyerType: $buyerType, guildKey: $guildKey, productKey: $productKey, type: $type, allocationType: $allocationType, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, sellType: $sellType, amount: $amount, totalAmount: $totalAmount, approvedPriceStatus: $approvedPriceStatus, date: $date)'; +} + + +} + +/// @nodoc +abstract mixin class $SubmitStewardAllocationCopyWith<$Res> { + factory $SubmitStewardAllocationCopyWith(SubmitStewardAllocation value, $Res Function(SubmitStewardAllocation) _then) = _$SubmitStewardAllocationCopyWithImpl; +@useResult +$Res call({ + String? sellerType, String? buyerType, String? guildKey, String? productKey, String? type, String? allocationType, int? numberOfCarcasses, int? weightOfCarcasses, String? sellType, int? amount, int? totalAmount, bool? approvedPriceStatus, String? date +}); + + + + +} +/// @nodoc +class _$SubmitStewardAllocationCopyWithImpl<$Res> + implements $SubmitStewardAllocationCopyWith<$Res> { + _$SubmitStewardAllocationCopyWithImpl(this._self, this._then); + + final SubmitStewardAllocation _self; + final $Res Function(SubmitStewardAllocation) _then; + +/// Create a copy of SubmitStewardAllocation +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? sellerType = freezed,Object? buyerType = freezed,Object? guildKey = freezed,Object? productKey = freezed,Object? type = freezed,Object? allocationType = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? sellType = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? approvedPriceStatus = freezed,Object? date = freezed,}) { + return _then(_self.copyWith( +sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable +as String?,buyerType: freezed == buyerType ? _self.buyerType : buyerType // ignore: cast_nullable_to_non_nullable +as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _SubmitStewardAllocation implements SubmitStewardAllocation { + const _SubmitStewardAllocation({this.sellerType, this.buyerType, this.guildKey, this.productKey, this.type, this.allocationType, this.numberOfCarcasses, this.weightOfCarcasses, this.sellType, this.amount, this.totalAmount, this.approvedPriceStatus, this.date}); + factory _SubmitStewardAllocation.fromJson(Map json) => _$SubmitStewardAllocationFromJson(json); + +@override final String? sellerType; +@override final String? buyerType; +@override final String? guildKey; +@override final String? productKey; +@override final String? type; +@override final String? allocationType; +@override final int? numberOfCarcasses; +@override final int? weightOfCarcasses; +@override final String? sellType; +@override final int? amount; +@override final int? totalAmount; +@override final bool? approvedPriceStatus; +@override final String? date; + +/// Create a copy of SubmitStewardAllocation +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SubmitStewardAllocationCopyWith<_SubmitStewardAllocation> get copyWith => __$SubmitStewardAllocationCopyWithImpl<_SubmitStewardAllocation>(this, _$identity); + +@override +Map toJson() { + return _$SubmitStewardAllocationToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SubmitStewardAllocation&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.buyerType, buyerType) || other.buyerType == buyerType)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.type, type) || other.type == type)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.date, date) || other.date == date)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,sellerType,buyerType,guildKey,productKey,type,allocationType,numberOfCarcasses,weightOfCarcasses,sellType,amount,totalAmount,approvedPriceStatus,date); + +@override +String toString() { + return 'SubmitStewardAllocation(sellerType: $sellerType, buyerType: $buyerType, guildKey: $guildKey, productKey: $productKey, type: $type, allocationType: $allocationType, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, sellType: $sellType, amount: $amount, totalAmount: $totalAmount, approvedPriceStatus: $approvedPriceStatus, date: $date)'; +} + + +} + +/// @nodoc +abstract mixin class _$SubmitStewardAllocationCopyWith<$Res> implements $SubmitStewardAllocationCopyWith<$Res> { + factory _$SubmitStewardAllocationCopyWith(_SubmitStewardAllocation value, $Res Function(_SubmitStewardAllocation) _then) = __$SubmitStewardAllocationCopyWithImpl; +@override @useResult +$Res call({ + String? sellerType, String? buyerType, String? guildKey, String? productKey, String? type, String? allocationType, int? numberOfCarcasses, int? weightOfCarcasses, String? sellType, int? amount, int? totalAmount, bool? approvedPriceStatus, String? date +}); + + + + +} +/// @nodoc +class __$SubmitStewardAllocationCopyWithImpl<$Res> + implements _$SubmitStewardAllocationCopyWith<$Res> { + __$SubmitStewardAllocationCopyWithImpl(this._self, this._then); + + final _SubmitStewardAllocation _self; + final $Res Function(_SubmitStewardAllocation) _then; + +/// Create a copy of SubmitStewardAllocation +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? sellerType = freezed,Object? buyerType = freezed,Object? guildKey = freezed,Object? productKey = freezed,Object? type = freezed,Object? allocationType = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? sellType = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? approvedPriceStatus = freezed,Object? date = freezed,}) { + return _then(_SubmitStewardAllocation( +sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable +as String?,buyerType: freezed == buyerType ? _self.buyerType : buyerType // ignore: cast_nullable_to_non_nullable +as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.g.dart b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.g.dart new file mode 100644 index 0000000..8b4b2e4 --- /dev/null +++ b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.g.dart @@ -0,0 +1,43 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'submit_steward_allocation.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_SubmitStewardAllocation _$SubmitStewardAllocationFromJson( + Map json, +) => _SubmitStewardAllocation( + sellerType: json['seller_type'] as String?, + buyerType: json['buyer_type'] as String?, + guildKey: json['guild_key'] as String?, + productKey: json['product_key'] as String?, + type: json['type'] as String?, + allocationType: json['allocation_type'] as String?, + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + sellType: json['sell_type'] as String?, + amount: (json['amount'] as num?)?.toInt(), + totalAmount: (json['total_amount'] as num?)?.toInt(), + approvedPriceStatus: json['approved_price_status'] as bool?, + date: json['date'] as String?, +); + +Map _$SubmitStewardAllocationToJson( + _SubmitStewardAllocation instance, +) => { + 'seller_type': instance.sellerType, + 'buyer_type': instance.buyerType, + 'guild_key': instance.guildKey, + 'product_key': instance.productKey, + 'type': instance.type, + 'allocation_type': instance.allocationType, + 'number_of_carcasses': instance.numberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'sell_type': instance.sellType, + 'amount': instance.amount, + 'total_amount': instance.totalAmount, + 'approved_price_status': instance.approvedPriceStatus, + 'date': instance.date, +}; diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart new file mode 100644 index 0000000..78f4f6c --- /dev/null +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart @@ -0,0 +1,227 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'allocated_made.freezed.dart'; +part 'allocated_made.g.dart'; + +@freezed +abstract class AllocatedMadeModel with _$AllocatedMadeModel { + factory AllocatedMadeModel({ + int? count, + String? next, + String? previous, + List? results, + }) = _AllocatedMadeModel; + + factory AllocatedMadeModel.fromJson(Map json) => + _$AllocatedMadeModelFromJson(json); +} + +@freezed +abstract class AllocatedMadeResult with _$AllocatedMadeResult { + factory AllocatedMadeResult({ + int? id, + Product? product, + dynamic kill_house, + dynamic to_kill_house, + Steward? steward, + dynamic to_steward, + dynamic guilds, + Steward? to_guilds, + dynamic to_cold_house, + int? index_weight, + int? date_timestamp, + int? new_state, + int? new_receiver_state, + int? new_allocation_state, + String? key, + String? create_date, + String? modify_date, + bool? trash, + int? number_of_carcasses, + int? real_number_of_carcasses, + int? receiver_real_number_of_carcasses, + int? weight_of_carcasses, + int? real_weight_of_carcasses, + int? receiver_real_weight_of_carcasses, + int? weight_loss_of_carcasses, + bool? final_registration, + String? sell_type, + String? product_name, + String? seller_type, + String? type, + String? sale_type, + String? allocation_type, + bool? system_registration_code, + int? registration_code, + int? amount, + int? total_amount, + int? total_amount_paid, + int? total_amount_remain, + String? logged_registration_code, + String? state, + String? receiver_state, + String? allocation_state, + String? date, + String? role, + String? steward_temp_key, + bool? approved_price_status, + bool? calculate_status, + bool? temporary_trash, + bool? temporary_deleted, + String? created_by, + String? modified_by, + dynamic ware_house, + dynamic steward_ware_house, + dynamic car, + dynamic dispenser, + }) = _AllocatedMadeResult; + + factory AllocatedMadeResult.fromJson(Map json) => + _$AllocatedMadeResultFromJson(json); +} + +@freezed +abstract class Product with _$Product { + factory Product({ + int? weight_average, + }) = _Product; + + factory Product.fromJson(Map json) => + _$ProductFromJson(json); +} + +@freezed +abstract class Steward with _$Steward { + factory Steward({ + int? id, + User? user, + Address? address, + Activity? guild_area_activity, + Activity? guild_type_activity, + List? kill_house, + List? steward_kill_house, + List? stewards, + PosStatus? get_pos_status, + String? key, + String? create_date, + String? modify_date, + bool? trash, + dynamic user_id_foreign_key, + dynamic address_id_foreign_key, + dynamic user_bank_id_foreign_key, + dynamic wallet_id_foreign_key, + dynamic provincial_government_id_key, + dynamic identity_documents, + bool? active, + int? city_number, + String? city_name, + String? guilds_id, + String? license_number, + String? guilds_name, + String? phone, + String? type_activity, + String? area_activity, + int? province_number, + String? province_name, + bool? steward, + bool? has_pos, + dynamic centers_allocation, + dynamic kill_house_centers_allocation, + dynamic allocation_limit, + bool? limitation_allocation, + String? registerar_role, + String? registerar_fullname, + String? registerar_mobile, + bool? kill_house_register, + bool? steward_register, + bool? guilds_room_register, + bool? pos_company_register, + String? province_accept_state, + String? province_message, + String? condition, + String? description_condition, + bool? steward_active, + dynamic steward_allocation_limit, + bool? steward_limitation_allocation, + bool? license, + dynamic license_form, + dynamic license_file, + String? reviewer_role, + String? reviewer_fullname, + String? reviewer_mobile, + String? checker_message, + bool? final_accept, + bool? temporary_registration, + String? created_by, + String? modified_by, + dynamic user_bank_info, + int? wallet, + List? cars, + List? user_level, + }) = _Steward; + + factory Steward.fromJson(Map json) => + _$StewardFromJson(json); +} + +@freezed +abstract class User with _$User { + factory User({ + String? fullname, + String? first_name, + String? last_name, + String? mobile, + String? national_id, + String? city, + }) = _User; + + factory User.fromJson(Map json) => + _$UserFromJson(json); +} + +@freezed +abstract class Address with _$Address { + factory Address({ + Province? province, + Province? city, + String? address, + String? postal_code, + }) = _Address; + + factory Address.fromJson(Map json) => + _$AddressFromJson(json); +} + +@freezed +abstract class Province with _$Province { + factory Province({ + String? key, + String? name, + }) = _Province; + + factory Province.fromJson(Map json) => + _$ProvinceFromJson(json); +} + +@freezed +abstract class Activity with _$Activity { + factory Activity({ + String? key, + String? title, + }) = _Activity; + + factory Activity.fromJson(Map json) => + _$ActivityFromJson(json); +} + +@freezed +abstract class PosStatus with _$PosStatus { + factory PosStatus({ + int? len_active_sessions, + bool? has_pons, + bool? has_active_pons, + }) = _PosStatus; + + factory PosStatus.fromJson(Map json) => + _$PosStatusFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart new file mode 100644 index 0000000..72b6981 --- /dev/null +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart @@ -0,0 +1,1899 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'allocated_made.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$AllocatedMadeModel { + + int? get count; String? get next; String? get previous; List? get results; +/// Create a copy of AllocatedMadeModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AllocatedMadeModelCopyWith get copyWith => _$AllocatedMadeModelCopyWithImpl(this as AllocatedMadeModel, _$identity); + + /// Serializes this AllocatedMadeModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AllocatedMadeModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); + +@override +String toString() { + return 'AllocatedMadeModel(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class $AllocatedMadeModelCopyWith<$Res> { + factory $AllocatedMadeModelCopyWith(AllocatedMadeModel value, $Res Function(AllocatedMadeModel) _then) = _$AllocatedMadeModelCopyWithImpl; +@useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class _$AllocatedMadeModelCopyWithImpl<$Res> + implements $AllocatedMadeModelCopyWith<$Res> { + _$AllocatedMadeModelCopyWithImpl(this._self, this._then); + + final AllocatedMadeModel _self; + final $Res Function(AllocatedMadeModel) _then; + +/// Create a copy of AllocatedMadeModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_self.copyWith( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self.results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _AllocatedMadeModel implements AllocatedMadeModel { + _AllocatedMadeModel({this.count, this.next, this.previous, final List? results}): _results = results; + factory _AllocatedMadeModel.fromJson(Map json) => _$AllocatedMadeModelFromJson(json); + +@override final int? count; +@override final String? next; +@override final String? previous; + final List? _results; +@override List? get results { + final value = _results; + if (value == null) return null; + if (_results is EqualUnmodifiableListView) return _results; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of AllocatedMadeModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AllocatedMadeModelCopyWith<_AllocatedMadeModel> get copyWith => __$AllocatedMadeModelCopyWithImpl<_AllocatedMadeModel>(this, _$identity); + +@override +Map toJson() { + return _$AllocatedMadeModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AllocatedMadeModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); + +@override +String toString() { + return 'AllocatedMadeModel(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class _$AllocatedMadeModelCopyWith<$Res> implements $AllocatedMadeModelCopyWith<$Res> { + factory _$AllocatedMadeModelCopyWith(_AllocatedMadeModel value, $Res Function(_AllocatedMadeModel) _then) = __$AllocatedMadeModelCopyWithImpl; +@override @useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class __$AllocatedMadeModelCopyWithImpl<$Res> + implements _$AllocatedMadeModelCopyWith<$Res> { + __$AllocatedMadeModelCopyWithImpl(this._self, this._then); + + final _AllocatedMadeModel _self; + final $Res Function(_AllocatedMadeModel) _then; + +/// Create a copy of AllocatedMadeModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_AllocatedMadeModel( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self._results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + + +} + + +/// @nodoc +mixin _$AllocatedMadeResult { + + int? get id; Product? get product; dynamic get kill_house; dynamic get to_kill_house; Steward? get steward; dynamic get to_steward; dynamic get guilds; Steward? get to_guilds; dynamic get to_cold_house; int? get index_weight; int? get date_timestamp; int? get new_state; int? get new_receiver_state; int? get new_allocation_state; String? get key; String? get create_date; String? get modify_date; bool? get trash; int? get number_of_carcasses; int? get real_number_of_carcasses; int? get receiver_real_number_of_carcasses; int? get weight_of_carcasses; int? get real_weight_of_carcasses; int? get receiver_real_weight_of_carcasses; int? get weight_loss_of_carcasses; bool? get final_registration; String? get sell_type; String? get product_name; String? get seller_type; String? get type; String? get sale_type; String? get allocation_type; bool? get system_registration_code; int? get registration_code; int? get amount; int? get total_amount; int? get total_amount_paid; int? get total_amount_remain; String? get logged_registration_code; String? get state; String? get receiver_state; String? get allocation_state; String? get date; String? get role; String? get steward_temp_key; bool? get approved_price_status; bool? get calculate_status; bool? get temporary_trash; bool? get temporary_deleted; String? get created_by; String? get modified_by; dynamic get ware_house; dynamic get steward_ware_house; dynamic get car; dynamic get dispenser; +/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AllocatedMadeResultCopyWith get copyWith => _$AllocatedMadeResultCopyWithImpl(this as AllocatedMadeResult, _$identity); + + /// Serializes this AllocatedMadeResult to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AllocatedMadeResult&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.kill_house, kill_house)&&const DeepCollectionEquality().equals(other.to_kill_house, to_kill_house)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.to_steward, to_steward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&(identical(other.to_guilds, to_guilds) || other.to_guilds == to_guilds)&&const DeepCollectionEquality().equals(other.to_cold_house, to_cold_house)&&(identical(other.index_weight, index_weight) || other.index_weight == index_weight)&&(identical(other.date_timestamp, date_timestamp) || other.date_timestamp == date_timestamp)&&(identical(other.new_state, new_state) || other.new_state == new_state)&&(identical(other.new_receiver_state, new_receiver_state) || other.new_receiver_state == new_receiver_state)&&(identical(other.new_allocation_state, new_allocation_state) || other.new_allocation_state == new_allocation_state)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.real_number_of_carcasses, real_number_of_carcasses) || other.real_number_of_carcasses == real_number_of_carcasses)&&(identical(other.receiver_real_number_of_carcasses, receiver_real_number_of_carcasses) || other.receiver_real_number_of_carcasses == receiver_real_number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.real_weight_of_carcasses, real_weight_of_carcasses) || other.real_weight_of_carcasses == real_weight_of_carcasses)&&(identical(other.receiver_real_weight_of_carcasses, receiver_real_weight_of_carcasses) || other.receiver_real_weight_of_carcasses == receiver_real_weight_of_carcasses)&&(identical(other.weight_loss_of_carcasses, weight_loss_of_carcasses) || other.weight_loss_of_carcasses == weight_loss_of_carcasses)&&(identical(other.final_registration, final_registration) || other.final_registration == final_registration)&&(identical(other.sell_type, sell_type) || other.sell_type == sell_type)&&(identical(other.product_name, product_name) || other.product_name == product_name)&&(identical(other.seller_type, seller_type) || other.seller_type == seller_type)&&(identical(other.type, type) || other.type == type)&&(identical(other.sale_type, sale_type) || other.sale_type == sale_type)&&(identical(other.allocation_type, allocation_type) || other.allocation_type == allocation_type)&&(identical(other.system_registration_code, system_registration_code) || other.system_registration_code == system_registration_code)&&(identical(other.registration_code, registration_code) || other.registration_code == registration_code)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount)&&(identical(other.total_amount_paid, total_amount_paid) || other.total_amount_paid == total_amount_paid)&&(identical(other.total_amount_remain, total_amount_remain) || other.total_amount_remain == total_amount_remain)&&(identical(other.logged_registration_code, logged_registration_code) || other.logged_registration_code == logged_registration_code)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiver_state, receiver_state) || other.receiver_state == receiver_state)&&(identical(other.allocation_state, allocation_state) || other.allocation_state == allocation_state)&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.steward_temp_key, steward_temp_key) || other.steward_temp_key == steward_temp_key)&&(identical(other.approved_price_status, approved_price_status) || other.approved_price_status == approved_price_status)&&(identical(other.calculate_status, calculate_status) || other.calculate_status == calculate_status)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.ware_house, ware_house)&&const DeepCollectionEquality().equals(other.steward_ware_house, steward_ware_house)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(kill_house),const DeepCollectionEquality().hash(to_kill_house),steward,const DeepCollectionEquality().hash(to_steward),const DeepCollectionEquality().hash(guilds),to_guilds,const DeepCollectionEquality().hash(to_cold_house),index_weight,date_timestamp,new_state,new_receiver_state,new_allocation_state,key,create_date,modify_date,trash,number_of_carcasses,real_number_of_carcasses,receiver_real_number_of_carcasses,weight_of_carcasses,real_weight_of_carcasses,receiver_real_weight_of_carcasses,weight_loss_of_carcasses,final_registration,sell_type,product_name,seller_type,type,sale_type,allocation_type,system_registration_code,registration_code,amount,total_amount,total_amount_paid,total_amount_remain,logged_registration_code,state,receiver_state,allocation_state,date,role,steward_temp_key,approved_price_status,calculate_status,temporary_trash,temporary_deleted,created_by,modified_by,const DeepCollectionEquality().hash(ware_house),const DeepCollectionEquality().hash(steward_ware_house),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); + +@override +String toString() { + return 'AllocatedMadeResult(id: $id, product: $product, kill_house: $kill_house, to_kill_house: $to_kill_house, steward: $steward, to_steward: $to_steward, guilds: $guilds, to_guilds: $to_guilds, to_cold_house: $to_cold_house, index_weight: $index_weight, date_timestamp: $date_timestamp, new_state: $new_state, new_receiver_state: $new_receiver_state, new_allocation_state: $new_allocation_state, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, number_of_carcasses: $number_of_carcasses, real_number_of_carcasses: $real_number_of_carcasses, receiver_real_number_of_carcasses: $receiver_real_number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, real_weight_of_carcasses: $real_weight_of_carcasses, receiver_real_weight_of_carcasses: $receiver_real_weight_of_carcasses, weight_loss_of_carcasses: $weight_loss_of_carcasses, final_registration: $final_registration, sell_type: $sell_type, product_name: $product_name, seller_type: $seller_type, type: $type, sale_type: $sale_type, allocation_type: $allocation_type, system_registration_code: $system_registration_code, registration_code: $registration_code, amount: $amount, total_amount: $total_amount, total_amount_paid: $total_amount_paid, total_amount_remain: $total_amount_remain, logged_registration_code: $logged_registration_code, state: $state, receiver_state: $receiver_state, allocation_state: $allocation_state, date: $date, role: $role, steward_temp_key: $steward_temp_key, approved_price_status: $approved_price_status, calculate_status: $calculate_status, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by, ware_house: $ware_house, steward_ware_house: $steward_ware_house, car: $car, dispenser: $dispenser)'; +} + + +} + +/// @nodoc +abstract mixin class $AllocatedMadeResultCopyWith<$Res> { + factory $AllocatedMadeResultCopyWith(AllocatedMadeResult value, $Res Function(AllocatedMadeResult) _then) = _$AllocatedMadeResultCopyWithImpl; +@useResult +$Res call({ + int? id, Product? product, dynamic kill_house, dynamic to_kill_house, Steward? steward, dynamic to_steward, dynamic guilds, Steward? to_guilds, dynamic to_cold_house, int? index_weight, int? date_timestamp, int? new_state, int? new_receiver_state, int? new_allocation_state, String? key, String? create_date, String? modify_date, bool? trash, int? number_of_carcasses, int? real_number_of_carcasses, int? receiver_real_number_of_carcasses, int? weight_of_carcasses, int? real_weight_of_carcasses, int? receiver_real_weight_of_carcasses, int? weight_loss_of_carcasses, bool? final_registration, String? sell_type, String? product_name, String? seller_type, String? type, String? sale_type, String? allocation_type, bool? system_registration_code, int? registration_code, int? amount, int? total_amount, int? total_amount_paid, int? total_amount_remain, String? logged_registration_code, String? state, String? receiver_state, String? allocation_state, String? date, String? role, String? steward_temp_key, bool? approved_price_status, bool? calculate_status, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by, dynamic ware_house, dynamic steward_ware_house, dynamic car, dynamic dispenser +}); + + +$ProductCopyWith<$Res>? get product;$StewardCopyWith<$Res>? get steward;$StewardCopyWith<$Res>? get to_guilds; + +} +/// @nodoc +class _$AllocatedMadeResultCopyWithImpl<$Res> + implements $AllocatedMadeResultCopyWith<$Res> { + _$AllocatedMadeResultCopyWithImpl(this._self, this._then); + + final AllocatedMadeResult _self; + final $Res Function(AllocatedMadeResult) _then; + +/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? kill_house = freezed,Object? to_kill_house = freezed,Object? steward = freezed,Object? to_steward = freezed,Object? guilds = freezed,Object? to_guilds = freezed,Object? to_cold_house = freezed,Object? index_weight = freezed,Object? date_timestamp = freezed,Object? new_state = freezed,Object? new_receiver_state = freezed,Object? new_allocation_state = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? number_of_carcasses = freezed,Object? real_number_of_carcasses = freezed,Object? receiver_real_number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? real_weight_of_carcasses = freezed,Object? receiver_real_weight_of_carcasses = freezed,Object? weight_loss_of_carcasses = freezed,Object? final_registration = freezed,Object? sell_type = freezed,Object? product_name = freezed,Object? seller_type = freezed,Object? type = freezed,Object? sale_type = freezed,Object? allocation_type = freezed,Object? system_registration_code = freezed,Object? registration_code = freezed,Object? amount = freezed,Object? total_amount = freezed,Object? total_amount_paid = freezed,Object? total_amount_remain = freezed,Object? logged_registration_code = freezed,Object? state = freezed,Object? receiver_state = freezed,Object? allocation_state = freezed,Object? date = freezed,Object? role = freezed,Object? steward_temp_key = freezed,Object? approved_price_status = freezed,Object? calculate_status = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? ware_house = freezed,Object? steward_ware_house = freezed,Object? car = freezed,Object? dispenser = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as Product?,kill_house: freezed == kill_house ? _self.kill_house : kill_house // ignore: cast_nullable_to_non_nullable +as dynamic,to_kill_house: freezed == to_kill_house ? _self.to_kill_house : to_kill_house // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as Steward?,to_steward: freezed == to_steward ? _self.to_steward : to_steward // ignore: cast_nullable_to_non_nullable +as dynamic,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as dynamic,to_guilds: freezed == to_guilds ? _self.to_guilds : to_guilds // ignore: cast_nullable_to_non_nullable +as Steward?,to_cold_house: freezed == to_cold_house ? _self.to_cold_house : to_cold_house // ignore: cast_nullable_to_non_nullable +as dynamic,index_weight: freezed == index_weight ? _self.index_weight : index_weight // ignore: cast_nullable_to_non_nullable +as int?,date_timestamp: freezed == date_timestamp ? _self.date_timestamp : date_timestamp // ignore: cast_nullable_to_non_nullable +as int?,new_state: freezed == new_state ? _self.new_state : new_state // ignore: cast_nullable_to_non_nullable +as int?,new_receiver_state: freezed == new_receiver_state ? _self.new_receiver_state : new_receiver_state // ignore: cast_nullable_to_non_nullable +as int?,new_allocation_state: freezed == new_allocation_state ? _self.new_allocation_state : new_allocation_state // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,real_number_of_carcasses: freezed == real_number_of_carcasses ? _self.real_number_of_carcasses : real_number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,receiver_real_number_of_carcasses: freezed == receiver_real_number_of_carcasses ? _self.receiver_real_number_of_carcasses : receiver_real_number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,real_weight_of_carcasses: freezed == real_weight_of_carcasses ? _self.real_weight_of_carcasses : real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,receiver_real_weight_of_carcasses: freezed == receiver_real_weight_of_carcasses ? _self.receiver_real_weight_of_carcasses : receiver_real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_loss_of_carcasses: freezed == weight_loss_of_carcasses ? _self.weight_loss_of_carcasses : weight_loss_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,final_registration: freezed == final_registration ? _self.final_registration : final_registration // ignore: cast_nullable_to_non_nullable +as bool?,sell_type: freezed == sell_type ? _self.sell_type : sell_type // ignore: cast_nullable_to_non_nullable +as String?,product_name: freezed == product_name ? _self.product_name : product_name // ignore: cast_nullable_to_non_nullable +as String?,seller_type: freezed == seller_type ? _self.seller_type : seller_type // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,sale_type: freezed == sale_type ? _self.sale_type : sale_type // ignore: cast_nullable_to_non_nullable +as String?,allocation_type: freezed == allocation_type ? _self.allocation_type : allocation_type // ignore: cast_nullable_to_non_nullable +as String?,system_registration_code: freezed == system_registration_code ? _self.system_registration_code : system_registration_code // ignore: cast_nullable_to_non_nullable +as bool?,registration_code: freezed == registration_code ? _self.registration_code : registration_code // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable +as int?,total_amount_paid: freezed == total_amount_paid ? _self.total_amount_paid : total_amount_paid // ignore: cast_nullable_to_non_nullable +as int?,total_amount_remain: freezed == total_amount_remain ? _self.total_amount_remain : total_amount_remain // ignore: cast_nullable_to_non_nullable +as int?,logged_registration_code: freezed == logged_registration_code ? _self.logged_registration_code : logged_registration_code // ignore: cast_nullable_to_non_nullable +as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,receiver_state: freezed == receiver_state ? _self.receiver_state : receiver_state // ignore: cast_nullable_to_non_nullable +as String?,allocation_state: freezed == allocation_state ? _self.allocation_state : allocation_state // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,steward_temp_key: freezed == steward_temp_key ? _self.steward_temp_key : steward_temp_key // ignore: cast_nullable_to_non_nullable +as String?,approved_price_status: freezed == approved_price_status ? _self.approved_price_status : approved_price_status // ignore: cast_nullable_to_non_nullable +as bool?,calculate_status: freezed == calculate_status ? _self.calculate_status : calculate_status // ignore: cast_nullable_to_non_nullable +as bool?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable +as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,ware_house: freezed == ware_house ? _self.ware_house : ware_house // ignore: cast_nullable_to_non_nullable +as dynamic,steward_ware_house: freezed == steward_ware_house ? _self.steward_ware_house : steward_ware_house // ignore: cast_nullable_to_non_nullable +as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} +/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +}/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get steward { + if (_self.steward == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); + }); +}/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get to_guilds { + if (_self.to_guilds == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.to_guilds!, (value) { + return _then(_self.copyWith(to_guilds: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _AllocatedMadeResult implements AllocatedMadeResult { + _AllocatedMadeResult({this.id, this.product, this.kill_house, this.to_kill_house, this.steward, this.to_steward, this.guilds, this.to_guilds, this.to_cold_house, this.index_weight, this.date_timestamp, this.new_state, this.new_receiver_state, this.new_allocation_state, this.key, this.create_date, this.modify_date, this.trash, this.number_of_carcasses, this.real_number_of_carcasses, this.receiver_real_number_of_carcasses, this.weight_of_carcasses, this.real_weight_of_carcasses, this.receiver_real_weight_of_carcasses, this.weight_loss_of_carcasses, this.final_registration, this.sell_type, this.product_name, this.seller_type, this.type, this.sale_type, this.allocation_type, this.system_registration_code, this.registration_code, this.amount, this.total_amount, this.total_amount_paid, this.total_amount_remain, this.logged_registration_code, this.state, this.receiver_state, this.allocation_state, this.date, this.role, this.steward_temp_key, this.approved_price_status, this.calculate_status, this.temporary_trash, this.temporary_deleted, this.created_by, this.modified_by, this.ware_house, this.steward_ware_house, this.car, this.dispenser}); + factory _AllocatedMadeResult.fromJson(Map json) => _$AllocatedMadeResultFromJson(json); + +@override final int? id; +@override final Product? product; +@override final dynamic kill_house; +@override final dynamic to_kill_house; +@override final Steward? steward; +@override final dynamic to_steward; +@override final dynamic guilds; +@override final Steward? to_guilds; +@override final dynamic to_cold_house; +@override final int? index_weight; +@override final int? date_timestamp; +@override final int? new_state; +@override final int? new_receiver_state; +@override final int? new_allocation_state; +@override final String? key; +@override final String? create_date; +@override final String? modify_date; +@override final bool? trash; +@override final int? number_of_carcasses; +@override final int? real_number_of_carcasses; +@override final int? receiver_real_number_of_carcasses; +@override final int? weight_of_carcasses; +@override final int? real_weight_of_carcasses; +@override final int? receiver_real_weight_of_carcasses; +@override final int? weight_loss_of_carcasses; +@override final bool? final_registration; +@override final String? sell_type; +@override final String? product_name; +@override final String? seller_type; +@override final String? type; +@override final String? sale_type; +@override final String? allocation_type; +@override final bool? system_registration_code; +@override final int? registration_code; +@override final int? amount; +@override final int? total_amount; +@override final int? total_amount_paid; +@override final int? total_amount_remain; +@override final String? logged_registration_code; +@override final String? state; +@override final String? receiver_state; +@override final String? allocation_state; +@override final String? date; +@override final String? role; +@override final String? steward_temp_key; +@override final bool? approved_price_status; +@override final bool? calculate_status; +@override final bool? temporary_trash; +@override final bool? temporary_deleted; +@override final String? created_by; +@override final String? modified_by; +@override final dynamic ware_house; +@override final dynamic steward_ware_house; +@override final dynamic car; +@override final dynamic dispenser; + +/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AllocatedMadeResultCopyWith<_AllocatedMadeResult> get copyWith => __$AllocatedMadeResultCopyWithImpl<_AllocatedMadeResult>(this, _$identity); + +@override +Map toJson() { + return _$AllocatedMadeResultToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AllocatedMadeResult&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.kill_house, kill_house)&&const DeepCollectionEquality().equals(other.to_kill_house, to_kill_house)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.to_steward, to_steward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&(identical(other.to_guilds, to_guilds) || other.to_guilds == to_guilds)&&const DeepCollectionEquality().equals(other.to_cold_house, to_cold_house)&&(identical(other.index_weight, index_weight) || other.index_weight == index_weight)&&(identical(other.date_timestamp, date_timestamp) || other.date_timestamp == date_timestamp)&&(identical(other.new_state, new_state) || other.new_state == new_state)&&(identical(other.new_receiver_state, new_receiver_state) || other.new_receiver_state == new_receiver_state)&&(identical(other.new_allocation_state, new_allocation_state) || other.new_allocation_state == new_allocation_state)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.real_number_of_carcasses, real_number_of_carcasses) || other.real_number_of_carcasses == real_number_of_carcasses)&&(identical(other.receiver_real_number_of_carcasses, receiver_real_number_of_carcasses) || other.receiver_real_number_of_carcasses == receiver_real_number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.real_weight_of_carcasses, real_weight_of_carcasses) || other.real_weight_of_carcasses == real_weight_of_carcasses)&&(identical(other.receiver_real_weight_of_carcasses, receiver_real_weight_of_carcasses) || other.receiver_real_weight_of_carcasses == receiver_real_weight_of_carcasses)&&(identical(other.weight_loss_of_carcasses, weight_loss_of_carcasses) || other.weight_loss_of_carcasses == weight_loss_of_carcasses)&&(identical(other.final_registration, final_registration) || other.final_registration == final_registration)&&(identical(other.sell_type, sell_type) || other.sell_type == sell_type)&&(identical(other.product_name, product_name) || other.product_name == product_name)&&(identical(other.seller_type, seller_type) || other.seller_type == seller_type)&&(identical(other.type, type) || other.type == type)&&(identical(other.sale_type, sale_type) || other.sale_type == sale_type)&&(identical(other.allocation_type, allocation_type) || other.allocation_type == allocation_type)&&(identical(other.system_registration_code, system_registration_code) || other.system_registration_code == system_registration_code)&&(identical(other.registration_code, registration_code) || other.registration_code == registration_code)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount)&&(identical(other.total_amount_paid, total_amount_paid) || other.total_amount_paid == total_amount_paid)&&(identical(other.total_amount_remain, total_amount_remain) || other.total_amount_remain == total_amount_remain)&&(identical(other.logged_registration_code, logged_registration_code) || other.logged_registration_code == logged_registration_code)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiver_state, receiver_state) || other.receiver_state == receiver_state)&&(identical(other.allocation_state, allocation_state) || other.allocation_state == allocation_state)&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.steward_temp_key, steward_temp_key) || other.steward_temp_key == steward_temp_key)&&(identical(other.approved_price_status, approved_price_status) || other.approved_price_status == approved_price_status)&&(identical(other.calculate_status, calculate_status) || other.calculate_status == calculate_status)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.ware_house, ware_house)&&const DeepCollectionEquality().equals(other.steward_ware_house, steward_ware_house)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(kill_house),const DeepCollectionEquality().hash(to_kill_house),steward,const DeepCollectionEquality().hash(to_steward),const DeepCollectionEquality().hash(guilds),to_guilds,const DeepCollectionEquality().hash(to_cold_house),index_weight,date_timestamp,new_state,new_receiver_state,new_allocation_state,key,create_date,modify_date,trash,number_of_carcasses,real_number_of_carcasses,receiver_real_number_of_carcasses,weight_of_carcasses,real_weight_of_carcasses,receiver_real_weight_of_carcasses,weight_loss_of_carcasses,final_registration,sell_type,product_name,seller_type,type,sale_type,allocation_type,system_registration_code,registration_code,amount,total_amount,total_amount_paid,total_amount_remain,logged_registration_code,state,receiver_state,allocation_state,date,role,steward_temp_key,approved_price_status,calculate_status,temporary_trash,temporary_deleted,created_by,modified_by,const DeepCollectionEquality().hash(ware_house),const DeepCollectionEquality().hash(steward_ware_house),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); + +@override +String toString() { + return 'AllocatedMadeResult(id: $id, product: $product, kill_house: $kill_house, to_kill_house: $to_kill_house, steward: $steward, to_steward: $to_steward, guilds: $guilds, to_guilds: $to_guilds, to_cold_house: $to_cold_house, index_weight: $index_weight, date_timestamp: $date_timestamp, new_state: $new_state, new_receiver_state: $new_receiver_state, new_allocation_state: $new_allocation_state, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, number_of_carcasses: $number_of_carcasses, real_number_of_carcasses: $real_number_of_carcasses, receiver_real_number_of_carcasses: $receiver_real_number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, real_weight_of_carcasses: $real_weight_of_carcasses, receiver_real_weight_of_carcasses: $receiver_real_weight_of_carcasses, weight_loss_of_carcasses: $weight_loss_of_carcasses, final_registration: $final_registration, sell_type: $sell_type, product_name: $product_name, seller_type: $seller_type, type: $type, sale_type: $sale_type, allocation_type: $allocation_type, system_registration_code: $system_registration_code, registration_code: $registration_code, amount: $amount, total_amount: $total_amount, total_amount_paid: $total_amount_paid, total_amount_remain: $total_amount_remain, logged_registration_code: $logged_registration_code, state: $state, receiver_state: $receiver_state, allocation_state: $allocation_state, date: $date, role: $role, steward_temp_key: $steward_temp_key, approved_price_status: $approved_price_status, calculate_status: $calculate_status, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by, ware_house: $ware_house, steward_ware_house: $steward_ware_house, car: $car, dispenser: $dispenser)'; +} + + +} + +/// @nodoc +abstract mixin class _$AllocatedMadeResultCopyWith<$Res> implements $AllocatedMadeResultCopyWith<$Res> { + factory _$AllocatedMadeResultCopyWith(_AllocatedMadeResult value, $Res Function(_AllocatedMadeResult) _then) = __$AllocatedMadeResultCopyWithImpl; +@override @useResult +$Res call({ + int? id, Product? product, dynamic kill_house, dynamic to_kill_house, Steward? steward, dynamic to_steward, dynamic guilds, Steward? to_guilds, dynamic to_cold_house, int? index_weight, int? date_timestamp, int? new_state, int? new_receiver_state, int? new_allocation_state, String? key, String? create_date, String? modify_date, bool? trash, int? number_of_carcasses, int? real_number_of_carcasses, int? receiver_real_number_of_carcasses, int? weight_of_carcasses, int? real_weight_of_carcasses, int? receiver_real_weight_of_carcasses, int? weight_loss_of_carcasses, bool? final_registration, String? sell_type, String? product_name, String? seller_type, String? type, String? sale_type, String? allocation_type, bool? system_registration_code, int? registration_code, int? amount, int? total_amount, int? total_amount_paid, int? total_amount_remain, String? logged_registration_code, String? state, String? receiver_state, String? allocation_state, String? date, String? role, String? steward_temp_key, bool? approved_price_status, bool? calculate_status, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by, dynamic ware_house, dynamic steward_ware_house, dynamic car, dynamic dispenser +}); + + +@override $ProductCopyWith<$Res>? get product;@override $StewardCopyWith<$Res>? get steward;@override $StewardCopyWith<$Res>? get to_guilds; + +} +/// @nodoc +class __$AllocatedMadeResultCopyWithImpl<$Res> + implements _$AllocatedMadeResultCopyWith<$Res> { + __$AllocatedMadeResultCopyWithImpl(this._self, this._then); + + final _AllocatedMadeResult _self; + final $Res Function(_AllocatedMadeResult) _then; + +/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? kill_house = freezed,Object? to_kill_house = freezed,Object? steward = freezed,Object? to_steward = freezed,Object? guilds = freezed,Object? to_guilds = freezed,Object? to_cold_house = freezed,Object? index_weight = freezed,Object? date_timestamp = freezed,Object? new_state = freezed,Object? new_receiver_state = freezed,Object? new_allocation_state = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? number_of_carcasses = freezed,Object? real_number_of_carcasses = freezed,Object? receiver_real_number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? real_weight_of_carcasses = freezed,Object? receiver_real_weight_of_carcasses = freezed,Object? weight_loss_of_carcasses = freezed,Object? final_registration = freezed,Object? sell_type = freezed,Object? product_name = freezed,Object? seller_type = freezed,Object? type = freezed,Object? sale_type = freezed,Object? allocation_type = freezed,Object? system_registration_code = freezed,Object? registration_code = freezed,Object? amount = freezed,Object? total_amount = freezed,Object? total_amount_paid = freezed,Object? total_amount_remain = freezed,Object? logged_registration_code = freezed,Object? state = freezed,Object? receiver_state = freezed,Object? allocation_state = freezed,Object? date = freezed,Object? role = freezed,Object? steward_temp_key = freezed,Object? approved_price_status = freezed,Object? calculate_status = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? ware_house = freezed,Object? steward_ware_house = freezed,Object? car = freezed,Object? dispenser = freezed,}) { + return _then(_AllocatedMadeResult( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as Product?,kill_house: freezed == kill_house ? _self.kill_house : kill_house // ignore: cast_nullable_to_non_nullable +as dynamic,to_kill_house: freezed == to_kill_house ? _self.to_kill_house : to_kill_house // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as Steward?,to_steward: freezed == to_steward ? _self.to_steward : to_steward // ignore: cast_nullable_to_non_nullable +as dynamic,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as dynamic,to_guilds: freezed == to_guilds ? _self.to_guilds : to_guilds // ignore: cast_nullable_to_non_nullable +as Steward?,to_cold_house: freezed == to_cold_house ? _self.to_cold_house : to_cold_house // ignore: cast_nullable_to_non_nullable +as dynamic,index_weight: freezed == index_weight ? _self.index_weight : index_weight // ignore: cast_nullable_to_non_nullable +as int?,date_timestamp: freezed == date_timestamp ? _self.date_timestamp : date_timestamp // ignore: cast_nullable_to_non_nullable +as int?,new_state: freezed == new_state ? _self.new_state : new_state // ignore: cast_nullable_to_non_nullable +as int?,new_receiver_state: freezed == new_receiver_state ? _self.new_receiver_state : new_receiver_state // ignore: cast_nullable_to_non_nullable +as int?,new_allocation_state: freezed == new_allocation_state ? _self.new_allocation_state : new_allocation_state // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,real_number_of_carcasses: freezed == real_number_of_carcasses ? _self.real_number_of_carcasses : real_number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,receiver_real_number_of_carcasses: freezed == receiver_real_number_of_carcasses ? _self.receiver_real_number_of_carcasses : receiver_real_number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,real_weight_of_carcasses: freezed == real_weight_of_carcasses ? _self.real_weight_of_carcasses : real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,receiver_real_weight_of_carcasses: freezed == receiver_real_weight_of_carcasses ? _self.receiver_real_weight_of_carcasses : receiver_real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_loss_of_carcasses: freezed == weight_loss_of_carcasses ? _self.weight_loss_of_carcasses : weight_loss_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,final_registration: freezed == final_registration ? _self.final_registration : final_registration // ignore: cast_nullable_to_non_nullable +as bool?,sell_type: freezed == sell_type ? _self.sell_type : sell_type // ignore: cast_nullable_to_non_nullable +as String?,product_name: freezed == product_name ? _self.product_name : product_name // ignore: cast_nullable_to_non_nullable +as String?,seller_type: freezed == seller_type ? _self.seller_type : seller_type // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,sale_type: freezed == sale_type ? _self.sale_type : sale_type // ignore: cast_nullable_to_non_nullable +as String?,allocation_type: freezed == allocation_type ? _self.allocation_type : allocation_type // ignore: cast_nullable_to_non_nullable +as String?,system_registration_code: freezed == system_registration_code ? _self.system_registration_code : system_registration_code // ignore: cast_nullable_to_non_nullable +as bool?,registration_code: freezed == registration_code ? _self.registration_code : registration_code // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable +as int?,total_amount_paid: freezed == total_amount_paid ? _self.total_amount_paid : total_amount_paid // ignore: cast_nullable_to_non_nullable +as int?,total_amount_remain: freezed == total_amount_remain ? _self.total_amount_remain : total_amount_remain // ignore: cast_nullable_to_non_nullable +as int?,logged_registration_code: freezed == logged_registration_code ? _self.logged_registration_code : logged_registration_code // ignore: cast_nullable_to_non_nullable +as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,receiver_state: freezed == receiver_state ? _self.receiver_state : receiver_state // ignore: cast_nullable_to_non_nullable +as String?,allocation_state: freezed == allocation_state ? _self.allocation_state : allocation_state // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,steward_temp_key: freezed == steward_temp_key ? _self.steward_temp_key : steward_temp_key // ignore: cast_nullable_to_non_nullable +as String?,approved_price_status: freezed == approved_price_status ? _self.approved_price_status : approved_price_status // ignore: cast_nullable_to_non_nullable +as bool?,calculate_status: freezed == calculate_status ? _self.calculate_status : calculate_status // ignore: cast_nullable_to_non_nullable +as bool?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable +as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,ware_house: freezed == ware_house ? _self.ware_house : ware_house // ignore: cast_nullable_to_non_nullable +as dynamic,steward_ware_house: freezed == steward_ware_house ? _self.steward_ware_house : steward_ware_house // ignore: cast_nullable_to_non_nullable +as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} + +/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +}/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get steward { + if (_self.steward == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); + }); +}/// Create a copy of AllocatedMadeResult +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get to_guilds { + if (_self.to_guilds == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.to_guilds!, (value) { + return _then(_self.copyWith(to_guilds: value)); + }); +} +} + + +/// @nodoc +mixin _$Product { + + int? get weight_average; +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProductCopyWith get copyWith => _$ProductCopyWithImpl(this as Product, _$identity); + + /// Serializes this Product to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Product&&(identical(other.weight_average, weight_average) || other.weight_average == weight_average)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,weight_average); + +@override +String toString() { + return 'Product(weight_average: $weight_average)'; +} + + +} + +/// @nodoc +abstract mixin class $ProductCopyWith<$Res> { + factory $ProductCopyWith(Product value, $Res Function(Product) _then) = _$ProductCopyWithImpl; +@useResult +$Res call({ + int? weight_average +}); + + + + +} +/// @nodoc +class _$ProductCopyWithImpl<$Res> + implements $ProductCopyWith<$Res> { + _$ProductCopyWithImpl(this._self, this._then); + + final Product _self; + final $Res Function(Product) _then; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? weight_average = freezed,}) { + return _then(_self.copyWith( +weight_average: freezed == weight_average ? _self.weight_average : weight_average // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Product implements Product { + _Product({this.weight_average}); + factory _Product.fromJson(Map json) => _$ProductFromJson(json); + +@override final int? weight_average; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProductCopyWith<_Product> get copyWith => __$ProductCopyWithImpl<_Product>(this, _$identity); + +@override +Map toJson() { + return _$ProductToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Product&&(identical(other.weight_average, weight_average) || other.weight_average == weight_average)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,weight_average); + +@override +String toString() { + return 'Product(weight_average: $weight_average)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProductCopyWith<$Res> implements $ProductCopyWith<$Res> { + factory _$ProductCopyWith(_Product value, $Res Function(_Product) _then) = __$ProductCopyWithImpl; +@override @useResult +$Res call({ + int? weight_average +}); + + + + +} +/// @nodoc +class __$ProductCopyWithImpl<$Res> + implements _$ProductCopyWith<$Res> { + __$ProductCopyWithImpl(this._self, this._then); + + final _Product _self; + final $Res Function(_Product) _then; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? weight_average = freezed,}) { + return _then(_Product( +weight_average: freezed == weight_average ? _self.weight_average : weight_average // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + + +/// @nodoc +mixin _$Steward { + + int? get id; User? get user; Address? get address; Activity? get guild_area_activity; Activity? get guild_type_activity; List? get kill_house; List? get steward_kill_house; List? get stewards; PosStatus? get get_pos_status; String? get key; String? get create_date; String? get modify_date; bool? get trash; dynamic get user_id_foreign_key; dynamic get address_id_foreign_key; dynamic get user_bank_id_foreign_key; dynamic get wallet_id_foreign_key; dynamic get provincial_government_id_key; dynamic get identity_documents; bool? get active; int? get city_number; String? get city_name; String? get guilds_id; String? get license_number; String? get guilds_name; String? get phone; String? get type_activity; String? get area_activity; int? get province_number; String? get province_name; bool? get steward; bool? get has_pos; dynamic get centers_allocation; dynamic get kill_house_centers_allocation; dynamic get allocation_limit; bool? get limitation_allocation; String? get registerar_role; String? get registerar_fullname; String? get registerar_mobile; bool? get kill_house_register; bool? get steward_register; bool? get guilds_room_register; bool? get pos_company_register; String? get province_accept_state; String? get province_message; String? get condition; String? get description_condition; bool? get steward_active; dynamic get steward_allocation_limit; bool? get steward_limitation_allocation; bool? get license; dynamic get license_form; dynamic get license_file; String? get reviewer_role; String? get reviewer_fullname; String? get reviewer_mobile; String? get checker_message; bool? get final_accept; bool? get temporary_registration; String? get created_by; String? get modified_by; dynamic get user_bank_info; int? get wallet; List? get cars; List? get user_level; +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StewardCopyWith get copyWith => _$StewardCopyWithImpl(this as Steward, _$identity); + + /// Serializes this Steward to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Steward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guild_area_activity, guild_area_activity) || other.guild_area_activity == guild_area_activity)&&(identical(other.guild_type_activity, guild_type_activity) || other.guild_type_activity == guild_type_activity)&&const DeepCollectionEquality().equals(other.kill_house, kill_house)&&const DeepCollectionEquality().equals(other.steward_kill_house, steward_kill_house)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.get_pos_status, get_pos_status) || other.get_pos_status == get_pos_status)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.user_id_foreign_key, user_id_foreign_key)&&const DeepCollectionEquality().equals(other.address_id_foreign_key, address_id_foreign_key)&&const DeepCollectionEquality().equals(other.user_bank_id_foreign_key, user_bank_id_foreign_key)&&const DeepCollectionEquality().equals(other.wallet_id_foreign_key, wallet_id_foreign_key)&&const DeepCollectionEquality().equals(other.provincial_government_id_key, provincial_government_id_key)&&const DeepCollectionEquality().equals(other.identity_documents, identity_documents)&&(identical(other.active, active) || other.active == active)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.has_pos, has_pos) || other.has_pos == has_pos)&&const DeepCollectionEquality().equals(other.centers_allocation, centers_allocation)&&const DeepCollectionEquality().equals(other.kill_house_centers_allocation, kill_house_centers_allocation)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.limitation_allocation, limitation_allocation) || other.limitation_allocation == limitation_allocation)&&(identical(other.registerar_role, registerar_role) || other.registerar_role == registerar_role)&&(identical(other.registerar_fullname, registerar_fullname) || other.registerar_fullname == registerar_fullname)&&(identical(other.registerar_mobile, registerar_mobile) || other.registerar_mobile == registerar_mobile)&&(identical(other.kill_house_register, kill_house_register) || other.kill_house_register == kill_house_register)&&(identical(other.steward_register, steward_register) || other.steward_register == steward_register)&&(identical(other.guilds_room_register, guilds_room_register) || other.guilds_room_register == guilds_room_register)&&(identical(other.pos_company_register, pos_company_register) || other.pos_company_register == pos_company_register)&&(identical(other.province_accept_state, province_accept_state) || other.province_accept_state == province_accept_state)&&(identical(other.province_message, province_message) || other.province_message == province_message)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.description_condition, description_condition) || other.description_condition == description_condition)&&(identical(other.steward_active, steward_active) || other.steward_active == steward_active)&&const DeepCollectionEquality().equals(other.steward_allocation_limit, steward_allocation_limit)&&(identical(other.steward_limitation_allocation, steward_limitation_allocation) || other.steward_limitation_allocation == steward_limitation_allocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.license_form, license_form)&&const DeepCollectionEquality().equals(other.license_file, license_file)&&(identical(other.reviewer_role, reviewer_role) || other.reviewer_role == reviewer_role)&&(identical(other.reviewer_fullname, reviewer_fullname) || other.reviewer_fullname == reviewer_fullname)&&(identical(other.reviewer_mobile, reviewer_mobile) || other.reviewer_mobile == reviewer_mobile)&&(identical(other.checker_message, checker_message) || other.checker_message == checker_message)&&(identical(other.final_accept, final_accept) || other.final_accept == final_accept)&&(identical(other.temporary_registration, temporary_registration) || other.temporary_registration == temporary_registration)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.user_bank_info, user_bank_info)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other.cars, cars)&&const DeepCollectionEquality().equals(other.user_level, user_level)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guild_area_activity,guild_type_activity,const DeepCollectionEquality().hash(kill_house),const DeepCollectionEquality().hash(steward_kill_house),const DeepCollectionEquality().hash(stewards),get_pos_status,key,create_date,modify_date,trash,const DeepCollectionEquality().hash(user_id_foreign_key),const DeepCollectionEquality().hash(address_id_foreign_key),const DeepCollectionEquality().hash(user_bank_id_foreign_key),const DeepCollectionEquality().hash(wallet_id_foreign_key),const DeepCollectionEquality().hash(provincial_government_id_key),const DeepCollectionEquality().hash(identity_documents),active,city_number,city_name,guilds_id,license_number,guilds_name,phone,type_activity,area_activity,province_number,province_name,steward,has_pos,const DeepCollectionEquality().hash(centers_allocation),const DeepCollectionEquality().hash(kill_house_centers_allocation),const DeepCollectionEquality().hash(allocation_limit),limitation_allocation,registerar_role,registerar_fullname,registerar_mobile,kill_house_register,steward_register,guilds_room_register,pos_company_register,province_accept_state,province_message,condition,description_condition,steward_active,const DeepCollectionEquality().hash(steward_allocation_limit),steward_limitation_allocation,license,const DeepCollectionEquality().hash(license_form),const DeepCollectionEquality().hash(license_file),reviewer_role,reviewer_fullname,reviewer_mobile,checker_message,final_accept,temporary_registration,created_by,modified_by,const DeepCollectionEquality().hash(user_bank_info),wallet,const DeepCollectionEquality().hash(cars),const DeepCollectionEquality().hash(user_level)]); + +@override +String toString() { + return 'Steward(id: $id, user: $user, address: $address, guild_area_activity: $guild_area_activity, guild_type_activity: $guild_type_activity, kill_house: $kill_house, steward_kill_house: $steward_kill_house, stewards: $stewards, get_pos_status: $get_pos_status, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, user_id_foreign_key: $user_id_foreign_key, address_id_foreign_key: $address_id_foreign_key, user_bank_id_foreign_key: $user_bank_id_foreign_key, wallet_id_foreign_key: $wallet_id_foreign_key, provincial_government_id_key: $provincial_government_id_key, identity_documents: $identity_documents, active: $active, city_number: $city_number, city_name: $city_name, guilds_id: $guilds_id, license_number: $license_number, guilds_name: $guilds_name, phone: $phone, type_activity: $type_activity, area_activity: $area_activity, province_number: $province_number, province_name: $province_name, steward: $steward, has_pos: $has_pos, centers_allocation: $centers_allocation, kill_house_centers_allocation: $kill_house_centers_allocation, allocation_limit: $allocation_limit, limitation_allocation: $limitation_allocation, registerar_role: $registerar_role, registerar_fullname: $registerar_fullname, registerar_mobile: $registerar_mobile, kill_house_register: $kill_house_register, steward_register: $steward_register, guilds_room_register: $guilds_room_register, pos_company_register: $pos_company_register, province_accept_state: $province_accept_state, province_message: $province_message, condition: $condition, description_condition: $description_condition, steward_active: $steward_active, steward_allocation_limit: $steward_allocation_limit, steward_limitation_allocation: $steward_limitation_allocation, license: $license, license_form: $license_form, license_file: $license_file, reviewer_role: $reviewer_role, reviewer_fullname: $reviewer_fullname, reviewer_mobile: $reviewer_mobile, checker_message: $checker_message, final_accept: $final_accept, temporary_registration: $temporary_registration, created_by: $created_by, modified_by: $modified_by, user_bank_info: $user_bank_info, wallet: $wallet, cars: $cars, user_level: $user_level)'; +} + + +} + +/// @nodoc +abstract mixin class $StewardCopyWith<$Res> { + factory $StewardCopyWith(Steward value, $Res Function(Steward) _then) = _$StewardCopyWithImpl; +@useResult +$Res call({ + int? id, User? user, Address? address, Activity? guild_area_activity, Activity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, PosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, dynamic user_id_foreign_key, dynamic address_id_foreign_key, dynamic user_bank_id_foreign_key, dynamic wallet_id_foreign_key, dynamic provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level +}); + + +$UserCopyWith<$Res>? get user;$AddressCopyWith<$Res>? get address;$ActivityCopyWith<$Res>? get guild_area_activity;$ActivityCopyWith<$Res>? get guild_type_activity;$PosStatusCopyWith<$Res>? get get_pos_status; + +} +/// @nodoc +class _$StewardCopyWithImpl<$Res> + implements $StewardCopyWith<$Res> { + _$StewardCopyWithImpl(this._self, this._then); + + final Steward _self; + final $Res Function(Steward) _then; + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guild_area_activity = freezed,Object? guild_type_activity = freezed,Object? kill_house = freezed,Object? steward_kill_house = freezed,Object? stewards = freezed,Object? get_pos_status = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? user_id_foreign_key = freezed,Object? address_id_foreign_key = freezed,Object? user_bank_id_foreign_key = freezed,Object? wallet_id_foreign_key = freezed,Object? provincial_government_id_key = freezed,Object? identity_documents = freezed,Object? active = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? guilds_id = freezed,Object? license_number = freezed,Object? guilds_name = freezed,Object? phone = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? steward = freezed,Object? has_pos = freezed,Object? centers_allocation = freezed,Object? kill_house_centers_allocation = freezed,Object? allocation_limit = freezed,Object? limitation_allocation = freezed,Object? registerar_role = freezed,Object? registerar_fullname = freezed,Object? registerar_mobile = freezed,Object? kill_house_register = freezed,Object? steward_register = freezed,Object? guilds_room_register = freezed,Object? pos_company_register = freezed,Object? province_accept_state = freezed,Object? province_message = freezed,Object? condition = freezed,Object? description_condition = freezed,Object? steward_active = freezed,Object? steward_allocation_limit = freezed,Object? steward_limitation_allocation = freezed,Object? license = freezed,Object? license_form = freezed,Object? license_file = freezed,Object? reviewer_role = freezed,Object? reviewer_fullname = freezed,Object? reviewer_mobile = freezed,Object? checker_message = freezed,Object? final_accept = freezed,Object? temporary_registration = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? user_bank_info = freezed,Object? wallet = freezed,Object? cars = freezed,Object? user_level = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,guild_area_activity: freezed == guild_area_activity ? _self.guild_area_activity : guild_area_activity // ignore: cast_nullable_to_non_nullable +as Activity?,guild_type_activity: freezed == guild_type_activity ? _self.guild_type_activity : guild_type_activity // ignore: cast_nullable_to_non_nullable +as Activity?,kill_house: freezed == kill_house ? _self.kill_house : kill_house // ignore: cast_nullable_to_non_nullable +as List?,steward_kill_house: freezed == steward_kill_house ? _self.steward_kill_house : steward_kill_house // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self.stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,get_pos_status: freezed == get_pos_status ? _self.get_pos_status : get_pos_status // ignore: cast_nullable_to_non_nullable +as PosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,user_id_foreign_key: freezed == user_id_foreign_key ? _self.user_id_foreign_key : user_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,address_id_foreign_key: freezed == address_id_foreign_key ? _self.address_id_foreign_key : address_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,user_bank_id_foreign_key: freezed == user_bank_id_foreign_key ? _self.user_bank_id_foreign_key : user_bank_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,wallet_id_foreign_key: freezed == wallet_id_foreign_key ? _self.wallet_id_foreign_key : wallet_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,provincial_government_id_key: freezed == provincial_government_id_key ? _self.provincial_government_id_key : provincial_government_id_key // ignore: cast_nullable_to_non_nullable +as dynamic,identity_documents: freezed == identity_documents ? _self.identity_documents : identity_documents // ignore: cast_nullable_to_non_nullable +as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable +as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable +as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable +as String?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable +as String?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable +as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable +as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable +as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,has_pos: freezed == has_pos ? _self.has_pos : has_pos // ignore: cast_nullable_to_non_nullable +as bool?,centers_allocation: freezed == centers_allocation ? _self.centers_allocation : centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,kill_house_centers_allocation: freezed == kill_house_centers_allocation ? _self.kill_house_centers_allocation : kill_house_centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,limitation_allocation: freezed == limitation_allocation ? _self.limitation_allocation : limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,registerar_role: freezed == registerar_role ? _self.registerar_role : registerar_role // ignore: cast_nullable_to_non_nullable +as String?,registerar_fullname: freezed == registerar_fullname ? _self.registerar_fullname : registerar_fullname // ignore: cast_nullable_to_non_nullable +as String?,registerar_mobile: freezed == registerar_mobile ? _self.registerar_mobile : registerar_mobile // ignore: cast_nullable_to_non_nullable +as String?,kill_house_register: freezed == kill_house_register ? _self.kill_house_register : kill_house_register // ignore: cast_nullable_to_non_nullable +as bool?,steward_register: freezed == steward_register ? _self.steward_register : steward_register // ignore: cast_nullable_to_non_nullable +as bool?,guilds_room_register: freezed == guilds_room_register ? _self.guilds_room_register : guilds_room_register // ignore: cast_nullable_to_non_nullable +as bool?,pos_company_register: freezed == pos_company_register ? _self.pos_company_register : pos_company_register // ignore: cast_nullable_to_non_nullable +as bool?,province_accept_state: freezed == province_accept_state ? _self.province_accept_state : province_accept_state // ignore: cast_nullable_to_non_nullable +as String?,province_message: freezed == province_message ? _self.province_message : province_message // ignore: cast_nullable_to_non_nullable +as String?,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable +as String?,description_condition: freezed == description_condition ? _self.description_condition : description_condition // ignore: cast_nullable_to_non_nullable +as String?,steward_active: freezed == steward_active ? _self.steward_active : steward_active // ignore: cast_nullable_to_non_nullable +as bool?,steward_allocation_limit: freezed == steward_allocation_limit ? _self.steward_allocation_limit : steward_allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,steward_limitation_allocation: freezed == steward_limitation_allocation ? _self.steward_limitation_allocation : steward_limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,license_form: freezed == license_form ? _self.license_form : license_form // ignore: cast_nullable_to_non_nullable +as dynamic,license_file: freezed == license_file ? _self.license_file : license_file // ignore: cast_nullable_to_non_nullable +as dynamic,reviewer_role: freezed == reviewer_role ? _self.reviewer_role : reviewer_role // ignore: cast_nullable_to_non_nullable +as String?,reviewer_fullname: freezed == reviewer_fullname ? _self.reviewer_fullname : reviewer_fullname // ignore: cast_nullable_to_non_nullable +as String?,reviewer_mobile: freezed == reviewer_mobile ? _self.reviewer_mobile : reviewer_mobile // ignore: cast_nullable_to_non_nullable +as String?,checker_message: freezed == checker_message ? _self.checker_message : checker_message // ignore: cast_nullable_to_non_nullable +as String?,final_accept: freezed == final_accept ? _self.final_accept : final_accept // ignore: cast_nullable_to_non_nullable +as bool?,temporary_registration: freezed == temporary_registration ? _self.temporary_registration : temporary_registration // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,user_bank_info: freezed == user_bank_info ? _self.user_bank_info : user_bank_info // ignore: cast_nullable_to_non_nullable +as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self.cars : cars // ignore: cast_nullable_to_non_nullable +as List?,user_level: freezed == user_level ? _self.user_level : user_level // ignore: cast_nullable_to_non_nullable +as List?, + )); +} +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guild_area_activity { + if (_self.guild_area_activity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guild_area_activity!, (value) { + return _then(_self.copyWith(guild_area_activity: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guild_type_activity { + if (_self.guild_type_activity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guild_type_activity!, (value) { + return _then(_self.copyWith(guild_type_activity: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$PosStatusCopyWith<$Res>? get get_pos_status { + if (_self.get_pos_status == null) { + return null; + } + + return $PosStatusCopyWith<$Res>(_self.get_pos_status!, (value) { + return _then(_self.copyWith(get_pos_status: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Steward implements Steward { + _Steward({this.id, this.user, this.address, this.guild_area_activity, this.guild_type_activity, final List? kill_house, final List? steward_kill_house, final List? stewards, this.get_pos_status, this.key, this.create_date, this.modify_date, this.trash, this.user_id_foreign_key, this.address_id_foreign_key, this.user_bank_id_foreign_key, this.wallet_id_foreign_key, this.provincial_government_id_key, this.identity_documents, this.active, this.city_number, this.city_name, this.guilds_id, this.license_number, this.guilds_name, this.phone, this.type_activity, this.area_activity, this.province_number, this.province_name, this.steward, this.has_pos, this.centers_allocation, this.kill_house_centers_allocation, this.allocation_limit, this.limitation_allocation, this.registerar_role, this.registerar_fullname, this.registerar_mobile, this.kill_house_register, this.steward_register, this.guilds_room_register, this.pos_company_register, this.province_accept_state, this.province_message, this.condition, this.description_condition, this.steward_active, this.steward_allocation_limit, this.steward_limitation_allocation, this.license, this.license_form, this.license_file, this.reviewer_role, this.reviewer_fullname, this.reviewer_mobile, this.checker_message, this.final_accept, this.temporary_registration, this.created_by, this.modified_by, this.user_bank_info, this.wallet, final List? cars, final List? user_level}): _kill_house = kill_house,_steward_kill_house = steward_kill_house,_stewards = stewards,_cars = cars,_user_level = user_level; + factory _Steward.fromJson(Map json) => _$StewardFromJson(json); + +@override final int? id; +@override final User? user; +@override final Address? address; +@override final Activity? guild_area_activity; +@override final Activity? guild_type_activity; + final List? _kill_house; +@override List? get kill_house { + final value = _kill_house; + if (value == null) return null; + if (_kill_house is EqualUnmodifiableListView) return _kill_house; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _steward_kill_house; +@override List? get steward_kill_house { + final value = _steward_kill_house; + if (value == null) return null; + if (_steward_kill_house is EqualUnmodifiableListView) return _steward_kill_house; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _stewards; +@override List? get stewards { + final value = _stewards; + if (value == null) return null; + if (_stewards is EqualUnmodifiableListView) return _stewards; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + +@override final PosStatus? get_pos_status; +@override final String? key; +@override final String? create_date; +@override final String? modify_date; +@override final bool? trash; +@override final dynamic user_id_foreign_key; +@override final dynamic address_id_foreign_key; +@override final dynamic user_bank_id_foreign_key; +@override final dynamic wallet_id_foreign_key; +@override final dynamic provincial_government_id_key; +@override final dynamic identity_documents; +@override final bool? active; +@override final int? city_number; +@override final String? city_name; +@override final String? guilds_id; +@override final String? license_number; +@override final String? guilds_name; +@override final String? phone; +@override final String? type_activity; +@override final String? area_activity; +@override final int? province_number; +@override final String? province_name; +@override final bool? steward; +@override final bool? has_pos; +@override final dynamic centers_allocation; +@override final dynamic kill_house_centers_allocation; +@override final dynamic allocation_limit; +@override final bool? limitation_allocation; +@override final String? registerar_role; +@override final String? registerar_fullname; +@override final String? registerar_mobile; +@override final bool? kill_house_register; +@override final bool? steward_register; +@override final bool? guilds_room_register; +@override final bool? pos_company_register; +@override final String? province_accept_state; +@override final String? province_message; +@override final String? condition; +@override final String? description_condition; +@override final bool? steward_active; +@override final dynamic steward_allocation_limit; +@override final bool? steward_limitation_allocation; +@override final bool? license; +@override final dynamic license_form; +@override final dynamic license_file; +@override final String? reviewer_role; +@override final String? reviewer_fullname; +@override final String? reviewer_mobile; +@override final String? checker_message; +@override final bool? final_accept; +@override final bool? temporary_registration; +@override final String? created_by; +@override final String? modified_by; +@override final dynamic user_bank_info; +@override final int? wallet; + final List? _cars; +@override List? get cars { + final value = _cars; + if (value == null) return null; + if (_cars is EqualUnmodifiableListView) return _cars; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _user_level; +@override List? get user_level { + final value = _user_level; + if (value == null) return null; + if (_user_level is EqualUnmodifiableListView) return _user_level; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$StewardCopyWith<_Steward> get copyWith => __$StewardCopyWithImpl<_Steward>(this, _$identity); + +@override +Map toJson() { + return _$StewardToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Steward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guild_area_activity, guild_area_activity) || other.guild_area_activity == guild_area_activity)&&(identical(other.guild_type_activity, guild_type_activity) || other.guild_type_activity == guild_type_activity)&&const DeepCollectionEquality().equals(other._kill_house, _kill_house)&&const DeepCollectionEquality().equals(other._steward_kill_house, _steward_kill_house)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.get_pos_status, get_pos_status) || other.get_pos_status == get_pos_status)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.user_id_foreign_key, user_id_foreign_key)&&const DeepCollectionEquality().equals(other.address_id_foreign_key, address_id_foreign_key)&&const DeepCollectionEquality().equals(other.user_bank_id_foreign_key, user_bank_id_foreign_key)&&const DeepCollectionEquality().equals(other.wallet_id_foreign_key, wallet_id_foreign_key)&&const DeepCollectionEquality().equals(other.provincial_government_id_key, provincial_government_id_key)&&const DeepCollectionEquality().equals(other.identity_documents, identity_documents)&&(identical(other.active, active) || other.active == active)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.has_pos, has_pos) || other.has_pos == has_pos)&&const DeepCollectionEquality().equals(other.centers_allocation, centers_allocation)&&const DeepCollectionEquality().equals(other.kill_house_centers_allocation, kill_house_centers_allocation)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.limitation_allocation, limitation_allocation) || other.limitation_allocation == limitation_allocation)&&(identical(other.registerar_role, registerar_role) || other.registerar_role == registerar_role)&&(identical(other.registerar_fullname, registerar_fullname) || other.registerar_fullname == registerar_fullname)&&(identical(other.registerar_mobile, registerar_mobile) || other.registerar_mobile == registerar_mobile)&&(identical(other.kill_house_register, kill_house_register) || other.kill_house_register == kill_house_register)&&(identical(other.steward_register, steward_register) || other.steward_register == steward_register)&&(identical(other.guilds_room_register, guilds_room_register) || other.guilds_room_register == guilds_room_register)&&(identical(other.pos_company_register, pos_company_register) || other.pos_company_register == pos_company_register)&&(identical(other.province_accept_state, province_accept_state) || other.province_accept_state == province_accept_state)&&(identical(other.province_message, province_message) || other.province_message == province_message)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.description_condition, description_condition) || other.description_condition == description_condition)&&(identical(other.steward_active, steward_active) || other.steward_active == steward_active)&&const DeepCollectionEquality().equals(other.steward_allocation_limit, steward_allocation_limit)&&(identical(other.steward_limitation_allocation, steward_limitation_allocation) || other.steward_limitation_allocation == steward_limitation_allocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.license_form, license_form)&&const DeepCollectionEquality().equals(other.license_file, license_file)&&(identical(other.reviewer_role, reviewer_role) || other.reviewer_role == reviewer_role)&&(identical(other.reviewer_fullname, reviewer_fullname) || other.reviewer_fullname == reviewer_fullname)&&(identical(other.reviewer_mobile, reviewer_mobile) || other.reviewer_mobile == reviewer_mobile)&&(identical(other.checker_message, checker_message) || other.checker_message == checker_message)&&(identical(other.final_accept, final_accept) || other.final_accept == final_accept)&&(identical(other.temporary_registration, temporary_registration) || other.temporary_registration == temporary_registration)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.user_bank_info, user_bank_info)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other._cars, _cars)&&const DeepCollectionEquality().equals(other._user_level, _user_level)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guild_area_activity,guild_type_activity,const DeepCollectionEquality().hash(_kill_house),const DeepCollectionEquality().hash(_steward_kill_house),const DeepCollectionEquality().hash(_stewards),get_pos_status,key,create_date,modify_date,trash,const DeepCollectionEquality().hash(user_id_foreign_key),const DeepCollectionEquality().hash(address_id_foreign_key),const DeepCollectionEquality().hash(user_bank_id_foreign_key),const DeepCollectionEquality().hash(wallet_id_foreign_key),const DeepCollectionEquality().hash(provincial_government_id_key),const DeepCollectionEquality().hash(identity_documents),active,city_number,city_name,guilds_id,license_number,guilds_name,phone,type_activity,area_activity,province_number,province_name,steward,has_pos,const DeepCollectionEquality().hash(centers_allocation),const DeepCollectionEquality().hash(kill_house_centers_allocation),const DeepCollectionEquality().hash(allocation_limit),limitation_allocation,registerar_role,registerar_fullname,registerar_mobile,kill_house_register,steward_register,guilds_room_register,pos_company_register,province_accept_state,province_message,condition,description_condition,steward_active,const DeepCollectionEquality().hash(steward_allocation_limit),steward_limitation_allocation,license,const DeepCollectionEquality().hash(license_form),const DeepCollectionEquality().hash(license_file),reviewer_role,reviewer_fullname,reviewer_mobile,checker_message,final_accept,temporary_registration,created_by,modified_by,const DeepCollectionEquality().hash(user_bank_info),wallet,const DeepCollectionEquality().hash(_cars),const DeepCollectionEquality().hash(_user_level)]); + +@override +String toString() { + return 'Steward(id: $id, user: $user, address: $address, guild_area_activity: $guild_area_activity, guild_type_activity: $guild_type_activity, kill_house: $kill_house, steward_kill_house: $steward_kill_house, stewards: $stewards, get_pos_status: $get_pos_status, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, user_id_foreign_key: $user_id_foreign_key, address_id_foreign_key: $address_id_foreign_key, user_bank_id_foreign_key: $user_bank_id_foreign_key, wallet_id_foreign_key: $wallet_id_foreign_key, provincial_government_id_key: $provincial_government_id_key, identity_documents: $identity_documents, active: $active, city_number: $city_number, city_name: $city_name, guilds_id: $guilds_id, license_number: $license_number, guilds_name: $guilds_name, phone: $phone, type_activity: $type_activity, area_activity: $area_activity, province_number: $province_number, province_name: $province_name, steward: $steward, has_pos: $has_pos, centers_allocation: $centers_allocation, kill_house_centers_allocation: $kill_house_centers_allocation, allocation_limit: $allocation_limit, limitation_allocation: $limitation_allocation, registerar_role: $registerar_role, registerar_fullname: $registerar_fullname, registerar_mobile: $registerar_mobile, kill_house_register: $kill_house_register, steward_register: $steward_register, guilds_room_register: $guilds_room_register, pos_company_register: $pos_company_register, province_accept_state: $province_accept_state, province_message: $province_message, condition: $condition, description_condition: $description_condition, steward_active: $steward_active, steward_allocation_limit: $steward_allocation_limit, steward_limitation_allocation: $steward_limitation_allocation, license: $license, license_form: $license_form, license_file: $license_file, reviewer_role: $reviewer_role, reviewer_fullname: $reviewer_fullname, reviewer_mobile: $reviewer_mobile, checker_message: $checker_message, final_accept: $final_accept, temporary_registration: $temporary_registration, created_by: $created_by, modified_by: $modified_by, user_bank_info: $user_bank_info, wallet: $wallet, cars: $cars, user_level: $user_level)'; +} + + +} + +/// @nodoc +abstract mixin class _$StewardCopyWith<$Res> implements $StewardCopyWith<$Res> { + factory _$StewardCopyWith(_Steward value, $Res Function(_Steward) _then) = __$StewardCopyWithImpl; +@override @useResult +$Res call({ + int? id, User? user, Address? address, Activity? guild_area_activity, Activity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, PosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, dynamic user_id_foreign_key, dynamic address_id_foreign_key, dynamic user_bank_id_foreign_key, dynamic wallet_id_foreign_key, dynamic provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level +}); + + +@override $UserCopyWith<$Res>? get user;@override $AddressCopyWith<$Res>? get address;@override $ActivityCopyWith<$Res>? get guild_area_activity;@override $ActivityCopyWith<$Res>? get guild_type_activity;@override $PosStatusCopyWith<$Res>? get get_pos_status; + +} +/// @nodoc +class __$StewardCopyWithImpl<$Res> + implements _$StewardCopyWith<$Res> { + __$StewardCopyWithImpl(this._self, this._then); + + final _Steward _self; + final $Res Function(_Steward) _then; + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guild_area_activity = freezed,Object? guild_type_activity = freezed,Object? kill_house = freezed,Object? steward_kill_house = freezed,Object? stewards = freezed,Object? get_pos_status = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? user_id_foreign_key = freezed,Object? address_id_foreign_key = freezed,Object? user_bank_id_foreign_key = freezed,Object? wallet_id_foreign_key = freezed,Object? provincial_government_id_key = freezed,Object? identity_documents = freezed,Object? active = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? guilds_id = freezed,Object? license_number = freezed,Object? guilds_name = freezed,Object? phone = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? steward = freezed,Object? has_pos = freezed,Object? centers_allocation = freezed,Object? kill_house_centers_allocation = freezed,Object? allocation_limit = freezed,Object? limitation_allocation = freezed,Object? registerar_role = freezed,Object? registerar_fullname = freezed,Object? registerar_mobile = freezed,Object? kill_house_register = freezed,Object? steward_register = freezed,Object? guilds_room_register = freezed,Object? pos_company_register = freezed,Object? province_accept_state = freezed,Object? province_message = freezed,Object? condition = freezed,Object? description_condition = freezed,Object? steward_active = freezed,Object? steward_allocation_limit = freezed,Object? steward_limitation_allocation = freezed,Object? license = freezed,Object? license_form = freezed,Object? license_file = freezed,Object? reviewer_role = freezed,Object? reviewer_fullname = freezed,Object? reviewer_mobile = freezed,Object? checker_message = freezed,Object? final_accept = freezed,Object? temporary_registration = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? user_bank_info = freezed,Object? wallet = freezed,Object? cars = freezed,Object? user_level = freezed,}) { + return _then(_Steward( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,guild_area_activity: freezed == guild_area_activity ? _self.guild_area_activity : guild_area_activity // ignore: cast_nullable_to_non_nullable +as Activity?,guild_type_activity: freezed == guild_type_activity ? _self.guild_type_activity : guild_type_activity // ignore: cast_nullable_to_non_nullable +as Activity?,kill_house: freezed == kill_house ? _self._kill_house : kill_house // ignore: cast_nullable_to_non_nullable +as List?,steward_kill_house: freezed == steward_kill_house ? _self._steward_kill_house : steward_kill_house // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self._stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,get_pos_status: freezed == get_pos_status ? _self.get_pos_status : get_pos_status // ignore: cast_nullable_to_non_nullable +as PosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,user_id_foreign_key: freezed == user_id_foreign_key ? _self.user_id_foreign_key : user_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,address_id_foreign_key: freezed == address_id_foreign_key ? _self.address_id_foreign_key : address_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,user_bank_id_foreign_key: freezed == user_bank_id_foreign_key ? _self.user_bank_id_foreign_key : user_bank_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,wallet_id_foreign_key: freezed == wallet_id_foreign_key ? _self.wallet_id_foreign_key : wallet_id_foreign_key // ignore: cast_nullable_to_non_nullable +as dynamic,provincial_government_id_key: freezed == provincial_government_id_key ? _self.provincial_government_id_key : provincial_government_id_key // ignore: cast_nullable_to_non_nullable +as dynamic,identity_documents: freezed == identity_documents ? _self.identity_documents : identity_documents // ignore: cast_nullable_to_non_nullable +as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable +as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable +as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable +as String?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable +as String?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable +as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable +as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable +as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,has_pos: freezed == has_pos ? _self.has_pos : has_pos // ignore: cast_nullable_to_non_nullable +as bool?,centers_allocation: freezed == centers_allocation ? _self.centers_allocation : centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,kill_house_centers_allocation: freezed == kill_house_centers_allocation ? _self.kill_house_centers_allocation : kill_house_centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,limitation_allocation: freezed == limitation_allocation ? _self.limitation_allocation : limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,registerar_role: freezed == registerar_role ? _self.registerar_role : registerar_role // ignore: cast_nullable_to_non_nullable +as String?,registerar_fullname: freezed == registerar_fullname ? _self.registerar_fullname : registerar_fullname // ignore: cast_nullable_to_non_nullable +as String?,registerar_mobile: freezed == registerar_mobile ? _self.registerar_mobile : registerar_mobile // ignore: cast_nullable_to_non_nullable +as String?,kill_house_register: freezed == kill_house_register ? _self.kill_house_register : kill_house_register // ignore: cast_nullable_to_non_nullable +as bool?,steward_register: freezed == steward_register ? _self.steward_register : steward_register // ignore: cast_nullable_to_non_nullable +as bool?,guilds_room_register: freezed == guilds_room_register ? _self.guilds_room_register : guilds_room_register // ignore: cast_nullable_to_non_nullable +as bool?,pos_company_register: freezed == pos_company_register ? _self.pos_company_register : pos_company_register // ignore: cast_nullable_to_non_nullable +as bool?,province_accept_state: freezed == province_accept_state ? _self.province_accept_state : province_accept_state // ignore: cast_nullable_to_non_nullable +as String?,province_message: freezed == province_message ? _self.province_message : province_message // ignore: cast_nullable_to_non_nullable +as String?,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable +as String?,description_condition: freezed == description_condition ? _self.description_condition : description_condition // ignore: cast_nullable_to_non_nullable +as String?,steward_active: freezed == steward_active ? _self.steward_active : steward_active // ignore: cast_nullable_to_non_nullable +as bool?,steward_allocation_limit: freezed == steward_allocation_limit ? _self.steward_allocation_limit : steward_allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,steward_limitation_allocation: freezed == steward_limitation_allocation ? _self.steward_limitation_allocation : steward_limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,license_form: freezed == license_form ? _self.license_form : license_form // ignore: cast_nullable_to_non_nullable +as dynamic,license_file: freezed == license_file ? _self.license_file : license_file // ignore: cast_nullable_to_non_nullable +as dynamic,reviewer_role: freezed == reviewer_role ? _self.reviewer_role : reviewer_role // ignore: cast_nullable_to_non_nullable +as String?,reviewer_fullname: freezed == reviewer_fullname ? _self.reviewer_fullname : reviewer_fullname // ignore: cast_nullable_to_non_nullable +as String?,reviewer_mobile: freezed == reviewer_mobile ? _self.reviewer_mobile : reviewer_mobile // ignore: cast_nullable_to_non_nullable +as String?,checker_message: freezed == checker_message ? _self.checker_message : checker_message // ignore: cast_nullable_to_non_nullable +as String?,final_accept: freezed == final_accept ? _self.final_accept : final_accept // ignore: cast_nullable_to_non_nullable +as bool?,temporary_registration: freezed == temporary_registration ? _self.temporary_registration : temporary_registration // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,user_bank_info: freezed == user_bank_info ? _self.user_bank_info : user_bank_info // ignore: cast_nullable_to_non_nullable +as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self._cars : cars // ignore: cast_nullable_to_non_nullable +as List?,user_level: freezed == user_level ? _self._user_level : user_level // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guild_area_activity { + if (_self.guild_area_activity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guild_area_activity!, (value) { + return _then(_self.copyWith(guild_area_activity: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guild_type_activity { + if (_self.guild_type_activity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guild_type_activity!, (value) { + return _then(_self.copyWith(guild_type_activity: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$PosStatusCopyWith<$Res>? get get_pos_status { + if (_self.get_pos_status == null) { + return null; + } + + return $PosStatusCopyWith<$Res>(_self.get_pos_status!, (value) { + return _then(_self.copyWith(get_pos_status: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + String? get fullname; String? get first_name; String? get last_name; String? get mobile; String? get national_id; String? get city; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,mobile,national_id,city); + +@override +String toString() { + return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, mobile: $mobile, national_id: $national_id, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city +}); + + + + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? city = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable +as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _User implements User { + _User({this.fullname, this.first_name, this.last_name, this.mobile, this.national_id, this.city}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final String? fullname; +@override final String? first_name; +@override final String? last_name; +@override final String? mobile; +@override final String? national_id; +@override final String? city; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,mobile,national_id,city); + +@override +String toString() { + return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, mobile: $mobile, national_id: $national_id, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city +}); + + + + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? city = freezed,}) { + return _then(_User( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable +as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$Address { + + Province? get province; Province? get city; String? get address; String? get postal_code; +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AddressCopyWith
get copyWith => _$AddressCopyWithImpl
(this as Address, _$identity); + + /// Serializes this Address to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; +} + + +} + +/// @nodoc +abstract mixin class $AddressCopyWith<$Res> { + factory $AddressCopyWith(Address value, $Res Function(Address) _then) = _$AddressCopyWithImpl; +@useResult +$Res call({ + Province? province, Province? city, String? address, String? postal_code +}); + + +$ProvinceCopyWith<$Res>? get province;$ProvinceCopyWith<$Res>? get city; + +} +/// @nodoc +class _$AddressCopyWithImpl<$Res> + implements $AddressCopyWith<$Res> { + _$AddressCopyWithImpl(this._self, this._then); + + final Address _self; + final $Res Function(Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { + return _then(_self.copyWith( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as Province?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Address implements Address { + _Address({this.province, this.city, this.address, this.postal_code}); + factory _Address.fromJson(Map json) => _$AddressFromJson(json); + +@override final Province? province; +@override final Province? city; +@override final String? address; +@override final String? postal_code; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AddressCopyWith<_Address> get copyWith => __$AddressCopyWithImpl<_Address>(this, _$identity); + +@override +Map toJson() { + return _$AddressToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; +} + + +} + +/// @nodoc +abstract mixin class _$AddressCopyWith<$Res> implements $AddressCopyWith<$Res> { + factory _$AddressCopyWith(_Address value, $Res Function(_Address) _then) = __$AddressCopyWithImpl; +@override @useResult +$Res call({ + Province? province, Province? city, String? address, String? postal_code +}); + + +@override $ProvinceCopyWith<$Res>? get province;@override $ProvinceCopyWith<$Res>? get city; + +} +/// @nodoc +class __$AddressCopyWithImpl<$Res> + implements _$AddressCopyWith<$Res> { + __$AddressCopyWithImpl(this._self, this._then); + + final _Address _self; + final $Res Function(_Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { + return _then(_Address( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as Province?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$Province { + + String? get key; String? get name; +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProvinceCopyWith get copyWith => _$ProvinceCopyWithImpl(this as Province, _$identity); + + /// Serializes this Province to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $ProvinceCopyWith<$Res> { + factory $ProvinceCopyWith(Province value, $Res Function(Province) _then) = _$ProvinceCopyWithImpl; +@useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class _$ProvinceCopyWithImpl<$Res> + implements $ProvinceCopyWith<$Res> { + _$ProvinceCopyWithImpl(this._self, this._then); + + final Province _self; + final $Res Function(Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Province implements Province { + _Province({this.key, this.name}); + factory _Province.fromJson(Map json) => _$ProvinceFromJson(json); + +@override final String? key; +@override final String? name; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProvinceCopyWith<_Province> get copyWith => __$ProvinceCopyWithImpl<_Province>(this, _$identity); + +@override +Map toJson() { + return _$ProvinceToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProvinceCopyWith<$Res> implements $ProvinceCopyWith<$Res> { + factory _$ProvinceCopyWith(_Province value, $Res Function(_Province) _then) = __$ProvinceCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class __$ProvinceCopyWithImpl<$Res> + implements _$ProvinceCopyWith<$Res> { + __$ProvinceCopyWithImpl(this._self, this._then); + + final _Province _self; + final $Res Function(_Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_Province( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$Activity { + + String? get key; String? get title; +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ActivityCopyWith get copyWith => _$ActivityCopyWithImpl(this as Activity, _$identity); + + /// Serializes this Activity to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Activity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'Activity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $ActivityCopyWith<$Res> { + factory $ActivityCopyWith(Activity value, $Res Function(Activity) _then) = _$ActivityCopyWithImpl; +@useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class _$ActivityCopyWithImpl<$Res> + implements $ActivityCopyWith<$Res> { + _$ActivityCopyWithImpl(this._self, this._then); + + final Activity _self; + final $Res Function(Activity) _then; + +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Activity implements Activity { + _Activity({this.key, this.title}); + factory _Activity.fromJson(Map json) => _$ActivityFromJson(json); + +@override final String? key; +@override final String? title; + +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ActivityCopyWith<_Activity> get copyWith => __$ActivityCopyWithImpl<_Activity>(this, _$identity); + +@override +Map toJson() { + return _$ActivityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Activity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'Activity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$ActivityCopyWith<$Res> implements $ActivityCopyWith<$Res> { + factory _$ActivityCopyWith(_Activity value, $Res Function(_Activity) _then) = __$ActivityCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class __$ActivityCopyWithImpl<$Res> + implements _$ActivityCopyWith<$Res> { + __$ActivityCopyWithImpl(this._self, this._then); + + final _Activity _self; + final $Res Function(_Activity) _then; + +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_Activity( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$PosStatus { + + int? get len_active_sessions; bool? get has_pons; bool? get has_active_pons; +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PosStatusCopyWith get copyWith => _$PosStatusCopyWithImpl(this as PosStatus, _$identity); + + /// Serializes this PosStatus to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosStatus&&(identical(other.len_active_sessions, len_active_sessions) || other.len_active_sessions == len_active_sessions)&&(identical(other.has_pons, has_pons) || other.has_pons == has_pons)&&(identical(other.has_active_pons, has_active_pons) || other.has_active_pons == has_active_pons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,len_active_sessions,has_pons,has_active_pons); + +@override +String toString() { + return 'PosStatus(len_active_sessions: $len_active_sessions, has_pons: $has_pons, has_active_pons: $has_active_pons)'; +} + + +} + +/// @nodoc +abstract mixin class $PosStatusCopyWith<$Res> { + factory $PosStatusCopyWith(PosStatus value, $Res Function(PosStatus) _then) = _$PosStatusCopyWithImpl; +@useResult +$Res call({ + int? len_active_sessions, bool? has_pons, bool? has_active_pons +}); + + + + +} +/// @nodoc +class _$PosStatusCopyWithImpl<$Res> + implements $PosStatusCopyWith<$Res> { + _$PosStatusCopyWithImpl(this._self, this._then); + + final PosStatus _self; + final $Res Function(PosStatus) _then; + +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? len_active_sessions = freezed,Object? has_pons = freezed,Object? has_active_pons = freezed,}) { + return _then(_self.copyWith( +len_active_sessions: freezed == len_active_sessions ? _self.len_active_sessions : len_active_sessions // ignore: cast_nullable_to_non_nullable +as int?,has_pons: freezed == has_pons ? _self.has_pons : has_pons // ignore: cast_nullable_to_non_nullable +as bool?,has_active_pons: freezed == has_active_pons ? _self.has_active_pons : has_active_pons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _PosStatus implements PosStatus { + _PosStatus({this.len_active_sessions, this.has_pons, this.has_active_pons}); + factory _PosStatus.fromJson(Map json) => _$PosStatusFromJson(json); + +@override final int? len_active_sessions; +@override final bool? has_pons; +@override final bool? has_active_pons; + +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$PosStatusCopyWith<_PosStatus> get copyWith => __$PosStatusCopyWithImpl<_PosStatus>(this, _$identity); + +@override +Map toJson() { + return _$PosStatusToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PosStatus&&(identical(other.len_active_sessions, len_active_sessions) || other.len_active_sessions == len_active_sessions)&&(identical(other.has_pons, has_pons) || other.has_pons == has_pons)&&(identical(other.has_active_pons, has_active_pons) || other.has_active_pons == has_active_pons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,len_active_sessions,has_pons,has_active_pons); + +@override +String toString() { + return 'PosStatus(len_active_sessions: $len_active_sessions, has_pons: $has_pons, has_active_pons: $has_active_pons)'; +} + + +} + +/// @nodoc +abstract mixin class _$PosStatusCopyWith<$Res> implements $PosStatusCopyWith<$Res> { + factory _$PosStatusCopyWith(_PosStatus value, $Res Function(_PosStatus) _then) = __$PosStatusCopyWithImpl; +@override @useResult +$Res call({ + int? len_active_sessions, bool? has_pons, bool? has_active_pons +}); + + + + +} +/// @nodoc +class __$PosStatusCopyWithImpl<$Res> + implements _$PosStatusCopyWith<$Res> { + __$PosStatusCopyWithImpl(this._self, this._then); + + final _PosStatus _self; + final $Res Function(_PosStatus) _then; + +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? len_active_sessions = freezed,Object? has_pons = freezed,Object? has_active_pons = freezed,}) { + return _then(_PosStatus( +len_active_sessions: freezed == len_active_sessions ? _self.len_active_sessions : len_active_sessions // ignore: cast_nullable_to_non_nullable +as int?,has_pons: freezed == has_pons ? _self.has_pons : has_pons // ignore: cast_nullable_to_non_nullable +as bool?,has_active_pons: freezed == has_active_pons ? _self.has_active_pons : has_active_pons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart new file mode 100644 index 0000000..9116ccf --- /dev/null +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart @@ -0,0 +1,373 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'allocated_made.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_AllocatedMadeModel _$AllocatedMadeModelFromJson(Map json) => + _AllocatedMadeModel( + count: (json['count'] as num?)?.toInt(), + next: json['next'] as String?, + previous: json['previous'] as String?, + results: (json['results'] as List?) + ?.map((e) => AllocatedMadeResult.fromJson(e as Map)) + .toList(), + ); + +Map _$AllocatedMadeModelToJson(_AllocatedMadeModel instance) => + { + 'count': instance.count, + 'next': instance.next, + 'previous': instance.previous, + 'results': instance.results, + }; + +_AllocatedMadeResult _$AllocatedMadeResultFromJson( + Map json, +) => _AllocatedMadeResult( + id: (json['id'] as num?)?.toInt(), + product: json['product'] == null + ? null + : Product.fromJson(json['product'] as Map), + kill_house: json['kill_house'], + to_kill_house: json['to_kill_house'], + steward: json['steward'] == null + ? null + : Steward.fromJson(json['steward'] as Map), + to_steward: json['to_steward'], + guilds: json['guilds'], + to_guilds: json['to_guilds'] == null + ? null + : Steward.fromJson(json['to_guilds'] as Map), + to_cold_house: json['to_cold_house'], + index_weight: (json['index_weight'] as num?)?.toInt(), + date_timestamp: (json['date_timestamp'] as num?)?.toInt(), + new_state: (json['new_state'] as num?)?.toInt(), + new_receiver_state: (json['new_receiver_state'] as num?)?.toInt(), + new_allocation_state: (json['new_allocation_state'] as num?)?.toInt(), + key: json['key'] as String?, + create_date: json['create_date'] as String?, + modify_date: json['modify_date'] as String?, + trash: json['trash'] as bool?, + number_of_carcasses: (json['number_of_carcasses'] as num?)?.toInt(), + real_number_of_carcasses: (json['real_number_of_carcasses'] as num?)?.toInt(), + receiver_real_number_of_carcasses: + (json['receiver_real_number_of_carcasses'] as num?)?.toInt(), + weight_of_carcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + real_weight_of_carcasses: (json['real_weight_of_carcasses'] as num?)?.toInt(), + receiver_real_weight_of_carcasses: + (json['receiver_real_weight_of_carcasses'] as num?)?.toInt(), + weight_loss_of_carcasses: (json['weight_loss_of_carcasses'] as num?)?.toInt(), + final_registration: json['final_registration'] as bool?, + sell_type: json['sell_type'] as String?, + product_name: json['product_name'] as String?, + seller_type: json['seller_type'] as String?, + type: json['type'] as String?, + sale_type: json['sale_type'] as String?, + allocation_type: json['allocation_type'] as String?, + system_registration_code: json['system_registration_code'] as bool?, + registration_code: (json['registration_code'] as num?)?.toInt(), + amount: (json['amount'] as num?)?.toInt(), + total_amount: (json['total_amount'] as num?)?.toInt(), + total_amount_paid: (json['total_amount_paid'] as num?)?.toInt(), + total_amount_remain: (json['total_amount_remain'] as num?)?.toInt(), + logged_registration_code: json['logged_registration_code'] as String?, + state: json['state'] as String?, + receiver_state: json['receiver_state'] as String?, + allocation_state: json['allocation_state'] as String?, + date: json['date'] as String?, + role: json['role'] as String?, + steward_temp_key: json['steward_temp_key'] as String?, + approved_price_status: json['approved_price_status'] as bool?, + calculate_status: json['calculate_status'] as bool?, + temporary_trash: json['temporary_trash'] as bool?, + temporary_deleted: json['temporary_deleted'] as bool?, + created_by: json['created_by'] as String?, + modified_by: json['modified_by'] as String?, + ware_house: json['ware_house'], + steward_ware_house: json['steward_ware_house'], + car: json['car'], + dispenser: json['dispenser'], +); + +Map _$AllocatedMadeResultToJson( + _AllocatedMadeResult instance, +) => { + 'id': instance.id, + 'product': instance.product, + 'kill_house': instance.kill_house, + 'to_kill_house': instance.to_kill_house, + 'steward': instance.steward, + 'to_steward': instance.to_steward, + 'guilds': instance.guilds, + 'to_guilds': instance.to_guilds, + 'to_cold_house': instance.to_cold_house, + 'index_weight': instance.index_weight, + 'date_timestamp': instance.date_timestamp, + 'new_state': instance.new_state, + 'new_receiver_state': instance.new_receiver_state, + 'new_allocation_state': instance.new_allocation_state, + 'key': instance.key, + 'create_date': instance.create_date, + 'modify_date': instance.modify_date, + 'trash': instance.trash, + 'number_of_carcasses': instance.number_of_carcasses, + 'real_number_of_carcasses': instance.real_number_of_carcasses, + 'receiver_real_number_of_carcasses': + instance.receiver_real_number_of_carcasses, + 'weight_of_carcasses': instance.weight_of_carcasses, + 'real_weight_of_carcasses': instance.real_weight_of_carcasses, + 'receiver_real_weight_of_carcasses': + instance.receiver_real_weight_of_carcasses, + 'weight_loss_of_carcasses': instance.weight_loss_of_carcasses, + 'final_registration': instance.final_registration, + 'sell_type': instance.sell_type, + 'product_name': instance.product_name, + 'seller_type': instance.seller_type, + 'type': instance.type, + 'sale_type': instance.sale_type, + 'allocation_type': instance.allocation_type, + 'system_registration_code': instance.system_registration_code, + 'registration_code': instance.registration_code, + 'amount': instance.amount, + 'total_amount': instance.total_amount, + 'total_amount_paid': instance.total_amount_paid, + 'total_amount_remain': instance.total_amount_remain, + 'logged_registration_code': instance.logged_registration_code, + 'state': instance.state, + 'receiver_state': instance.receiver_state, + 'allocation_state': instance.allocation_state, + 'date': instance.date, + 'role': instance.role, + 'steward_temp_key': instance.steward_temp_key, + 'approved_price_status': instance.approved_price_status, + 'calculate_status': instance.calculate_status, + 'temporary_trash': instance.temporary_trash, + 'temporary_deleted': instance.temporary_deleted, + 'created_by': instance.created_by, + 'modified_by': instance.modified_by, + 'ware_house': instance.ware_house, + 'steward_ware_house': instance.steward_ware_house, + 'car': instance.car, + 'dispenser': instance.dispenser, +}; + +_Product _$ProductFromJson(Map json) => + _Product(weight_average: (json['weight_average'] as num?)?.toInt()); + +Map _$ProductToJson(_Product instance) => { + 'weight_average': instance.weight_average, +}; + +_Steward _$StewardFromJson(Map json) => _Steward( + id: (json['id'] as num?)?.toInt(), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + address: json['address'] == null + ? null + : Address.fromJson(json['address'] as Map), + guild_area_activity: json['guild_area_activity'] == null + ? null + : Activity.fromJson(json['guild_area_activity'] as Map), + guild_type_activity: json['guild_type_activity'] == null + ? null + : Activity.fromJson(json['guild_type_activity'] as Map), + kill_house: json['kill_house'] as List?, + steward_kill_house: json['steward_kill_house'] as List?, + stewards: json['stewards'] as List?, + get_pos_status: json['get_pos_status'] == null + ? null + : PosStatus.fromJson(json['get_pos_status'] as Map), + key: json['key'] as String?, + create_date: json['create_date'] as String?, + modify_date: json['modify_date'] as String?, + trash: json['trash'] as bool?, + user_id_foreign_key: json['user_id_foreign_key'], + address_id_foreign_key: json['address_id_foreign_key'], + user_bank_id_foreign_key: json['user_bank_id_foreign_key'], + wallet_id_foreign_key: json['wallet_id_foreign_key'], + provincial_government_id_key: json['provincial_government_id_key'], + identity_documents: json['identity_documents'], + active: json['active'] as bool?, + city_number: (json['city_number'] as num?)?.toInt(), + city_name: json['city_name'] as String?, + guilds_id: json['guilds_id'] as String?, + license_number: json['license_number'] as String?, + guilds_name: json['guilds_name'] as String?, + phone: json['phone'] as String?, + type_activity: json['type_activity'] as String?, + area_activity: json['area_activity'] as String?, + province_number: (json['province_number'] as num?)?.toInt(), + province_name: json['province_name'] as String?, + steward: json['steward'] as bool?, + has_pos: json['has_pos'] as bool?, + centers_allocation: json['centers_allocation'], + kill_house_centers_allocation: json['kill_house_centers_allocation'], + allocation_limit: json['allocation_limit'], + limitation_allocation: json['limitation_allocation'] as bool?, + registerar_role: json['registerar_role'] as String?, + registerar_fullname: json['registerar_fullname'] as String?, + registerar_mobile: json['registerar_mobile'] as String?, + kill_house_register: json['kill_house_register'] as bool?, + steward_register: json['steward_register'] as bool?, + guilds_room_register: json['guilds_room_register'] as bool?, + pos_company_register: json['pos_company_register'] as bool?, + province_accept_state: json['province_accept_state'] as String?, + province_message: json['province_message'] as String?, + condition: json['condition'] as String?, + description_condition: json['description_condition'] as String?, + steward_active: json['steward_active'] as bool?, + steward_allocation_limit: json['steward_allocation_limit'], + steward_limitation_allocation: json['steward_limitation_allocation'] as bool?, + license: json['license'] as bool?, + license_form: json['license_form'], + license_file: json['license_file'], + reviewer_role: json['reviewer_role'] as String?, + reviewer_fullname: json['reviewer_fullname'] as String?, + reviewer_mobile: json['reviewer_mobile'] as String?, + checker_message: json['checker_message'] as String?, + final_accept: json['final_accept'] as bool?, + temporary_registration: json['temporary_registration'] as bool?, + created_by: json['created_by'] as String?, + modified_by: json['modified_by'] as String?, + user_bank_info: json['user_bank_info'], + wallet: (json['wallet'] as num?)?.toInt(), + cars: json['cars'] as List?, + user_level: json['user_level'] as List?, +); + +Map _$StewardToJson(_Steward instance) => { + 'id': instance.id, + 'user': instance.user, + 'address': instance.address, + 'guild_area_activity': instance.guild_area_activity, + 'guild_type_activity': instance.guild_type_activity, + 'kill_house': instance.kill_house, + 'steward_kill_house': instance.steward_kill_house, + 'stewards': instance.stewards, + 'get_pos_status': instance.get_pos_status, + 'key': instance.key, + 'create_date': instance.create_date, + 'modify_date': instance.modify_date, + 'trash': instance.trash, + 'user_id_foreign_key': instance.user_id_foreign_key, + 'address_id_foreign_key': instance.address_id_foreign_key, + 'user_bank_id_foreign_key': instance.user_bank_id_foreign_key, + 'wallet_id_foreign_key': instance.wallet_id_foreign_key, + 'provincial_government_id_key': instance.provincial_government_id_key, + 'identity_documents': instance.identity_documents, + 'active': instance.active, + 'city_number': instance.city_number, + 'city_name': instance.city_name, + 'guilds_id': instance.guilds_id, + 'license_number': instance.license_number, + 'guilds_name': instance.guilds_name, + 'phone': instance.phone, + 'type_activity': instance.type_activity, + 'area_activity': instance.area_activity, + 'province_number': instance.province_number, + 'province_name': instance.province_name, + 'steward': instance.steward, + 'has_pos': instance.has_pos, + 'centers_allocation': instance.centers_allocation, + 'kill_house_centers_allocation': instance.kill_house_centers_allocation, + 'allocation_limit': instance.allocation_limit, + 'limitation_allocation': instance.limitation_allocation, + 'registerar_role': instance.registerar_role, + 'registerar_fullname': instance.registerar_fullname, + 'registerar_mobile': instance.registerar_mobile, + 'kill_house_register': instance.kill_house_register, + 'steward_register': instance.steward_register, + 'guilds_room_register': instance.guilds_room_register, + 'pos_company_register': instance.pos_company_register, + 'province_accept_state': instance.province_accept_state, + 'province_message': instance.province_message, + 'condition': instance.condition, + 'description_condition': instance.description_condition, + 'steward_active': instance.steward_active, + 'steward_allocation_limit': instance.steward_allocation_limit, + 'steward_limitation_allocation': instance.steward_limitation_allocation, + 'license': instance.license, + 'license_form': instance.license_form, + 'license_file': instance.license_file, + 'reviewer_role': instance.reviewer_role, + 'reviewer_fullname': instance.reviewer_fullname, + 'reviewer_mobile': instance.reviewer_mobile, + 'checker_message': instance.checker_message, + 'final_accept': instance.final_accept, + 'temporary_registration': instance.temporary_registration, + 'created_by': instance.created_by, + 'modified_by': instance.modified_by, + 'user_bank_info': instance.user_bank_info, + 'wallet': instance.wallet, + 'cars': instance.cars, + 'user_level': instance.user_level, +}; + +_User _$UserFromJson(Map json) => _User( + fullname: json['fullname'] as String?, + first_name: json['first_name'] as String?, + last_name: json['last_name'] as String?, + mobile: json['mobile'] as String?, + national_id: json['national_id'] as String?, + city: json['city'] as String?, +); + +Map _$UserToJson(_User instance) => { + 'fullname': instance.fullname, + 'first_name': instance.first_name, + 'last_name': instance.last_name, + 'mobile': instance.mobile, + 'national_id': instance.national_id, + 'city': instance.city, +}; + +_Address _$AddressFromJson(Map json) => _Address( + province: json['province'] == null + ? null + : Province.fromJson(json['province'] as Map), + city: json['city'] == null + ? null + : Province.fromJson(json['city'] as Map), + address: json['address'] as String?, + postal_code: json['postal_code'] as String?, +); + +Map _$AddressToJson(_Address instance) => { + 'province': instance.province, + 'city': instance.city, + 'address': instance.address, + 'postal_code': instance.postal_code, +}; + +_Province _$ProvinceFromJson(Map json) => + _Province(key: json['key'] as String?, name: json['name'] as String?); + +Map _$ProvinceToJson(_Province instance) => { + 'key': instance.key, + 'name': instance.name, +}; + +_Activity _$ActivityFromJson(Map json) => + _Activity(key: json['key'] as String?, title: json['title'] as String?); + +Map _$ActivityToJson(_Activity instance) => { + 'key': instance.key, + 'title': instance.title, +}; + +_PosStatus _$PosStatusFromJson(Map json) => _PosStatus( + len_active_sessions: (json['len_active_sessions'] as num?)?.toInt(), + has_pons: json['has_pons'] as bool?, + has_active_pons: json['has_active_pons'] as bool?, +); + +Map _$PosStatusToJson(_PosStatus instance) => + { + 'len_active_sessions': instance.len_active_sessions, + 'has_pons': instance.has_pons, + 'has_active_pons': instance.has_active_pons, + }; diff --git a/packages/chicken/lib/data/models/response/bar_information/bar_information.dart b/packages/chicken/lib/data/models/response/bar_information/bar_information.dart new file mode 100644 index 0000000..ed39c98 --- /dev/null +++ b/packages/chicken/lib/data/models/response/bar_information/bar_information.dart @@ -0,0 +1,25 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'bar_information.freezed.dart'; +part 'bar_information.g.dart'; + +@freezed +abstract class BarInformation with _$BarInformation { + const factory BarInformation({ + int? totalBars, + int? totalBarsQuantity, + double? totalBarsWeight, + int? totalEnteredBars, + int? totalEnteredBarsQuantity, + double? totalEnteredBarsWeight, + int? totalNotEnteredBars, + int? totalNotEnteredBarsQuantity, + double? totalNotEnteredKillHouseRequestsWeight, + int? totalRejectedBars, + int? totalRejectedBarsQuantity, + double? totalRejectedBarsWeight, + }) = _BarInformation; + + factory BarInformation.fromJson(Map json) => + _$BarInformationFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart b/packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart new file mode 100644 index 0000000..e8b13e8 --- /dev/null +++ b/packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart @@ -0,0 +1,181 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'bar_information.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$BarInformation { + + int? get totalBars; int? get totalBarsQuantity; double? get totalBarsWeight; int? get totalEnteredBars; int? get totalEnteredBarsQuantity; double? get totalEnteredBarsWeight; int? get totalNotEnteredBars; int? get totalNotEnteredBarsQuantity; double? get totalNotEnteredKillHouseRequestsWeight; int? get totalRejectedBars; int? get totalRejectedBarsQuantity; double? get totalRejectedBarsWeight; +/// Create a copy of BarInformation +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BarInformationCopyWith get copyWith => _$BarInformationCopyWithImpl(this as BarInformation, _$identity); + + /// Serializes this BarInformation to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is BarInformation&&(identical(other.totalBars, totalBars) || other.totalBars == totalBars)&&(identical(other.totalBarsQuantity, totalBarsQuantity) || other.totalBarsQuantity == totalBarsQuantity)&&(identical(other.totalBarsWeight, totalBarsWeight) || other.totalBarsWeight == totalBarsWeight)&&(identical(other.totalEnteredBars, totalEnteredBars) || other.totalEnteredBars == totalEnteredBars)&&(identical(other.totalEnteredBarsQuantity, totalEnteredBarsQuantity) || other.totalEnteredBarsQuantity == totalEnteredBarsQuantity)&&(identical(other.totalEnteredBarsWeight, totalEnteredBarsWeight) || other.totalEnteredBarsWeight == totalEnteredBarsWeight)&&(identical(other.totalNotEnteredBars, totalNotEnteredBars) || other.totalNotEnteredBars == totalNotEnteredBars)&&(identical(other.totalNotEnteredBarsQuantity, totalNotEnteredBarsQuantity) || other.totalNotEnteredBarsQuantity == totalNotEnteredBarsQuantity)&&(identical(other.totalNotEnteredKillHouseRequestsWeight, totalNotEnteredKillHouseRequestsWeight) || other.totalNotEnteredKillHouseRequestsWeight == totalNotEnteredKillHouseRequestsWeight)&&(identical(other.totalRejectedBars, totalRejectedBars) || other.totalRejectedBars == totalRejectedBars)&&(identical(other.totalRejectedBarsQuantity, totalRejectedBarsQuantity) || other.totalRejectedBarsQuantity == totalRejectedBarsQuantity)&&(identical(other.totalRejectedBarsWeight, totalRejectedBarsWeight) || other.totalRejectedBarsWeight == totalRejectedBarsWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,totalBars,totalBarsQuantity,totalBarsWeight,totalEnteredBars,totalEnteredBarsQuantity,totalEnteredBarsWeight,totalNotEnteredBars,totalNotEnteredBarsQuantity,totalNotEnteredKillHouseRequestsWeight,totalRejectedBars,totalRejectedBarsQuantity,totalRejectedBarsWeight); + +@override +String toString() { + return 'BarInformation(totalBars: $totalBars, totalBarsQuantity: $totalBarsQuantity, totalBarsWeight: $totalBarsWeight, totalEnteredBars: $totalEnteredBars, totalEnteredBarsQuantity: $totalEnteredBarsQuantity, totalEnteredBarsWeight: $totalEnteredBarsWeight, totalNotEnteredBars: $totalNotEnteredBars, totalNotEnteredBarsQuantity: $totalNotEnteredBarsQuantity, totalNotEnteredKillHouseRequestsWeight: $totalNotEnteredKillHouseRequestsWeight, totalRejectedBars: $totalRejectedBars, totalRejectedBarsQuantity: $totalRejectedBarsQuantity, totalRejectedBarsWeight: $totalRejectedBarsWeight)'; +} + + +} + +/// @nodoc +abstract mixin class $BarInformationCopyWith<$Res> { + factory $BarInformationCopyWith(BarInformation value, $Res Function(BarInformation) _then) = _$BarInformationCopyWithImpl; +@useResult +$Res call({ + int? totalBars, int? totalBarsQuantity, double? totalBarsWeight, int? totalEnteredBars, int? totalEnteredBarsQuantity, double? totalEnteredBarsWeight, int? totalNotEnteredBars, int? totalNotEnteredBarsQuantity, double? totalNotEnteredKillHouseRequestsWeight, int? totalRejectedBars, int? totalRejectedBarsQuantity, double? totalRejectedBarsWeight +}); + + + + +} +/// @nodoc +class _$BarInformationCopyWithImpl<$Res> + implements $BarInformationCopyWith<$Res> { + _$BarInformationCopyWithImpl(this._self, this._then); + + final BarInformation _self; + final $Res Function(BarInformation) _then; + +/// Create a copy of BarInformation +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? totalBars = freezed,Object? totalBarsQuantity = freezed,Object? totalBarsWeight = freezed,Object? totalEnteredBars = freezed,Object? totalEnteredBarsQuantity = freezed,Object? totalEnteredBarsWeight = freezed,Object? totalNotEnteredBars = freezed,Object? totalNotEnteredBarsQuantity = freezed,Object? totalNotEnteredKillHouseRequestsWeight = freezed,Object? totalRejectedBars = freezed,Object? totalRejectedBarsQuantity = freezed,Object? totalRejectedBarsWeight = freezed,}) { + return _then(_self.copyWith( +totalBars: freezed == totalBars ? _self.totalBars : totalBars // ignore: cast_nullable_to_non_nullable +as int?,totalBarsQuantity: freezed == totalBarsQuantity ? _self.totalBarsQuantity : totalBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalBarsWeight: freezed == totalBarsWeight ? _self.totalBarsWeight : totalBarsWeight // ignore: cast_nullable_to_non_nullable +as double?,totalEnteredBars: freezed == totalEnteredBars ? _self.totalEnteredBars : totalEnteredBars // ignore: cast_nullable_to_non_nullable +as int?,totalEnteredBarsQuantity: freezed == totalEnteredBarsQuantity ? _self.totalEnteredBarsQuantity : totalEnteredBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalEnteredBarsWeight: freezed == totalEnteredBarsWeight ? _self.totalEnteredBarsWeight : totalEnteredBarsWeight // ignore: cast_nullable_to_non_nullable +as double?,totalNotEnteredBars: freezed == totalNotEnteredBars ? _self.totalNotEnteredBars : totalNotEnteredBars // ignore: cast_nullable_to_non_nullable +as int?,totalNotEnteredBarsQuantity: freezed == totalNotEnteredBarsQuantity ? _self.totalNotEnteredBarsQuantity : totalNotEnteredBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalNotEnteredKillHouseRequestsWeight: freezed == totalNotEnteredKillHouseRequestsWeight ? _self.totalNotEnteredKillHouseRequestsWeight : totalNotEnteredKillHouseRequestsWeight // ignore: cast_nullable_to_non_nullable +as double?,totalRejectedBars: freezed == totalRejectedBars ? _self.totalRejectedBars : totalRejectedBars // ignore: cast_nullable_to_non_nullable +as int?,totalRejectedBarsQuantity: freezed == totalRejectedBarsQuantity ? _self.totalRejectedBarsQuantity : totalRejectedBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalRejectedBarsWeight: freezed == totalRejectedBarsWeight ? _self.totalRejectedBarsWeight : totalRejectedBarsWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _BarInformation implements BarInformation { + const _BarInformation({this.totalBars, this.totalBarsQuantity, this.totalBarsWeight, this.totalEnteredBars, this.totalEnteredBarsQuantity, this.totalEnteredBarsWeight, this.totalNotEnteredBars, this.totalNotEnteredBarsQuantity, this.totalNotEnteredKillHouseRequestsWeight, this.totalRejectedBars, this.totalRejectedBarsQuantity, this.totalRejectedBarsWeight}); + factory _BarInformation.fromJson(Map json) => _$BarInformationFromJson(json); + +@override final int? totalBars; +@override final int? totalBarsQuantity; +@override final double? totalBarsWeight; +@override final int? totalEnteredBars; +@override final int? totalEnteredBarsQuantity; +@override final double? totalEnteredBarsWeight; +@override final int? totalNotEnteredBars; +@override final int? totalNotEnteredBarsQuantity; +@override final double? totalNotEnteredKillHouseRequestsWeight; +@override final int? totalRejectedBars; +@override final int? totalRejectedBarsQuantity; +@override final double? totalRejectedBarsWeight; + +/// Create a copy of BarInformation +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$BarInformationCopyWith<_BarInformation> get copyWith => __$BarInformationCopyWithImpl<_BarInformation>(this, _$identity); + +@override +Map toJson() { + return _$BarInformationToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _BarInformation&&(identical(other.totalBars, totalBars) || other.totalBars == totalBars)&&(identical(other.totalBarsQuantity, totalBarsQuantity) || other.totalBarsQuantity == totalBarsQuantity)&&(identical(other.totalBarsWeight, totalBarsWeight) || other.totalBarsWeight == totalBarsWeight)&&(identical(other.totalEnteredBars, totalEnteredBars) || other.totalEnteredBars == totalEnteredBars)&&(identical(other.totalEnteredBarsQuantity, totalEnteredBarsQuantity) || other.totalEnteredBarsQuantity == totalEnteredBarsQuantity)&&(identical(other.totalEnteredBarsWeight, totalEnteredBarsWeight) || other.totalEnteredBarsWeight == totalEnteredBarsWeight)&&(identical(other.totalNotEnteredBars, totalNotEnteredBars) || other.totalNotEnteredBars == totalNotEnteredBars)&&(identical(other.totalNotEnteredBarsQuantity, totalNotEnteredBarsQuantity) || other.totalNotEnteredBarsQuantity == totalNotEnteredBarsQuantity)&&(identical(other.totalNotEnteredKillHouseRequestsWeight, totalNotEnteredKillHouseRequestsWeight) || other.totalNotEnteredKillHouseRequestsWeight == totalNotEnteredKillHouseRequestsWeight)&&(identical(other.totalRejectedBars, totalRejectedBars) || other.totalRejectedBars == totalRejectedBars)&&(identical(other.totalRejectedBarsQuantity, totalRejectedBarsQuantity) || other.totalRejectedBarsQuantity == totalRejectedBarsQuantity)&&(identical(other.totalRejectedBarsWeight, totalRejectedBarsWeight) || other.totalRejectedBarsWeight == totalRejectedBarsWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,totalBars,totalBarsQuantity,totalBarsWeight,totalEnteredBars,totalEnteredBarsQuantity,totalEnteredBarsWeight,totalNotEnteredBars,totalNotEnteredBarsQuantity,totalNotEnteredKillHouseRequestsWeight,totalRejectedBars,totalRejectedBarsQuantity,totalRejectedBarsWeight); + +@override +String toString() { + return 'BarInformation(totalBars: $totalBars, totalBarsQuantity: $totalBarsQuantity, totalBarsWeight: $totalBarsWeight, totalEnteredBars: $totalEnteredBars, totalEnteredBarsQuantity: $totalEnteredBarsQuantity, totalEnteredBarsWeight: $totalEnteredBarsWeight, totalNotEnteredBars: $totalNotEnteredBars, totalNotEnteredBarsQuantity: $totalNotEnteredBarsQuantity, totalNotEnteredKillHouseRequestsWeight: $totalNotEnteredKillHouseRequestsWeight, totalRejectedBars: $totalRejectedBars, totalRejectedBarsQuantity: $totalRejectedBarsQuantity, totalRejectedBarsWeight: $totalRejectedBarsWeight)'; +} + + +} + +/// @nodoc +abstract mixin class _$BarInformationCopyWith<$Res> implements $BarInformationCopyWith<$Res> { + factory _$BarInformationCopyWith(_BarInformation value, $Res Function(_BarInformation) _then) = __$BarInformationCopyWithImpl; +@override @useResult +$Res call({ + int? totalBars, int? totalBarsQuantity, double? totalBarsWeight, int? totalEnteredBars, int? totalEnteredBarsQuantity, double? totalEnteredBarsWeight, int? totalNotEnteredBars, int? totalNotEnteredBarsQuantity, double? totalNotEnteredKillHouseRequestsWeight, int? totalRejectedBars, int? totalRejectedBarsQuantity, double? totalRejectedBarsWeight +}); + + + + +} +/// @nodoc +class __$BarInformationCopyWithImpl<$Res> + implements _$BarInformationCopyWith<$Res> { + __$BarInformationCopyWithImpl(this._self, this._then); + + final _BarInformation _self; + final $Res Function(_BarInformation) _then; + +/// Create a copy of BarInformation +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? totalBars = freezed,Object? totalBarsQuantity = freezed,Object? totalBarsWeight = freezed,Object? totalEnteredBars = freezed,Object? totalEnteredBarsQuantity = freezed,Object? totalEnteredBarsWeight = freezed,Object? totalNotEnteredBars = freezed,Object? totalNotEnteredBarsQuantity = freezed,Object? totalNotEnteredKillHouseRequestsWeight = freezed,Object? totalRejectedBars = freezed,Object? totalRejectedBarsQuantity = freezed,Object? totalRejectedBarsWeight = freezed,}) { + return _then(_BarInformation( +totalBars: freezed == totalBars ? _self.totalBars : totalBars // ignore: cast_nullable_to_non_nullable +as int?,totalBarsQuantity: freezed == totalBarsQuantity ? _self.totalBarsQuantity : totalBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalBarsWeight: freezed == totalBarsWeight ? _self.totalBarsWeight : totalBarsWeight // ignore: cast_nullable_to_non_nullable +as double?,totalEnteredBars: freezed == totalEnteredBars ? _self.totalEnteredBars : totalEnteredBars // ignore: cast_nullable_to_non_nullable +as int?,totalEnteredBarsQuantity: freezed == totalEnteredBarsQuantity ? _self.totalEnteredBarsQuantity : totalEnteredBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalEnteredBarsWeight: freezed == totalEnteredBarsWeight ? _self.totalEnteredBarsWeight : totalEnteredBarsWeight // ignore: cast_nullable_to_non_nullable +as double?,totalNotEnteredBars: freezed == totalNotEnteredBars ? _self.totalNotEnteredBars : totalNotEnteredBars // ignore: cast_nullable_to_non_nullable +as int?,totalNotEnteredBarsQuantity: freezed == totalNotEnteredBarsQuantity ? _self.totalNotEnteredBarsQuantity : totalNotEnteredBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalNotEnteredKillHouseRequestsWeight: freezed == totalNotEnteredKillHouseRequestsWeight ? _self.totalNotEnteredKillHouseRequestsWeight : totalNotEnteredKillHouseRequestsWeight // ignore: cast_nullable_to_non_nullable +as double?,totalRejectedBars: freezed == totalRejectedBars ? _self.totalRejectedBars : totalRejectedBars // ignore: cast_nullable_to_non_nullable +as int?,totalRejectedBarsQuantity: freezed == totalRejectedBarsQuantity ? _self.totalRejectedBarsQuantity : totalRejectedBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalRejectedBarsWeight: freezed == totalRejectedBarsWeight ? _self.totalRejectedBarsWeight : totalRejectedBarsWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/bar_information/bar_information.g.dart b/packages/chicken/lib/data/models/response/bar_information/bar_information.g.dart new file mode 100644 index 0000000..51c1221 --- /dev/null +++ b/packages/chicken/lib/data/models/response/bar_information/bar_information.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bar_information.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_BarInformation _$BarInformationFromJson(Map json) => + _BarInformation( + totalBars: (json['total_bars'] as num?)?.toInt(), + totalBarsQuantity: (json['total_bars_quantity'] as num?)?.toInt(), + totalBarsWeight: (json['total_bars_weight'] as num?)?.toDouble(), + totalEnteredBars: (json['total_entered_bars'] as num?)?.toInt(), + totalEnteredBarsQuantity: (json['total_entered_bars_quantity'] as num?) + ?.toInt(), + totalEnteredBarsWeight: (json['total_entered_bars_weight'] as num?) + ?.toDouble(), + totalNotEnteredBars: (json['total_not_entered_bars'] as num?)?.toInt(), + totalNotEnteredBarsQuantity: + (json['total_not_entered_bars_quantity'] as num?)?.toInt(), + totalNotEnteredKillHouseRequestsWeight: + (json['total_not_entered_kill_house_requests_weight'] as num?) + ?.toDouble(), + totalRejectedBars: (json['total_rejected_bars'] as num?)?.toInt(), + totalRejectedBarsQuantity: (json['total_rejected_bars_quantity'] as num?) + ?.toInt(), + totalRejectedBarsWeight: (json['total_rejected_bars_weight'] as num?) + ?.toDouble(), + ); + +Map _$BarInformationToJson(_BarInformation instance) => + { + 'total_bars': instance.totalBars, + 'total_bars_quantity': instance.totalBarsQuantity, + 'total_bars_weight': instance.totalBarsWeight, + 'total_entered_bars': instance.totalEnteredBars, + 'total_entered_bars_quantity': instance.totalEnteredBarsQuantity, + 'total_entered_bars_weight': instance.totalEnteredBarsWeight, + 'total_not_entered_bars': instance.totalNotEnteredBars, + 'total_not_entered_bars_quantity': instance.totalNotEnteredBarsQuantity, + 'total_not_entered_kill_house_requests_weight': + instance.totalNotEnteredKillHouseRequestsWeight, + 'total_rejected_bars': instance.totalRejectedBars, + 'total_rejected_bars_quantity': instance.totalRejectedBarsQuantity, + 'total_rejected_bars_weight': instance.totalRejectedBarsWeight, + }; diff --git a/packages/chicken/lib/data/models/response/guild/guild_model.dart b/packages/chicken/lib/data/models/response/guild/guild_model.dart new file mode 100644 index 0000000..22beee1 --- /dev/null +++ b/packages/chicken/lib/data/models/response/guild/guild_model.dart @@ -0,0 +1,28 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'guild_model.freezed.dart'; +part 'guild_model.g.dart'; + +@freezed +abstract class GuildModel with _$GuildModel { + const factory GuildModel({ + String? key, + String? guildsName, + bool? steward, + User? user, + }) = _GuildModel; + + factory GuildModel.fromJson(Map json) => + _$GuildModelFromJson(json); +} + +@freezed +abstract class User with _$User { + const factory User({ + String? fullname, + String? mobile, + String? city, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart b/packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart new file mode 100644 index 0000000..1456502 --- /dev/null +++ b/packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart @@ -0,0 +1,320 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'guild_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$GuildModel { + + String? get key; String? get guildsName; bool? get steward; User? get user; +/// Create a copy of GuildModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GuildModelCopyWith get copyWith => _$GuildModelCopyWithImpl(this as GuildModel, _$identity); + + /// Serializes this GuildModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildModel&&(identical(other.key, key) || other.key == key)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,guildsName,steward,user); + +@override +String toString() { + return 'GuildModel(key: $key, guildsName: $guildsName, steward: $steward, user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class $GuildModelCopyWith<$Res> { + factory $GuildModelCopyWith(GuildModel value, $Res Function(GuildModel) _then) = _$GuildModelCopyWithImpl; +@useResult +$Res call({ + String? key, String? guildsName, bool? steward, User? user +}); + + +$UserCopyWith<$Res>? get user; + +} +/// @nodoc +class _$GuildModelCopyWithImpl<$Res> + implements $GuildModelCopyWith<$Res> { + _$GuildModelCopyWithImpl(this._self, this._then); + + final GuildModel _self; + final $Res Function(GuildModel) _then; + +/// Create a copy of GuildModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? guildsName = freezed,Object? steward = freezed,Object? user = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?, + )); +} +/// Create a copy of GuildModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _GuildModel implements GuildModel { + const _GuildModel({this.key, this.guildsName, this.steward, this.user}); + factory _GuildModel.fromJson(Map json) => _$GuildModelFromJson(json); + +@override final String? key; +@override final String? guildsName; +@override final bool? steward; +@override final User? user; + +/// Create a copy of GuildModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GuildModelCopyWith<_GuildModel> get copyWith => __$GuildModelCopyWithImpl<_GuildModel>(this, _$identity); + +@override +Map toJson() { + return _$GuildModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildModel&&(identical(other.key, key) || other.key == key)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,guildsName,steward,user); + +@override +String toString() { + return 'GuildModel(key: $key, guildsName: $guildsName, steward: $steward, user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class _$GuildModelCopyWith<$Res> implements $GuildModelCopyWith<$Res> { + factory _$GuildModelCopyWith(_GuildModel value, $Res Function(_GuildModel) _then) = __$GuildModelCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? guildsName, bool? steward, User? user +}); + + +@override $UserCopyWith<$Res>? get user; + +} +/// @nodoc +class __$GuildModelCopyWithImpl<$Res> + implements _$GuildModelCopyWith<$Res> { + __$GuildModelCopyWithImpl(this._self, this._then); + + final _GuildModel _self; + final $Res Function(_GuildModel) _then; + +/// Create a copy of GuildModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? guildsName = freezed,Object? steward = freezed,Object? user = freezed,}) { + return _then(_GuildModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?, + )); +} + +/// Create a copy of GuildModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + String? get fullname; String? get mobile; String? get city; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,mobile,city); + +@override +String toString() { + return 'User(fullname: $fullname, mobile: $mobile, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? mobile, String? city +}); + + + + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? city = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _User implements User { + const _User({this.fullname, this.mobile, this.city}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final String? fullname; +@override final String? mobile; +@override final String? city; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,mobile,city); + +@override +String toString() { + return 'User(fullname: $fullname, mobile: $mobile, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? mobile, String? city +}); + + + + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? city = freezed,}) { + return _then(_User( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/guild/guild_model.g.dart b/packages/chicken/lib/data/models/response/guild/guild_model.g.dart new file mode 100644 index 0000000..4b82c26 --- /dev/null +++ b/packages/chicken/lib/data/models/response/guild/guild_model.g.dart @@ -0,0 +1,36 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'guild_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_GuildModel _$GuildModelFromJson(Map json) => _GuildModel( + key: json['key'] as String?, + guildsName: json['guilds_name'] as String?, + steward: json['steward'] as bool?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), +); + +Map _$GuildModelToJson(_GuildModel instance) => + { + 'key': instance.key, + 'guilds_name': instance.guildsName, + 'steward': instance.steward, + 'user': instance.user, + }; + +_User _$UserFromJson(Map json) => _User( + fullname: json['fullname'] as String?, + mobile: json['mobile'] as String?, + city: json['city'] as String?, +); + +Map _$UserToJson(_User instance) => { + 'fullname': instance.fullname, + 'mobile': instance.mobile, + 'city': instance.city, +}; diff --git a/packages/chicken/lib/data/models/response/guild_profile/guild_profile.dart b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.dart new file mode 100644 index 0000000..4572332 --- /dev/null +++ b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.dart @@ -0,0 +1,160 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'guild_profile.freezed.dart'; +part 'guild_profile.g.dart'; + +@freezed +abstract class GuildProfile with _$GuildProfile { + const factory GuildProfile({ + int? id, + User? user, + Address? address, + GuildAreaActivity? guild_area_activity, + GuildTypeActivity? guild_type_activity, + List? kill_house, + List? steward_kill_house, + List? stewards, + GetPosStatus? get_pos_status, + String? key, + String? create_date, + String? modify_date, + bool? trash, + String? user_id_foreign_key, + String? address_id_foreign_key, + String? user_bank_id_foreign_key, + String? wallet_id_foreign_key, + String? provincial_government_id_key, + dynamic identity_documents, + bool? active, + int? city_number, + String? city_name, + String? guilds_id, + String? license_number, + String? guilds_name, + String? phone, + String? type_activity, + String? area_activity, + int? province_number, + String? province_name, + bool? steward, + bool? has_pos, + dynamic centers_allocation, + dynamic kill_house_centers_allocation, + dynamic allocation_limit, + bool? limitation_allocation, + String? registerar_role, + String? registerar_fullname, + String? registerar_mobile, + bool? kill_house_register, + bool? steward_register, + bool? guilds_room_register, + bool? pos_company_register, + String? province_accept_state, + String? province_message, + String? condition, + String? description_condition, + bool? steward_active, + dynamic steward_allocation_limit, + bool? steward_limitation_allocation, + bool? license, + dynamic license_form, + dynamic license_file, + String? reviewer_role, + String? reviewer_fullname, + String? reviewer_mobile, + String? checker_message, + bool? final_accept, + bool? temporary_registration, + String? created_by, + String? modified_by, + dynamic user_bank_info, + int? wallet, + List? cars, + List? user_level, + }) = _GuildProfile; + + factory GuildProfile.fromJson(Map json) => + _$GuildProfileFromJson(json); +} + +@freezed +abstract class User with _$User { + const factory User({ + String? fullname, + String? first_name, + String? last_name, + String? mobile, + String? national_id, + String? city, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} + +@freezed +abstract class Address with _$Address { + const factory Address({ + Province? province, + City? city, + String? address, + String? postal_code, + }) = _Address; + + factory Address.fromJson(Map json) => + _$AddressFromJson(json); +} + +@freezed +abstract class Province with _$Province { + const factory Province({ + String? key, + String? name, + }) = _Province; + + factory Province.fromJson(Map json) => + _$ProvinceFromJson(json); +} + +@freezed +abstract class City with _$City { + const factory City({ + String? key, + String? name, + }) = _City; + + factory City.fromJson(Map json) => _$CityFromJson(json); +} + +@freezed +abstract class GuildAreaActivity with _$GuildAreaActivity { + const factory GuildAreaActivity({ + String? key, + String? title, + }) = _GuildAreaActivity; + + factory GuildAreaActivity.fromJson(Map json) => + _$GuildAreaActivityFromJson(json); +} + +@freezed +abstract class GuildTypeActivity with _$GuildTypeActivity { + const factory GuildTypeActivity({ + String? key, + String? title, + }) = _GuildTypeActivity; + + factory GuildTypeActivity.fromJson(Map json) => + _$GuildTypeActivityFromJson(json); +} + +@freezed +abstract class GetPosStatus with _$GetPosStatus { + const factory GetPosStatus({ + int? len_active_sessions, + bool? has_pons, + bool? has_active_pons, + }) = _GetPosStatus; + + factory GetPosStatus.fromJson(Map json) => + _$GetPosStatusFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart new file mode 100644 index 0000000..12b9656 --- /dev/null +++ b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart @@ -0,0 +1,1521 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'guild_profile.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$GuildProfile { + + int? get id; User? get user; Address? get address; GuildAreaActivity? get guild_area_activity; GuildTypeActivity? get guild_type_activity; List? get kill_house; List? get steward_kill_house; List? get stewards; GetPosStatus? get get_pos_status; String? get key; String? get create_date; String? get modify_date; bool? get trash; String? get user_id_foreign_key; String? get address_id_foreign_key; String? get user_bank_id_foreign_key; String? get wallet_id_foreign_key; String? get provincial_government_id_key; dynamic get identity_documents; bool? get active; int? get city_number; String? get city_name; String? get guilds_id; String? get license_number; String? get guilds_name; String? get phone; String? get type_activity; String? get area_activity; int? get province_number; String? get province_name; bool? get steward; bool? get has_pos; dynamic get centers_allocation; dynamic get kill_house_centers_allocation; dynamic get allocation_limit; bool? get limitation_allocation; String? get registerar_role; String? get registerar_fullname; String? get registerar_mobile; bool? get kill_house_register; bool? get steward_register; bool? get guilds_room_register; bool? get pos_company_register; String? get province_accept_state; String? get province_message; String? get condition; String? get description_condition; bool? get steward_active; dynamic get steward_allocation_limit; bool? get steward_limitation_allocation; bool? get license; dynamic get license_form; dynamic get license_file; String? get reviewer_role; String? get reviewer_fullname; String? get reviewer_mobile; String? get checker_message; bool? get final_accept; bool? get temporary_registration; String? get created_by; String? get modified_by; dynamic get user_bank_info; int? get wallet; List? get cars; List? get user_level; +/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GuildProfileCopyWith get copyWith => _$GuildProfileCopyWithImpl(this as GuildProfile, _$identity); + + /// Serializes this GuildProfile to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildProfile&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guild_area_activity, guild_area_activity) || other.guild_area_activity == guild_area_activity)&&(identical(other.guild_type_activity, guild_type_activity) || other.guild_type_activity == guild_type_activity)&&const DeepCollectionEquality().equals(other.kill_house, kill_house)&&const DeepCollectionEquality().equals(other.steward_kill_house, steward_kill_house)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.get_pos_status, get_pos_status) || other.get_pos_status == get_pos_status)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.user_id_foreign_key, user_id_foreign_key) || other.user_id_foreign_key == user_id_foreign_key)&&(identical(other.address_id_foreign_key, address_id_foreign_key) || other.address_id_foreign_key == address_id_foreign_key)&&(identical(other.user_bank_id_foreign_key, user_bank_id_foreign_key) || other.user_bank_id_foreign_key == user_bank_id_foreign_key)&&(identical(other.wallet_id_foreign_key, wallet_id_foreign_key) || other.wallet_id_foreign_key == wallet_id_foreign_key)&&(identical(other.provincial_government_id_key, provincial_government_id_key) || other.provincial_government_id_key == provincial_government_id_key)&&const DeepCollectionEquality().equals(other.identity_documents, identity_documents)&&(identical(other.active, active) || other.active == active)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.has_pos, has_pos) || other.has_pos == has_pos)&&const DeepCollectionEquality().equals(other.centers_allocation, centers_allocation)&&const DeepCollectionEquality().equals(other.kill_house_centers_allocation, kill_house_centers_allocation)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.limitation_allocation, limitation_allocation) || other.limitation_allocation == limitation_allocation)&&(identical(other.registerar_role, registerar_role) || other.registerar_role == registerar_role)&&(identical(other.registerar_fullname, registerar_fullname) || other.registerar_fullname == registerar_fullname)&&(identical(other.registerar_mobile, registerar_mobile) || other.registerar_mobile == registerar_mobile)&&(identical(other.kill_house_register, kill_house_register) || other.kill_house_register == kill_house_register)&&(identical(other.steward_register, steward_register) || other.steward_register == steward_register)&&(identical(other.guilds_room_register, guilds_room_register) || other.guilds_room_register == guilds_room_register)&&(identical(other.pos_company_register, pos_company_register) || other.pos_company_register == pos_company_register)&&(identical(other.province_accept_state, province_accept_state) || other.province_accept_state == province_accept_state)&&(identical(other.province_message, province_message) || other.province_message == province_message)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.description_condition, description_condition) || other.description_condition == description_condition)&&(identical(other.steward_active, steward_active) || other.steward_active == steward_active)&&const DeepCollectionEquality().equals(other.steward_allocation_limit, steward_allocation_limit)&&(identical(other.steward_limitation_allocation, steward_limitation_allocation) || other.steward_limitation_allocation == steward_limitation_allocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.license_form, license_form)&&const DeepCollectionEquality().equals(other.license_file, license_file)&&(identical(other.reviewer_role, reviewer_role) || other.reviewer_role == reviewer_role)&&(identical(other.reviewer_fullname, reviewer_fullname) || other.reviewer_fullname == reviewer_fullname)&&(identical(other.reviewer_mobile, reviewer_mobile) || other.reviewer_mobile == reviewer_mobile)&&(identical(other.checker_message, checker_message) || other.checker_message == checker_message)&&(identical(other.final_accept, final_accept) || other.final_accept == final_accept)&&(identical(other.temporary_registration, temporary_registration) || other.temporary_registration == temporary_registration)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.user_bank_info, user_bank_info)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other.cars, cars)&&const DeepCollectionEquality().equals(other.user_level, user_level)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guild_area_activity,guild_type_activity,const DeepCollectionEquality().hash(kill_house),const DeepCollectionEquality().hash(steward_kill_house),const DeepCollectionEquality().hash(stewards),get_pos_status,key,create_date,modify_date,trash,user_id_foreign_key,address_id_foreign_key,user_bank_id_foreign_key,wallet_id_foreign_key,provincial_government_id_key,const DeepCollectionEquality().hash(identity_documents),active,city_number,city_name,guilds_id,license_number,guilds_name,phone,type_activity,area_activity,province_number,province_name,steward,has_pos,const DeepCollectionEquality().hash(centers_allocation),const DeepCollectionEquality().hash(kill_house_centers_allocation),const DeepCollectionEquality().hash(allocation_limit),limitation_allocation,registerar_role,registerar_fullname,registerar_mobile,kill_house_register,steward_register,guilds_room_register,pos_company_register,province_accept_state,province_message,condition,description_condition,steward_active,const DeepCollectionEquality().hash(steward_allocation_limit),steward_limitation_allocation,license,const DeepCollectionEquality().hash(license_form),const DeepCollectionEquality().hash(license_file),reviewer_role,reviewer_fullname,reviewer_mobile,checker_message,final_accept,temporary_registration,created_by,modified_by,const DeepCollectionEquality().hash(user_bank_info),wallet,const DeepCollectionEquality().hash(cars),const DeepCollectionEquality().hash(user_level)]); + +@override +String toString() { + return 'GuildProfile(id: $id, user: $user, address: $address, guild_area_activity: $guild_area_activity, guild_type_activity: $guild_type_activity, kill_house: $kill_house, steward_kill_house: $steward_kill_house, stewards: $stewards, get_pos_status: $get_pos_status, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, user_id_foreign_key: $user_id_foreign_key, address_id_foreign_key: $address_id_foreign_key, user_bank_id_foreign_key: $user_bank_id_foreign_key, wallet_id_foreign_key: $wallet_id_foreign_key, provincial_government_id_key: $provincial_government_id_key, identity_documents: $identity_documents, active: $active, city_number: $city_number, city_name: $city_name, guilds_id: $guilds_id, license_number: $license_number, guilds_name: $guilds_name, phone: $phone, type_activity: $type_activity, area_activity: $area_activity, province_number: $province_number, province_name: $province_name, steward: $steward, has_pos: $has_pos, centers_allocation: $centers_allocation, kill_house_centers_allocation: $kill_house_centers_allocation, allocation_limit: $allocation_limit, limitation_allocation: $limitation_allocation, registerar_role: $registerar_role, registerar_fullname: $registerar_fullname, registerar_mobile: $registerar_mobile, kill_house_register: $kill_house_register, steward_register: $steward_register, guilds_room_register: $guilds_room_register, pos_company_register: $pos_company_register, province_accept_state: $province_accept_state, province_message: $province_message, condition: $condition, description_condition: $description_condition, steward_active: $steward_active, steward_allocation_limit: $steward_allocation_limit, steward_limitation_allocation: $steward_limitation_allocation, license: $license, license_form: $license_form, license_file: $license_file, reviewer_role: $reviewer_role, reviewer_fullname: $reviewer_fullname, reviewer_mobile: $reviewer_mobile, checker_message: $checker_message, final_accept: $final_accept, temporary_registration: $temporary_registration, created_by: $created_by, modified_by: $modified_by, user_bank_info: $user_bank_info, wallet: $wallet, cars: $cars, user_level: $user_level)'; +} + + +} + +/// @nodoc +abstract mixin class $GuildProfileCopyWith<$Res> { + factory $GuildProfileCopyWith(GuildProfile value, $Res Function(GuildProfile) _then) = _$GuildProfileCopyWithImpl; +@useResult +$Res call({ + int? id, User? user, Address? address, GuildAreaActivity? guild_area_activity, GuildTypeActivity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, GetPosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, String? user_id_foreign_key, String? address_id_foreign_key, String? user_bank_id_foreign_key, String? wallet_id_foreign_key, String? provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level +}); + + +$UserCopyWith<$Res>? get user;$AddressCopyWith<$Res>? get address;$GuildAreaActivityCopyWith<$Res>? get guild_area_activity;$GuildTypeActivityCopyWith<$Res>? get guild_type_activity;$GetPosStatusCopyWith<$Res>? get get_pos_status; + +} +/// @nodoc +class _$GuildProfileCopyWithImpl<$Res> + implements $GuildProfileCopyWith<$Res> { + _$GuildProfileCopyWithImpl(this._self, this._then); + + final GuildProfile _self; + final $Res Function(GuildProfile) _then; + +/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guild_area_activity = freezed,Object? guild_type_activity = freezed,Object? kill_house = freezed,Object? steward_kill_house = freezed,Object? stewards = freezed,Object? get_pos_status = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? user_id_foreign_key = freezed,Object? address_id_foreign_key = freezed,Object? user_bank_id_foreign_key = freezed,Object? wallet_id_foreign_key = freezed,Object? provincial_government_id_key = freezed,Object? identity_documents = freezed,Object? active = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? guilds_id = freezed,Object? license_number = freezed,Object? guilds_name = freezed,Object? phone = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? steward = freezed,Object? has_pos = freezed,Object? centers_allocation = freezed,Object? kill_house_centers_allocation = freezed,Object? allocation_limit = freezed,Object? limitation_allocation = freezed,Object? registerar_role = freezed,Object? registerar_fullname = freezed,Object? registerar_mobile = freezed,Object? kill_house_register = freezed,Object? steward_register = freezed,Object? guilds_room_register = freezed,Object? pos_company_register = freezed,Object? province_accept_state = freezed,Object? province_message = freezed,Object? condition = freezed,Object? description_condition = freezed,Object? steward_active = freezed,Object? steward_allocation_limit = freezed,Object? steward_limitation_allocation = freezed,Object? license = freezed,Object? license_form = freezed,Object? license_file = freezed,Object? reviewer_role = freezed,Object? reviewer_fullname = freezed,Object? reviewer_mobile = freezed,Object? checker_message = freezed,Object? final_accept = freezed,Object? temporary_registration = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? user_bank_info = freezed,Object? wallet = freezed,Object? cars = freezed,Object? user_level = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,guild_area_activity: freezed == guild_area_activity ? _self.guild_area_activity : guild_area_activity // ignore: cast_nullable_to_non_nullable +as GuildAreaActivity?,guild_type_activity: freezed == guild_type_activity ? _self.guild_type_activity : guild_type_activity // ignore: cast_nullable_to_non_nullable +as GuildTypeActivity?,kill_house: freezed == kill_house ? _self.kill_house : kill_house // ignore: cast_nullable_to_non_nullable +as List?,steward_kill_house: freezed == steward_kill_house ? _self.steward_kill_house : steward_kill_house // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self.stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,get_pos_status: freezed == get_pos_status ? _self.get_pos_status : get_pos_status // ignore: cast_nullable_to_non_nullable +as GetPosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,user_id_foreign_key: freezed == user_id_foreign_key ? _self.user_id_foreign_key : user_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,address_id_foreign_key: freezed == address_id_foreign_key ? _self.address_id_foreign_key : address_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,user_bank_id_foreign_key: freezed == user_bank_id_foreign_key ? _self.user_bank_id_foreign_key : user_bank_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,wallet_id_foreign_key: freezed == wallet_id_foreign_key ? _self.wallet_id_foreign_key : wallet_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,provincial_government_id_key: freezed == provincial_government_id_key ? _self.provincial_government_id_key : provincial_government_id_key // ignore: cast_nullable_to_non_nullable +as String?,identity_documents: freezed == identity_documents ? _self.identity_documents : identity_documents // ignore: cast_nullable_to_non_nullable +as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable +as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable +as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable +as String?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable +as String?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable +as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable +as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable +as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,has_pos: freezed == has_pos ? _self.has_pos : has_pos // ignore: cast_nullable_to_non_nullable +as bool?,centers_allocation: freezed == centers_allocation ? _self.centers_allocation : centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,kill_house_centers_allocation: freezed == kill_house_centers_allocation ? _self.kill_house_centers_allocation : kill_house_centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,limitation_allocation: freezed == limitation_allocation ? _self.limitation_allocation : limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,registerar_role: freezed == registerar_role ? _self.registerar_role : registerar_role // ignore: cast_nullable_to_non_nullable +as String?,registerar_fullname: freezed == registerar_fullname ? _self.registerar_fullname : registerar_fullname // ignore: cast_nullable_to_non_nullable +as String?,registerar_mobile: freezed == registerar_mobile ? _self.registerar_mobile : registerar_mobile // ignore: cast_nullable_to_non_nullable +as String?,kill_house_register: freezed == kill_house_register ? _self.kill_house_register : kill_house_register // ignore: cast_nullable_to_non_nullable +as bool?,steward_register: freezed == steward_register ? _self.steward_register : steward_register // ignore: cast_nullable_to_non_nullable +as bool?,guilds_room_register: freezed == guilds_room_register ? _self.guilds_room_register : guilds_room_register // ignore: cast_nullable_to_non_nullable +as bool?,pos_company_register: freezed == pos_company_register ? _self.pos_company_register : pos_company_register // ignore: cast_nullable_to_non_nullable +as bool?,province_accept_state: freezed == province_accept_state ? _self.province_accept_state : province_accept_state // ignore: cast_nullable_to_non_nullable +as String?,province_message: freezed == province_message ? _self.province_message : province_message // ignore: cast_nullable_to_non_nullable +as String?,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable +as String?,description_condition: freezed == description_condition ? _self.description_condition : description_condition // ignore: cast_nullable_to_non_nullable +as String?,steward_active: freezed == steward_active ? _self.steward_active : steward_active // ignore: cast_nullable_to_non_nullable +as bool?,steward_allocation_limit: freezed == steward_allocation_limit ? _self.steward_allocation_limit : steward_allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,steward_limitation_allocation: freezed == steward_limitation_allocation ? _self.steward_limitation_allocation : steward_limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,license_form: freezed == license_form ? _self.license_form : license_form // ignore: cast_nullable_to_non_nullable +as dynamic,license_file: freezed == license_file ? _self.license_file : license_file // ignore: cast_nullable_to_non_nullable +as dynamic,reviewer_role: freezed == reviewer_role ? _self.reviewer_role : reviewer_role // ignore: cast_nullable_to_non_nullable +as String?,reviewer_fullname: freezed == reviewer_fullname ? _self.reviewer_fullname : reviewer_fullname // ignore: cast_nullable_to_non_nullable +as String?,reviewer_mobile: freezed == reviewer_mobile ? _self.reviewer_mobile : reviewer_mobile // ignore: cast_nullable_to_non_nullable +as String?,checker_message: freezed == checker_message ? _self.checker_message : checker_message // ignore: cast_nullable_to_non_nullable +as String?,final_accept: freezed == final_accept ? _self.final_accept : final_accept // ignore: cast_nullable_to_non_nullable +as bool?,temporary_registration: freezed == temporary_registration ? _self.temporary_registration : temporary_registration // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,user_bank_info: freezed == user_bank_info ? _self.user_bank_info : user_bank_info // ignore: cast_nullable_to_non_nullable +as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self.cars : cars // ignore: cast_nullable_to_non_nullable +as List?,user_level: freezed == user_level ? _self.user_level : user_level // ignore: cast_nullable_to_non_nullable +as List?, + )); +} +/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildAreaActivityCopyWith<$Res>? get guild_area_activity { + if (_self.guild_area_activity == null) { + return null; + } + + return $GuildAreaActivityCopyWith<$Res>(_self.guild_area_activity!, (value) { + return _then(_self.copyWith(guild_area_activity: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildTypeActivityCopyWith<$Res>? get guild_type_activity { + if (_self.guild_type_activity == null) { + return null; + } + + return $GuildTypeActivityCopyWith<$Res>(_self.guild_type_activity!, (value) { + return _then(_self.copyWith(guild_type_activity: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GetPosStatusCopyWith<$Res>? get get_pos_status { + if (_self.get_pos_status == null) { + return null; + } + + return $GetPosStatusCopyWith<$Res>(_self.get_pos_status!, (value) { + return _then(_self.copyWith(get_pos_status: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _GuildProfile implements GuildProfile { + const _GuildProfile({this.id, this.user, this.address, this.guild_area_activity, this.guild_type_activity, final List? kill_house, final List? steward_kill_house, final List? stewards, this.get_pos_status, this.key, this.create_date, this.modify_date, this.trash, this.user_id_foreign_key, this.address_id_foreign_key, this.user_bank_id_foreign_key, this.wallet_id_foreign_key, this.provincial_government_id_key, this.identity_documents, this.active, this.city_number, this.city_name, this.guilds_id, this.license_number, this.guilds_name, this.phone, this.type_activity, this.area_activity, this.province_number, this.province_name, this.steward, this.has_pos, this.centers_allocation, this.kill_house_centers_allocation, this.allocation_limit, this.limitation_allocation, this.registerar_role, this.registerar_fullname, this.registerar_mobile, this.kill_house_register, this.steward_register, this.guilds_room_register, this.pos_company_register, this.province_accept_state, this.province_message, this.condition, this.description_condition, this.steward_active, this.steward_allocation_limit, this.steward_limitation_allocation, this.license, this.license_form, this.license_file, this.reviewer_role, this.reviewer_fullname, this.reviewer_mobile, this.checker_message, this.final_accept, this.temporary_registration, this.created_by, this.modified_by, this.user_bank_info, this.wallet, final List? cars, final List? user_level}): _kill_house = kill_house,_steward_kill_house = steward_kill_house,_stewards = stewards,_cars = cars,_user_level = user_level; + factory _GuildProfile.fromJson(Map json) => _$GuildProfileFromJson(json); + +@override final int? id; +@override final User? user; +@override final Address? address; +@override final GuildAreaActivity? guild_area_activity; +@override final GuildTypeActivity? guild_type_activity; + final List? _kill_house; +@override List? get kill_house { + final value = _kill_house; + if (value == null) return null; + if (_kill_house is EqualUnmodifiableListView) return _kill_house; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _steward_kill_house; +@override List? get steward_kill_house { + final value = _steward_kill_house; + if (value == null) return null; + if (_steward_kill_house is EqualUnmodifiableListView) return _steward_kill_house; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _stewards; +@override List? get stewards { + final value = _stewards; + if (value == null) return null; + if (_stewards is EqualUnmodifiableListView) return _stewards; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + +@override final GetPosStatus? get_pos_status; +@override final String? key; +@override final String? create_date; +@override final String? modify_date; +@override final bool? trash; +@override final String? user_id_foreign_key; +@override final String? address_id_foreign_key; +@override final String? user_bank_id_foreign_key; +@override final String? wallet_id_foreign_key; +@override final String? provincial_government_id_key; +@override final dynamic identity_documents; +@override final bool? active; +@override final int? city_number; +@override final String? city_name; +@override final String? guilds_id; +@override final String? license_number; +@override final String? guilds_name; +@override final String? phone; +@override final String? type_activity; +@override final String? area_activity; +@override final int? province_number; +@override final String? province_name; +@override final bool? steward; +@override final bool? has_pos; +@override final dynamic centers_allocation; +@override final dynamic kill_house_centers_allocation; +@override final dynamic allocation_limit; +@override final bool? limitation_allocation; +@override final String? registerar_role; +@override final String? registerar_fullname; +@override final String? registerar_mobile; +@override final bool? kill_house_register; +@override final bool? steward_register; +@override final bool? guilds_room_register; +@override final bool? pos_company_register; +@override final String? province_accept_state; +@override final String? province_message; +@override final String? condition; +@override final String? description_condition; +@override final bool? steward_active; +@override final dynamic steward_allocation_limit; +@override final bool? steward_limitation_allocation; +@override final bool? license; +@override final dynamic license_form; +@override final dynamic license_file; +@override final String? reviewer_role; +@override final String? reviewer_fullname; +@override final String? reviewer_mobile; +@override final String? checker_message; +@override final bool? final_accept; +@override final bool? temporary_registration; +@override final String? created_by; +@override final String? modified_by; +@override final dynamic user_bank_info; +@override final int? wallet; + final List? _cars; +@override List? get cars { + final value = _cars; + if (value == null) return null; + if (_cars is EqualUnmodifiableListView) return _cars; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _user_level; +@override List? get user_level { + final value = _user_level; + if (value == null) return null; + if (_user_level is EqualUnmodifiableListView) return _user_level; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GuildProfileCopyWith<_GuildProfile> get copyWith => __$GuildProfileCopyWithImpl<_GuildProfile>(this, _$identity); + +@override +Map toJson() { + return _$GuildProfileToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildProfile&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guild_area_activity, guild_area_activity) || other.guild_area_activity == guild_area_activity)&&(identical(other.guild_type_activity, guild_type_activity) || other.guild_type_activity == guild_type_activity)&&const DeepCollectionEquality().equals(other._kill_house, _kill_house)&&const DeepCollectionEquality().equals(other._steward_kill_house, _steward_kill_house)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.get_pos_status, get_pos_status) || other.get_pos_status == get_pos_status)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.user_id_foreign_key, user_id_foreign_key) || other.user_id_foreign_key == user_id_foreign_key)&&(identical(other.address_id_foreign_key, address_id_foreign_key) || other.address_id_foreign_key == address_id_foreign_key)&&(identical(other.user_bank_id_foreign_key, user_bank_id_foreign_key) || other.user_bank_id_foreign_key == user_bank_id_foreign_key)&&(identical(other.wallet_id_foreign_key, wallet_id_foreign_key) || other.wallet_id_foreign_key == wallet_id_foreign_key)&&(identical(other.provincial_government_id_key, provincial_government_id_key) || other.provincial_government_id_key == provincial_government_id_key)&&const DeepCollectionEquality().equals(other.identity_documents, identity_documents)&&(identical(other.active, active) || other.active == active)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.has_pos, has_pos) || other.has_pos == has_pos)&&const DeepCollectionEquality().equals(other.centers_allocation, centers_allocation)&&const DeepCollectionEquality().equals(other.kill_house_centers_allocation, kill_house_centers_allocation)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.limitation_allocation, limitation_allocation) || other.limitation_allocation == limitation_allocation)&&(identical(other.registerar_role, registerar_role) || other.registerar_role == registerar_role)&&(identical(other.registerar_fullname, registerar_fullname) || other.registerar_fullname == registerar_fullname)&&(identical(other.registerar_mobile, registerar_mobile) || other.registerar_mobile == registerar_mobile)&&(identical(other.kill_house_register, kill_house_register) || other.kill_house_register == kill_house_register)&&(identical(other.steward_register, steward_register) || other.steward_register == steward_register)&&(identical(other.guilds_room_register, guilds_room_register) || other.guilds_room_register == guilds_room_register)&&(identical(other.pos_company_register, pos_company_register) || other.pos_company_register == pos_company_register)&&(identical(other.province_accept_state, province_accept_state) || other.province_accept_state == province_accept_state)&&(identical(other.province_message, province_message) || other.province_message == province_message)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.description_condition, description_condition) || other.description_condition == description_condition)&&(identical(other.steward_active, steward_active) || other.steward_active == steward_active)&&const DeepCollectionEquality().equals(other.steward_allocation_limit, steward_allocation_limit)&&(identical(other.steward_limitation_allocation, steward_limitation_allocation) || other.steward_limitation_allocation == steward_limitation_allocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.license_form, license_form)&&const DeepCollectionEquality().equals(other.license_file, license_file)&&(identical(other.reviewer_role, reviewer_role) || other.reviewer_role == reviewer_role)&&(identical(other.reviewer_fullname, reviewer_fullname) || other.reviewer_fullname == reviewer_fullname)&&(identical(other.reviewer_mobile, reviewer_mobile) || other.reviewer_mobile == reviewer_mobile)&&(identical(other.checker_message, checker_message) || other.checker_message == checker_message)&&(identical(other.final_accept, final_accept) || other.final_accept == final_accept)&&(identical(other.temporary_registration, temporary_registration) || other.temporary_registration == temporary_registration)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.user_bank_info, user_bank_info)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other._cars, _cars)&&const DeepCollectionEquality().equals(other._user_level, _user_level)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guild_area_activity,guild_type_activity,const DeepCollectionEquality().hash(_kill_house),const DeepCollectionEquality().hash(_steward_kill_house),const DeepCollectionEquality().hash(_stewards),get_pos_status,key,create_date,modify_date,trash,user_id_foreign_key,address_id_foreign_key,user_bank_id_foreign_key,wallet_id_foreign_key,provincial_government_id_key,const DeepCollectionEquality().hash(identity_documents),active,city_number,city_name,guilds_id,license_number,guilds_name,phone,type_activity,area_activity,province_number,province_name,steward,has_pos,const DeepCollectionEquality().hash(centers_allocation),const DeepCollectionEquality().hash(kill_house_centers_allocation),const DeepCollectionEquality().hash(allocation_limit),limitation_allocation,registerar_role,registerar_fullname,registerar_mobile,kill_house_register,steward_register,guilds_room_register,pos_company_register,province_accept_state,province_message,condition,description_condition,steward_active,const DeepCollectionEquality().hash(steward_allocation_limit),steward_limitation_allocation,license,const DeepCollectionEquality().hash(license_form),const DeepCollectionEquality().hash(license_file),reviewer_role,reviewer_fullname,reviewer_mobile,checker_message,final_accept,temporary_registration,created_by,modified_by,const DeepCollectionEquality().hash(user_bank_info),wallet,const DeepCollectionEquality().hash(_cars),const DeepCollectionEquality().hash(_user_level)]); + +@override +String toString() { + return 'GuildProfile(id: $id, user: $user, address: $address, guild_area_activity: $guild_area_activity, guild_type_activity: $guild_type_activity, kill_house: $kill_house, steward_kill_house: $steward_kill_house, stewards: $stewards, get_pos_status: $get_pos_status, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, user_id_foreign_key: $user_id_foreign_key, address_id_foreign_key: $address_id_foreign_key, user_bank_id_foreign_key: $user_bank_id_foreign_key, wallet_id_foreign_key: $wallet_id_foreign_key, provincial_government_id_key: $provincial_government_id_key, identity_documents: $identity_documents, active: $active, city_number: $city_number, city_name: $city_name, guilds_id: $guilds_id, license_number: $license_number, guilds_name: $guilds_name, phone: $phone, type_activity: $type_activity, area_activity: $area_activity, province_number: $province_number, province_name: $province_name, steward: $steward, has_pos: $has_pos, centers_allocation: $centers_allocation, kill_house_centers_allocation: $kill_house_centers_allocation, allocation_limit: $allocation_limit, limitation_allocation: $limitation_allocation, registerar_role: $registerar_role, registerar_fullname: $registerar_fullname, registerar_mobile: $registerar_mobile, kill_house_register: $kill_house_register, steward_register: $steward_register, guilds_room_register: $guilds_room_register, pos_company_register: $pos_company_register, province_accept_state: $province_accept_state, province_message: $province_message, condition: $condition, description_condition: $description_condition, steward_active: $steward_active, steward_allocation_limit: $steward_allocation_limit, steward_limitation_allocation: $steward_limitation_allocation, license: $license, license_form: $license_form, license_file: $license_file, reviewer_role: $reviewer_role, reviewer_fullname: $reviewer_fullname, reviewer_mobile: $reviewer_mobile, checker_message: $checker_message, final_accept: $final_accept, temporary_registration: $temporary_registration, created_by: $created_by, modified_by: $modified_by, user_bank_info: $user_bank_info, wallet: $wallet, cars: $cars, user_level: $user_level)'; +} + + +} + +/// @nodoc +abstract mixin class _$GuildProfileCopyWith<$Res> implements $GuildProfileCopyWith<$Res> { + factory _$GuildProfileCopyWith(_GuildProfile value, $Res Function(_GuildProfile) _then) = __$GuildProfileCopyWithImpl; +@override @useResult +$Res call({ + int? id, User? user, Address? address, GuildAreaActivity? guild_area_activity, GuildTypeActivity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, GetPosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, String? user_id_foreign_key, String? address_id_foreign_key, String? user_bank_id_foreign_key, String? wallet_id_foreign_key, String? provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level +}); + + +@override $UserCopyWith<$Res>? get user;@override $AddressCopyWith<$Res>? get address;@override $GuildAreaActivityCopyWith<$Res>? get guild_area_activity;@override $GuildTypeActivityCopyWith<$Res>? get guild_type_activity;@override $GetPosStatusCopyWith<$Res>? get get_pos_status; + +} +/// @nodoc +class __$GuildProfileCopyWithImpl<$Res> + implements _$GuildProfileCopyWith<$Res> { + __$GuildProfileCopyWithImpl(this._self, this._then); + + final _GuildProfile _self; + final $Res Function(_GuildProfile) _then; + +/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guild_area_activity = freezed,Object? guild_type_activity = freezed,Object? kill_house = freezed,Object? steward_kill_house = freezed,Object? stewards = freezed,Object? get_pos_status = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? user_id_foreign_key = freezed,Object? address_id_foreign_key = freezed,Object? user_bank_id_foreign_key = freezed,Object? wallet_id_foreign_key = freezed,Object? provincial_government_id_key = freezed,Object? identity_documents = freezed,Object? active = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? guilds_id = freezed,Object? license_number = freezed,Object? guilds_name = freezed,Object? phone = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? steward = freezed,Object? has_pos = freezed,Object? centers_allocation = freezed,Object? kill_house_centers_allocation = freezed,Object? allocation_limit = freezed,Object? limitation_allocation = freezed,Object? registerar_role = freezed,Object? registerar_fullname = freezed,Object? registerar_mobile = freezed,Object? kill_house_register = freezed,Object? steward_register = freezed,Object? guilds_room_register = freezed,Object? pos_company_register = freezed,Object? province_accept_state = freezed,Object? province_message = freezed,Object? condition = freezed,Object? description_condition = freezed,Object? steward_active = freezed,Object? steward_allocation_limit = freezed,Object? steward_limitation_allocation = freezed,Object? license = freezed,Object? license_form = freezed,Object? license_file = freezed,Object? reviewer_role = freezed,Object? reviewer_fullname = freezed,Object? reviewer_mobile = freezed,Object? checker_message = freezed,Object? final_accept = freezed,Object? temporary_registration = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? user_bank_info = freezed,Object? wallet = freezed,Object? cars = freezed,Object? user_level = freezed,}) { + return _then(_GuildProfile( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,guild_area_activity: freezed == guild_area_activity ? _self.guild_area_activity : guild_area_activity // ignore: cast_nullable_to_non_nullable +as GuildAreaActivity?,guild_type_activity: freezed == guild_type_activity ? _self.guild_type_activity : guild_type_activity // ignore: cast_nullable_to_non_nullable +as GuildTypeActivity?,kill_house: freezed == kill_house ? _self._kill_house : kill_house // ignore: cast_nullable_to_non_nullable +as List?,steward_kill_house: freezed == steward_kill_house ? _self._steward_kill_house : steward_kill_house // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self._stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,get_pos_status: freezed == get_pos_status ? _self.get_pos_status : get_pos_status // ignore: cast_nullable_to_non_nullable +as GetPosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,user_id_foreign_key: freezed == user_id_foreign_key ? _self.user_id_foreign_key : user_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,address_id_foreign_key: freezed == address_id_foreign_key ? _self.address_id_foreign_key : address_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,user_bank_id_foreign_key: freezed == user_bank_id_foreign_key ? _self.user_bank_id_foreign_key : user_bank_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,wallet_id_foreign_key: freezed == wallet_id_foreign_key ? _self.wallet_id_foreign_key : wallet_id_foreign_key // ignore: cast_nullable_to_non_nullable +as String?,provincial_government_id_key: freezed == provincial_government_id_key ? _self.provincial_government_id_key : provincial_government_id_key // ignore: cast_nullable_to_non_nullable +as String?,identity_documents: freezed == identity_documents ? _self.identity_documents : identity_documents // ignore: cast_nullable_to_non_nullable +as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable +as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable +as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable +as String?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable +as String?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable +as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable +as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable +as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,has_pos: freezed == has_pos ? _self.has_pos : has_pos // ignore: cast_nullable_to_non_nullable +as bool?,centers_allocation: freezed == centers_allocation ? _self.centers_allocation : centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,kill_house_centers_allocation: freezed == kill_house_centers_allocation ? _self.kill_house_centers_allocation : kill_house_centers_allocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,limitation_allocation: freezed == limitation_allocation ? _self.limitation_allocation : limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,registerar_role: freezed == registerar_role ? _self.registerar_role : registerar_role // ignore: cast_nullable_to_non_nullable +as String?,registerar_fullname: freezed == registerar_fullname ? _self.registerar_fullname : registerar_fullname // ignore: cast_nullable_to_non_nullable +as String?,registerar_mobile: freezed == registerar_mobile ? _self.registerar_mobile : registerar_mobile // ignore: cast_nullable_to_non_nullable +as String?,kill_house_register: freezed == kill_house_register ? _self.kill_house_register : kill_house_register // ignore: cast_nullable_to_non_nullable +as bool?,steward_register: freezed == steward_register ? _self.steward_register : steward_register // ignore: cast_nullable_to_non_nullable +as bool?,guilds_room_register: freezed == guilds_room_register ? _self.guilds_room_register : guilds_room_register // ignore: cast_nullable_to_non_nullable +as bool?,pos_company_register: freezed == pos_company_register ? _self.pos_company_register : pos_company_register // ignore: cast_nullable_to_non_nullable +as bool?,province_accept_state: freezed == province_accept_state ? _self.province_accept_state : province_accept_state // ignore: cast_nullable_to_non_nullable +as String?,province_message: freezed == province_message ? _self.province_message : province_message // ignore: cast_nullable_to_non_nullable +as String?,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable +as String?,description_condition: freezed == description_condition ? _self.description_condition : description_condition // ignore: cast_nullable_to_non_nullable +as String?,steward_active: freezed == steward_active ? _self.steward_active : steward_active // ignore: cast_nullable_to_non_nullable +as bool?,steward_allocation_limit: freezed == steward_allocation_limit ? _self.steward_allocation_limit : steward_allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,steward_limitation_allocation: freezed == steward_limitation_allocation ? _self.steward_limitation_allocation : steward_limitation_allocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,license_form: freezed == license_form ? _self.license_form : license_form // ignore: cast_nullable_to_non_nullable +as dynamic,license_file: freezed == license_file ? _self.license_file : license_file // ignore: cast_nullable_to_non_nullable +as dynamic,reviewer_role: freezed == reviewer_role ? _self.reviewer_role : reviewer_role // ignore: cast_nullable_to_non_nullable +as String?,reviewer_fullname: freezed == reviewer_fullname ? _self.reviewer_fullname : reviewer_fullname // ignore: cast_nullable_to_non_nullable +as String?,reviewer_mobile: freezed == reviewer_mobile ? _self.reviewer_mobile : reviewer_mobile // ignore: cast_nullable_to_non_nullable +as String?,checker_message: freezed == checker_message ? _self.checker_message : checker_message // ignore: cast_nullable_to_non_nullable +as String?,final_accept: freezed == final_accept ? _self.final_accept : final_accept // ignore: cast_nullable_to_non_nullable +as bool?,temporary_registration: freezed == temporary_registration ? _self.temporary_registration : temporary_registration // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,user_bank_info: freezed == user_bank_info ? _self.user_bank_info : user_bank_info // ignore: cast_nullable_to_non_nullable +as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self._cars : cars // ignore: cast_nullable_to_non_nullable +as List?,user_level: freezed == user_level ? _self._user_level : user_level // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildAreaActivityCopyWith<$Res>? get guild_area_activity { + if (_self.guild_area_activity == null) { + return null; + } + + return $GuildAreaActivityCopyWith<$Res>(_self.guild_area_activity!, (value) { + return _then(_self.copyWith(guild_area_activity: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildTypeActivityCopyWith<$Res>? get guild_type_activity { + if (_self.guild_type_activity == null) { + return null; + } + + return $GuildTypeActivityCopyWith<$Res>(_self.guild_type_activity!, (value) { + return _then(_self.copyWith(guild_type_activity: value)); + }); +}/// Create a copy of GuildProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GetPosStatusCopyWith<$Res>? get get_pos_status { + if (_self.get_pos_status == null) { + return null; + } + + return $GetPosStatusCopyWith<$Res>(_self.get_pos_status!, (value) { + return _then(_self.copyWith(get_pos_status: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + String? get fullname; String? get first_name; String? get last_name; String? get mobile; String? get national_id; String? get city; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,mobile,national_id,city); + +@override +String toString() { + return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, mobile: $mobile, national_id: $national_id, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city +}); + + + + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? city = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable +as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _User implements User { + const _User({this.fullname, this.first_name, this.last_name, this.mobile, this.national_id, this.city}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final String? fullname; +@override final String? first_name; +@override final String? last_name; +@override final String? mobile; +@override final String? national_id; +@override final String? city; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,mobile,national_id,city); + +@override +String toString() { + return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, mobile: $mobile, national_id: $national_id, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city +}); + + + + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? city = freezed,}) { + return _then(_User( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable +as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$Address { + + Province? get province; City? get city; String? get address; String? get postal_code; +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AddressCopyWith
get copyWith => _$AddressCopyWithImpl
(this as Address, _$identity); + + /// Serializes this Address to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; +} + + +} + +/// @nodoc +abstract mixin class $AddressCopyWith<$Res> { + factory $AddressCopyWith(Address value, $Res Function(Address) _then) = _$AddressCopyWithImpl; +@useResult +$Res call({ + Province? province, City? city, String? address, String? postal_code +}); + + +$ProvinceCopyWith<$Res>? get province;$CityCopyWith<$Res>? get city; + +} +/// @nodoc +class _$AddressCopyWithImpl<$Res> + implements $AddressCopyWith<$Res> { + _$AddressCopyWithImpl(this._self, this._then); + + final Address _self; + final $Res Function(Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { + return _then(_self.copyWith( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Address implements Address { + const _Address({this.province, this.city, this.address, this.postal_code}); + factory _Address.fromJson(Map json) => _$AddressFromJson(json); + +@override final Province? province; +@override final City? city; +@override final String? address; +@override final String? postal_code; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AddressCopyWith<_Address> get copyWith => __$AddressCopyWithImpl<_Address>(this, _$identity); + +@override +Map toJson() { + return _$AddressToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; +} + + +} + +/// @nodoc +abstract mixin class _$AddressCopyWith<$Res> implements $AddressCopyWith<$Res> { + factory _$AddressCopyWith(_Address value, $Res Function(_Address) _then) = __$AddressCopyWithImpl; +@override @useResult +$Res call({ + Province? province, City? city, String? address, String? postal_code +}); + + +@override $ProvinceCopyWith<$Res>? get province;@override $CityCopyWith<$Res>? get city; + +} +/// @nodoc +class __$AddressCopyWithImpl<$Res> + implements _$AddressCopyWith<$Res> { + __$AddressCopyWithImpl(this._self, this._then); + + final _Address _self; + final $Res Function(_Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { + return _then(_Address( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$Province { + + String? get key; String? get name; +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProvinceCopyWith get copyWith => _$ProvinceCopyWithImpl(this as Province, _$identity); + + /// Serializes this Province to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $ProvinceCopyWith<$Res> { + factory $ProvinceCopyWith(Province value, $Res Function(Province) _then) = _$ProvinceCopyWithImpl; +@useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class _$ProvinceCopyWithImpl<$Res> + implements $ProvinceCopyWith<$Res> { + _$ProvinceCopyWithImpl(this._self, this._then); + + final Province _self; + final $Res Function(Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Province implements Province { + const _Province({this.key, this.name}); + factory _Province.fromJson(Map json) => _$ProvinceFromJson(json); + +@override final String? key; +@override final String? name; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProvinceCopyWith<_Province> get copyWith => __$ProvinceCopyWithImpl<_Province>(this, _$identity); + +@override +Map toJson() { + return _$ProvinceToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProvinceCopyWith<$Res> implements $ProvinceCopyWith<$Res> { + factory _$ProvinceCopyWith(_Province value, $Res Function(_Province) _then) = __$ProvinceCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class __$ProvinceCopyWithImpl<$Res> + implements _$ProvinceCopyWith<$Res> { + __$ProvinceCopyWithImpl(this._self, this._then); + + final _Province _self; + final $Res Function(_Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_Province( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$City { + + String? get key; String? get name; +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CityCopyWith get copyWith => _$CityCopyWithImpl(this as City, _$identity); + + /// Serializes this City to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is City&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'City(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $CityCopyWith<$Res> { + factory $CityCopyWith(City value, $Res Function(City) _then) = _$CityCopyWithImpl; +@useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class _$CityCopyWithImpl<$Res> + implements $CityCopyWith<$Res> { + _$CityCopyWithImpl(this._self, this._then); + + final City _self; + final $Res Function(City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _City implements City { + const _City({this.key, this.name}); + factory _City.fromJson(Map json) => _$CityFromJson(json); + +@override final String? key; +@override final String? name; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CityCopyWith<_City> get copyWith => __$CityCopyWithImpl<_City>(this, _$identity); + +@override +Map toJson() { + return _$CityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _City&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'City(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$CityCopyWith<$Res> implements $CityCopyWith<$Res> { + factory _$CityCopyWith(_City value, $Res Function(_City) _then) = __$CityCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class __$CityCopyWithImpl<$Res> + implements _$CityCopyWith<$Res> { + __$CityCopyWithImpl(this._self, this._then); + + final _City _self; + final $Res Function(_City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_City( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$GuildAreaActivity { + + String? get key; String? get title; +/// Create a copy of GuildAreaActivity +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GuildAreaActivityCopyWith get copyWith => _$GuildAreaActivityCopyWithImpl(this as GuildAreaActivity, _$identity); + + /// Serializes this GuildAreaActivity to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildAreaActivity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildAreaActivity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $GuildAreaActivityCopyWith<$Res> { + factory $GuildAreaActivityCopyWith(GuildAreaActivity value, $Res Function(GuildAreaActivity) _then) = _$GuildAreaActivityCopyWithImpl; +@useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class _$GuildAreaActivityCopyWithImpl<$Res> + implements $GuildAreaActivityCopyWith<$Res> { + _$GuildAreaActivityCopyWithImpl(this._self, this._then); + + final GuildAreaActivity _self; + final $Res Function(GuildAreaActivity) _then; + +/// Create a copy of GuildAreaActivity +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _GuildAreaActivity implements GuildAreaActivity { + const _GuildAreaActivity({this.key, this.title}); + factory _GuildAreaActivity.fromJson(Map json) => _$GuildAreaActivityFromJson(json); + +@override final String? key; +@override final String? title; + +/// Create a copy of GuildAreaActivity +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GuildAreaActivityCopyWith<_GuildAreaActivity> get copyWith => __$GuildAreaActivityCopyWithImpl<_GuildAreaActivity>(this, _$identity); + +@override +Map toJson() { + return _$GuildAreaActivityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildAreaActivity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildAreaActivity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$GuildAreaActivityCopyWith<$Res> implements $GuildAreaActivityCopyWith<$Res> { + factory _$GuildAreaActivityCopyWith(_GuildAreaActivity value, $Res Function(_GuildAreaActivity) _then) = __$GuildAreaActivityCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class __$GuildAreaActivityCopyWithImpl<$Res> + implements _$GuildAreaActivityCopyWith<$Res> { + __$GuildAreaActivityCopyWithImpl(this._self, this._then); + + final _GuildAreaActivity _self; + final $Res Function(_GuildAreaActivity) _then; + +/// Create a copy of GuildAreaActivity +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_GuildAreaActivity( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$GuildTypeActivity { + + String? get key; String? get title; +/// Create a copy of GuildTypeActivity +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GuildTypeActivityCopyWith get copyWith => _$GuildTypeActivityCopyWithImpl(this as GuildTypeActivity, _$identity); + + /// Serializes this GuildTypeActivity to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildTypeActivity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildTypeActivity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $GuildTypeActivityCopyWith<$Res> { + factory $GuildTypeActivityCopyWith(GuildTypeActivity value, $Res Function(GuildTypeActivity) _then) = _$GuildTypeActivityCopyWithImpl; +@useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class _$GuildTypeActivityCopyWithImpl<$Res> + implements $GuildTypeActivityCopyWith<$Res> { + _$GuildTypeActivityCopyWithImpl(this._self, this._then); + + final GuildTypeActivity _self; + final $Res Function(GuildTypeActivity) _then; + +/// Create a copy of GuildTypeActivity +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _GuildTypeActivity implements GuildTypeActivity { + const _GuildTypeActivity({this.key, this.title}); + factory _GuildTypeActivity.fromJson(Map json) => _$GuildTypeActivityFromJson(json); + +@override final String? key; +@override final String? title; + +/// Create a copy of GuildTypeActivity +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GuildTypeActivityCopyWith<_GuildTypeActivity> get copyWith => __$GuildTypeActivityCopyWithImpl<_GuildTypeActivity>(this, _$identity); + +@override +Map toJson() { + return _$GuildTypeActivityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildTypeActivity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildTypeActivity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$GuildTypeActivityCopyWith<$Res> implements $GuildTypeActivityCopyWith<$Res> { + factory _$GuildTypeActivityCopyWith(_GuildTypeActivity value, $Res Function(_GuildTypeActivity) _then) = __$GuildTypeActivityCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class __$GuildTypeActivityCopyWithImpl<$Res> + implements _$GuildTypeActivityCopyWith<$Res> { + __$GuildTypeActivityCopyWithImpl(this._self, this._then); + + final _GuildTypeActivity _self; + final $Res Function(_GuildTypeActivity) _then; + +/// Create a copy of GuildTypeActivity +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_GuildTypeActivity( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$GetPosStatus { + + int? get len_active_sessions; bool? get has_pons; bool? get has_active_pons; +/// Create a copy of GetPosStatus +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GetPosStatusCopyWith get copyWith => _$GetPosStatusCopyWithImpl(this as GetPosStatus, _$identity); + + /// Serializes this GetPosStatus to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GetPosStatus&&(identical(other.len_active_sessions, len_active_sessions) || other.len_active_sessions == len_active_sessions)&&(identical(other.has_pons, has_pons) || other.has_pons == has_pons)&&(identical(other.has_active_pons, has_active_pons) || other.has_active_pons == has_active_pons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,len_active_sessions,has_pons,has_active_pons); + +@override +String toString() { + return 'GetPosStatus(len_active_sessions: $len_active_sessions, has_pons: $has_pons, has_active_pons: $has_active_pons)'; +} + + +} + +/// @nodoc +abstract mixin class $GetPosStatusCopyWith<$Res> { + factory $GetPosStatusCopyWith(GetPosStatus value, $Res Function(GetPosStatus) _then) = _$GetPosStatusCopyWithImpl; +@useResult +$Res call({ + int? len_active_sessions, bool? has_pons, bool? has_active_pons +}); + + + + +} +/// @nodoc +class _$GetPosStatusCopyWithImpl<$Res> + implements $GetPosStatusCopyWith<$Res> { + _$GetPosStatusCopyWithImpl(this._self, this._then); + + final GetPosStatus _self; + final $Res Function(GetPosStatus) _then; + +/// Create a copy of GetPosStatus +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? len_active_sessions = freezed,Object? has_pons = freezed,Object? has_active_pons = freezed,}) { + return _then(_self.copyWith( +len_active_sessions: freezed == len_active_sessions ? _self.len_active_sessions : len_active_sessions // ignore: cast_nullable_to_non_nullable +as int?,has_pons: freezed == has_pons ? _self.has_pons : has_pons // ignore: cast_nullable_to_non_nullable +as bool?,has_active_pons: freezed == has_active_pons ? _self.has_active_pons : has_active_pons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _GetPosStatus implements GetPosStatus { + const _GetPosStatus({this.len_active_sessions, this.has_pons, this.has_active_pons}); + factory _GetPosStatus.fromJson(Map json) => _$GetPosStatusFromJson(json); + +@override final int? len_active_sessions; +@override final bool? has_pons; +@override final bool? has_active_pons; + +/// Create a copy of GetPosStatus +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GetPosStatusCopyWith<_GetPosStatus> get copyWith => __$GetPosStatusCopyWithImpl<_GetPosStatus>(this, _$identity); + +@override +Map toJson() { + return _$GetPosStatusToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GetPosStatus&&(identical(other.len_active_sessions, len_active_sessions) || other.len_active_sessions == len_active_sessions)&&(identical(other.has_pons, has_pons) || other.has_pons == has_pons)&&(identical(other.has_active_pons, has_active_pons) || other.has_active_pons == has_active_pons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,len_active_sessions,has_pons,has_active_pons); + +@override +String toString() { + return 'GetPosStatus(len_active_sessions: $len_active_sessions, has_pons: $has_pons, has_active_pons: $has_active_pons)'; +} + + +} + +/// @nodoc +abstract mixin class _$GetPosStatusCopyWith<$Res> implements $GetPosStatusCopyWith<$Res> { + factory _$GetPosStatusCopyWith(_GetPosStatus value, $Res Function(_GetPosStatus) _then) = __$GetPosStatusCopyWithImpl; +@override @useResult +$Res call({ + int? len_active_sessions, bool? has_pons, bool? has_active_pons +}); + + + + +} +/// @nodoc +class __$GetPosStatusCopyWithImpl<$Res> + implements _$GetPosStatusCopyWith<$Res> { + __$GetPosStatusCopyWithImpl(this._self, this._then); + + final _GetPosStatus _self; + final $Res Function(_GetPosStatus) _then; + +/// Create a copy of GetPosStatus +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? len_active_sessions = freezed,Object? has_pons = freezed,Object? has_active_pons = freezed,}) { + return _then(_GetPosStatus( +len_active_sessions: freezed == len_active_sessions ? _self.len_active_sessions : len_active_sessions // ignore: cast_nullable_to_non_nullable +as int?,has_pons: freezed == has_pons ? _self.has_pons : has_pons // ignore: cast_nullable_to_non_nullable +as bool?,has_active_pons: freezed == has_active_pons ? _self.has_active_pons : has_active_pons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/guild_profile/guild_profile.g.dart b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.g.dart new file mode 100644 index 0000000..98edd02 --- /dev/null +++ b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.g.dart @@ -0,0 +1,244 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'guild_profile.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_GuildProfile _$GuildProfileFromJson( + Map json, +) => _GuildProfile( + id: (json['id'] as num?)?.toInt(), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + address: json['address'] == null + ? null + : Address.fromJson(json['address'] as Map), + guild_area_activity: json['guild_area_activity'] == null + ? null + : GuildAreaActivity.fromJson( + json['guild_area_activity'] as Map, + ), + guild_type_activity: json['guild_type_activity'] == null + ? null + : GuildTypeActivity.fromJson( + json['guild_type_activity'] as Map, + ), + kill_house: json['kill_house'] as List?, + steward_kill_house: json['steward_kill_house'] as List?, + stewards: json['stewards'] as List?, + get_pos_status: json['get_pos_status'] == null + ? null + : GetPosStatus.fromJson(json['get_pos_status'] as Map), + key: json['key'] as String?, + create_date: json['create_date'] as String?, + modify_date: json['modify_date'] as String?, + trash: json['trash'] as bool?, + user_id_foreign_key: json['user_id_foreign_key'] as String?, + address_id_foreign_key: json['address_id_foreign_key'] as String?, + user_bank_id_foreign_key: json['user_bank_id_foreign_key'] as String?, + wallet_id_foreign_key: json['wallet_id_foreign_key'] as String?, + provincial_government_id_key: json['provincial_government_id_key'] as String?, + identity_documents: json['identity_documents'], + active: json['active'] as bool?, + city_number: (json['city_number'] as num?)?.toInt(), + city_name: json['city_name'] as String?, + guilds_id: json['guilds_id'] as String?, + license_number: json['license_number'] as String?, + guilds_name: json['guilds_name'] as String?, + phone: json['phone'] as String?, + type_activity: json['type_activity'] as String?, + area_activity: json['area_activity'] as String?, + province_number: (json['province_number'] as num?)?.toInt(), + province_name: json['province_name'] as String?, + steward: json['steward'] as bool?, + has_pos: json['has_pos'] as bool?, + centers_allocation: json['centers_allocation'], + kill_house_centers_allocation: json['kill_house_centers_allocation'], + allocation_limit: json['allocation_limit'], + limitation_allocation: json['limitation_allocation'] as bool?, + registerar_role: json['registerar_role'] as String?, + registerar_fullname: json['registerar_fullname'] as String?, + registerar_mobile: json['registerar_mobile'] as String?, + kill_house_register: json['kill_house_register'] as bool?, + steward_register: json['steward_register'] as bool?, + guilds_room_register: json['guilds_room_register'] as bool?, + pos_company_register: json['pos_company_register'] as bool?, + province_accept_state: json['province_accept_state'] as String?, + province_message: json['province_message'] as String?, + condition: json['condition'] as String?, + description_condition: json['description_condition'] as String?, + steward_active: json['steward_active'] as bool?, + steward_allocation_limit: json['steward_allocation_limit'], + steward_limitation_allocation: json['steward_limitation_allocation'] as bool?, + license: json['license'] as bool?, + license_form: json['license_form'], + license_file: json['license_file'], + reviewer_role: json['reviewer_role'] as String?, + reviewer_fullname: json['reviewer_fullname'] as String?, + reviewer_mobile: json['reviewer_mobile'] as String?, + checker_message: json['checker_message'] as String?, + final_accept: json['final_accept'] as bool?, + temporary_registration: json['temporary_registration'] as bool?, + created_by: json['created_by'] as String?, + modified_by: json['modified_by'] as String?, + user_bank_info: json['user_bank_info'], + wallet: (json['wallet'] as num?)?.toInt(), + cars: json['cars'] as List?, + user_level: json['user_level'] as List?, +); + +Map _$GuildProfileToJson(_GuildProfile instance) => + { + 'id': instance.id, + 'user': instance.user, + 'address': instance.address, + 'guild_area_activity': instance.guild_area_activity, + 'guild_type_activity': instance.guild_type_activity, + 'kill_house': instance.kill_house, + 'steward_kill_house': instance.steward_kill_house, + 'stewards': instance.stewards, + 'get_pos_status': instance.get_pos_status, + 'key': instance.key, + 'create_date': instance.create_date, + 'modify_date': instance.modify_date, + 'trash': instance.trash, + 'user_id_foreign_key': instance.user_id_foreign_key, + 'address_id_foreign_key': instance.address_id_foreign_key, + 'user_bank_id_foreign_key': instance.user_bank_id_foreign_key, + 'wallet_id_foreign_key': instance.wallet_id_foreign_key, + 'provincial_government_id_key': instance.provincial_government_id_key, + 'identity_documents': instance.identity_documents, + 'active': instance.active, + 'city_number': instance.city_number, + 'city_name': instance.city_name, + 'guilds_id': instance.guilds_id, + 'license_number': instance.license_number, + 'guilds_name': instance.guilds_name, + 'phone': instance.phone, + 'type_activity': instance.type_activity, + 'area_activity': instance.area_activity, + 'province_number': instance.province_number, + 'province_name': instance.province_name, + 'steward': instance.steward, + 'has_pos': instance.has_pos, + 'centers_allocation': instance.centers_allocation, + 'kill_house_centers_allocation': instance.kill_house_centers_allocation, + 'allocation_limit': instance.allocation_limit, + 'limitation_allocation': instance.limitation_allocation, + 'registerar_role': instance.registerar_role, + 'registerar_fullname': instance.registerar_fullname, + 'registerar_mobile': instance.registerar_mobile, + 'kill_house_register': instance.kill_house_register, + 'steward_register': instance.steward_register, + 'guilds_room_register': instance.guilds_room_register, + 'pos_company_register': instance.pos_company_register, + 'province_accept_state': instance.province_accept_state, + 'province_message': instance.province_message, + 'condition': instance.condition, + 'description_condition': instance.description_condition, + 'steward_active': instance.steward_active, + 'steward_allocation_limit': instance.steward_allocation_limit, + 'steward_limitation_allocation': instance.steward_limitation_allocation, + 'license': instance.license, + 'license_form': instance.license_form, + 'license_file': instance.license_file, + 'reviewer_role': instance.reviewer_role, + 'reviewer_fullname': instance.reviewer_fullname, + 'reviewer_mobile': instance.reviewer_mobile, + 'checker_message': instance.checker_message, + 'final_accept': instance.final_accept, + 'temporary_registration': instance.temporary_registration, + 'created_by': instance.created_by, + 'modified_by': instance.modified_by, + 'user_bank_info': instance.user_bank_info, + 'wallet': instance.wallet, + 'cars': instance.cars, + 'user_level': instance.user_level, + }; + +_User _$UserFromJson(Map json) => _User( + fullname: json['fullname'] as String?, + first_name: json['first_name'] as String?, + last_name: json['last_name'] as String?, + mobile: json['mobile'] as String?, + national_id: json['national_id'] as String?, + city: json['city'] as String?, +); + +Map _$UserToJson(_User instance) => { + 'fullname': instance.fullname, + 'first_name': instance.first_name, + 'last_name': instance.last_name, + 'mobile': instance.mobile, + 'national_id': instance.national_id, + 'city': instance.city, +}; + +_Address _$AddressFromJson(Map json) => _Address( + province: json['province'] == null + ? null + : Province.fromJson(json['province'] as Map), + city: json['city'] == null + ? null + : City.fromJson(json['city'] as Map), + address: json['address'] as String?, + postal_code: json['postal_code'] as String?, +); + +Map _$AddressToJson(_Address instance) => { + 'province': instance.province, + 'city': instance.city, + 'address': instance.address, + 'postal_code': instance.postal_code, +}; + +_Province _$ProvinceFromJson(Map json) => + _Province(key: json['key'] as String?, name: json['name'] as String?); + +Map _$ProvinceToJson(_Province instance) => { + 'key': instance.key, + 'name': instance.name, +}; + +_City _$CityFromJson(Map json) => + _City(key: json['key'] as String?, name: json['name'] as String?); + +Map _$CityToJson(_City instance) => { + 'key': instance.key, + 'name': instance.name, +}; + +_GuildAreaActivity _$GuildAreaActivityFromJson(Map json) => + _GuildAreaActivity( + key: json['key'] as String?, + title: json['title'] as String?, + ); + +Map _$GuildAreaActivityToJson(_GuildAreaActivity instance) => + {'key': instance.key, 'title': instance.title}; + +_GuildTypeActivity _$GuildTypeActivityFromJson(Map json) => + _GuildTypeActivity( + key: json['key'] as String?, + title: json['title'] as String?, + ); + +Map _$GuildTypeActivityToJson(_GuildTypeActivity instance) => + {'key': instance.key, 'title': instance.title}; + +_GetPosStatus _$GetPosStatusFromJson(Map json) => + _GetPosStatus( + len_active_sessions: (json['len_active_sessions'] as num?)?.toInt(), + has_pons: json['has_pons'] as bool?, + has_active_pons: json['has_active_pons'] as bool?, + ); + +Map _$GetPosStatusToJson(_GetPosStatus instance) => + { + 'len_active_sessions': instance.len_active_sessions, + 'has_pons': instance.has_pons, + 'has_active_pons': instance.has_active_pons, + }; diff --git a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart new file mode 100644 index 0000000..4df10b9 --- /dev/null +++ b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart @@ -0,0 +1,311 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'imported_loads_model.freezed.dart'; +part 'imported_loads_model.g.dart'; + +@freezed +abstract class ImportedLoadsModel with _$ImportedLoadsModel { + const factory ImportedLoadsModel({ + int? count, + String? next, + String? previous, + List? results, + }) = _ImportedLoadsModel; + + factory ImportedLoadsModel.fromJson(Map json) => + _$ImportedLoadsModelFromJson(json); +} + +@freezed +abstract class ImportedLoad with _$ImportedLoad { + const factory ImportedLoad({ + int? id, + Product? product, + KillHouse? killHouse, + dynamic toKillHouse, + dynamic steward, + ToSteward? toSteward, + dynamic guilds, + dynamic toGuilds, + dynamic toColdHouse, + int? indexWeight, + int? dateTimestamp, + int? newState, + int? newReceiverState, + int? newAllocationState, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + int? numberOfCarcasses, + int? realNumberOfCarcasses, + int? receiverRealNumberOfCarcasses, + double? weightOfCarcasses, + double? realWeightOfCarcasses, + double? receiverRealWeightOfCarcasses, + double? weightLossOfCarcasses, + bool? finalRegistration, + String? sellType, + String? productName, + String? sellerType, + String? type, + String? saleType, + String? allocationType, + bool? systemRegistrationCode, + int? registrationCode, + int? amount, + int? totalAmount, + int? totalAmountPaid, + int? totalAmountRemain, + dynamic loggedRegistrationCode, + String? state, + String? receiverState, + String? allocationState, + String? date, + dynamic role, + dynamic stewardTempKey, + bool? approvedPriceStatus, + bool? calculateStatus, + bool? temporaryTrash, + bool? temporaryDeleted, + dynamic createdBy, + dynamic modifiedBy, + dynamic wareHouse, + dynamic stewardWareHouse, + dynamic car, + dynamic dispenser, + }) = _ImportedLoad; + + factory ImportedLoad.fromJson(Map json) => + _$ImportedLoadFromJson(json); +} + +@freezed +abstract class Product with _$Product { + const factory Product({ + double? weightAverage, + }) = _Product; + + factory Product.fromJson(Map json) => + _$ProductFromJson(json); +} + +@freezed +abstract class KillHouse with _$KillHouse { + const factory KillHouse({ + String? key, + KillHouseOperator? killHouseOperator, + String? name, + bool? killer, + }) = _KillHouse; + + factory KillHouse.fromJson(Map json) => + _$KillHouseFromJson(json); +} + +@freezed +abstract class KillHouseOperator with _$KillHouseOperator { + const factory KillHouseOperator({ + User? user, + }) = _KillHouseOperator; + + factory KillHouseOperator.fromJson(Map json) => + _$KillHouseOperatorFromJson(json); +} + +@freezed +abstract class User with _$User { + const factory User({ + String? fullname, + String? firstName, + String? lastName, + int? baseOrder, + String? mobile, + String? nationalId, + String? nationalCode, + String? key, + City? city, + String? unitName, + String? unitNationalId, + String? unitRegistrationNumber, + String? unitEconomicalNumber, + String? unitProvince, + String? unitCity, + String? unitPostalCode, + String? unitAddress, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} + +@freezed +abstract class City with _$City { + const factory City({ + int? id, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + int? provinceIdForeignKey, + int? cityIdKey, + String? name, + double? productPrice, + bool? provinceCenter, + int? cityNumber, + String? cityName, + int? provinceNumber, + String? provinceName, + dynamic createdBy, + dynamic modifiedBy, + int? province, + }) = _City; + + factory City.fromJson(Map json) => _$CityFromJson(json); +} + +@freezed +abstract class ToSteward with _$ToSteward { + const factory ToSteward({ + int? id, + ToStewardUser? user, + Address? address, + Activity? guildAreaActivity, + Activity? guildTypeActivity, + List? killHouse, + List? stewardKillHouse, + List? stewards, + PosStatus? getPosStatus, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + dynamic userIdForeignKey, + dynamic addressIdForeignKey, + dynamic userBankIdForeignKey, + dynamic walletIdForeignKey, + dynamic provincialGovernmentIdKey, + dynamic identityDocuments, + bool? active, + int? cityNumber, + String? cityName, + String? guildsId, + String? licenseNumber, + String? guildsName, + dynamic phone, + String? typeActivity, + String? areaActivity, + int? provinceNumber, + String? provinceName, + bool? steward, + bool? hasPos, + dynamic centersAllocation, + dynamic killHouseCentersAllocation, + dynamic allocationLimit, + bool? limitationAllocation, + dynamic registerarRole, + dynamic registerarFullname, + dynamic registerarMobile, + bool? killHouseRegister, + bool? stewardRegister, + bool? guildsRoomRegister, + bool? posCompanyRegister, + String? provinceAcceptState, + dynamic provinceMessage, + dynamic condition, + dynamic descriptionCondition, + bool? stewardActive, + dynamic stewardAllocationLimit, + bool? stewardLimitationAllocation, + bool? license, + dynamic licenseForm, + dynamic licenseFile, + dynamic reviewerRole, + dynamic reviewerFullname, + dynamic reviewerMobile, + dynamic checkerMessage, + bool? finalAccept, + bool? temporaryRegistration, + dynamic createdBy, + dynamic modifiedBy, + dynamic userBankInfo, + int? wallet, + List? cars, + List? userLevel, + }) = _ToSteward; + + factory ToSteward.fromJson(Map json) => + _$ToStewardFromJson(json); +} + +@freezed +abstract class ToStewardUser with _$ToStewardUser { + const factory ToStewardUser({ + String? fullname, + String? firstName, + String? lastName, + String? mobile, + String? nationalId, + String? city, + }) = _ToStewardUser; + + factory ToStewardUser.fromJson(Map json) => + _$ToStewardUserFromJson(json); +} + +@freezed +abstract class Address with _$Address { + const factory Address({ + Province? province, + CitySimple? city, + String? address, + String? postalCode, + }) = _Address; + + factory Address.fromJson(Map json) => + _$AddressFromJson(json); +} + +@freezed +abstract class Province with _$Province { + const factory Province({ + String? key, + String? name, + }) = _Province; + + factory Province.fromJson(Map json) => + _$ProvinceFromJson(json); +} + +@freezed +abstract class CitySimple with _$CitySimple { + const factory CitySimple({ + String? key, + String? name, + }) = _CitySimple; + + factory CitySimple.fromJson(Map json) => + _$CitySimpleFromJson(json); +} + +@freezed +abstract class Activity with _$Activity { + const factory Activity({ + String? key, + String? title, + }) = _Activity; + + factory Activity.fromJson(Map json) => + _$ActivityFromJson(json); +} + +@freezed +abstract class PosStatus with _$PosStatus { + const factory PosStatus({ + int? lenActiveSessions, + bool? hasPons, + bool? hasActivePons, + }) = _PosStatus; + + factory PosStatus.fromJson(Map json) => + _$PosStatusFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart new file mode 100644 index 0000000..16c065c --- /dev/null +++ b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart @@ -0,0 +1,2744 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'imported_loads_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$ImportedLoadsModel { + + int? get count; String? get next; String? get previous; List? get results; +/// Create a copy of ImportedLoadsModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ImportedLoadsModelCopyWith get copyWith => _$ImportedLoadsModelCopyWithImpl(this as ImportedLoadsModel, _$identity); + + /// Serializes this ImportedLoadsModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ImportedLoadsModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); + +@override +String toString() { + return 'ImportedLoadsModel(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class $ImportedLoadsModelCopyWith<$Res> { + factory $ImportedLoadsModelCopyWith(ImportedLoadsModel value, $Res Function(ImportedLoadsModel) _then) = _$ImportedLoadsModelCopyWithImpl; +@useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class _$ImportedLoadsModelCopyWithImpl<$Res> + implements $ImportedLoadsModelCopyWith<$Res> { + _$ImportedLoadsModelCopyWithImpl(this._self, this._then); + + final ImportedLoadsModel _self; + final $Res Function(ImportedLoadsModel) _then; + +/// Create a copy of ImportedLoadsModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_self.copyWith( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self.results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ImportedLoadsModel implements ImportedLoadsModel { + const _ImportedLoadsModel({this.count, this.next, this.previous, final List? results}): _results = results; + factory _ImportedLoadsModel.fromJson(Map json) => _$ImportedLoadsModelFromJson(json); + +@override final int? count; +@override final String? next; +@override final String? previous; + final List? _results; +@override List? get results { + final value = _results; + if (value == null) return null; + if (_results is EqualUnmodifiableListView) return _results; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of ImportedLoadsModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ImportedLoadsModelCopyWith<_ImportedLoadsModel> get copyWith => __$ImportedLoadsModelCopyWithImpl<_ImportedLoadsModel>(this, _$identity); + +@override +Map toJson() { + return _$ImportedLoadsModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ImportedLoadsModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); + +@override +String toString() { + return 'ImportedLoadsModel(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class _$ImportedLoadsModelCopyWith<$Res> implements $ImportedLoadsModelCopyWith<$Res> { + factory _$ImportedLoadsModelCopyWith(_ImportedLoadsModel value, $Res Function(_ImportedLoadsModel) _then) = __$ImportedLoadsModelCopyWithImpl; +@override @useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class __$ImportedLoadsModelCopyWithImpl<$Res> + implements _$ImportedLoadsModelCopyWith<$Res> { + __$ImportedLoadsModelCopyWithImpl(this._self, this._then); + + final _ImportedLoadsModel _self; + final $Res Function(_ImportedLoadsModel) _then; + +/// Create a copy of ImportedLoadsModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_ImportedLoadsModel( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self._results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + + +} + + +/// @nodoc +mixin _$ImportedLoad { + + int? get id; Product? get product; KillHouse? get killHouse; dynamic get toKillHouse; dynamic get steward; ToSteward? get toSteward; dynamic get guilds; dynamic get toGuilds; dynamic get toColdHouse; int? get indexWeight; int? get dateTimestamp; int? get newState; int? get newReceiverState; int? get newAllocationState; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get numberOfCarcasses; int? get realNumberOfCarcasses; int? get receiverRealNumberOfCarcasses; double? get weightOfCarcasses; double? get realWeightOfCarcasses; double? get receiverRealWeightOfCarcasses; double? get weightLossOfCarcasses; bool? get finalRegistration; String? get sellType; String? get productName; String? get sellerType; String? get type; String? get saleType; String? get allocationType; bool? get systemRegistrationCode; int? get registrationCode; int? get amount; int? get totalAmount; int? get totalAmountPaid; int? get totalAmountRemain; dynamic get loggedRegistrationCode; String? get state; String? get receiverState; String? get allocationState; String? get date; dynamic get role; dynamic get stewardTempKey; bool? get approvedPriceStatus; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get createdBy; dynamic get modifiedBy; dynamic get wareHouse; dynamic get stewardWareHouse; dynamic get car; dynamic get dispenser; +/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ImportedLoadCopyWith get copyWith => _$ImportedLoadCopyWithImpl(this as ImportedLoad, _$identity); + + /// Serializes this ImportedLoad to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ImportedLoad&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); + +@override +String toString() { + return 'ImportedLoad(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; +} + + +} + +/// @nodoc +abstract mixin class $ImportedLoadCopyWith<$Res> { + factory $ImportedLoadCopyWith(ImportedLoad value, $Res Function(ImportedLoad) _then) = _$ImportedLoadCopyWithImpl; +@useResult +$Res call({ + int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser +}); + + +$ProductCopyWith<$Res>? get product;$KillHouseCopyWith<$Res>? get killHouse;$ToStewardCopyWith<$Res>? get toSteward; + +} +/// @nodoc +class _$ImportedLoadCopyWithImpl<$Res> + implements $ImportedLoadCopyWith<$Res> { + _$ImportedLoadCopyWithImpl(this._self, this._then); + + final ImportedLoad _self; + final $Res Function(ImportedLoad) _then; + +/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as Product?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as KillHouse?,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as dynamic,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable +as ToSteward?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable +as dynamic,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable +as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable +as int?,dateTimestamp: freezed == dateTimestamp ? _self.dateTimestamp : dateTimestamp // ignore: cast_nullable_to_non_nullable +as int?,newState: freezed == newState ? _self.newState : newState // ignore: cast_nullable_to_non_nullable +as int?,newReceiverState: freezed == newReceiverState ? _self.newReceiverState : newReceiverState // ignore: cast_nullable_to_non_nullable +as int?,newAllocationState: freezed == newAllocationState ? _self.newAllocationState : newAllocationState // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realNumberOfCarcasses: freezed == realNumberOfCarcasses ? _self.realNumberOfCarcasses : realNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,realWeightOfCarcasses: freezed == realWeightOfCarcasses ? _self.realWeightOfCarcasses : realWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,finalRegistration: freezed == finalRegistration ? _self.finalRegistration : finalRegistration // ignore: cast_nullable_to_non_nullable +as bool?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,productName: freezed == productName ? _self.productName : productName // ignore: cast_nullable_to_non_nullable +as String?,sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,saleType: freezed == saleType ? _self.saleType : saleType // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,systemRegistrationCode: freezed == systemRegistrationCode ? _self.systemRegistrationCode : systemRegistrationCode // ignore: cast_nullable_to_non_nullable +as bool?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,totalAmountPaid: freezed == totalAmountPaid ? _self.totalAmountPaid : totalAmountPaid // ignore: cast_nullable_to_non_nullable +as int?,totalAmountRemain: freezed == totalAmountRemain ? _self.totalAmountRemain : totalAmountRemain // ignore: cast_nullable_to_non_nullable +as int?,loggedRegistrationCode: freezed == loggedRegistrationCode ? _self.loggedRegistrationCode : loggedRegistrationCode // ignore: cast_nullable_to_non_nullable +as dynamic,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,receiverState: freezed == receiverState ? _self.receiverState : receiverState // ignore: cast_nullable_to_non_nullable +as String?,allocationState: freezed == allocationState ? _self.allocationState : allocationState // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as dynamic,stewardTempKey: freezed == stewardTempKey ? _self.stewardTempKey : stewardTempKey // ignore: cast_nullable_to_non_nullable +as dynamic,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,stewardWareHouse: freezed == stewardWareHouse ? _self.stewardWareHouse : stewardWareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} +/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +}/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseCopyWith<$Res>? get killHouse { + if (_self.killHouse == null) { + return null; + } + + return $KillHouseCopyWith<$Res>(_self.killHouse!, (value) { + return _then(_self.copyWith(killHouse: value)); + }); +}/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardCopyWith<$Res>? get toSteward { + if (_self.toSteward == null) { + return null; + } + + return $ToStewardCopyWith<$Res>(_self.toSteward!, (value) { + return _then(_self.copyWith(toSteward: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _ImportedLoad implements ImportedLoad { + const _ImportedLoad({this.id, this.product, this.killHouse, this.toKillHouse, this.steward, this.toSteward, this.guilds, this.toGuilds, this.toColdHouse, this.indexWeight, this.dateTimestamp, this.newState, this.newReceiverState, this.newAllocationState, this.key, this.createDate, this.modifyDate, this.trash, this.numberOfCarcasses, this.realNumberOfCarcasses, this.receiverRealNumberOfCarcasses, this.weightOfCarcasses, this.realWeightOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses, this.finalRegistration, this.sellType, this.productName, this.sellerType, this.type, this.saleType, this.allocationType, this.systemRegistrationCode, this.registrationCode, this.amount, this.totalAmount, this.totalAmountPaid, this.totalAmountRemain, this.loggedRegistrationCode, this.state, this.receiverState, this.allocationState, this.date, this.role, this.stewardTempKey, this.approvedPriceStatus, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy, this.wareHouse, this.stewardWareHouse, this.car, this.dispenser}); + factory _ImportedLoad.fromJson(Map json) => _$ImportedLoadFromJson(json); + +@override final int? id; +@override final Product? product; +@override final KillHouse? killHouse; +@override final dynamic toKillHouse; +@override final dynamic steward; +@override final ToSteward? toSteward; +@override final dynamic guilds; +@override final dynamic toGuilds; +@override final dynamic toColdHouse; +@override final int? indexWeight; +@override final int? dateTimestamp; +@override final int? newState; +@override final int? newReceiverState; +@override final int? newAllocationState; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final int? numberOfCarcasses; +@override final int? realNumberOfCarcasses; +@override final int? receiverRealNumberOfCarcasses; +@override final double? weightOfCarcasses; +@override final double? realWeightOfCarcasses; +@override final double? receiverRealWeightOfCarcasses; +@override final double? weightLossOfCarcasses; +@override final bool? finalRegistration; +@override final String? sellType; +@override final String? productName; +@override final String? sellerType; +@override final String? type; +@override final String? saleType; +@override final String? allocationType; +@override final bool? systemRegistrationCode; +@override final int? registrationCode; +@override final int? amount; +@override final int? totalAmount; +@override final int? totalAmountPaid; +@override final int? totalAmountRemain; +@override final dynamic loggedRegistrationCode; +@override final String? state; +@override final String? receiverState; +@override final String? allocationState; +@override final String? date; +@override final dynamic role; +@override final dynamic stewardTempKey; +@override final bool? approvedPriceStatus; +@override final bool? calculateStatus; +@override final bool? temporaryTrash; +@override final bool? temporaryDeleted; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final dynamic wareHouse; +@override final dynamic stewardWareHouse; +@override final dynamic car; +@override final dynamic dispenser; + +/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ImportedLoadCopyWith<_ImportedLoad> get copyWith => __$ImportedLoadCopyWithImpl<_ImportedLoad>(this, _$identity); + +@override +Map toJson() { + return _$ImportedLoadToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ImportedLoad&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); + +@override +String toString() { + return 'ImportedLoad(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; +} + + +} + +/// @nodoc +abstract mixin class _$ImportedLoadCopyWith<$Res> implements $ImportedLoadCopyWith<$Res> { + factory _$ImportedLoadCopyWith(_ImportedLoad value, $Res Function(_ImportedLoad) _then) = __$ImportedLoadCopyWithImpl; +@override @useResult +$Res call({ + int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser +}); + + +@override $ProductCopyWith<$Res>? get product;@override $KillHouseCopyWith<$Res>? get killHouse;@override $ToStewardCopyWith<$Res>? get toSteward; + +} +/// @nodoc +class __$ImportedLoadCopyWithImpl<$Res> + implements _$ImportedLoadCopyWith<$Res> { + __$ImportedLoadCopyWithImpl(this._self, this._then); + + final _ImportedLoad _self; + final $Res Function(_ImportedLoad) _then; + +/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { + return _then(_ImportedLoad( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as Product?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as KillHouse?,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as dynamic,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable +as ToSteward?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable +as dynamic,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable +as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable +as int?,dateTimestamp: freezed == dateTimestamp ? _self.dateTimestamp : dateTimestamp // ignore: cast_nullable_to_non_nullable +as int?,newState: freezed == newState ? _self.newState : newState // ignore: cast_nullable_to_non_nullable +as int?,newReceiverState: freezed == newReceiverState ? _self.newReceiverState : newReceiverState // ignore: cast_nullable_to_non_nullable +as int?,newAllocationState: freezed == newAllocationState ? _self.newAllocationState : newAllocationState // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realNumberOfCarcasses: freezed == realNumberOfCarcasses ? _self.realNumberOfCarcasses : realNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,realWeightOfCarcasses: freezed == realWeightOfCarcasses ? _self.realWeightOfCarcasses : realWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,finalRegistration: freezed == finalRegistration ? _self.finalRegistration : finalRegistration // ignore: cast_nullable_to_non_nullable +as bool?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,productName: freezed == productName ? _self.productName : productName // ignore: cast_nullable_to_non_nullable +as String?,sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,saleType: freezed == saleType ? _self.saleType : saleType // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,systemRegistrationCode: freezed == systemRegistrationCode ? _self.systemRegistrationCode : systemRegistrationCode // ignore: cast_nullable_to_non_nullable +as bool?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,totalAmountPaid: freezed == totalAmountPaid ? _self.totalAmountPaid : totalAmountPaid // ignore: cast_nullable_to_non_nullable +as int?,totalAmountRemain: freezed == totalAmountRemain ? _self.totalAmountRemain : totalAmountRemain // ignore: cast_nullable_to_non_nullable +as int?,loggedRegistrationCode: freezed == loggedRegistrationCode ? _self.loggedRegistrationCode : loggedRegistrationCode // ignore: cast_nullable_to_non_nullable +as dynamic,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,receiverState: freezed == receiverState ? _self.receiverState : receiverState // ignore: cast_nullable_to_non_nullable +as String?,allocationState: freezed == allocationState ? _self.allocationState : allocationState // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as dynamic,stewardTempKey: freezed == stewardTempKey ? _self.stewardTempKey : stewardTempKey // ignore: cast_nullable_to_non_nullable +as dynamic,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,stewardWareHouse: freezed == stewardWareHouse ? _self.stewardWareHouse : stewardWareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} + +/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +}/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseCopyWith<$Res>? get killHouse { + if (_self.killHouse == null) { + return null; + } + + return $KillHouseCopyWith<$Res>(_self.killHouse!, (value) { + return _then(_self.copyWith(killHouse: value)); + }); +}/// Create a copy of ImportedLoad +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardCopyWith<$Res>? get toSteward { + if (_self.toSteward == null) { + return null; + } + + return $ToStewardCopyWith<$Res>(_self.toSteward!, (value) { + return _then(_self.copyWith(toSteward: value)); + }); +} +} + + +/// @nodoc +mixin _$Product { + + double? get weightAverage; +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProductCopyWith get copyWith => _$ProductCopyWithImpl(this as Product, _$identity); + + /// Serializes this Product to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,weightAverage); + +@override +String toString() { + return 'Product(weightAverage: $weightAverage)'; +} + + +} + +/// @nodoc +abstract mixin class $ProductCopyWith<$Res> { + factory $ProductCopyWith(Product value, $Res Function(Product) _then) = _$ProductCopyWithImpl; +@useResult +$Res call({ + double? weightAverage +}); + + + + +} +/// @nodoc +class _$ProductCopyWithImpl<$Res> + implements $ProductCopyWith<$Res> { + _$ProductCopyWithImpl(this._self, this._then); + + final Product _self; + final $Res Function(Product) _then; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? weightAverage = freezed,}) { + return _then(_self.copyWith( +weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Product implements Product { + const _Product({this.weightAverage}); + factory _Product.fromJson(Map json) => _$ProductFromJson(json); + +@override final double? weightAverage; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProductCopyWith<_Product> get copyWith => __$ProductCopyWithImpl<_Product>(this, _$identity); + +@override +Map toJson() { + return _$ProductToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,weightAverage); + +@override +String toString() { + return 'Product(weightAverage: $weightAverage)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProductCopyWith<$Res> implements $ProductCopyWith<$Res> { + factory _$ProductCopyWith(_Product value, $Res Function(_Product) _then) = __$ProductCopyWithImpl; +@override @useResult +$Res call({ + double? weightAverage +}); + + + + +} +/// @nodoc +class __$ProductCopyWithImpl<$Res> + implements _$ProductCopyWith<$Res> { + __$ProductCopyWithImpl(this._self, this._then); + + final _Product _self; + final $Res Function(_Product) _then; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? weightAverage = freezed,}) { + return _then(_Product( +weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + + +/// @nodoc +mixin _$KillHouse { + + String? get key; KillHouseOperator? get killHouseOperator; String? get name; bool? get killer; +/// Create a copy of KillHouse +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$KillHouseCopyWith get copyWith => _$KillHouseCopyWithImpl(this as KillHouse, _$identity); + + /// Serializes this KillHouse to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouse&&(identical(other.key, key) || other.key == key)&&(identical(other.killHouseOperator, killHouseOperator) || other.killHouseOperator == killHouseOperator)&&(identical(other.name, name) || other.name == name)&&(identical(other.killer, killer) || other.killer == killer)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,killHouseOperator,name,killer); + +@override +String toString() { + return 'KillHouse(key: $key, killHouseOperator: $killHouseOperator, name: $name, killer: $killer)'; +} + + +} + +/// @nodoc +abstract mixin class $KillHouseCopyWith<$Res> { + factory $KillHouseCopyWith(KillHouse value, $Res Function(KillHouse) _then) = _$KillHouseCopyWithImpl; +@useResult +$Res call({ + String? key, KillHouseOperator? killHouseOperator, String? name, bool? killer +}); + + +$KillHouseOperatorCopyWith<$Res>? get killHouseOperator; + +} +/// @nodoc +class _$KillHouseCopyWithImpl<$Res> + implements $KillHouseCopyWith<$Res> { + _$KillHouseCopyWithImpl(this._self, this._then); + + final KillHouse _self; + final $Res Function(KillHouse) _then; + +/// Create a copy of KillHouse +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? killHouseOperator = freezed,Object? name = freezed,Object? killer = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,killHouseOperator: freezed == killHouseOperator ? _self.killHouseOperator : killHouseOperator // ignore: cast_nullable_to_non_nullable +as KillHouseOperator?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,killer: freezed == killer ? _self.killer : killer // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} +/// Create a copy of KillHouse +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseOperatorCopyWith<$Res>? get killHouseOperator { + if (_self.killHouseOperator == null) { + return null; + } + + return $KillHouseOperatorCopyWith<$Res>(_self.killHouseOperator!, (value) { + return _then(_self.copyWith(killHouseOperator: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _KillHouse implements KillHouse { + const _KillHouse({this.key, this.killHouseOperator, this.name, this.killer}); + factory _KillHouse.fromJson(Map json) => _$KillHouseFromJson(json); + +@override final String? key; +@override final KillHouseOperator? killHouseOperator; +@override final String? name; +@override final bool? killer; + +/// Create a copy of KillHouse +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$KillHouseCopyWith<_KillHouse> get copyWith => __$KillHouseCopyWithImpl<_KillHouse>(this, _$identity); + +@override +Map toJson() { + return _$KillHouseToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouse&&(identical(other.key, key) || other.key == key)&&(identical(other.killHouseOperator, killHouseOperator) || other.killHouseOperator == killHouseOperator)&&(identical(other.name, name) || other.name == name)&&(identical(other.killer, killer) || other.killer == killer)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,killHouseOperator,name,killer); + +@override +String toString() { + return 'KillHouse(key: $key, killHouseOperator: $killHouseOperator, name: $name, killer: $killer)'; +} + + +} + +/// @nodoc +abstract mixin class _$KillHouseCopyWith<$Res> implements $KillHouseCopyWith<$Res> { + factory _$KillHouseCopyWith(_KillHouse value, $Res Function(_KillHouse) _then) = __$KillHouseCopyWithImpl; +@override @useResult +$Res call({ + String? key, KillHouseOperator? killHouseOperator, String? name, bool? killer +}); + + +@override $KillHouseOperatorCopyWith<$Res>? get killHouseOperator; + +} +/// @nodoc +class __$KillHouseCopyWithImpl<$Res> + implements _$KillHouseCopyWith<$Res> { + __$KillHouseCopyWithImpl(this._self, this._then); + + final _KillHouse _self; + final $Res Function(_KillHouse) _then; + +/// Create a copy of KillHouse +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? killHouseOperator = freezed,Object? name = freezed,Object? killer = freezed,}) { + return _then(_KillHouse( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,killHouseOperator: freezed == killHouseOperator ? _self.killHouseOperator : killHouseOperator // ignore: cast_nullable_to_non_nullable +as KillHouseOperator?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,killer: freezed == killer ? _self.killer : killer // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +/// Create a copy of KillHouse +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseOperatorCopyWith<$Res>? get killHouseOperator { + if (_self.killHouseOperator == null) { + return null; + } + + return $KillHouseOperatorCopyWith<$Res>(_self.killHouseOperator!, (value) { + return _then(_self.copyWith(killHouseOperator: value)); + }); +} +} + + +/// @nodoc +mixin _$KillHouseOperator { + + User? get user; +/// Create a copy of KillHouseOperator +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$KillHouseOperatorCopyWith get copyWith => _$KillHouseOperatorCopyWithImpl(this as KillHouseOperator, _$identity); + + /// Serializes this KillHouseOperator to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouseOperator&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user); + +@override +String toString() { + return 'KillHouseOperator(user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class $KillHouseOperatorCopyWith<$Res> { + factory $KillHouseOperatorCopyWith(KillHouseOperator value, $Res Function(KillHouseOperator) _then) = _$KillHouseOperatorCopyWithImpl; +@useResult +$Res call({ + User? user +}); + + +$UserCopyWith<$Res>? get user; + +} +/// @nodoc +class _$KillHouseOperatorCopyWithImpl<$Res> + implements $KillHouseOperatorCopyWith<$Res> { + _$KillHouseOperatorCopyWithImpl(this._self, this._then); + + final KillHouseOperator _self; + final $Res Function(KillHouseOperator) _then; + +/// Create a copy of KillHouseOperator +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? user = freezed,}) { + return _then(_self.copyWith( +user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?, + )); +} +/// Create a copy of KillHouseOperator +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _KillHouseOperator implements KillHouseOperator { + const _KillHouseOperator({this.user}); + factory _KillHouseOperator.fromJson(Map json) => _$KillHouseOperatorFromJson(json); + +@override final User? user; + +/// Create a copy of KillHouseOperator +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$KillHouseOperatorCopyWith<_KillHouseOperator> get copyWith => __$KillHouseOperatorCopyWithImpl<_KillHouseOperator>(this, _$identity); + +@override +Map toJson() { + return _$KillHouseOperatorToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouseOperator&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user); + +@override +String toString() { + return 'KillHouseOperator(user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class _$KillHouseOperatorCopyWith<$Res> implements $KillHouseOperatorCopyWith<$Res> { + factory _$KillHouseOperatorCopyWith(_KillHouseOperator value, $Res Function(_KillHouseOperator) _then) = __$KillHouseOperatorCopyWithImpl; +@override @useResult +$Res call({ + User? user +}); + + +@override $UserCopyWith<$Res>? get user; + +} +/// @nodoc +class __$KillHouseOperatorCopyWithImpl<$Res> + implements _$KillHouseOperatorCopyWith<$Res> { + __$KillHouseOperatorCopyWithImpl(this._self, this._then); + + final _KillHouseOperator _self; + final $Res Function(_KillHouseOperator) _then; + +/// Create a copy of KillHouseOperator +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? user = freezed,}) { + return _then(_KillHouseOperator( +user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?, + )); +} + +/// Create a copy of KillHouseOperator +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + String? get fullname; String? get firstName; String? get lastName; int? get baseOrder; String? get mobile; String? get nationalId; String? get nationalCode; String? get key; City? get city; String? get unitName; String? get unitNationalId; String? get unitRegistrationNumber; String? get unitEconomicalNumber; String? get unitProvince; String? get unitCity; String? get unitPostalCode; String? get unitAddress; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); + +@override +String toString() { + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress +}); + + +$CityCopyWith<$Res>? get city; + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _User implements User { + const _User({this.fullname, this.firstName, this.lastName, this.baseOrder, this.mobile, this.nationalId, this.nationalCode, this.key, this.city, this.unitName, this.unitNationalId, this.unitRegistrationNumber, this.unitEconomicalNumber, this.unitProvince, this.unitCity, this.unitPostalCode, this.unitAddress}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final int? baseOrder; +@override final String? mobile; +@override final String? nationalId; +@override final String? nationalCode; +@override final String? key; +@override final City? city; +@override final String? unitName; +@override final String? unitNationalId; +@override final String? unitRegistrationNumber; +@override final String? unitEconomicalNumber; +@override final String? unitProvince; +@override final String? unitCity; +@override final String? unitPostalCode; +@override final String? unitAddress; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); + +@override +String toString() { + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress +}); + + +@override $CityCopyWith<$Res>? get city; + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { + return _then(_User( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$City { + + int? get id; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get provinceIdForeignKey; int? get cityIdKey; String? get name; double? get productPrice; bool? get provinceCenter; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; dynamic get createdBy; dynamic get modifiedBy; int? get province; +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CityCopyWith get copyWith => _$CityCopyWithImpl(this as City, _$identity); + + /// Serializes this City to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.province, province) || other.province == province)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),province); + +@override +String toString() { + return 'City(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; +} + + +} + +/// @nodoc +abstract mixin class $CityCopyWith<$Res> { + factory $CityCopyWith(City value, $Res Function(City) _then) = _$CityCopyWithImpl; +@useResult +$Res call({ + int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province +}); + + + + +} +/// @nodoc +class _$CityCopyWithImpl<$Res> + implements $CityCopyWith<$Res> { + _$CityCopyWithImpl(this._self, this._then); + + final City _self; + final $Res Function(City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable +as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _City implements City { + const _City({this.id, this.key, this.createDate, this.modifyDate, this.trash, this.provinceIdForeignKey, this.cityIdKey, this.name, this.productPrice, this.provinceCenter, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.createdBy, this.modifiedBy, this.province}); + factory _City.fromJson(Map json) => _$CityFromJson(json); + +@override final int? id; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final int? provinceIdForeignKey; +@override final int? cityIdKey; +@override final String? name; +@override final double? productPrice; +@override final bool? provinceCenter; +@override final int? cityNumber; +@override final String? cityName; +@override final int? provinceNumber; +@override final String? provinceName; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final int? province; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CityCopyWith<_City> get copyWith => __$CityCopyWithImpl<_City>(this, _$identity); + +@override +Map toJson() { + return _$CityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.province, province) || other.province == province)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),province); + +@override +String toString() { + return 'City(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; +} + + +} + +/// @nodoc +abstract mixin class _$CityCopyWith<$Res> implements $CityCopyWith<$Res> { + factory _$CityCopyWith(_City value, $Res Function(_City) _then) = __$CityCopyWithImpl; +@override @useResult +$Res call({ + int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province +}); + + + + +} +/// @nodoc +class __$CityCopyWithImpl<$Res> + implements _$CityCopyWith<$Res> { + __$CityCopyWithImpl(this._self, this._then); + + final _City _self; + final $Res Function(_City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { + return _then(_City( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable +as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + + +/// @nodoc +mixin _$ToSteward { + + int? get id; ToStewardUser? get user; Address? get address; Activity? get guildAreaActivity; Activity? get guildTypeActivity; List? get killHouse; List? get stewardKillHouse; List? get stewards; PosStatus? get getPosStatus; String? get key; String? get createDate; String? get modifyDate; bool? get trash; dynamic get userIdForeignKey; dynamic get addressIdForeignKey; dynamic get userBankIdForeignKey; dynamic get walletIdForeignKey; dynamic get provincialGovernmentIdKey; dynamic get identityDocuments; bool? get active; int? get cityNumber; String? get cityName; String? get guildsId; String? get licenseNumber; String? get guildsName; dynamic get phone; String? get typeActivity; String? get areaActivity; int? get provinceNumber; String? get provinceName; bool? get steward; bool? get hasPos; dynamic get centersAllocation; dynamic get killHouseCentersAllocation; dynamic get allocationLimit; bool? get limitationAllocation; dynamic get registerarRole; dynamic get registerarFullname; dynamic get registerarMobile; bool? get killHouseRegister; bool? get stewardRegister; bool? get guildsRoomRegister; bool? get posCompanyRegister; String? get provinceAcceptState; dynamic get provinceMessage; dynamic get condition; dynamic get descriptionCondition; bool? get stewardActive; dynamic get stewardAllocationLimit; bool? get stewardLimitationAllocation; bool? get license; dynamic get licenseForm; dynamic get licenseFile; dynamic get reviewerRole; dynamic get reviewerFullname; dynamic get reviewerMobile; dynamic get checkerMessage; bool? get finalAccept; bool? get temporaryRegistration; dynamic get createdBy; dynamic get modifiedBy; dynamic get userBankInfo; int? get wallet; List? get cars; List? get userLevel; +/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ToStewardCopyWith get copyWith => _$ToStewardCopyWithImpl(this as ToSteward, _$identity); + + /// Serializes this ToSteward to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToSteward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.stewardKillHouse, stewardKillHouse)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.userIdForeignKey, userIdForeignKey)&&const DeepCollectionEquality().equals(other.addressIdForeignKey, addressIdForeignKey)&&const DeepCollectionEquality().equals(other.userBankIdForeignKey, userBankIdForeignKey)&&const DeepCollectionEquality().equals(other.walletIdForeignKey, walletIdForeignKey)&&const DeepCollectionEquality().equals(other.provincialGovernmentIdKey, provincialGovernmentIdKey)&&const DeepCollectionEquality().equals(other.identityDocuments, identityDocuments)&&(identical(other.active, active) || other.active == active)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&const DeepCollectionEquality().equals(other.phone, phone)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&const DeepCollectionEquality().equals(other.centersAllocation, centersAllocation)&&const DeepCollectionEquality().equals(other.killHouseCentersAllocation, killHouseCentersAllocation)&&const DeepCollectionEquality().equals(other.allocationLimit, allocationLimit)&&(identical(other.limitationAllocation, limitationAllocation) || other.limitationAllocation == limitationAllocation)&&const DeepCollectionEquality().equals(other.registerarRole, registerarRole)&&const DeepCollectionEquality().equals(other.registerarFullname, registerarFullname)&&const DeepCollectionEquality().equals(other.registerarMobile, registerarMobile)&&(identical(other.killHouseRegister, killHouseRegister) || other.killHouseRegister == killHouseRegister)&&(identical(other.stewardRegister, stewardRegister) || other.stewardRegister == stewardRegister)&&(identical(other.guildsRoomRegister, guildsRoomRegister) || other.guildsRoomRegister == guildsRoomRegister)&&(identical(other.posCompanyRegister, posCompanyRegister) || other.posCompanyRegister == posCompanyRegister)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)&&const DeepCollectionEquality().equals(other.provinceMessage, provinceMessage)&&const DeepCollectionEquality().equals(other.condition, condition)&&const DeepCollectionEquality().equals(other.descriptionCondition, descriptionCondition)&&(identical(other.stewardActive, stewardActive) || other.stewardActive == stewardActive)&&const DeepCollectionEquality().equals(other.stewardAllocationLimit, stewardAllocationLimit)&&(identical(other.stewardLimitationAllocation, stewardLimitationAllocation) || other.stewardLimitationAllocation == stewardLimitationAllocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.licenseForm, licenseForm)&&const DeepCollectionEquality().equals(other.licenseFile, licenseFile)&&const DeepCollectionEquality().equals(other.reviewerRole, reviewerRole)&&const DeepCollectionEquality().equals(other.reviewerFullname, reviewerFullname)&&const DeepCollectionEquality().equals(other.reviewerMobile, reviewerMobile)&&const DeepCollectionEquality().equals(other.checkerMessage, checkerMessage)&&(identical(other.finalAccept, finalAccept) || other.finalAccept == finalAccept)&&(identical(other.temporaryRegistration, temporaryRegistration) || other.temporaryRegistration == temporaryRegistration)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.userBankInfo, userBankInfo)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other.cars, cars)&&const DeepCollectionEquality().equals(other.userLevel, userLevel)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(stewardKillHouse),const DeepCollectionEquality().hash(stewards),getPosStatus,key,createDate,modifyDate,trash,const DeepCollectionEquality().hash(userIdForeignKey),const DeepCollectionEquality().hash(addressIdForeignKey),const DeepCollectionEquality().hash(userBankIdForeignKey),const DeepCollectionEquality().hash(walletIdForeignKey),const DeepCollectionEquality().hash(provincialGovernmentIdKey),const DeepCollectionEquality().hash(identityDocuments),active,cityNumber,cityName,guildsId,licenseNumber,guildsName,const DeepCollectionEquality().hash(phone),typeActivity,areaActivity,provinceNumber,provinceName,steward,hasPos,const DeepCollectionEquality().hash(centersAllocation),const DeepCollectionEquality().hash(killHouseCentersAllocation),const DeepCollectionEquality().hash(allocationLimit),limitationAllocation,const DeepCollectionEquality().hash(registerarRole),const DeepCollectionEquality().hash(registerarFullname),const DeepCollectionEquality().hash(registerarMobile),killHouseRegister,stewardRegister,guildsRoomRegister,posCompanyRegister,provinceAcceptState,const DeepCollectionEquality().hash(provinceMessage),const DeepCollectionEquality().hash(condition),const DeepCollectionEquality().hash(descriptionCondition),stewardActive,const DeepCollectionEquality().hash(stewardAllocationLimit),stewardLimitationAllocation,license,const DeepCollectionEquality().hash(licenseForm),const DeepCollectionEquality().hash(licenseFile),const DeepCollectionEquality().hash(reviewerRole),const DeepCollectionEquality().hash(reviewerFullname),const DeepCollectionEquality().hash(reviewerMobile),const DeepCollectionEquality().hash(checkerMessage),finalAccept,temporaryRegistration,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(userBankInfo),wallet,const DeepCollectionEquality().hash(cars),const DeepCollectionEquality().hash(userLevel)]); + +@override +String toString() { + return 'ToSteward(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, userIdForeignKey: $userIdForeignKey, addressIdForeignKey: $addressIdForeignKey, userBankIdForeignKey: $userBankIdForeignKey, walletIdForeignKey: $walletIdForeignKey, provincialGovernmentIdKey: $provincialGovernmentIdKey, identityDocuments: $identityDocuments, active: $active, cityNumber: $cityNumber, cityName: $cityName, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, phone: $phone, typeActivity: $typeActivity, areaActivity: $areaActivity, provinceNumber: $provinceNumber, provinceName: $provinceName, steward: $steward, hasPos: $hasPos, centersAllocation: $centersAllocation, killHouseCentersAllocation: $killHouseCentersAllocation, allocationLimit: $allocationLimit, limitationAllocation: $limitationAllocation, registerarRole: $registerarRole, registerarFullname: $registerarFullname, registerarMobile: $registerarMobile, killHouseRegister: $killHouseRegister, stewardRegister: $stewardRegister, guildsRoomRegister: $guildsRoomRegister, posCompanyRegister: $posCompanyRegister, provinceAcceptState: $provinceAcceptState, provinceMessage: $provinceMessage, condition: $condition, descriptionCondition: $descriptionCondition, stewardActive: $stewardActive, stewardAllocationLimit: $stewardAllocationLimit, stewardLimitationAllocation: $stewardLimitationAllocation, license: $license, licenseForm: $licenseForm, licenseFile: $licenseFile, reviewerRole: $reviewerRole, reviewerFullname: $reviewerFullname, reviewerMobile: $reviewerMobile, checkerMessage: $checkerMessage, finalAccept: $finalAccept, temporaryRegistration: $temporaryRegistration, createdBy: $createdBy, modifiedBy: $modifiedBy, userBankInfo: $userBankInfo, wallet: $wallet, cars: $cars, userLevel: $userLevel)'; +} + + +} + +/// @nodoc +abstract mixin class $ToStewardCopyWith<$Res> { + factory $ToStewardCopyWith(ToSteward value, $Res Function(ToSteward) _then) = _$ToStewardCopyWithImpl; +@useResult +$Res call({ + int? id, ToStewardUser? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, dynamic phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, dynamic registerarRole, dynamic registerarFullname, dynamic registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, dynamic provinceMessage, dynamic condition, dynamic descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, dynamic reviewerRole, dynamic reviewerFullname, dynamic reviewerMobile, dynamic checkerMessage, bool? finalAccept, bool? temporaryRegistration, dynamic createdBy, dynamic modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel +}); + + +$ToStewardUserCopyWith<$Res>? get user;$AddressCopyWith<$Res>? get address;$ActivityCopyWith<$Res>? get guildAreaActivity;$ActivityCopyWith<$Res>? get guildTypeActivity;$PosStatusCopyWith<$Res>? get getPosStatus; + +} +/// @nodoc +class _$ToStewardCopyWithImpl<$Res> + implements $ToStewardCopyWith<$Res> { + _$ToStewardCopyWithImpl(this._self, this._then); + + final ToSteward _self; + final $Res Function(ToSteward) _then; + +/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? userIdForeignKey = freezed,Object? addressIdForeignKey = freezed,Object? userBankIdForeignKey = freezed,Object? walletIdForeignKey = freezed,Object? provincialGovernmentIdKey = freezed,Object? identityDocuments = freezed,Object? active = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? phone = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? centersAllocation = freezed,Object? killHouseCentersAllocation = freezed,Object? allocationLimit = freezed,Object? limitationAllocation = freezed,Object? registerarRole = freezed,Object? registerarFullname = freezed,Object? registerarMobile = freezed,Object? killHouseRegister = freezed,Object? stewardRegister = freezed,Object? guildsRoomRegister = freezed,Object? posCompanyRegister = freezed,Object? provinceAcceptState = freezed,Object? provinceMessage = freezed,Object? condition = freezed,Object? descriptionCondition = freezed,Object? stewardActive = freezed,Object? stewardAllocationLimit = freezed,Object? stewardLimitationAllocation = freezed,Object? license = freezed,Object? licenseForm = freezed,Object? licenseFile = freezed,Object? reviewerRole = freezed,Object? reviewerFullname = freezed,Object? reviewerMobile = freezed,Object? checkerMessage = freezed,Object? finalAccept = freezed,Object? temporaryRegistration = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? userBankInfo = freezed,Object? wallet = freezed,Object? cars = freezed,Object? userLevel = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as ToStewardUser?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable +as Activity?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as Activity?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as List?,stewardKillHouse: freezed == stewardKillHouse ? _self.stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self.stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable +as PosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,userIdForeignKey: freezed == userIdForeignKey ? _self.userIdForeignKey : userIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,addressIdForeignKey: freezed == addressIdForeignKey ? _self.addressIdForeignKey : addressIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,userBankIdForeignKey: freezed == userBankIdForeignKey ? _self.userBankIdForeignKey : userBankIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,walletIdForeignKey: freezed == walletIdForeignKey ? _self.walletIdForeignKey : walletIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,provincialGovernmentIdKey: freezed == provincialGovernmentIdKey ? _self.provincialGovernmentIdKey : provincialGovernmentIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,identityDocuments: freezed == identityDocuments ? _self.identityDocuments : identityDocuments // ignore: cast_nullable_to_non_nullable +as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as dynamic,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,centersAllocation: freezed == centersAllocation ? _self.centersAllocation : centersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,killHouseCentersAllocation: freezed == killHouseCentersAllocation ? _self.killHouseCentersAllocation : killHouseCentersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,limitationAllocation: freezed == limitationAllocation ? _self.limitationAllocation : limitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,registerarRole: freezed == registerarRole ? _self.registerarRole : registerarRole // ignore: cast_nullable_to_non_nullable +as dynamic,registerarFullname: freezed == registerarFullname ? _self.registerarFullname : registerarFullname // ignore: cast_nullable_to_non_nullable +as dynamic,registerarMobile: freezed == registerarMobile ? _self.registerarMobile : registerarMobile // ignore: cast_nullable_to_non_nullable +as dynamic,killHouseRegister: freezed == killHouseRegister ? _self.killHouseRegister : killHouseRegister // ignore: cast_nullable_to_non_nullable +as bool?,stewardRegister: freezed == stewardRegister ? _self.stewardRegister : stewardRegister // ignore: cast_nullable_to_non_nullable +as bool?,guildsRoomRegister: freezed == guildsRoomRegister ? _self.guildsRoomRegister : guildsRoomRegister // ignore: cast_nullable_to_non_nullable +as bool?,posCompanyRegister: freezed == posCompanyRegister ? _self.posCompanyRegister : posCompanyRegister // ignore: cast_nullable_to_non_nullable +as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable +as String?,provinceMessage: freezed == provinceMessage ? _self.provinceMessage : provinceMessage // ignore: cast_nullable_to_non_nullable +as dynamic,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable +as dynamic,descriptionCondition: freezed == descriptionCondition ? _self.descriptionCondition : descriptionCondition // ignore: cast_nullable_to_non_nullable +as dynamic,stewardActive: freezed == stewardActive ? _self.stewardActive : stewardActive // ignore: cast_nullable_to_non_nullable +as bool?,stewardAllocationLimit: freezed == stewardAllocationLimit ? _self.stewardAllocationLimit : stewardAllocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,stewardLimitationAllocation: freezed == stewardLimitationAllocation ? _self.stewardLimitationAllocation : stewardLimitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,licenseForm: freezed == licenseForm ? _self.licenseForm : licenseForm // ignore: cast_nullable_to_non_nullable +as dynamic,licenseFile: freezed == licenseFile ? _self.licenseFile : licenseFile // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerRole: freezed == reviewerRole ? _self.reviewerRole : reviewerRole // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerFullname: freezed == reviewerFullname ? _self.reviewerFullname : reviewerFullname // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerMobile: freezed == reviewerMobile ? _self.reviewerMobile : reviewerMobile // ignore: cast_nullable_to_non_nullable +as dynamic,checkerMessage: freezed == checkerMessage ? _self.checkerMessage : checkerMessage // ignore: cast_nullable_to_non_nullable +as dynamic,finalAccept: freezed == finalAccept ? _self.finalAccept : finalAccept // ignore: cast_nullable_to_non_nullable +as bool?,temporaryRegistration: freezed == temporaryRegistration ? _self.temporaryRegistration : temporaryRegistration // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,userBankInfo: freezed == userBankInfo ? _self.userBankInfo : userBankInfo // ignore: cast_nullable_to_non_nullable +as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self.cars : cars // ignore: cast_nullable_to_non_nullable +as List?,userLevel: freezed == userLevel ? _self.userLevel : userLevel // ignore: cast_nullable_to_non_nullable +as List?, + )); +} +/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardUserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $ToStewardUserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guildAreaActivity { + if (_self.guildAreaActivity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guildAreaActivity!, (value) { + return _then(_self.copyWith(guildAreaActivity: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guildTypeActivity { + if (_self.guildTypeActivity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guildTypeActivity!, (value) { + return _then(_self.copyWith(guildTypeActivity: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$PosStatusCopyWith<$Res>? get getPosStatus { + if (_self.getPosStatus == null) { + return null; + } + + return $PosStatusCopyWith<$Res>(_self.getPosStatus!, (value) { + return _then(_self.copyWith(getPosStatus: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _ToSteward implements ToSteward { + const _ToSteward({this.id, this.user, this.address, this.guildAreaActivity, this.guildTypeActivity, final List? killHouse, final List? stewardKillHouse, final List? stewards, this.getPosStatus, this.key, this.createDate, this.modifyDate, this.trash, this.userIdForeignKey, this.addressIdForeignKey, this.userBankIdForeignKey, this.walletIdForeignKey, this.provincialGovernmentIdKey, this.identityDocuments, this.active, this.cityNumber, this.cityName, this.guildsId, this.licenseNumber, this.guildsName, this.phone, this.typeActivity, this.areaActivity, this.provinceNumber, this.provinceName, this.steward, this.hasPos, this.centersAllocation, this.killHouseCentersAllocation, this.allocationLimit, this.limitationAllocation, this.registerarRole, this.registerarFullname, this.registerarMobile, this.killHouseRegister, this.stewardRegister, this.guildsRoomRegister, this.posCompanyRegister, this.provinceAcceptState, this.provinceMessage, this.condition, this.descriptionCondition, this.stewardActive, this.stewardAllocationLimit, this.stewardLimitationAllocation, this.license, this.licenseForm, this.licenseFile, this.reviewerRole, this.reviewerFullname, this.reviewerMobile, this.checkerMessage, this.finalAccept, this.temporaryRegistration, this.createdBy, this.modifiedBy, this.userBankInfo, this.wallet, final List? cars, final List? userLevel}): _killHouse = killHouse,_stewardKillHouse = stewardKillHouse,_stewards = stewards,_cars = cars,_userLevel = userLevel; + factory _ToSteward.fromJson(Map json) => _$ToStewardFromJson(json); + +@override final int? id; +@override final ToStewardUser? user; +@override final Address? address; +@override final Activity? guildAreaActivity; +@override final Activity? guildTypeActivity; + final List? _killHouse; +@override List? get killHouse { + final value = _killHouse; + if (value == null) return null; + if (_killHouse is EqualUnmodifiableListView) return _killHouse; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _stewardKillHouse; +@override List? get stewardKillHouse { + final value = _stewardKillHouse; + if (value == null) return null; + if (_stewardKillHouse is EqualUnmodifiableListView) return _stewardKillHouse; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _stewards; +@override List? get stewards { + final value = _stewards; + if (value == null) return null; + if (_stewards is EqualUnmodifiableListView) return _stewards; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + +@override final PosStatus? getPosStatus; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final dynamic userIdForeignKey; +@override final dynamic addressIdForeignKey; +@override final dynamic userBankIdForeignKey; +@override final dynamic walletIdForeignKey; +@override final dynamic provincialGovernmentIdKey; +@override final dynamic identityDocuments; +@override final bool? active; +@override final int? cityNumber; +@override final String? cityName; +@override final String? guildsId; +@override final String? licenseNumber; +@override final String? guildsName; +@override final dynamic phone; +@override final String? typeActivity; +@override final String? areaActivity; +@override final int? provinceNumber; +@override final String? provinceName; +@override final bool? steward; +@override final bool? hasPos; +@override final dynamic centersAllocation; +@override final dynamic killHouseCentersAllocation; +@override final dynamic allocationLimit; +@override final bool? limitationAllocation; +@override final dynamic registerarRole; +@override final dynamic registerarFullname; +@override final dynamic registerarMobile; +@override final bool? killHouseRegister; +@override final bool? stewardRegister; +@override final bool? guildsRoomRegister; +@override final bool? posCompanyRegister; +@override final String? provinceAcceptState; +@override final dynamic provinceMessage; +@override final dynamic condition; +@override final dynamic descriptionCondition; +@override final bool? stewardActive; +@override final dynamic stewardAllocationLimit; +@override final bool? stewardLimitationAllocation; +@override final bool? license; +@override final dynamic licenseForm; +@override final dynamic licenseFile; +@override final dynamic reviewerRole; +@override final dynamic reviewerFullname; +@override final dynamic reviewerMobile; +@override final dynamic checkerMessage; +@override final bool? finalAccept; +@override final bool? temporaryRegistration; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final dynamic userBankInfo; +@override final int? wallet; + final List? _cars; +@override List? get cars { + final value = _cars; + if (value == null) return null; + if (_cars is EqualUnmodifiableListView) return _cars; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _userLevel; +@override List? get userLevel { + final value = _userLevel; + if (value == null) return null; + if (_userLevel is EqualUnmodifiableListView) return _userLevel; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ToStewardCopyWith<_ToSteward> get copyWith => __$ToStewardCopyWithImpl<_ToSteward>(this, _$identity); + +@override +Map toJson() { + return _$ToStewardToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToSteward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other._killHouse, _killHouse)&&const DeepCollectionEquality().equals(other._stewardKillHouse, _stewardKillHouse)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.userIdForeignKey, userIdForeignKey)&&const DeepCollectionEquality().equals(other.addressIdForeignKey, addressIdForeignKey)&&const DeepCollectionEquality().equals(other.userBankIdForeignKey, userBankIdForeignKey)&&const DeepCollectionEquality().equals(other.walletIdForeignKey, walletIdForeignKey)&&const DeepCollectionEquality().equals(other.provincialGovernmentIdKey, provincialGovernmentIdKey)&&const DeepCollectionEquality().equals(other.identityDocuments, identityDocuments)&&(identical(other.active, active) || other.active == active)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&const DeepCollectionEquality().equals(other.phone, phone)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&const DeepCollectionEquality().equals(other.centersAllocation, centersAllocation)&&const DeepCollectionEquality().equals(other.killHouseCentersAllocation, killHouseCentersAllocation)&&const DeepCollectionEquality().equals(other.allocationLimit, allocationLimit)&&(identical(other.limitationAllocation, limitationAllocation) || other.limitationAllocation == limitationAllocation)&&const DeepCollectionEquality().equals(other.registerarRole, registerarRole)&&const DeepCollectionEquality().equals(other.registerarFullname, registerarFullname)&&const DeepCollectionEquality().equals(other.registerarMobile, registerarMobile)&&(identical(other.killHouseRegister, killHouseRegister) || other.killHouseRegister == killHouseRegister)&&(identical(other.stewardRegister, stewardRegister) || other.stewardRegister == stewardRegister)&&(identical(other.guildsRoomRegister, guildsRoomRegister) || other.guildsRoomRegister == guildsRoomRegister)&&(identical(other.posCompanyRegister, posCompanyRegister) || other.posCompanyRegister == posCompanyRegister)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)&&const DeepCollectionEquality().equals(other.provinceMessage, provinceMessage)&&const DeepCollectionEquality().equals(other.condition, condition)&&const DeepCollectionEquality().equals(other.descriptionCondition, descriptionCondition)&&(identical(other.stewardActive, stewardActive) || other.stewardActive == stewardActive)&&const DeepCollectionEquality().equals(other.stewardAllocationLimit, stewardAllocationLimit)&&(identical(other.stewardLimitationAllocation, stewardLimitationAllocation) || other.stewardLimitationAllocation == stewardLimitationAllocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.licenseForm, licenseForm)&&const DeepCollectionEquality().equals(other.licenseFile, licenseFile)&&const DeepCollectionEquality().equals(other.reviewerRole, reviewerRole)&&const DeepCollectionEquality().equals(other.reviewerFullname, reviewerFullname)&&const DeepCollectionEquality().equals(other.reviewerMobile, reviewerMobile)&&const DeepCollectionEquality().equals(other.checkerMessage, checkerMessage)&&(identical(other.finalAccept, finalAccept) || other.finalAccept == finalAccept)&&(identical(other.temporaryRegistration, temporaryRegistration) || other.temporaryRegistration == temporaryRegistration)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.userBankInfo, userBankInfo)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other._cars, _cars)&&const DeepCollectionEquality().equals(other._userLevel, _userLevel)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(_killHouse),const DeepCollectionEquality().hash(_stewardKillHouse),const DeepCollectionEquality().hash(_stewards),getPosStatus,key,createDate,modifyDate,trash,const DeepCollectionEquality().hash(userIdForeignKey),const DeepCollectionEquality().hash(addressIdForeignKey),const DeepCollectionEquality().hash(userBankIdForeignKey),const DeepCollectionEquality().hash(walletIdForeignKey),const DeepCollectionEquality().hash(provincialGovernmentIdKey),const DeepCollectionEquality().hash(identityDocuments),active,cityNumber,cityName,guildsId,licenseNumber,guildsName,const DeepCollectionEquality().hash(phone),typeActivity,areaActivity,provinceNumber,provinceName,steward,hasPos,const DeepCollectionEquality().hash(centersAllocation),const DeepCollectionEquality().hash(killHouseCentersAllocation),const DeepCollectionEquality().hash(allocationLimit),limitationAllocation,const DeepCollectionEquality().hash(registerarRole),const DeepCollectionEquality().hash(registerarFullname),const DeepCollectionEquality().hash(registerarMobile),killHouseRegister,stewardRegister,guildsRoomRegister,posCompanyRegister,provinceAcceptState,const DeepCollectionEquality().hash(provinceMessage),const DeepCollectionEquality().hash(condition),const DeepCollectionEquality().hash(descriptionCondition),stewardActive,const DeepCollectionEquality().hash(stewardAllocationLimit),stewardLimitationAllocation,license,const DeepCollectionEquality().hash(licenseForm),const DeepCollectionEquality().hash(licenseFile),const DeepCollectionEquality().hash(reviewerRole),const DeepCollectionEquality().hash(reviewerFullname),const DeepCollectionEquality().hash(reviewerMobile),const DeepCollectionEquality().hash(checkerMessage),finalAccept,temporaryRegistration,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(userBankInfo),wallet,const DeepCollectionEquality().hash(_cars),const DeepCollectionEquality().hash(_userLevel)]); + +@override +String toString() { + return 'ToSteward(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, userIdForeignKey: $userIdForeignKey, addressIdForeignKey: $addressIdForeignKey, userBankIdForeignKey: $userBankIdForeignKey, walletIdForeignKey: $walletIdForeignKey, provincialGovernmentIdKey: $provincialGovernmentIdKey, identityDocuments: $identityDocuments, active: $active, cityNumber: $cityNumber, cityName: $cityName, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, phone: $phone, typeActivity: $typeActivity, areaActivity: $areaActivity, provinceNumber: $provinceNumber, provinceName: $provinceName, steward: $steward, hasPos: $hasPos, centersAllocation: $centersAllocation, killHouseCentersAllocation: $killHouseCentersAllocation, allocationLimit: $allocationLimit, limitationAllocation: $limitationAllocation, registerarRole: $registerarRole, registerarFullname: $registerarFullname, registerarMobile: $registerarMobile, killHouseRegister: $killHouseRegister, stewardRegister: $stewardRegister, guildsRoomRegister: $guildsRoomRegister, posCompanyRegister: $posCompanyRegister, provinceAcceptState: $provinceAcceptState, provinceMessage: $provinceMessage, condition: $condition, descriptionCondition: $descriptionCondition, stewardActive: $stewardActive, stewardAllocationLimit: $stewardAllocationLimit, stewardLimitationAllocation: $stewardLimitationAllocation, license: $license, licenseForm: $licenseForm, licenseFile: $licenseFile, reviewerRole: $reviewerRole, reviewerFullname: $reviewerFullname, reviewerMobile: $reviewerMobile, checkerMessage: $checkerMessage, finalAccept: $finalAccept, temporaryRegistration: $temporaryRegistration, createdBy: $createdBy, modifiedBy: $modifiedBy, userBankInfo: $userBankInfo, wallet: $wallet, cars: $cars, userLevel: $userLevel)'; +} + + +} + +/// @nodoc +abstract mixin class _$ToStewardCopyWith<$Res> implements $ToStewardCopyWith<$Res> { + factory _$ToStewardCopyWith(_ToSteward value, $Res Function(_ToSteward) _then) = __$ToStewardCopyWithImpl; +@override @useResult +$Res call({ + int? id, ToStewardUser? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, dynamic phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, dynamic registerarRole, dynamic registerarFullname, dynamic registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, dynamic provinceMessage, dynamic condition, dynamic descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, dynamic reviewerRole, dynamic reviewerFullname, dynamic reviewerMobile, dynamic checkerMessage, bool? finalAccept, bool? temporaryRegistration, dynamic createdBy, dynamic modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel +}); + + +@override $ToStewardUserCopyWith<$Res>? get user;@override $AddressCopyWith<$Res>? get address;@override $ActivityCopyWith<$Res>? get guildAreaActivity;@override $ActivityCopyWith<$Res>? get guildTypeActivity;@override $PosStatusCopyWith<$Res>? get getPosStatus; + +} +/// @nodoc +class __$ToStewardCopyWithImpl<$Res> + implements _$ToStewardCopyWith<$Res> { + __$ToStewardCopyWithImpl(this._self, this._then); + + final _ToSteward _self; + final $Res Function(_ToSteward) _then; + +/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? userIdForeignKey = freezed,Object? addressIdForeignKey = freezed,Object? userBankIdForeignKey = freezed,Object? walletIdForeignKey = freezed,Object? provincialGovernmentIdKey = freezed,Object? identityDocuments = freezed,Object? active = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? phone = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? centersAllocation = freezed,Object? killHouseCentersAllocation = freezed,Object? allocationLimit = freezed,Object? limitationAllocation = freezed,Object? registerarRole = freezed,Object? registerarFullname = freezed,Object? registerarMobile = freezed,Object? killHouseRegister = freezed,Object? stewardRegister = freezed,Object? guildsRoomRegister = freezed,Object? posCompanyRegister = freezed,Object? provinceAcceptState = freezed,Object? provinceMessage = freezed,Object? condition = freezed,Object? descriptionCondition = freezed,Object? stewardActive = freezed,Object? stewardAllocationLimit = freezed,Object? stewardLimitationAllocation = freezed,Object? license = freezed,Object? licenseForm = freezed,Object? licenseFile = freezed,Object? reviewerRole = freezed,Object? reviewerFullname = freezed,Object? reviewerMobile = freezed,Object? checkerMessage = freezed,Object? finalAccept = freezed,Object? temporaryRegistration = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? userBankInfo = freezed,Object? wallet = freezed,Object? cars = freezed,Object? userLevel = freezed,}) { + return _then(_ToSteward( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as ToStewardUser?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable +as Activity?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as Activity?,killHouse: freezed == killHouse ? _self._killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as List?,stewardKillHouse: freezed == stewardKillHouse ? _self._stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self._stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable +as PosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,userIdForeignKey: freezed == userIdForeignKey ? _self.userIdForeignKey : userIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,addressIdForeignKey: freezed == addressIdForeignKey ? _self.addressIdForeignKey : addressIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,userBankIdForeignKey: freezed == userBankIdForeignKey ? _self.userBankIdForeignKey : userBankIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,walletIdForeignKey: freezed == walletIdForeignKey ? _self.walletIdForeignKey : walletIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,provincialGovernmentIdKey: freezed == provincialGovernmentIdKey ? _self.provincialGovernmentIdKey : provincialGovernmentIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,identityDocuments: freezed == identityDocuments ? _self.identityDocuments : identityDocuments // ignore: cast_nullable_to_non_nullable +as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as dynamic,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,centersAllocation: freezed == centersAllocation ? _self.centersAllocation : centersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,killHouseCentersAllocation: freezed == killHouseCentersAllocation ? _self.killHouseCentersAllocation : killHouseCentersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,limitationAllocation: freezed == limitationAllocation ? _self.limitationAllocation : limitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,registerarRole: freezed == registerarRole ? _self.registerarRole : registerarRole // ignore: cast_nullable_to_non_nullable +as dynamic,registerarFullname: freezed == registerarFullname ? _self.registerarFullname : registerarFullname // ignore: cast_nullable_to_non_nullable +as dynamic,registerarMobile: freezed == registerarMobile ? _self.registerarMobile : registerarMobile // ignore: cast_nullable_to_non_nullable +as dynamic,killHouseRegister: freezed == killHouseRegister ? _self.killHouseRegister : killHouseRegister // ignore: cast_nullable_to_non_nullable +as bool?,stewardRegister: freezed == stewardRegister ? _self.stewardRegister : stewardRegister // ignore: cast_nullable_to_non_nullable +as bool?,guildsRoomRegister: freezed == guildsRoomRegister ? _self.guildsRoomRegister : guildsRoomRegister // ignore: cast_nullable_to_non_nullable +as bool?,posCompanyRegister: freezed == posCompanyRegister ? _self.posCompanyRegister : posCompanyRegister // ignore: cast_nullable_to_non_nullable +as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable +as String?,provinceMessage: freezed == provinceMessage ? _self.provinceMessage : provinceMessage // ignore: cast_nullable_to_non_nullable +as dynamic,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable +as dynamic,descriptionCondition: freezed == descriptionCondition ? _self.descriptionCondition : descriptionCondition // ignore: cast_nullable_to_non_nullable +as dynamic,stewardActive: freezed == stewardActive ? _self.stewardActive : stewardActive // ignore: cast_nullable_to_non_nullable +as bool?,stewardAllocationLimit: freezed == stewardAllocationLimit ? _self.stewardAllocationLimit : stewardAllocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,stewardLimitationAllocation: freezed == stewardLimitationAllocation ? _self.stewardLimitationAllocation : stewardLimitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,licenseForm: freezed == licenseForm ? _self.licenseForm : licenseForm // ignore: cast_nullable_to_non_nullable +as dynamic,licenseFile: freezed == licenseFile ? _self.licenseFile : licenseFile // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerRole: freezed == reviewerRole ? _self.reviewerRole : reviewerRole // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerFullname: freezed == reviewerFullname ? _self.reviewerFullname : reviewerFullname // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerMobile: freezed == reviewerMobile ? _self.reviewerMobile : reviewerMobile // ignore: cast_nullable_to_non_nullable +as dynamic,checkerMessage: freezed == checkerMessage ? _self.checkerMessage : checkerMessage // ignore: cast_nullable_to_non_nullable +as dynamic,finalAccept: freezed == finalAccept ? _self.finalAccept : finalAccept // ignore: cast_nullable_to_non_nullable +as bool?,temporaryRegistration: freezed == temporaryRegistration ? _self.temporaryRegistration : temporaryRegistration // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,userBankInfo: freezed == userBankInfo ? _self.userBankInfo : userBankInfo // ignore: cast_nullable_to_non_nullable +as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self._cars : cars // ignore: cast_nullable_to_non_nullable +as List?,userLevel: freezed == userLevel ? _self._userLevel : userLevel // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardUserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $ToStewardUserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guildAreaActivity { + if (_self.guildAreaActivity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guildAreaActivity!, (value) { + return _then(_self.copyWith(guildAreaActivity: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActivityCopyWith<$Res>? get guildTypeActivity { + if (_self.guildTypeActivity == null) { + return null; + } + + return $ActivityCopyWith<$Res>(_self.guildTypeActivity!, (value) { + return _then(_self.copyWith(guildTypeActivity: value)); + }); +}/// Create a copy of ToSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$PosStatusCopyWith<$Res>? get getPosStatus { + if (_self.getPosStatus == null) { + return null; + } + + return $PosStatusCopyWith<$Res>(_self.getPosStatus!, (value) { + return _then(_self.copyWith(getPosStatus: value)); + }); +} +} + + +/// @nodoc +mixin _$ToStewardUser { + + String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get nationalId; String? get city; +/// Create a copy of ToStewardUser +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ToStewardUserCopyWith get copyWith => _$ToStewardUserCopyWithImpl(this as ToStewardUser, _$identity); + + /// Serializes this ToStewardUser to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardUser&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); + +@override +String toString() { + return 'ToStewardUser(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class $ToStewardUserCopyWith<$Res> { + factory $ToStewardUserCopyWith(ToStewardUser value, $Res Function(ToStewardUser) _then) = _$ToStewardUserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city +}); + + + + +} +/// @nodoc +class _$ToStewardUserCopyWithImpl<$Res> + implements $ToStewardUserCopyWith<$Res> { + _$ToStewardUserCopyWithImpl(this._self, this._then); + + final ToStewardUser _self; + final $Res Function(ToStewardUser) _then; + +/// Create a copy of ToStewardUser +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ToStewardUser implements ToStewardUser { + const _ToStewardUser({this.fullname, this.firstName, this.lastName, this.mobile, this.nationalId, this.city}); + factory _ToStewardUser.fromJson(Map json) => _$ToStewardUserFromJson(json); + +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final String? mobile; +@override final String? nationalId; +@override final String? city; + +/// Create a copy of ToStewardUser +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ToStewardUserCopyWith<_ToStewardUser> get copyWith => __$ToStewardUserCopyWithImpl<_ToStewardUser>(this, _$identity); + +@override +Map toJson() { + return _$ToStewardUserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardUser&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); + +@override +String toString() { + return 'ToStewardUser(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class _$ToStewardUserCopyWith<$Res> implements $ToStewardUserCopyWith<$Res> { + factory _$ToStewardUserCopyWith(_ToStewardUser value, $Res Function(_ToStewardUser) _then) = __$ToStewardUserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city +}); + + + + +} +/// @nodoc +class __$ToStewardUserCopyWithImpl<$Res> + implements _$ToStewardUserCopyWith<$Res> { + __$ToStewardUserCopyWithImpl(this._self, this._then); + + final _ToStewardUser _self; + final $Res Function(_ToStewardUser) _then; + +/// Create a copy of ToStewardUser +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { + return _then(_ToStewardUser( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$Address { + + Province? get province; CitySimple? get city; String? get address; String? get postalCode; +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AddressCopyWith
get copyWith => _$AddressCopyWithImpl
(this as Address, _$identity); + + /// Serializes this Address to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postalCode: $postalCode)'; +} + + +} + +/// @nodoc +abstract mixin class $AddressCopyWith<$Res> { + factory $AddressCopyWith(Address value, $Res Function(Address) _then) = _$AddressCopyWithImpl; +@useResult +$Res call({ + Province? province, CitySimple? city, String? address, String? postalCode +}); + + +$ProvinceCopyWith<$Res>? get province;$CitySimpleCopyWith<$Res>? get city; + +} +/// @nodoc +class _$AddressCopyWithImpl<$Res> + implements $AddressCopyWith<$Res> { + _$AddressCopyWithImpl(this._self, this._then); + + final Address _self; + final $Res Function(Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { + return _then(_self.copyWith( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as CitySimple?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CitySimpleCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CitySimpleCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Address implements Address { + const _Address({this.province, this.city, this.address, this.postalCode}); + factory _Address.fromJson(Map json) => _$AddressFromJson(json); + +@override final Province? province; +@override final CitySimple? city; +@override final String? address; +@override final String? postalCode; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AddressCopyWith<_Address> get copyWith => __$AddressCopyWithImpl<_Address>(this, _$identity); + +@override +Map toJson() { + return _$AddressToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postalCode: $postalCode)'; +} + + +} + +/// @nodoc +abstract mixin class _$AddressCopyWith<$Res> implements $AddressCopyWith<$Res> { + factory _$AddressCopyWith(_Address value, $Res Function(_Address) _then) = __$AddressCopyWithImpl; +@override @useResult +$Res call({ + Province? province, CitySimple? city, String? address, String? postalCode +}); + + +@override $ProvinceCopyWith<$Res>? get province;@override $CitySimpleCopyWith<$Res>? get city; + +} +/// @nodoc +class __$AddressCopyWithImpl<$Res> + implements _$AddressCopyWith<$Res> { + __$AddressCopyWithImpl(this._self, this._then); + + final _Address _self; + final $Res Function(_Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { + return _then(_Address( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as CitySimple?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CitySimpleCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CitySimpleCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$Province { + + String? get key; String? get name; +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProvinceCopyWith get copyWith => _$ProvinceCopyWithImpl(this as Province, _$identity); + + /// Serializes this Province to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $ProvinceCopyWith<$Res> { + factory $ProvinceCopyWith(Province value, $Res Function(Province) _then) = _$ProvinceCopyWithImpl; +@useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class _$ProvinceCopyWithImpl<$Res> + implements $ProvinceCopyWith<$Res> { + _$ProvinceCopyWithImpl(this._self, this._then); + + final Province _self; + final $Res Function(Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Province implements Province { + const _Province({this.key, this.name}); + factory _Province.fromJson(Map json) => _$ProvinceFromJson(json); + +@override final String? key; +@override final String? name; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProvinceCopyWith<_Province> get copyWith => __$ProvinceCopyWithImpl<_Province>(this, _$identity); + +@override +Map toJson() { + return _$ProvinceToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProvinceCopyWith<$Res> implements $ProvinceCopyWith<$Res> { + factory _$ProvinceCopyWith(_Province value, $Res Function(_Province) _then) = __$ProvinceCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class __$ProvinceCopyWithImpl<$Res> + implements _$ProvinceCopyWith<$Res> { + __$ProvinceCopyWithImpl(this._self, this._then); + + final _Province _self; + final $Res Function(_Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_Province( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$CitySimple { + + String? get key; String? get name; +/// Create a copy of CitySimple +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CitySimpleCopyWith get copyWith => _$CitySimpleCopyWithImpl(this as CitySimple, _$identity); + + /// Serializes this CitySimple to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is CitySimple&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'CitySimple(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $CitySimpleCopyWith<$Res> { + factory $CitySimpleCopyWith(CitySimple value, $Res Function(CitySimple) _then) = _$CitySimpleCopyWithImpl; +@useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class _$CitySimpleCopyWithImpl<$Res> + implements $CitySimpleCopyWith<$Res> { + _$CitySimpleCopyWithImpl(this._self, this._then); + + final CitySimple _self; + final $Res Function(CitySimple) _then; + +/// Create a copy of CitySimple +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _CitySimple implements CitySimple { + const _CitySimple({this.key, this.name}); + factory _CitySimple.fromJson(Map json) => _$CitySimpleFromJson(json); + +@override final String? key; +@override final String? name; + +/// Create a copy of CitySimple +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CitySimpleCopyWith<_CitySimple> get copyWith => __$CitySimpleCopyWithImpl<_CitySimple>(this, _$identity); + +@override +Map toJson() { + return _$CitySimpleToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CitySimple&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'CitySimple(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$CitySimpleCopyWith<$Res> implements $CitySimpleCopyWith<$Res> { + factory _$CitySimpleCopyWith(_CitySimple value, $Res Function(_CitySimple) _then) = __$CitySimpleCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class __$CitySimpleCopyWithImpl<$Res> + implements _$CitySimpleCopyWith<$Res> { + __$CitySimpleCopyWithImpl(this._self, this._then); + + final _CitySimple _self; + final $Res Function(_CitySimple) _then; + +/// Create a copy of CitySimple +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_CitySimple( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$Activity { + + String? get key; String? get title; +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ActivityCopyWith get copyWith => _$ActivityCopyWithImpl(this as Activity, _$identity); + + /// Serializes this Activity to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Activity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'Activity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $ActivityCopyWith<$Res> { + factory $ActivityCopyWith(Activity value, $Res Function(Activity) _then) = _$ActivityCopyWithImpl; +@useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class _$ActivityCopyWithImpl<$Res> + implements $ActivityCopyWith<$Res> { + _$ActivityCopyWithImpl(this._self, this._then); + + final Activity _self; + final $Res Function(Activity) _then; + +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Activity implements Activity { + const _Activity({this.key, this.title}); + factory _Activity.fromJson(Map json) => _$ActivityFromJson(json); + +@override final String? key; +@override final String? title; + +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ActivityCopyWith<_Activity> get copyWith => __$ActivityCopyWithImpl<_Activity>(this, _$identity); + +@override +Map toJson() { + return _$ActivityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Activity&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'Activity(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$ActivityCopyWith<$Res> implements $ActivityCopyWith<$Res> { + factory _$ActivityCopyWith(_Activity value, $Res Function(_Activity) _then) = __$ActivityCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class __$ActivityCopyWithImpl<$Res> + implements _$ActivityCopyWith<$Res> { + __$ActivityCopyWithImpl(this._self, this._then); + + final _Activity _self; + final $Res Function(_Activity) _then; + +/// Create a copy of Activity +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_Activity( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$PosStatus { + + int? get lenActiveSessions; bool? get hasPons; bool? get hasActivePons; +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PosStatusCopyWith get copyWith => _$PosStatusCopyWithImpl(this as PosStatus, _$identity); + + /// Serializes this PosStatus to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosStatus&&(identical(other.lenActiveSessions, lenActiveSessions) || other.lenActiveSessions == lenActiveSessions)&&(identical(other.hasPons, hasPons) || other.hasPons == hasPons)&&(identical(other.hasActivePons, hasActivePons) || other.hasActivePons == hasActivePons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,lenActiveSessions,hasPons,hasActivePons); + +@override +String toString() { + return 'PosStatus(lenActiveSessions: $lenActiveSessions, hasPons: $hasPons, hasActivePons: $hasActivePons)'; +} + + +} + +/// @nodoc +abstract mixin class $PosStatusCopyWith<$Res> { + factory $PosStatusCopyWith(PosStatus value, $Res Function(PosStatus) _then) = _$PosStatusCopyWithImpl; +@useResult +$Res call({ + int? lenActiveSessions, bool? hasPons, bool? hasActivePons +}); + + + + +} +/// @nodoc +class _$PosStatusCopyWithImpl<$Res> + implements $PosStatusCopyWith<$Res> { + _$PosStatusCopyWithImpl(this._self, this._then); + + final PosStatus _self; + final $Res Function(PosStatus) _then; + +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? lenActiveSessions = freezed,Object? hasPons = freezed,Object? hasActivePons = freezed,}) { + return _then(_self.copyWith( +lenActiveSessions: freezed == lenActiveSessions ? _self.lenActiveSessions : lenActiveSessions // ignore: cast_nullable_to_non_nullable +as int?,hasPons: freezed == hasPons ? _self.hasPons : hasPons // ignore: cast_nullable_to_non_nullable +as bool?,hasActivePons: freezed == hasActivePons ? _self.hasActivePons : hasActivePons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _PosStatus implements PosStatus { + const _PosStatus({this.lenActiveSessions, this.hasPons, this.hasActivePons}); + factory _PosStatus.fromJson(Map json) => _$PosStatusFromJson(json); + +@override final int? lenActiveSessions; +@override final bool? hasPons; +@override final bool? hasActivePons; + +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$PosStatusCopyWith<_PosStatus> get copyWith => __$PosStatusCopyWithImpl<_PosStatus>(this, _$identity); + +@override +Map toJson() { + return _$PosStatusToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PosStatus&&(identical(other.lenActiveSessions, lenActiveSessions) || other.lenActiveSessions == lenActiveSessions)&&(identical(other.hasPons, hasPons) || other.hasPons == hasPons)&&(identical(other.hasActivePons, hasActivePons) || other.hasActivePons == hasActivePons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,lenActiveSessions,hasPons,hasActivePons); + +@override +String toString() { + return 'PosStatus(lenActiveSessions: $lenActiveSessions, hasPons: $hasPons, hasActivePons: $hasActivePons)'; +} + + +} + +/// @nodoc +abstract mixin class _$PosStatusCopyWith<$Res> implements $PosStatusCopyWith<$Res> { + factory _$PosStatusCopyWith(_PosStatus value, $Res Function(_PosStatus) _then) = __$PosStatusCopyWithImpl; +@override @useResult +$Res call({ + int? lenActiveSessions, bool? hasPons, bool? hasActivePons +}); + + + + +} +/// @nodoc +class __$PosStatusCopyWithImpl<$Res> + implements _$PosStatusCopyWith<$Res> { + __$PosStatusCopyWithImpl(this._self, this._then); + + final _PosStatus _self; + final $Res Function(_PosStatus) _then; + +/// Create a copy of PosStatus +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? lenActiveSessions = freezed,Object? hasPons = freezed,Object? hasActivePons = freezed,}) { + return _then(_PosStatus( +lenActiveSessions: freezed == lenActiveSessions ? _self.lenActiveSessions : lenActiveSessions // ignore: cast_nullable_to_non_nullable +as int?,hasPons: freezed == hasPons ? _self.hasPons : hasPons // ignore: cast_nullable_to_non_nullable +as bool?,hasActivePons: freezed == hasActivePons ? _self.hasActivePons : hasActivePons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart new file mode 100644 index 0000000..99edf28 --- /dev/null +++ b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart @@ -0,0 +1,491 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'imported_loads_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_ImportedLoadsModel _$ImportedLoadsModelFromJson(Map json) => + _ImportedLoadsModel( + count: (json['count'] as num?)?.toInt(), + next: json['next'] as String?, + previous: json['previous'] as String?, + results: (json['results'] as List?) + ?.map((e) => ImportedLoad.fromJson(e as Map)) + .toList(), + ); + +Map _$ImportedLoadsModelToJson(_ImportedLoadsModel instance) => + { + 'count': instance.count, + 'next': instance.next, + 'previous': instance.previous, + 'results': instance.results, + }; + +_ImportedLoad _$ImportedLoadFromJson( + Map json, +) => _ImportedLoad( + id: (json['id'] as num?)?.toInt(), + product: json['product'] == null + ? null + : Product.fromJson(json['product'] as Map), + killHouse: json['kill_house'] == null + ? null + : KillHouse.fromJson(json['kill_house'] as Map), + toKillHouse: json['to_kill_house'], + steward: json['steward'], + toSteward: json['to_steward'] == null + ? null + : ToSteward.fromJson(json['to_steward'] as Map), + guilds: json['guilds'], + toGuilds: json['to_guilds'], + toColdHouse: json['to_cold_house'], + indexWeight: (json['index_weight'] as num?)?.toInt(), + dateTimestamp: (json['date_timestamp'] as num?)?.toInt(), + newState: (json['new_state'] as num?)?.toInt(), + newReceiverState: (json['new_receiver_state'] as num?)?.toInt(), + newAllocationState: (json['new_allocation_state'] as num?)?.toInt(), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + realNumberOfCarcasses: (json['real_number_of_carcasses'] as num?)?.toInt(), + receiverRealNumberOfCarcasses: + (json['receiver_real_number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toDouble(), + realWeightOfCarcasses: (json['real_weight_of_carcasses'] as num?)?.toDouble(), + receiverRealWeightOfCarcasses: + (json['receiver_real_weight_of_carcasses'] as num?)?.toDouble(), + weightLossOfCarcasses: (json['weight_loss_of_carcasses'] as num?)?.toDouble(), + finalRegistration: json['final_registration'] as bool?, + sellType: json['sell_type'] as String?, + productName: json['product_name'] as String?, + sellerType: json['seller_type'] as String?, + type: json['type'] as String?, + saleType: json['sale_type'] as String?, + allocationType: json['allocation_type'] as String?, + systemRegistrationCode: json['system_registration_code'] as bool?, + registrationCode: (json['registration_code'] as num?)?.toInt(), + amount: (json['amount'] as num?)?.toInt(), + totalAmount: (json['total_amount'] as num?)?.toInt(), + totalAmountPaid: (json['total_amount_paid'] as num?)?.toInt(), + totalAmountRemain: (json['total_amount_remain'] as num?)?.toInt(), + loggedRegistrationCode: json['logged_registration_code'], + state: json['state'] as String?, + receiverState: json['receiver_state'] as String?, + allocationState: json['allocation_state'] as String?, + date: json['date'] as String?, + role: json['role'], + stewardTempKey: json['steward_temp_key'], + approvedPriceStatus: json['approved_price_status'] as bool?, + calculateStatus: json['calculate_status'] as bool?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + wareHouse: json['ware_house'], + stewardWareHouse: json['steward_ware_house'], + car: json['car'], + dispenser: json['dispenser'], +); + +Map _$ImportedLoadToJson( + _ImportedLoad instance, +) => { + 'id': instance.id, + 'product': instance.product, + 'kill_house': instance.killHouse, + 'to_kill_house': instance.toKillHouse, + 'steward': instance.steward, + 'to_steward': instance.toSteward, + 'guilds': instance.guilds, + 'to_guilds': instance.toGuilds, + 'to_cold_house': instance.toColdHouse, + 'index_weight': instance.indexWeight, + 'date_timestamp': instance.dateTimestamp, + 'new_state': instance.newState, + 'new_receiver_state': instance.newReceiverState, + 'new_allocation_state': instance.newAllocationState, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'number_of_carcasses': instance.numberOfCarcasses, + 'real_number_of_carcasses': instance.realNumberOfCarcasses, + 'receiver_real_number_of_carcasses': instance.receiverRealNumberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'real_weight_of_carcasses': instance.realWeightOfCarcasses, + 'receiver_real_weight_of_carcasses': instance.receiverRealWeightOfCarcasses, + 'weight_loss_of_carcasses': instance.weightLossOfCarcasses, + 'final_registration': instance.finalRegistration, + 'sell_type': instance.sellType, + 'product_name': instance.productName, + 'seller_type': instance.sellerType, + 'type': instance.type, + 'sale_type': instance.saleType, + 'allocation_type': instance.allocationType, + 'system_registration_code': instance.systemRegistrationCode, + 'registration_code': instance.registrationCode, + 'amount': instance.amount, + 'total_amount': instance.totalAmount, + 'total_amount_paid': instance.totalAmountPaid, + 'total_amount_remain': instance.totalAmountRemain, + 'logged_registration_code': instance.loggedRegistrationCode, + 'state': instance.state, + 'receiver_state': instance.receiverState, + 'allocation_state': instance.allocationState, + 'date': instance.date, + 'role': instance.role, + 'steward_temp_key': instance.stewardTempKey, + 'approved_price_status': instance.approvedPriceStatus, + 'calculate_status': instance.calculateStatus, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'ware_house': instance.wareHouse, + 'steward_ware_house': instance.stewardWareHouse, + 'car': instance.car, + 'dispenser': instance.dispenser, +}; + +_Product _$ProductFromJson(Map json) => + _Product(weightAverage: (json['weight_average'] as num?)?.toDouble()); + +Map _$ProductToJson(_Product instance) => { + 'weight_average': instance.weightAverage, +}; + +_KillHouse _$KillHouseFromJson(Map json) => _KillHouse( + key: json['key'] as String?, + killHouseOperator: json['kill_house_operator'] == null + ? null + : KillHouseOperator.fromJson( + json['kill_house_operator'] as Map, + ), + name: json['name'] as String?, + killer: json['killer'] as bool?, +); + +Map _$KillHouseToJson(_KillHouse instance) => + { + 'key': instance.key, + 'kill_house_operator': instance.killHouseOperator, + 'name': instance.name, + 'killer': instance.killer, + }; + +_KillHouseOperator _$KillHouseOperatorFromJson(Map json) => + _KillHouseOperator( + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + ); + +Map _$KillHouseOperatorToJson(_KillHouseOperator instance) => + {'user': instance.user}; + +_User _$UserFromJson(Map json) => _User( + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + baseOrder: (json['base_order'] as num?)?.toInt(), + mobile: json['mobile'] as String?, + nationalId: json['national_id'] as String?, + nationalCode: json['national_code'] as String?, + key: json['key'] as String?, + city: json['city'] == null + ? null + : City.fromJson(json['city'] as Map), + unitName: json['unit_name'] as String?, + unitNationalId: json['unit_national_id'] as String?, + unitRegistrationNumber: json['unit_registration_number'] as String?, + unitEconomicalNumber: json['unit_economical_number'] as String?, + unitProvince: json['unit_province'] as String?, + unitCity: json['unit_city'] as String?, + unitPostalCode: json['unit_postal_code'] as String?, + unitAddress: json['unit_address'] as String?, +); + +Map _$UserToJson(_User instance) => { + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'base_order': instance.baseOrder, + 'mobile': instance.mobile, + 'national_id': instance.nationalId, + 'national_code': instance.nationalCode, + 'key': instance.key, + 'city': instance.city, + 'unit_name': instance.unitName, + 'unit_national_id': instance.unitNationalId, + 'unit_registration_number': instance.unitRegistrationNumber, + 'unit_economical_number': instance.unitEconomicalNumber, + 'unit_province': instance.unitProvince, + 'unit_city': instance.unitCity, + 'unit_postal_code': instance.unitPostalCode, + 'unit_address': instance.unitAddress, +}; + +_City _$CityFromJson(Map json) => _City( + id: (json['id'] as num?)?.toInt(), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + provinceIdForeignKey: (json['province_id_foreign_key'] as num?)?.toInt(), + cityIdKey: (json['city_id_key'] as num?)?.toInt(), + name: json['name'] as String?, + productPrice: (json['product_price'] as num?)?.toDouble(), + provinceCenter: json['province_center'] as bool?, + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + province: (json['province'] as num?)?.toInt(), +); + +Map _$CityToJson(_City instance) => { + 'id': instance.id, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'province_id_foreign_key': instance.provinceIdForeignKey, + 'city_id_key': instance.cityIdKey, + 'name': instance.name, + 'product_price': instance.productPrice, + 'province_center': instance.provinceCenter, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'province': instance.province, +}; + +_ToSteward _$ToStewardFromJson(Map json) => _ToSteward( + id: (json['id'] as num?)?.toInt(), + user: json['user'] == null + ? null + : ToStewardUser.fromJson(json['user'] as Map), + address: json['address'] == null + ? null + : Address.fromJson(json['address'] as Map), + guildAreaActivity: json['guild_area_activity'] == null + ? null + : Activity.fromJson(json['guild_area_activity'] as Map), + guildTypeActivity: json['guild_type_activity'] == null + ? null + : Activity.fromJson(json['guild_type_activity'] as Map), + killHouse: json['kill_house'] as List?, + stewardKillHouse: json['steward_kill_house'] as List?, + stewards: json['stewards'] as List?, + getPosStatus: json['get_pos_status'] == null + ? null + : PosStatus.fromJson(json['get_pos_status'] as Map), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + userIdForeignKey: json['user_id_foreign_key'], + addressIdForeignKey: json['address_id_foreign_key'], + userBankIdForeignKey: json['user_bank_id_foreign_key'], + walletIdForeignKey: json['wallet_id_foreign_key'], + provincialGovernmentIdKey: json['provincial_government_id_key'], + identityDocuments: json['identity_documents'], + active: json['active'] as bool?, + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, + guildsId: json['guilds_id'] as String?, + licenseNumber: json['license_number'] as String?, + guildsName: json['guilds_name'] as String?, + phone: json['phone'], + typeActivity: json['type_activity'] as String?, + areaActivity: json['area_activity'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, + steward: json['steward'] as bool?, + hasPos: json['has_pos'] as bool?, + centersAllocation: json['centers_allocation'], + killHouseCentersAllocation: json['kill_house_centers_allocation'], + allocationLimit: json['allocation_limit'], + limitationAllocation: json['limitation_allocation'] as bool?, + registerarRole: json['registerar_role'], + registerarFullname: json['registerar_fullname'], + registerarMobile: json['registerar_mobile'], + killHouseRegister: json['kill_house_register'] as bool?, + stewardRegister: json['steward_register'] as bool?, + guildsRoomRegister: json['guilds_room_register'] as bool?, + posCompanyRegister: json['pos_company_register'] as bool?, + provinceAcceptState: json['province_accept_state'] as String?, + provinceMessage: json['province_message'], + condition: json['condition'], + descriptionCondition: json['description_condition'], + stewardActive: json['steward_active'] as bool?, + stewardAllocationLimit: json['steward_allocation_limit'], + stewardLimitationAllocation: json['steward_limitation_allocation'] as bool?, + license: json['license'] as bool?, + licenseForm: json['license_form'], + licenseFile: json['license_file'], + reviewerRole: json['reviewer_role'], + reviewerFullname: json['reviewer_fullname'], + reviewerMobile: json['reviewer_mobile'], + checkerMessage: json['checker_message'], + finalAccept: json['final_accept'] as bool?, + temporaryRegistration: json['temporary_registration'] as bool?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + userBankInfo: json['user_bank_info'], + wallet: (json['wallet'] as num?)?.toInt(), + cars: json['cars'] as List?, + userLevel: json['user_level'] as List?, +); + +Map _$ToStewardToJson(_ToSteward instance) => + { + 'id': instance.id, + 'user': instance.user, + 'address': instance.address, + 'guild_area_activity': instance.guildAreaActivity, + 'guild_type_activity': instance.guildTypeActivity, + 'kill_house': instance.killHouse, + 'steward_kill_house': instance.stewardKillHouse, + 'stewards': instance.stewards, + 'get_pos_status': instance.getPosStatus, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'user_id_foreign_key': instance.userIdForeignKey, + 'address_id_foreign_key': instance.addressIdForeignKey, + 'user_bank_id_foreign_key': instance.userBankIdForeignKey, + 'wallet_id_foreign_key': instance.walletIdForeignKey, + 'provincial_government_id_key': instance.provincialGovernmentIdKey, + 'identity_documents': instance.identityDocuments, + 'active': instance.active, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, + 'guilds_id': instance.guildsId, + 'license_number': instance.licenseNumber, + 'guilds_name': instance.guildsName, + 'phone': instance.phone, + 'type_activity': instance.typeActivity, + 'area_activity': instance.areaActivity, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, + 'steward': instance.steward, + 'has_pos': instance.hasPos, + 'centers_allocation': instance.centersAllocation, + 'kill_house_centers_allocation': instance.killHouseCentersAllocation, + 'allocation_limit': instance.allocationLimit, + 'limitation_allocation': instance.limitationAllocation, + 'registerar_role': instance.registerarRole, + 'registerar_fullname': instance.registerarFullname, + 'registerar_mobile': instance.registerarMobile, + 'kill_house_register': instance.killHouseRegister, + 'steward_register': instance.stewardRegister, + 'guilds_room_register': instance.guildsRoomRegister, + 'pos_company_register': instance.posCompanyRegister, + 'province_accept_state': instance.provinceAcceptState, + 'province_message': instance.provinceMessage, + 'condition': instance.condition, + 'description_condition': instance.descriptionCondition, + 'steward_active': instance.stewardActive, + 'steward_allocation_limit': instance.stewardAllocationLimit, + 'steward_limitation_allocation': instance.stewardLimitationAllocation, + 'license': instance.license, + 'license_form': instance.licenseForm, + 'license_file': instance.licenseFile, + 'reviewer_role': instance.reviewerRole, + 'reviewer_fullname': instance.reviewerFullname, + 'reviewer_mobile': instance.reviewerMobile, + 'checker_message': instance.checkerMessage, + 'final_accept': instance.finalAccept, + 'temporary_registration': instance.temporaryRegistration, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'user_bank_info': instance.userBankInfo, + 'wallet': instance.wallet, + 'cars': instance.cars, + 'user_level': instance.userLevel, + }; + +_ToStewardUser _$ToStewardUserFromJson(Map json) => + _ToStewardUser( + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + mobile: json['mobile'] as String?, + nationalId: json['national_id'] as String?, + city: json['city'] as String?, + ); + +Map _$ToStewardUserToJson(_ToStewardUser instance) => + { + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'mobile': instance.mobile, + 'national_id': instance.nationalId, + 'city': instance.city, + }; + +_Address _$AddressFromJson(Map json) => _Address( + province: json['province'] == null + ? null + : Province.fromJson(json['province'] as Map), + city: json['city'] == null + ? null + : CitySimple.fromJson(json['city'] as Map), + address: json['address'] as String?, + postalCode: json['postal_code'] as String?, +); + +Map _$AddressToJson(_Address instance) => { + 'province': instance.province, + 'city': instance.city, + 'address': instance.address, + 'postal_code': instance.postalCode, +}; + +_Province _$ProvinceFromJson(Map json) => + _Province(key: json['key'] as String?, name: json['name'] as String?); + +Map _$ProvinceToJson(_Province instance) => { + 'key': instance.key, + 'name': instance.name, +}; + +_CitySimple _$CitySimpleFromJson(Map json) => + _CitySimple(key: json['key'] as String?, name: json['name'] as String?); + +Map _$CitySimpleToJson(_CitySimple instance) => + {'key': instance.key, 'name': instance.name}; + +_Activity _$ActivityFromJson(Map json) => + _Activity(key: json['key'] as String?, title: json['title'] as String?); + +Map _$ActivityToJson(_Activity instance) => { + 'key': instance.key, + 'title': instance.title, +}; + +_PosStatus _$PosStatusFromJson(Map json) => _PosStatus( + lenActiveSessions: (json['len_active_sessions'] as num?)?.toInt(), + hasPons: json['has_pons'] as bool?, + hasActivePons: json['has_active_pons'] as bool?, +); + +Map _$PosStatusToJson(_PosStatus instance) => + { + 'len_active_sessions': instance.lenActiveSessions, + 'has_pons': instance.hasPons, + 'has_active_pons': instance.hasActivePons, + }; diff --git a/packages/chicken/lib/data/models/response/inventory/inventory_model.dart b/packages/chicken/lib/data/models/response/inventory/inventory_model.dart new file mode 100644 index 0000000..b6ed7c6 --- /dev/null +++ b/packages/chicken/lib/data/models/response/inventory/inventory_model.dart @@ -0,0 +1,56 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'inventory_model.freezed.dart'; +part 'inventory_model.g.dart'; + +@freezed +abstract class InventoryModel with _$InventoryModel { + const factory InventoryModel({ + int? id, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + String? name, + int? provinceGovernmentalCarcassesQuantity, + int? provinceGovernmentalCarcassesWeight, + int? provinceFreeCarcassesQuantity, + int? provinceFreeCarcassesWeight, + int? receiveGovernmentalCarcassesQuantity, + int? receiveGovernmentalCarcassesWeight, + int? receiveFreeCarcassesQuantity, + int? receiveFreeCarcassesWeight, + int? freeBuyingCarcassesQuantity, + int? freeBuyingCarcassesWeight, + int? totalGovernmentalCarcassesQuantity, + int? totalGovernmentalCarcassesWeight, + int? totalFreeBarsCarcassesQuantity, + int? totalFreeBarsCarcassesWeight, + double? weightAverage, + int? totalCarcassesQuantity, + int? totalCarcassesWeight, + int? freezingQuantity, + int? freezingWeight, + int? lossWeight, + int? outProvinceAllocatedQuantity, + int? outProvinceAllocatedWeight, + int? provinceAllocatedQuantity, + int? provinceAllocatedWeight, + int? realAllocatedQuantity, + int? realAllocatedWeight, + int? coldHouseAllocatedWeight, + int? posAllocatedWeight, + int? segmentationWeight, + int? totalRemainQuantity, + int? totalRemainWeight, + int? freePrice, + int? approvedPrice, + bool? approvedPriceStatus, + int? parentProduct, + int? killHouse, + int? guild, + }) = _InventoryModel; // Changed to _InventoryModel + + factory InventoryModel.fromJson(Map json) => + _$InventoryModelFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart b/packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart new file mode 100644 index 0000000..bc87570 --- /dev/null +++ b/packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart @@ -0,0 +1,274 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'inventory_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$InventoryModel { + + int? get id; String? get key; String? get createDate; String? get modifyDate; bool? get trash; String? get name; int? get provinceGovernmentalCarcassesQuantity; int? get provinceGovernmentalCarcassesWeight; int? get provinceFreeCarcassesQuantity; int? get provinceFreeCarcassesWeight; int? get receiveGovernmentalCarcassesQuantity; int? get receiveGovernmentalCarcassesWeight; int? get receiveFreeCarcassesQuantity; int? get receiveFreeCarcassesWeight; int? get freeBuyingCarcassesQuantity; int? get freeBuyingCarcassesWeight; int? get totalGovernmentalCarcassesQuantity; int? get totalGovernmentalCarcassesWeight; int? get totalFreeBarsCarcassesQuantity; int? get totalFreeBarsCarcassesWeight; double? get weightAverage; int? get totalCarcassesQuantity; int? get totalCarcassesWeight; int? get freezingQuantity; int? get freezingWeight; int? get lossWeight; int? get outProvinceAllocatedQuantity; int? get outProvinceAllocatedWeight; int? get provinceAllocatedQuantity; int? get provinceAllocatedWeight; int? get realAllocatedQuantity; int? get realAllocatedWeight; int? get coldHouseAllocatedWeight; int? get posAllocatedWeight; int? get segmentationWeight; int? get totalRemainQuantity; int? get totalRemainWeight; int? get freePrice; int? get approvedPrice; bool? get approvedPriceStatus; int? get parentProduct; int? get killHouse; int? get guild; +/// Create a copy of InventoryModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$InventoryModelCopyWith get copyWith => _$InventoryModelCopyWithImpl(this as InventoryModel, _$identity); + + /// Serializes this InventoryModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is InventoryModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.name, name) || other.name == name)&&(identical(other.provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesQuantity) || other.provinceGovernmentalCarcassesQuantity == provinceGovernmentalCarcassesQuantity)&&(identical(other.provinceGovernmentalCarcassesWeight, provinceGovernmentalCarcassesWeight) || other.provinceGovernmentalCarcassesWeight == provinceGovernmentalCarcassesWeight)&&(identical(other.provinceFreeCarcassesQuantity, provinceFreeCarcassesQuantity) || other.provinceFreeCarcassesQuantity == provinceFreeCarcassesQuantity)&&(identical(other.provinceFreeCarcassesWeight, provinceFreeCarcassesWeight) || other.provinceFreeCarcassesWeight == provinceFreeCarcassesWeight)&&(identical(other.receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesQuantity) || other.receiveGovernmentalCarcassesQuantity == receiveGovernmentalCarcassesQuantity)&&(identical(other.receiveGovernmentalCarcassesWeight, receiveGovernmentalCarcassesWeight) || other.receiveGovernmentalCarcassesWeight == receiveGovernmentalCarcassesWeight)&&(identical(other.receiveFreeCarcassesQuantity, receiveFreeCarcassesQuantity) || other.receiveFreeCarcassesQuantity == receiveFreeCarcassesQuantity)&&(identical(other.receiveFreeCarcassesWeight, receiveFreeCarcassesWeight) || other.receiveFreeCarcassesWeight == receiveFreeCarcassesWeight)&&(identical(other.freeBuyingCarcassesQuantity, freeBuyingCarcassesQuantity) || other.freeBuyingCarcassesQuantity == freeBuyingCarcassesQuantity)&&(identical(other.freeBuyingCarcassesWeight, freeBuyingCarcassesWeight) || other.freeBuyingCarcassesWeight == freeBuyingCarcassesWeight)&&(identical(other.totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesQuantity) || other.totalGovernmentalCarcassesQuantity == totalGovernmentalCarcassesQuantity)&&(identical(other.totalGovernmentalCarcassesWeight, totalGovernmentalCarcassesWeight) || other.totalGovernmentalCarcassesWeight == totalGovernmentalCarcassesWeight)&&(identical(other.totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesQuantity) || other.totalFreeBarsCarcassesQuantity == totalFreeBarsCarcassesQuantity)&&(identical(other.totalFreeBarsCarcassesWeight, totalFreeBarsCarcassesWeight) || other.totalFreeBarsCarcassesWeight == totalFreeBarsCarcassesWeight)&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)&&(identical(other.totalCarcassesQuantity, totalCarcassesQuantity) || other.totalCarcassesQuantity == totalCarcassesQuantity)&&(identical(other.totalCarcassesWeight, totalCarcassesWeight) || other.totalCarcassesWeight == totalCarcassesWeight)&&(identical(other.freezingQuantity, freezingQuantity) || other.freezingQuantity == freezingQuantity)&&(identical(other.freezingWeight, freezingWeight) || other.freezingWeight == freezingWeight)&&(identical(other.lossWeight, lossWeight) || other.lossWeight == lossWeight)&&(identical(other.outProvinceAllocatedQuantity, outProvinceAllocatedQuantity) || other.outProvinceAllocatedQuantity == outProvinceAllocatedQuantity)&&(identical(other.outProvinceAllocatedWeight, outProvinceAllocatedWeight) || other.outProvinceAllocatedWeight == outProvinceAllocatedWeight)&&(identical(other.provinceAllocatedQuantity, provinceAllocatedQuantity) || other.provinceAllocatedQuantity == provinceAllocatedQuantity)&&(identical(other.provinceAllocatedWeight, provinceAllocatedWeight) || other.provinceAllocatedWeight == provinceAllocatedWeight)&&(identical(other.realAllocatedQuantity, realAllocatedQuantity) || other.realAllocatedQuantity == realAllocatedQuantity)&&(identical(other.realAllocatedWeight, realAllocatedWeight) || other.realAllocatedWeight == realAllocatedWeight)&&(identical(other.coldHouseAllocatedWeight, coldHouseAllocatedWeight) || other.coldHouseAllocatedWeight == coldHouseAllocatedWeight)&&(identical(other.posAllocatedWeight, posAllocatedWeight) || other.posAllocatedWeight == posAllocatedWeight)&&(identical(other.segmentationWeight, segmentationWeight) || other.segmentationWeight == segmentationWeight)&&(identical(other.totalRemainQuantity, totalRemainQuantity) || other.totalRemainQuantity == totalRemainQuantity)&&(identical(other.totalRemainWeight, totalRemainWeight) || other.totalRemainWeight == totalRemainWeight)&&(identical(other.freePrice, freePrice) || other.freePrice == freePrice)&&(identical(other.approvedPrice, approvedPrice) || other.approvedPrice == approvedPrice)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.parentProduct, parentProduct) || other.parentProduct == parentProduct)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&(identical(other.guild, guild) || other.guild == guild)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,key,createDate,modifyDate,trash,name,provinceGovernmentalCarcassesQuantity,provinceGovernmentalCarcassesWeight,provinceFreeCarcassesQuantity,provinceFreeCarcassesWeight,receiveGovernmentalCarcassesQuantity,receiveGovernmentalCarcassesWeight,receiveFreeCarcassesQuantity,receiveFreeCarcassesWeight,freeBuyingCarcassesQuantity,freeBuyingCarcassesWeight,totalGovernmentalCarcassesQuantity,totalGovernmentalCarcassesWeight,totalFreeBarsCarcassesQuantity,totalFreeBarsCarcassesWeight,weightAverage,totalCarcassesQuantity,totalCarcassesWeight,freezingQuantity,freezingWeight,lossWeight,outProvinceAllocatedQuantity,outProvinceAllocatedWeight,provinceAllocatedQuantity,provinceAllocatedWeight,realAllocatedQuantity,realAllocatedWeight,coldHouseAllocatedWeight,posAllocatedWeight,segmentationWeight,totalRemainQuantity,totalRemainWeight,freePrice,approvedPrice,approvedPriceStatus,parentProduct,killHouse,guild]); + +@override +String toString() { + return 'InventoryModel(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, name: $name, provinceGovernmentalCarcassesQuantity: $provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesWeight: $provinceGovernmentalCarcassesWeight, provinceFreeCarcassesQuantity: $provinceFreeCarcassesQuantity, provinceFreeCarcassesWeight: $provinceFreeCarcassesWeight, receiveGovernmentalCarcassesQuantity: $receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesWeight: $receiveGovernmentalCarcassesWeight, receiveFreeCarcassesQuantity: $receiveFreeCarcassesQuantity, receiveFreeCarcassesWeight: $receiveFreeCarcassesWeight, freeBuyingCarcassesQuantity: $freeBuyingCarcassesQuantity, freeBuyingCarcassesWeight: $freeBuyingCarcassesWeight, totalGovernmentalCarcassesQuantity: $totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesWeight: $totalGovernmentalCarcassesWeight, totalFreeBarsCarcassesQuantity: $totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesWeight: $totalFreeBarsCarcassesWeight, weightAverage: $weightAverage, totalCarcassesQuantity: $totalCarcassesQuantity, totalCarcassesWeight: $totalCarcassesWeight, freezingQuantity: $freezingQuantity, freezingWeight: $freezingWeight, lossWeight: $lossWeight, outProvinceAllocatedQuantity: $outProvinceAllocatedQuantity, outProvinceAllocatedWeight: $outProvinceAllocatedWeight, provinceAllocatedQuantity: $provinceAllocatedQuantity, provinceAllocatedWeight: $provinceAllocatedWeight, realAllocatedQuantity: $realAllocatedQuantity, realAllocatedWeight: $realAllocatedWeight, coldHouseAllocatedWeight: $coldHouseAllocatedWeight, posAllocatedWeight: $posAllocatedWeight, segmentationWeight: $segmentationWeight, totalRemainQuantity: $totalRemainQuantity, totalRemainWeight: $totalRemainWeight, freePrice: $freePrice, approvedPrice: $approvedPrice, approvedPriceStatus: $approvedPriceStatus, parentProduct: $parentProduct, killHouse: $killHouse, guild: $guild)'; +} + + +} + +/// @nodoc +abstract mixin class $InventoryModelCopyWith<$Res> { + factory $InventoryModelCopyWith(InventoryModel value, $Res Function(InventoryModel) _then) = _$InventoryModelCopyWithImpl; +@useResult +$Res call({ + int? id, String? key, String? createDate, String? modifyDate, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, int? parentProduct, int? killHouse, int? guild +}); + + + + +} +/// @nodoc +class _$InventoryModelCopyWithImpl<$Res> + implements $InventoryModelCopyWith<$Res> { + _$InventoryModelCopyWithImpl(this._self, this._then); + + final InventoryModel _self; + final $Res Function(InventoryModel) _then; + +/// Create a copy of InventoryModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? name = freezed,Object? provinceGovernmentalCarcassesQuantity = freezed,Object? provinceGovernmentalCarcassesWeight = freezed,Object? provinceFreeCarcassesQuantity = freezed,Object? provinceFreeCarcassesWeight = freezed,Object? receiveGovernmentalCarcassesQuantity = freezed,Object? receiveGovernmentalCarcassesWeight = freezed,Object? receiveFreeCarcassesQuantity = freezed,Object? receiveFreeCarcassesWeight = freezed,Object? freeBuyingCarcassesQuantity = freezed,Object? freeBuyingCarcassesWeight = freezed,Object? totalGovernmentalCarcassesQuantity = freezed,Object? totalGovernmentalCarcassesWeight = freezed,Object? totalFreeBarsCarcassesQuantity = freezed,Object? totalFreeBarsCarcassesWeight = freezed,Object? weightAverage = freezed,Object? totalCarcassesQuantity = freezed,Object? totalCarcassesWeight = freezed,Object? freezingQuantity = freezed,Object? freezingWeight = freezed,Object? lossWeight = freezed,Object? outProvinceAllocatedQuantity = freezed,Object? outProvinceAllocatedWeight = freezed,Object? provinceAllocatedQuantity = freezed,Object? provinceAllocatedWeight = freezed,Object? realAllocatedQuantity = freezed,Object? realAllocatedWeight = freezed,Object? coldHouseAllocatedWeight = freezed,Object? posAllocatedWeight = freezed,Object? segmentationWeight = freezed,Object? totalRemainQuantity = freezed,Object? totalRemainWeight = freezed,Object? freePrice = freezed,Object? approvedPrice = freezed,Object? approvedPriceStatus = freezed,Object? parentProduct = freezed,Object? killHouse = freezed,Object? guild = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,provinceGovernmentalCarcassesQuantity: freezed == provinceGovernmentalCarcassesQuantity ? _self.provinceGovernmentalCarcassesQuantity : provinceGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceGovernmentalCarcassesWeight: freezed == provinceGovernmentalCarcassesWeight ? _self.provinceGovernmentalCarcassesWeight : provinceGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesQuantity: freezed == provinceFreeCarcassesQuantity ? _self.provinceFreeCarcassesQuantity : provinceFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesWeight: freezed == provinceFreeCarcassesWeight ? _self.provinceFreeCarcassesWeight : provinceFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesQuantity: freezed == receiveGovernmentalCarcassesQuantity ? _self.receiveGovernmentalCarcassesQuantity : receiveGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesWeight: freezed == receiveGovernmentalCarcassesWeight ? _self.receiveGovernmentalCarcassesWeight : receiveGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesQuantity: freezed == receiveFreeCarcassesQuantity ? _self.receiveFreeCarcassesQuantity : receiveFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesWeight: freezed == receiveFreeCarcassesWeight ? _self.receiveFreeCarcassesWeight : receiveFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesQuantity: freezed == freeBuyingCarcassesQuantity ? _self.freeBuyingCarcassesQuantity : freeBuyingCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesWeight: freezed == freeBuyingCarcassesWeight ? _self.freeBuyingCarcassesWeight : freeBuyingCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesQuantity: freezed == totalGovernmentalCarcassesQuantity ? _self.totalGovernmentalCarcassesQuantity : totalGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesWeight: freezed == totalGovernmentalCarcassesWeight ? _self.totalGovernmentalCarcassesWeight : totalGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesQuantity: freezed == totalFreeBarsCarcassesQuantity ? _self.totalFreeBarsCarcassesQuantity : totalFreeBarsCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesWeight: freezed == totalFreeBarsCarcassesWeight ? _self.totalFreeBarsCarcassesWeight : totalFreeBarsCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?,totalCarcassesQuantity: freezed == totalCarcassesQuantity ? _self.totalCarcassesQuantity : totalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalCarcassesWeight: freezed == totalCarcassesWeight ? _self.totalCarcassesWeight : totalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freezingQuantity: freezed == freezingQuantity ? _self.freezingQuantity : freezingQuantity // ignore: cast_nullable_to_non_nullable +as int?,freezingWeight: freezed == freezingWeight ? _self.freezingWeight : freezingWeight // ignore: cast_nullable_to_non_nullable +as int?,lossWeight: freezed == lossWeight ? _self.lossWeight : lossWeight // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedQuantity: freezed == outProvinceAllocatedQuantity ? _self.outProvinceAllocatedQuantity : outProvinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedWeight: freezed == outProvinceAllocatedWeight ? _self.outProvinceAllocatedWeight : outProvinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedQuantity: freezed == provinceAllocatedQuantity ? _self.provinceAllocatedQuantity : provinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedWeight: freezed == provinceAllocatedWeight ? _self.provinceAllocatedWeight : provinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedQuantity: freezed == realAllocatedQuantity ? _self.realAllocatedQuantity : realAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedWeight: freezed == realAllocatedWeight ? _self.realAllocatedWeight : realAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,coldHouseAllocatedWeight: freezed == coldHouseAllocatedWeight ? _self.coldHouseAllocatedWeight : coldHouseAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,posAllocatedWeight: freezed == posAllocatedWeight ? _self.posAllocatedWeight : posAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,segmentationWeight: freezed == segmentationWeight ? _self.segmentationWeight : segmentationWeight // ignore: cast_nullable_to_non_nullable +as int?,totalRemainQuantity: freezed == totalRemainQuantity ? _self.totalRemainQuantity : totalRemainQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalRemainWeight: freezed == totalRemainWeight ? _self.totalRemainWeight : totalRemainWeight // ignore: cast_nullable_to_non_nullable +as int?,freePrice: freezed == freePrice ? _self.freePrice : freePrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPrice: freezed == approvedPrice ? _self.approvedPrice : approvedPrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,parentProduct: freezed == parentProduct ? _self.parentProduct : parentProduct // ignore: cast_nullable_to_non_nullable +as int?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as int?,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _InventoryModel implements InventoryModel { + const _InventoryModel({this.id, this.key, this.createDate, this.modifyDate, this.trash, this.name, this.provinceGovernmentalCarcassesQuantity, this.provinceGovernmentalCarcassesWeight, this.provinceFreeCarcassesQuantity, this.provinceFreeCarcassesWeight, this.receiveGovernmentalCarcassesQuantity, this.receiveGovernmentalCarcassesWeight, this.receiveFreeCarcassesQuantity, this.receiveFreeCarcassesWeight, this.freeBuyingCarcassesQuantity, this.freeBuyingCarcassesWeight, this.totalGovernmentalCarcassesQuantity, this.totalGovernmentalCarcassesWeight, this.totalFreeBarsCarcassesQuantity, this.totalFreeBarsCarcassesWeight, this.weightAverage, this.totalCarcassesQuantity, this.totalCarcassesWeight, this.freezingQuantity, this.freezingWeight, this.lossWeight, this.outProvinceAllocatedQuantity, this.outProvinceAllocatedWeight, this.provinceAllocatedQuantity, this.provinceAllocatedWeight, this.realAllocatedQuantity, this.realAllocatedWeight, this.coldHouseAllocatedWeight, this.posAllocatedWeight, this.segmentationWeight, this.totalRemainQuantity, this.totalRemainWeight, this.freePrice, this.approvedPrice, this.approvedPriceStatus, this.parentProduct, this.killHouse, this.guild}); + factory _InventoryModel.fromJson(Map json) => _$InventoryModelFromJson(json); + +@override final int? id; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final String? name; +@override final int? provinceGovernmentalCarcassesQuantity; +@override final int? provinceGovernmentalCarcassesWeight; +@override final int? provinceFreeCarcassesQuantity; +@override final int? provinceFreeCarcassesWeight; +@override final int? receiveGovernmentalCarcassesQuantity; +@override final int? receiveGovernmentalCarcassesWeight; +@override final int? receiveFreeCarcassesQuantity; +@override final int? receiveFreeCarcassesWeight; +@override final int? freeBuyingCarcassesQuantity; +@override final int? freeBuyingCarcassesWeight; +@override final int? totalGovernmentalCarcassesQuantity; +@override final int? totalGovernmentalCarcassesWeight; +@override final int? totalFreeBarsCarcassesQuantity; +@override final int? totalFreeBarsCarcassesWeight; +@override final double? weightAverage; +@override final int? totalCarcassesQuantity; +@override final int? totalCarcassesWeight; +@override final int? freezingQuantity; +@override final int? freezingWeight; +@override final int? lossWeight; +@override final int? outProvinceAllocatedQuantity; +@override final int? outProvinceAllocatedWeight; +@override final int? provinceAllocatedQuantity; +@override final int? provinceAllocatedWeight; +@override final int? realAllocatedQuantity; +@override final int? realAllocatedWeight; +@override final int? coldHouseAllocatedWeight; +@override final int? posAllocatedWeight; +@override final int? segmentationWeight; +@override final int? totalRemainQuantity; +@override final int? totalRemainWeight; +@override final int? freePrice; +@override final int? approvedPrice; +@override final bool? approvedPriceStatus; +@override final int? parentProduct; +@override final int? killHouse; +@override final int? guild; + +/// Create a copy of InventoryModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$InventoryModelCopyWith<_InventoryModel> get copyWith => __$InventoryModelCopyWithImpl<_InventoryModel>(this, _$identity); + +@override +Map toJson() { + return _$InventoryModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _InventoryModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.name, name) || other.name == name)&&(identical(other.provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesQuantity) || other.provinceGovernmentalCarcassesQuantity == provinceGovernmentalCarcassesQuantity)&&(identical(other.provinceGovernmentalCarcassesWeight, provinceGovernmentalCarcassesWeight) || other.provinceGovernmentalCarcassesWeight == provinceGovernmentalCarcassesWeight)&&(identical(other.provinceFreeCarcassesQuantity, provinceFreeCarcassesQuantity) || other.provinceFreeCarcassesQuantity == provinceFreeCarcassesQuantity)&&(identical(other.provinceFreeCarcassesWeight, provinceFreeCarcassesWeight) || other.provinceFreeCarcassesWeight == provinceFreeCarcassesWeight)&&(identical(other.receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesQuantity) || other.receiveGovernmentalCarcassesQuantity == receiveGovernmentalCarcassesQuantity)&&(identical(other.receiveGovernmentalCarcassesWeight, receiveGovernmentalCarcassesWeight) || other.receiveGovernmentalCarcassesWeight == receiveGovernmentalCarcassesWeight)&&(identical(other.receiveFreeCarcassesQuantity, receiveFreeCarcassesQuantity) || other.receiveFreeCarcassesQuantity == receiveFreeCarcassesQuantity)&&(identical(other.receiveFreeCarcassesWeight, receiveFreeCarcassesWeight) || other.receiveFreeCarcassesWeight == receiveFreeCarcassesWeight)&&(identical(other.freeBuyingCarcassesQuantity, freeBuyingCarcassesQuantity) || other.freeBuyingCarcassesQuantity == freeBuyingCarcassesQuantity)&&(identical(other.freeBuyingCarcassesWeight, freeBuyingCarcassesWeight) || other.freeBuyingCarcassesWeight == freeBuyingCarcassesWeight)&&(identical(other.totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesQuantity) || other.totalGovernmentalCarcassesQuantity == totalGovernmentalCarcassesQuantity)&&(identical(other.totalGovernmentalCarcassesWeight, totalGovernmentalCarcassesWeight) || other.totalGovernmentalCarcassesWeight == totalGovernmentalCarcassesWeight)&&(identical(other.totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesQuantity) || other.totalFreeBarsCarcassesQuantity == totalFreeBarsCarcassesQuantity)&&(identical(other.totalFreeBarsCarcassesWeight, totalFreeBarsCarcassesWeight) || other.totalFreeBarsCarcassesWeight == totalFreeBarsCarcassesWeight)&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)&&(identical(other.totalCarcassesQuantity, totalCarcassesQuantity) || other.totalCarcassesQuantity == totalCarcassesQuantity)&&(identical(other.totalCarcassesWeight, totalCarcassesWeight) || other.totalCarcassesWeight == totalCarcassesWeight)&&(identical(other.freezingQuantity, freezingQuantity) || other.freezingQuantity == freezingQuantity)&&(identical(other.freezingWeight, freezingWeight) || other.freezingWeight == freezingWeight)&&(identical(other.lossWeight, lossWeight) || other.lossWeight == lossWeight)&&(identical(other.outProvinceAllocatedQuantity, outProvinceAllocatedQuantity) || other.outProvinceAllocatedQuantity == outProvinceAllocatedQuantity)&&(identical(other.outProvinceAllocatedWeight, outProvinceAllocatedWeight) || other.outProvinceAllocatedWeight == outProvinceAllocatedWeight)&&(identical(other.provinceAllocatedQuantity, provinceAllocatedQuantity) || other.provinceAllocatedQuantity == provinceAllocatedQuantity)&&(identical(other.provinceAllocatedWeight, provinceAllocatedWeight) || other.provinceAllocatedWeight == provinceAllocatedWeight)&&(identical(other.realAllocatedQuantity, realAllocatedQuantity) || other.realAllocatedQuantity == realAllocatedQuantity)&&(identical(other.realAllocatedWeight, realAllocatedWeight) || other.realAllocatedWeight == realAllocatedWeight)&&(identical(other.coldHouseAllocatedWeight, coldHouseAllocatedWeight) || other.coldHouseAllocatedWeight == coldHouseAllocatedWeight)&&(identical(other.posAllocatedWeight, posAllocatedWeight) || other.posAllocatedWeight == posAllocatedWeight)&&(identical(other.segmentationWeight, segmentationWeight) || other.segmentationWeight == segmentationWeight)&&(identical(other.totalRemainQuantity, totalRemainQuantity) || other.totalRemainQuantity == totalRemainQuantity)&&(identical(other.totalRemainWeight, totalRemainWeight) || other.totalRemainWeight == totalRemainWeight)&&(identical(other.freePrice, freePrice) || other.freePrice == freePrice)&&(identical(other.approvedPrice, approvedPrice) || other.approvedPrice == approvedPrice)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.parentProduct, parentProduct) || other.parentProduct == parentProduct)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&(identical(other.guild, guild) || other.guild == guild)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,key,createDate,modifyDate,trash,name,provinceGovernmentalCarcassesQuantity,provinceGovernmentalCarcassesWeight,provinceFreeCarcassesQuantity,provinceFreeCarcassesWeight,receiveGovernmentalCarcassesQuantity,receiveGovernmentalCarcassesWeight,receiveFreeCarcassesQuantity,receiveFreeCarcassesWeight,freeBuyingCarcassesQuantity,freeBuyingCarcassesWeight,totalGovernmentalCarcassesQuantity,totalGovernmentalCarcassesWeight,totalFreeBarsCarcassesQuantity,totalFreeBarsCarcassesWeight,weightAverage,totalCarcassesQuantity,totalCarcassesWeight,freezingQuantity,freezingWeight,lossWeight,outProvinceAllocatedQuantity,outProvinceAllocatedWeight,provinceAllocatedQuantity,provinceAllocatedWeight,realAllocatedQuantity,realAllocatedWeight,coldHouseAllocatedWeight,posAllocatedWeight,segmentationWeight,totalRemainQuantity,totalRemainWeight,freePrice,approvedPrice,approvedPriceStatus,parentProduct,killHouse,guild]); + +@override +String toString() { + return 'InventoryModel(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, name: $name, provinceGovernmentalCarcassesQuantity: $provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesWeight: $provinceGovernmentalCarcassesWeight, provinceFreeCarcassesQuantity: $provinceFreeCarcassesQuantity, provinceFreeCarcassesWeight: $provinceFreeCarcassesWeight, receiveGovernmentalCarcassesQuantity: $receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesWeight: $receiveGovernmentalCarcassesWeight, receiveFreeCarcassesQuantity: $receiveFreeCarcassesQuantity, receiveFreeCarcassesWeight: $receiveFreeCarcassesWeight, freeBuyingCarcassesQuantity: $freeBuyingCarcassesQuantity, freeBuyingCarcassesWeight: $freeBuyingCarcassesWeight, totalGovernmentalCarcassesQuantity: $totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesWeight: $totalGovernmentalCarcassesWeight, totalFreeBarsCarcassesQuantity: $totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesWeight: $totalFreeBarsCarcassesWeight, weightAverage: $weightAverage, totalCarcassesQuantity: $totalCarcassesQuantity, totalCarcassesWeight: $totalCarcassesWeight, freezingQuantity: $freezingQuantity, freezingWeight: $freezingWeight, lossWeight: $lossWeight, outProvinceAllocatedQuantity: $outProvinceAllocatedQuantity, outProvinceAllocatedWeight: $outProvinceAllocatedWeight, provinceAllocatedQuantity: $provinceAllocatedQuantity, provinceAllocatedWeight: $provinceAllocatedWeight, realAllocatedQuantity: $realAllocatedQuantity, realAllocatedWeight: $realAllocatedWeight, coldHouseAllocatedWeight: $coldHouseAllocatedWeight, posAllocatedWeight: $posAllocatedWeight, segmentationWeight: $segmentationWeight, totalRemainQuantity: $totalRemainQuantity, totalRemainWeight: $totalRemainWeight, freePrice: $freePrice, approvedPrice: $approvedPrice, approvedPriceStatus: $approvedPriceStatus, parentProduct: $parentProduct, killHouse: $killHouse, guild: $guild)'; +} + + +} + +/// @nodoc +abstract mixin class _$InventoryModelCopyWith<$Res> implements $InventoryModelCopyWith<$Res> { + factory _$InventoryModelCopyWith(_InventoryModel value, $Res Function(_InventoryModel) _then) = __$InventoryModelCopyWithImpl; +@override @useResult +$Res call({ + int? id, String? key, String? createDate, String? modifyDate, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, int? parentProduct, int? killHouse, int? guild +}); + + + + +} +/// @nodoc +class __$InventoryModelCopyWithImpl<$Res> + implements _$InventoryModelCopyWith<$Res> { + __$InventoryModelCopyWithImpl(this._self, this._then); + + final _InventoryModel _self; + final $Res Function(_InventoryModel) _then; + +/// Create a copy of InventoryModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? name = freezed,Object? provinceGovernmentalCarcassesQuantity = freezed,Object? provinceGovernmentalCarcassesWeight = freezed,Object? provinceFreeCarcassesQuantity = freezed,Object? provinceFreeCarcassesWeight = freezed,Object? receiveGovernmentalCarcassesQuantity = freezed,Object? receiveGovernmentalCarcassesWeight = freezed,Object? receiveFreeCarcassesQuantity = freezed,Object? receiveFreeCarcassesWeight = freezed,Object? freeBuyingCarcassesQuantity = freezed,Object? freeBuyingCarcassesWeight = freezed,Object? totalGovernmentalCarcassesQuantity = freezed,Object? totalGovernmentalCarcassesWeight = freezed,Object? totalFreeBarsCarcassesQuantity = freezed,Object? totalFreeBarsCarcassesWeight = freezed,Object? weightAverage = freezed,Object? totalCarcassesQuantity = freezed,Object? totalCarcassesWeight = freezed,Object? freezingQuantity = freezed,Object? freezingWeight = freezed,Object? lossWeight = freezed,Object? outProvinceAllocatedQuantity = freezed,Object? outProvinceAllocatedWeight = freezed,Object? provinceAllocatedQuantity = freezed,Object? provinceAllocatedWeight = freezed,Object? realAllocatedQuantity = freezed,Object? realAllocatedWeight = freezed,Object? coldHouseAllocatedWeight = freezed,Object? posAllocatedWeight = freezed,Object? segmentationWeight = freezed,Object? totalRemainQuantity = freezed,Object? totalRemainWeight = freezed,Object? freePrice = freezed,Object? approvedPrice = freezed,Object? approvedPriceStatus = freezed,Object? parentProduct = freezed,Object? killHouse = freezed,Object? guild = freezed,}) { + return _then(_InventoryModel( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,provinceGovernmentalCarcassesQuantity: freezed == provinceGovernmentalCarcassesQuantity ? _self.provinceGovernmentalCarcassesQuantity : provinceGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceGovernmentalCarcassesWeight: freezed == provinceGovernmentalCarcassesWeight ? _self.provinceGovernmentalCarcassesWeight : provinceGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesQuantity: freezed == provinceFreeCarcassesQuantity ? _self.provinceFreeCarcassesQuantity : provinceFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesWeight: freezed == provinceFreeCarcassesWeight ? _self.provinceFreeCarcassesWeight : provinceFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesQuantity: freezed == receiveGovernmentalCarcassesQuantity ? _self.receiveGovernmentalCarcassesQuantity : receiveGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesWeight: freezed == receiveGovernmentalCarcassesWeight ? _self.receiveGovernmentalCarcassesWeight : receiveGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesQuantity: freezed == receiveFreeCarcassesQuantity ? _self.receiveFreeCarcassesQuantity : receiveFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesWeight: freezed == receiveFreeCarcassesWeight ? _self.receiveFreeCarcassesWeight : receiveFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesQuantity: freezed == freeBuyingCarcassesQuantity ? _self.freeBuyingCarcassesQuantity : freeBuyingCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesWeight: freezed == freeBuyingCarcassesWeight ? _self.freeBuyingCarcassesWeight : freeBuyingCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesQuantity: freezed == totalGovernmentalCarcassesQuantity ? _self.totalGovernmentalCarcassesQuantity : totalGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesWeight: freezed == totalGovernmentalCarcassesWeight ? _self.totalGovernmentalCarcassesWeight : totalGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesQuantity: freezed == totalFreeBarsCarcassesQuantity ? _self.totalFreeBarsCarcassesQuantity : totalFreeBarsCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesWeight: freezed == totalFreeBarsCarcassesWeight ? _self.totalFreeBarsCarcassesWeight : totalFreeBarsCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?,totalCarcassesQuantity: freezed == totalCarcassesQuantity ? _self.totalCarcassesQuantity : totalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalCarcassesWeight: freezed == totalCarcassesWeight ? _self.totalCarcassesWeight : totalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freezingQuantity: freezed == freezingQuantity ? _self.freezingQuantity : freezingQuantity // ignore: cast_nullable_to_non_nullable +as int?,freezingWeight: freezed == freezingWeight ? _self.freezingWeight : freezingWeight // ignore: cast_nullable_to_non_nullable +as int?,lossWeight: freezed == lossWeight ? _self.lossWeight : lossWeight // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedQuantity: freezed == outProvinceAllocatedQuantity ? _self.outProvinceAllocatedQuantity : outProvinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedWeight: freezed == outProvinceAllocatedWeight ? _self.outProvinceAllocatedWeight : outProvinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedQuantity: freezed == provinceAllocatedQuantity ? _self.provinceAllocatedQuantity : provinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedWeight: freezed == provinceAllocatedWeight ? _self.provinceAllocatedWeight : provinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedQuantity: freezed == realAllocatedQuantity ? _self.realAllocatedQuantity : realAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedWeight: freezed == realAllocatedWeight ? _self.realAllocatedWeight : realAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,coldHouseAllocatedWeight: freezed == coldHouseAllocatedWeight ? _self.coldHouseAllocatedWeight : coldHouseAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,posAllocatedWeight: freezed == posAllocatedWeight ? _self.posAllocatedWeight : posAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,segmentationWeight: freezed == segmentationWeight ? _self.segmentationWeight : segmentationWeight // ignore: cast_nullable_to_non_nullable +as int?,totalRemainQuantity: freezed == totalRemainQuantity ? _self.totalRemainQuantity : totalRemainQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalRemainWeight: freezed == totalRemainWeight ? _self.totalRemainWeight : totalRemainWeight // ignore: cast_nullable_to_non_nullable +as int?,freePrice: freezed == freePrice ? _self.freePrice : freePrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPrice: freezed == approvedPrice ? _self.approvedPrice : approvedPrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,parentProduct: freezed == parentProduct ? _self.parentProduct : parentProduct // ignore: cast_nullable_to_non_nullable +as int?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as int?,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/inventory/inventory_model.g.dart b/packages/chicken/lib/data/models/response/inventory/inventory_model.g.dart new file mode 100644 index 0000000..6bf5ba2 --- /dev/null +++ b/packages/chicken/lib/data/models/response/inventory/inventory_model.g.dart @@ -0,0 +1,127 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'inventory_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_InventoryModel _$InventoryModelFromJson( + Map json, +) => _InventoryModel( + id: (json['id'] as num?)?.toInt(), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + name: json['name'] as String?, + provinceGovernmentalCarcassesQuantity: + (json['province_governmental_carcasses_quantity'] as num?)?.toInt(), + provinceGovernmentalCarcassesWeight: + (json['province_governmental_carcasses_weight'] as num?)?.toInt(), + provinceFreeCarcassesQuantity: + (json['province_free_carcasses_quantity'] as num?)?.toInt(), + provinceFreeCarcassesWeight: (json['province_free_carcasses_weight'] as num?) + ?.toInt(), + receiveGovernmentalCarcassesQuantity: + (json['receive_governmental_carcasses_quantity'] as num?)?.toInt(), + receiveGovernmentalCarcassesWeight: + (json['receive_governmental_carcasses_weight'] as num?)?.toInt(), + receiveFreeCarcassesQuantity: + (json['receive_free_carcasses_quantity'] as num?)?.toInt(), + receiveFreeCarcassesWeight: (json['receive_free_carcasses_weight'] as num?) + ?.toInt(), + freeBuyingCarcassesQuantity: (json['free_buying_carcasses_quantity'] as num?) + ?.toInt(), + freeBuyingCarcassesWeight: (json['free_buying_carcasses_weight'] as num?) + ?.toInt(), + totalGovernmentalCarcassesQuantity: + (json['total_governmental_carcasses_quantity'] as num?)?.toInt(), + totalGovernmentalCarcassesWeight: + (json['total_governmental_carcasses_weight'] as num?)?.toInt(), + totalFreeBarsCarcassesQuantity: + (json['total_free_bars_carcasses_quantity'] as num?)?.toInt(), + totalFreeBarsCarcassesWeight: + (json['total_free_bars_carcasses_weight'] as num?)?.toInt(), + weightAverage: (json['weight_average'] as num?)?.toDouble(), + totalCarcassesQuantity: (json['total_carcasses_quantity'] as num?)?.toInt(), + totalCarcassesWeight: (json['total_carcasses_weight'] as num?)?.toInt(), + freezingQuantity: (json['freezing_quantity'] as num?)?.toInt(), + freezingWeight: (json['freezing_weight'] as num?)?.toInt(), + lossWeight: (json['loss_weight'] as num?)?.toInt(), + outProvinceAllocatedQuantity: + (json['out_province_allocated_quantity'] as num?)?.toInt(), + outProvinceAllocatedWeight: (json['out_province_allocated_weight'] as num?) + ?.toInt(), + provinceAllocatedQuantity: (json['province_allocated_quantity'] as num?) + ?.toInt(), + provinceAllocatedWeight: (json['province_allocated_weight'] as num?)?.toInt(), + realAllocatedQuantity: (json['real_allocated_quantity'] as num?)?.toInt(), + realAllocatedWeight: (json['real_allocated_weight'] as num?)?.toInt(), + coldHouseAllocatedWeight: (json['cold_house_allocated_weight'] as num?) + ?.toInt(), + posAllocatedWeight: (json['pos_allocated_weight'] as num?)?.toInt(), + segmentationWeight: (json['segmentation_weight'] as num?)?.toInt(), + totalRemainQuantity: (json['total_remain_quantity'] as num?)?.toInt(), + totalRemainWeight: (json['total_remain_weight'] as num?)?.toInt(), + freePrice: (json['free_price'] as num?)?.toInt(), + approvedPrice: (json['approved_price'] as num?)?.toInt(), + approvedPriceStatus: json['approved_price_status'] as bool?, + parentProduct: (json['parent_product'] as num?)?.toInt(), + killHouse: (json['kill_house'] as num?)?.toInt(), + guild: (json['guild'] as num?)?.toInt(), +); + +Map _$InventoryModelToJson( + _InventoryModel instance, +) => { + 'id': instance.id, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'name': instance.name, + 'province_governmental_carcasses_quantity': + instance.provinceGovernmentalCarcassesQuantity, + 'province_governmental_carcasses_weight': + instance.provinceGovernmentalCarcassesWeight, + 'province_free_carcasses_quantity': instance.provinceFreeCarcassesQuantity, + 'province_free_carcasses_weight': instance.provinceFreeCarcassesWeight, + 'receive_governmental_carcasses_quantity': + instance.receiveGovernmentalCarcassesQuantity, + 'receive_governmental_carcasses_weight': + instance.receiveGovernmentalCarcassesWeight, + 'receive_free_carcasses_quantity': instance.receiveFreeCarcassesQuantity, + 'receive_free_carcasses_weight': instance.receiveFreeCarcassesWeight, + 'free_buying_carcasses_quantity': instance.freeBuyingCarcassesQuantity, + 'free_buying_carcasses_weight': instance.freeBuyingCarcassesWeight, + 'total_governmental_carcasses_quantity': + instance.totalGovernmentalCarcassesQuantity, + 'total_governmental_carcasses_weight': + instance.totalGovernmentalCarcassesWeight, + 'total_free_bars_carcasses_quantity': instance.totalFreeBarsCarcassesQuantity, + 'total_free_bars_carcasses_weight': instance.totalFreeBarsCarcassesWeight, + 'weight_average': instance.weightAverage, + 'total_carcasses_quantity': instance.totalCarcassesQuantity, + 'total_carcasses_weight': instance.totalCarcassesWeight, + 'freezing_quantity': instance.freezingQuantity, + 'freezing_weight': instance.freezingWeight, + 'loss_weight': instance.lossWeight, + 'out_province_allocated_quantity': instance.outProvinceAllocatedQuantity, + 'out_province_allocated_weight': instance.outProvinceAllocatedWeight, + 'province_allocated_quantity': instance.provinceAllocatedQuantity, + 'province_allocated_weight': instance.provinceAllocatedWeight, + 'real_allocated_quantity': instance.realAllocatedQuantity, + 'real_allocated_weight': instance.realAllocatedWeight, + 'cold_house_allocated_weight': instance.coldHouseAllocatedWeight, + 'pos_allocated_weight': instance.posAllocatedWeight, + 'segmentation_weight': instance.segmentationWeight, + 'total_remain_quantity': instance.totalRemainQuantity, + 'total_remain_weight': instance.totalRemainWeight, + 'free_price': instance.freePrice, + 'approved_price': instance.approvedPrice, + 'approved_price_status': instance.approvedPriceStatus, + 'parent_product': instance.parentProduct, + 'kill_house': instance.killHouse, + 'guild': instance.guild, +}; diff --git a/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart new file mode 100644 index 0000000..4a0c85c --- /dev/null +++ b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'kill_house_distribution_info.freezed.dart'; +part 'kill_house_distribution_info.g.dart'; + +@freezed +abstract class KillHouseDistributionInfo with _$KillHouseDistributionInfo { + const factory KillHouseDistributionInfo({ + double? stewardAllocationsWeight, + double? freeSalesWeight, + }) = _KillHouseDistributionInfo; + + factory KillHouseDistributionInfo.fromJson(Map json) => + _$KillHouseDistributionInfoFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart new file mode 100644 index 0000000..cc493ee --- /dev/null +++ b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart @@ -0,0 +1,151 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'kill_house_distribution_info.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$KillHouseDistributionInfo { + + double? get stewardAllocationsWeight; double? get freeSalesWeight; +/// Create a copy of KillHouseDistributionInfo +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$KillHouseDistributionInfoCopyWith get copyWith => _$KillHouseDistributionInfoCopyWithImpl(this as KillHouseDistributionInfo, _$identity); + + /// Serializes this KillHouseDistributionInfo to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouseDistributionInfo&&(identical(other.stewardAllocationsWeight, stewardAllocationsWeight) || other.stewardAllocationsWeight == stewardAllocationsWeight)&&(identical(other.freeSalesWeight, freeSalesWeight) || other.freeSalesWeight == freeSalesWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,stewardAllocationsWeight,freeSalesWeight); + +@override +String toString() { + return 'KillHouseDistributionInfo(stewardAllocationsWeight: $stewardAllocationsWeight, freeSalesWeight: $freeSalesWeight)'; +} + + +} + +/// @nodoc +abstract mixin class $KillHouseDistributionInfoCopyWith<$Res> { + factory $KillHouseDistributionInfoCopyWith(KillHouseDistributionInfo value, $Res Function(KillHouseDistributionInfo) _then) = _$KillHouseDistributionInfoCopyWithImpl; +@useResult +$Res call({ + double? stewardAllocationsWeight, double? freeSalesWeight +}); + + + + +} +/// @nodoc +class _$KillHouseDistributionInfoCopyWithImpl<$Res> + implements $KillHouseDistributionInfoCopyWith<$Res> { + _$KillHouseDistributionInfoCopyWithImpl(this._self, this._then); + + final KillHouseDistributionInfo _self; + final $Res Function(KillHouseDistributionInfo) _then; + +/// Create a copy of KillHouseDistributionInfo +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? stewardAllocationsWeight = freezed,Object? freeSalesWeight = freezed,}) { + return _then(_self.copyWith( +stewardAllocationsWeight: freezed == stewardAllocationsWeight ? _self.stewardAllocationsWeight : stewardAllocationsWeight // ignore: cast_nullable_to_non_nullable +as double?,freeSalesWeight: freezed == freeSalesWeight ? _self.freeSalesWeight : freeSalesWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _KillHouseDistributionInfo implements KillHouseDistributionInfo { + const _KillHouseDistributionInfo({this.stewardAllocationsWeight, this.freeSalesWeight}); + factory _KillHouseDistributionInfo.fromJson(Map json) => _$KillHouseDistributionInfoFromJson(json); + +@override final double? stewardAllocationsWeight; +@override final double? freeSalesWeight; + +/// Create a copy of KillHouseDistributionInfo +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$KillHouseDistributionInfoCopyWith<_KillHouseDistributionInfo> get copyWith => __$KillHouseDistributionInfoCopyWithImpl<_KillHouseDistributionInfo>(this, _$identity); + +@override +Map toJson() { + return _$KillHouseDistributionInfoToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouseDistributionInfo&&(identical(other.stewardAllocationsWeight, stewardAllocationsWeight) || other.stewardAllocationsWeight == stewardAllocationsWeight)&&(identical(other.freeSalesWeight, freeSalesWeight) || other.freeSalesWeight == freeSalesWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,stewardAllocationsWeight,freeSalesWeight); + +@override +String toString() { + return 'KillHouseDistributionInfo(stewardAllocationsWeight: $stewardAllocationsWeight, freeSalesWeight: $freeSalesWeight)'; +} + + +} + +/// @nodoc +abstract mixin class _$KillHouseDistributionInfoCopyWith<$Res> implements $KillHouseDistributionInfoCopyWith<$Res> { + factory _$KillHouseDistributionInfoCopyWith(_KillHouseDistributionInfo value, $Res Function(_KillHouseDistributionInfo) _then) = __$KillHouseDistributionInfoCopyWithImpl; +@override @useResult +$Res call({ + double? stewardAllocationsWeight, double? freeSalesWeight +}); + + + + +} +/// @nodoc +class __$KillHouseDistributionInfoCopyWithImpl<$Res> + implements _$KillHouseDistributionInfoCopyWith<$Res> { + __$KillHouseDistributionInfoCopyWithImpl(this._self, this._then); + + final _KillHouseDistributionInfo _self; + final $Res Function(_KillHouseDistributionInfo) _then; + +/// Create a copy of KillHouseDistributionInfo +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? stewardAllocationsWeight = freezed,Object? freeSalesWeight = freezed,}) { + return _then(_KillHouseDistributionInfo( +stewardAllocationsWeight: freezed == stewardAllocationsWeight ? _self.stewardAllocationsWeight : stewardAllocationsWeight // ignore: cast_nullable_to_non_nullable +as double?,freeSalesWeight: freezed == freeSalesWeight ? _self.freeSalesWeight : freeSalesWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.g.dart b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.g.dart new file mode 100644 index 0000000..f9c0d1a --- /dev/null +++ b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.g.dart @@ -0,0 +1,22 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'kill_house_distribution_info.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_KillHouseDistributionInfo _$KillHouseDistributionInfoFromJson( + Map json, +) => _KillHouseDistributionInfo( + stewardAllocationsWeight: (json['steward_allocations_weight'] as num?) + ?.toDouble(), + freeSalesWeight: (json['free_sales_weight'] as num?)?.toDouble(), +); + +Map _$KillHouseDistributionInfoToJson( + _KillHouseDistributionInfo instance, +) => { + 'steward_allocations_weight': instance.stewardAllocationsWeight, + 'free_sales_weight': instance.freeSalesWeight, +}; diff --git a/packages/chicken/lib/data/models/response/roles_products/roles_products.dart b/packages/chicken/lib/data/models/response/roles_products/roles_products.dart new file mode 100644 index 0000000..4be9533 --- /dev/null +++ b/packages/chicken/lib/data/models/response/roles_products/roles_products.dart @@ -0,0 +1,67 @@ + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'roles_products.freezed.dart'; +part 'roles_products.g.dart'; + +@freezed +abstract class RolesProductsModel with _$RolesProductsModel { +factory RolesProductsModel({ +required List products, +}) = _RolesProductsModel; + +factory RolesProductsModel.fromJson(Map json) => _$RolesProductsModelFromJson(json); +} + +@freezed +abstract class ProductModel with _$ProductModel { +factory ProductModel({ +int? id, +String? key, +String? create_date, // Changed from createDate, removed @JsonKey +String? modify_date, // Changed from modifyDate, removed @JsonKey +bool? trash, +String? name, + int? provinceGovernmentalCarcassesQuantity, + int? provinceGovernmentalCarcassesWeight, +int? provinceFreeCarcassesQuantity, +int? provinceFreeCarcassesWeight, +int? receiveGovernmentalCarcassesQuantity, +int? receiveGovernmentalCarcassesWeight, + int? receiveFreeCarcassesQuantity, +int? receiveFreeCarcassesWeight, + int? freeBuyingCarcassesQuantity, +int? freeBuyingCarcassesWeight, + int? totalGovernmentalCarcassesQuantity, +int? totalGovernmentalCarcassesWeight, +int? totalFreeBarsCarcassesQuantity, + int? totalFreeBarsCarcassesWeight, + double? weightAverage, +int? totalCarcassesQuantity, +int? totalCarcassesWeight, + int? freezingQuantity, +int? freezingWeight, +int? lossWeight, + int? outProvinceAllocatedQuantity, + int? outProvinceAllocatedWeight, +int? provinceAllocatedQuantity, +int? provinceAllocatedWeight, + int? realAllocatedQuantity, +int? realAllocatedWeight, +int? coldHouseAllocatedWeight, + int? posAllocatedWeight, +int? segmentationWeight, +int? totalRemainQuantity, + int? totalRemainWeight, + int? freePrice, +int? approvedPrice, + bool? approvedPriceStatus, + dynamic createdBy, + dynamic modifiedBy, +int? parentProduct, + dynamic killHouse, +int? guild, +}) = _ProductModel; + +factory ProductModel.fromJson(Map json) => _$ProductModelFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart b/packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart new file mode 100644 index 0000000..308ce7d --- /dev/null +++ b/packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart @@ -0,0 +1,423 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'roles_products.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$RolesProductsModel { + + List get products; +/// Create a copy of RolesProductsModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RolesProductsModelCopyWith get copyWith => _$RolesProductsModelCopyWithImpl(this as RolesProductsModel, _$identity); + + /// Serializes this RolesProductsModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RolesProductsModel&&const DeepCollectionEquality().equals(other.products, products)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(products)); + +@override +String toString() { + return 'RolesProductsModel(products: $products)'; +} + + +} + +/// @nodoc +abstract mixin class $RolesProductsModelCopyWith<$Res> { + factory $RolesProductsModelCopyWith(RolesProductsModel value, $Res Function(RolesProductsModel) _then) = _$RolesProductsModelCopyWithImpl; +@useResult +$Res call({ + List products +}); + + + + +} +/// @nodoc +class _$RolesProductsModelCopyWithImpl<$Res> + implements $RolesProductsModelCopyWith<$Res> { + _$RolesProductsModelCopyWithImpl(this._self, this._then); + + final RolesProductsModel _self; + final $Res Function(RolesProductsModel) _then; + +/// Create a copy of RolesProductsModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? products = null,}) { + return _then(_self.copyWith( +products: null == products ? _self.products : products // ignore: cast_nullable_to_non_nullable +as List, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _RolesProductsModel implements RolesProductsModel { + _RolesProductsModel({required final List products}): _products = products; + factory _RolesProductsModel.fromJson(Map json) => _$RolesProductsModelFromJson(json); + + final List _products; +@override List get products { + if (_products is EqualUnmodifiableListView) return _products; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_products); +} + + +/// Create a copy of RolesProductsModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$RolesProductsModelCopyWith<_RolesProductsModel> get copyWith => __$RolesProductsModelCopyWithImpl<_RolesProductsModel>(this, _$identity); + +@override +Map toJson() { + return _$RolesProductsModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _RolesProductsModel&&const DeepCollectionEquality().equals(other._products, _products)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_products)); + +@override +String toString() { + return 'RolesProductsModel(products: $products)'; +} + + +} + +/// @nodoc +abstract mixin class _$RolesProductsModelCopyWith<$Res> implements $RolesProductsModelCopyWith<$Res> { + factory _$RolesProductsModelCopyWith(_RolesProductsModel value, $Res Function(_RolesProductsModel) _then) = __$RolesProductsModelCopyWithImpl; +@override @useResult +$Res call({ + List products +}); + + + + +} +/// @nodoc +class __$RolesProductsModelCopyWithImpl<$Res> + implements _$RolesProductsModelCopyWith<$Res> { + __$RolesProductsModelCopyWithImpl(this._self, this._then); + + final _RolesProductsModel _self; + final $Res Function(_RolesProductsModel) _then; + +/// Create a copy of RolesProductsModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? products = null,}) { + return _then(_RolesProductsModel( +products: null == products ? _self._products : products // ignore: cast_nullable_to_non_nullable +as List, + )); +} + + +} + + +/// @nodoc +mixin _$ProductModel { + + int? get id; String? get key; String? get create_date;// Changed from createDate, removed @JsonKey + String? get modify_date;// Changed from modifyDate, removed @JsonKey + bool? get trash; String? get name; int? get provinceGovernmentalCarcassesQuantity; int? get provinceGovernmentalCarcassesWeight; int? get provinceFreeCarcassesQuantity; int? get provinceFreeCarcassesWeight; int? get receiveGovernmentalCarcassesQuantity; int? get receiveGovernmentalCarcassesWeight; int? get receiveFreeCarcassesQuantity; int? get receiveFreeCarcassesWeight; int? get freeBuyingCarcassesQuantity; int? get freeBuyingCarcassesWeight; int? get totalGovernmentalCarcassesQuantity; int? get totalGovernmentalCarcassesWeight; int? get totalFreeBarsCarcassesQuantity; int? get totalFreeBarsCarcassesWeight; double? get weightAverage; int? get totalCarcassesQuantity; int? get totalCarcassesWeight; int? get freezingQuantity; int? get freezingWeight; int? get lossWeight; int? get outProvinceAllocatedQuantity; int? get outProvinceAllocatedWeight; int? get provinceAllocatedQuantity; int? get provinceAllocatedWeight; int? get realAllocatedQuantity; int? get realAllocatedWeight; int? get coldHouseAllocatedWeight; int? get posAllocatedWeight; int? get segmentationWeight; int? get totalRemainQuantity; int? get totalRemainWeight; int? get freePrice; int? get approvedPrice; bool? get approvedPriceStatus; dynamic get createdBy; dynamic get modifiedBy; int? get parentProduct; dynamic get killHouse; int? get guild; +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProductModelCopyWith get copyWith => _$ProductModelCopyWithImpl(this as ProductModel, _$identity); + + /// Serializes this ProductModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ProductModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.name, name) || other.name == name)&&(identical(other.provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesQuantity) || other.provinceGovernmentalCarcassesQuantity == provinceGovernmentalCarcassesQuantity)&&(identical(other.provinceGovernmentalCarcassesWeight, provinceGovernmentalCarcassesWeight) || other.provinceGovernmentalCarcassesWeight == provinceGovernmentalCarcassesWeight)&&(identical(other.provinceFreeCarcassesQuantity, provinceFreeCarcassesQuantity) || other.provinceFreeCarcassesQuantity == provinceFreeCarcassesQuantity)&&(identical(other.provinceFreeCarcassesWeight, provinceFreeCarcassesWeight) || other.provinceFreeCarcassesWeight == provinceFreeCarcassesWeight)&&(identical(other.receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesQuantity) || other.receiveGovernmentalCarcassesQuantity == receiveGovernmentalCarcassesQuantity)&&(identical(other.receiveGovernmentalCarcassesWeight, receiveGovernmentalCarcassesWeight) || other.receiveGovernmentalCarcassesWeight == receiveGovernmentalCarcassesWeight)&&(identical(other.receiveFreeCarcassesQuantity, receiveFreeCarcassesQuantity) || other.receiveFreeCarcassesQuantity == receiveFreeCarcassesQuantity)&&(identical(other.receiveFreeCarcassesWeight, receiveFreeCarcassesWeight) || other.receiveFreeCarcassesWeight == receiveFreeCarcassesWeight)&&(identical(other.freeBuyingCarcassesQuantity, freeBuyingCarcassesQuantity) || other.freeBuyingCarcassesQuantity == freeBuyingCarcassesQuantity)&&(identical(other.freeBuyingCarcassesWeight, freeBuyingCarcassesWeight) || other.freeBuyingCarcassesWeight == freeBuyingCarcassesWeight)&&(identical(other.totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesQuantity) || other.totalGovernmentalCarcassesQuantity == totalGovernmentalCarcassesQuantity)&&(identical(other.totalGovernmentalCarcassesWeight, totalGovernmentalCarcassesWeight) || other.totalGovernmentalCarcassesWeight == totalGovernmentalCarcassesWeight)&&(identical(other.totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesQuantity) || other.totalFreeBarsCarcassesQuantity == totalFreeBarsCarcassesQuantity)&&(identical(other.totalFreeBarsCarcassesWeight, totalFreeBarsCarcassesWeight) || other.totalFreeBarsCarcassesWeight == totalFreeBarsCarcassesWeight)&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)&&(identical(other.totalCarcassesQuantity, totalCarcassesQuantity) || other.totalCarcassesQuantity == totalCarcassesQuantity)&&(identical(other.totalCarcassesWeight, totalCarcassesWeight) || other.totalCarcassesWeight == totalCarcassesWeight)&&(identical(other.freezingQuantity, freezingQuantity) || other.freezingQuantity == freezingQuantity)&&(identical(other.freezingWeight, freezingWeight) || other.freezingWeight == freezingWeight)&&(identical(other.lossWeight, lossWeight) || other.lossWeight == lossWeight)&&(identical(other.outProvinceAllocatedQuantity, outProvinceAllocatedQuantity) || other.outProvinceAllocatedQuantity == outProvinceAllocatedQuantity)&&(identical(other.outProvinceAllocatedWeight, outProvinceAllocatedWeight) || other.outProvinceAllocatedWeight == outProvinceAllocatedWeight)&&(identical(other.provinceAllocatedQuantity, provinceAllocatedQuantity) || other.provinceAllocatedQuantity == provinceAllocatedQuantity)&&(identical(other.provinceAllocatedWeight, provinceAllocatedWeight) || other.provinceAllocatedWeight == provinceAllocatedWeight)&&(identical(other.realAllocatedQuantity, realAllocatedQuantity) || other.realAllocatedQuantity == realAllocatedQuantity)&&(identical(other.realAllocatedWeight, realAllocatedWeight) || other.realAllocatedWeight == realAllocatedWeight)&&(identical(other.coldHouseAllocatedWeight, coldHouseAllocatedWeight) || other.coldHouseAllocatedWeight == coldHouseAllocatedWeight)&&(identical(other.posAllocatedWeight, posAllocatedWeight) || other.posAllocatedWeight == posAllocatedWeight)&&(identical(other.segmentationWeight, segmentationWeight) || other.segmentationWeight == segmentationWeight)&&(identical(other.totalRemainQuantity, totalRemainQuantity) || other.totalRemainQuantity == totalRemainQuantity)&&(identical(other.totalRemainWeight, totalRemainWeight) || other.totalRemainWeight == totalRemainWeight)&&(identical(other.freePrice, freePrice) || other.freePrice == freePrice)&&(identical(other.approvedPrice, approvedPrice) || other.approvedPrice == approvedPrice)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.parentProduct, parentProduct) || other.parentProduct == parentProduct)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&(identical(other.guild, guild) || other.guild == guild)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,key,create_date,modify_date,trash,name,provinceGovernmentalCarcassesQuantity,provinceGovernmentalCarcassesWeight,provinceFreeCarcassesQuantity,provinceFreeCarcassesWeight,receiveGovernmentalCarcassesQuantity,receiveGovernmentalCarcassesWeight,receiveFreeCarcassesQuantity,receiveFreeCarcassesWeight,freeBuyingCarcassesQuantity,freeBuyingCarcassesWeight,totalGovernmentalCarcassesQuantity,totalGovernmentalCarcassesWeight,totalFreeBarsCarcassesQuantity,totalFreeBarsCarcassesWeight,weightAverage,totalCarcassesQuantity,totalCarcassesWeight,freezingQuantity,freezingWeight,lossWeight,outProvinceAllocatedQuantity,outProvinceAllocatedWeight,provinceAllocatedQuantity,provinceAllocatedWeight,realAllocatedQuantity,realAllocatedWeight,coldHouseAllocatedWeight,posAllocatedWeight,segmentationWeight,totalRemainQuantity,totalRemainWeight,freePrice,approvedPrice,approvedPriceStatus,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),parentProduct,const DeepCollectionEquality().hash(killHouse),guild]); + +@override +String toString() { + return 'ProductModel(id: $id, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, name: $name, provinceGovernmentalCarcassesQuantity: $provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesWeight: $provinceGovernmentalCarcassesWeight, provinceFreeCarcassesQuantity: $provinceFreeCarcassesQuantity, provinceFreeCarcassesWeight: $provinceFreeCarcassesWeight, receiveGovernmentalCarcassesQuantity: $receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesWeight: $receiveGovernmentalCarcassesWeight, receiveFreeCarcassesQuantity: $receiveFreeCarcassesQuantity, receiveFreeCarcassesWeight: $receiveFreeCarcassesWeight, freeBuyingCarcassesQuantity: $freeBuyingCarcassesQuantity, freeBuyingCarcassesWeight: $freeBuyingCarcassesWeight, totalGovernmentalCarcassesQuantity: $totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesWeight: $totalGovernmentalCarcassesWeight, totalFreeBarsCarcassesQuantity: $totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesWeight: $totalFreeBarsCarcassesWeight, weightAverage: $weightAverage, totalCarcassesQuantity: $totalCarcassesQuantity, totalCarcassesWeight: $totalCarcassesWeight, freezingQuantity: $freezingQuantity, freezingWeight: $freezingWeight, lossWeight: $lossWeight, outProvinceAllocatedQuantity: $outProvinceAllocatedQuantity, outProvinceAllocatedWeight: $outProvinceAllocatedWeight, provinceAllocatedQuantity: $provinceAllocatedQuantity, provinceAllocatedWeight: $provinceAllocatedWeight, realAllocatedQuantity: $realAllocatedQuantity, realAllocatedWeight: $realAllocatedWeight, coldHouseAllocatedWeight: $coldHouseAllocatedWeight, posAllocatedWeight: $posAllocatedWeight, segmentationWeight: $segmentationWeight, totalRemainQuantity: $totalRemainQuantity, totalRemainWeight: $totalRemainWeight, freePrice: $freePrice, approvedPrice: $approvedPrice, approvedPriceStatus: $approvedPriceStatus, createdBy: $createdBy, modifiedBy: $modifiedBy, parentProduct: $parentProduct, killHouse: $killHouse, guild: $guild)'; +} + + +} + +/// @nodoc +abstract mixin class $ProductModelCopyWith<$Res> { + factory $ProductModelCopyWith(ProductModel value, $Res Function(ProductModel) _then) = _$ProductModelCopyWithImpl; +@useResult +$Res call({ + int? id, String? key, String? create_date, String? modify_date, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, dynamic createdBy, dynamic modifiedBy, int? parentProduct, dynamic killHouse, int? guild +}); + + + + +} +/// @nodoc +class _$ProductModelCopyWithImpl<$Res> + implements $ProductModelCopyWith<$Res> { + _$ProductModelCopyWithImpl(this._self, this._then); + + final ProductModel _self; + final $Res Function(ProductModel) _then; + +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? name = freezed,Object? provinceGovernmentalCarcassesQuantity = freezed,Object? provinceGovernmentalCarcassesWeight = freezed,Object? provinceFreeCarcassesQuantity = freezed,Object? provinceFreeCarcassesWeight = freezed,Object? receiveGovernmentalCarcassesQuantity = freezed,Object? receiveGovernmentalCarcassesWeight = freezed,Object? receiveFreeCarcassesQuantity = freezed,Object? receiveFreeCarcassesWeight = freezed,Object? freeBuyingCarcassesQuantity = freezed,Object? freeBuyingCarcassesWeight = freezed,Object? totalGovernmentalCarcassesQuantity = freezed,Object? totalGovernmentalCarcassesWeight = freezed,Object? totalFreeBarsCarcassesQuantity = freezed,Object? totalFreeBarsCarcassesWeight = freezed,Object? weightAverage = freezed,Object? totalCarcassesQuantity = freezed,Object? totalCarcassesWeight = freezed,Object? freezingQuantity = freezed,Object? freezingWeight = freezed,Object? lossWeight = freezed,Object? outProvinceAllocatedQuantity = freezed,Object? outProvinceAllocatedWeight = freezed,Object? provinceAllocatedQuantity = freezed,Object? provinceAllocatedWeight = freezed,Object? realAllocatedQuantity = freezed,Object? realAllocatedWeight = freezed,Object? coldHouseAllocatedWeight = freezed,Object? posAllocatedWeight = freezed,Object? segmentationWeight = freezed,Object? totalRemainQuantity = freezed,Object? totalRemainWeight = freezed,Object? freePrice = freezed,Object? approvedPrice = freezed,Object? approvedPriceStatus = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? parentProduct = freezed,Object? killHouse = freezed,Object? guild = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,provinceGovernmentalCarcassesQuantity: freezed == provinceGovernmentalCarcassesQuantity ? _self.provinceGovernmentalCarcassesQuantity : provinceGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceGovernmentalCarcassesWeight: freezed == provinceGovernmentalCarcassesWeight ? _self.provinceGovernmentalCarcassesWeight : provinceGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesQuantity: freezed == provinceFreeCarcassesQuantity ? _self.provinceFreeCarcassesQuantity : provinceFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesWeight: freezed == provinceFreeCarcassesWeight ? _self.provinceFreeCarcassesWeight : provinceFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesQuantity: freezed == receiveGovernmentalCarcassesQuantity ? _self.receiveGovernmentalCarcassesQuantity : receiveGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesWeight: freezed == receiveGovernmentalCarcassesWeight ? _self.receiveGovernmentalCarcassesWeight : receiveGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesQuantity: freezed == receiveFreeCarcassesQuantity ? _self.receiveFreeCarcassesQuantity : receiveFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesWeight: freezed == receiveFreeCarcassesWeight ? _self.receiveFreeCarcassesWeight : receiveFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesQuantity: freezed == freeBuyingCarcassesQuantity ? _self.freeBuyingCarcassesQuantity : freeBuyingCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesWeight: freezed == freeBuyingCarcassesWeight ? _self.freeBuyingCarcassesWeight : freeBuyingCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesQuantity: freezed == totalGovernmentalCarcassesQuantity ? _self.totalGovernmentalCarcassesQuantity : totalGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesWeight: freezed == totalGovernmentalCarcassesWeight ? _self.totalGovernmentalCarcassesWeight : totalGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesQuantity: freezed == totalFreeBarsCarcassesQuantity ? _self.totalFreeBarsCarcassesQuantity : totalFreeBarsCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesWeight: freezed == totalFreeBarsCarcassesWeight ? _self.totalFreeBarsCarcassesWeight : totalFreeBarsCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?,totalCarcassesQuantity: freezed == totalCarcassesQuantity ? _self.totalCarcassesQuantity : totalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalCarcassesWeight: freezed == totalCarcassesWeight ? _self.totalCarcassesWeight : totalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freezingQuantity: freezed == freezingQuantity ? _self.freezingQuantity : freezingQuantity // ignore: cast_nullable_to_non_nullable +as int?,freezingWeight: freezed == freezingWeight ? _self.freezingWeight : freezingWeight // ignore: cast_nullable_to_non_nullable +as int?,lossWeight: freezed == lossWeight ? _self.lossWeight : lossWeight // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedQuantity: freezed == outProvinceAllocatedQuantity ? _self.outProvinceAllocatedQuantity : outProvinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedWeight: freezed == outProvinceAllocatedWeight ? _self.outProvinceAllocatedWeight : outProvinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedQuantity: freezed == provinceAllocatedQuantity ? _self.provinceAllocatedQuantity : provinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedWeight: freezed == provinceAllocatedWeight ? _self.provinceAllocatedWeight : provinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedQuantity: freezed == realAllocatedQuantity ? _self.realAllocatedQuantity : realAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedWeight: freezed == realAllocatedWeight ? _self.realAllocatedWeight : realAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,coldHouseAllocatedWeight: freezed == coldHouseAllocatedWeight ? _self.coldHouseAllocatedWeight : coldHouseAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,posAllocatedWeight: freezed == posAllocatedWeight ? _self.posAllocatedWeight : posAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,segmentationWeight: freezed == segmentationWeight ? _self.segmentationWeight : segmentationWeight // ignore: cast_nullable_to_non_nullable +as int?,totalRemainQuantity: freezed == totalRemainQuantity ? _self.totalRemainQuantity : totalRemainQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalRemainWeight: freezed == totalRemainWeight ? _self.totalRemainWeight : totalRemainWeight // ignore: cast_nullable_to_non_nullable +as int?,freePrice: freezed == freePrice ? _self.freePrice : freePrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPrice: freezed == approvedPrice ? _self.approvedPrice : approvedPrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,parentProduct: freezed == parentProduct ? _self.parentProduct : parentProduct // ignore: cast_nullable_to_non_nullable +as int?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ProductModel implements ProductModel { + _ProductModel({this.id, this.key, this.create_date, this.modify_date, this.trash, this.name, this.provinceGovernmentalCarcassesQuantity, this.provinceGovernmentalCarcassesWeight, this.provinceFreeCarcassesQuantity, this.provinceFreeCarcassesWeight, this.receiveGovernmentalCarcassesQuantity, this.receiveGovernmentalCarcassesWeight, this.receiveFreeCarcassesQuantity, this.receiveFreeCarcassesWeight, this.freeBuyingCarcassesQuantity, this.freeBuyingCarcassesWeight, this.totalGovernmentalCarcassesQuantity, this.totalGovernmentalCarcassesWeight, this.totalFreeBarsCarcassesQuantity, this.totalFreeBarsCarcassesWeight, this.weightAverage, this.totalCarcassesQuantity, this.totalCarcassesWeight, this.freezingQuantity, this.freezingWeight, this.lossWeight, this.outProvinceAllocatedQuantity, this.outProvinceAllocatedWeight, this.provinceAllocatedQuantity, this.provinceAllocatedWeight, this.realAllocatedQuantity, this.realAllocatedWeight, this.coldHouseAllocatedWeight, this.posAllocatedWeight, this.segmentationWeight, this.totalRemainQuantity, this.totalRemainWeight, this.freePrice, this.approvedPrice, this.approvedPriceStatus, this.createdBy, this.modifiedBy, this.parentProduct, this.killHouse, this.guild}); + factory _ProductModel.fromJson(Map json) => _$ProductModelFromJson(json); + +@override final int? id; +@override final String? key; +@override final String? create_date; +// Changed from createDate, removed @JsonKey +@override final String? modify_date; +// Changed from modifyDate, removed @JsonKey +@override final bool? trash; +@override final String? name; +@override final int? provinceGovernmentalCarcassesQuantity; +@override final int? provinceGovernmentalCarcassesWeight; +@override final int? provinceFreeCarcassesQuantity; +@override final int? provinceFreeCarcassesWeight; +@override final int? receiveGovernmentalCarcassesQuantity; +@override final int? receiveGovernmentalCarcassesWeight; +@override final int? receiveFreeCarcassesQuantity; +@override final int? receiveFreeCarcassesWeight; +@override final int? freeBuyingCarcassesQuantity; +@override final int? freeBuyingCarcassesWeight; +@override final int? totalGovernmentalCarcassesQuantity; +@override final int? totalGovernmentalCarcassesWeight; +@override final int? totalFreeBarsCarcassesQuantity; +@override final int? totalFreeBarsCarcassesWeight; +@override final double? weightAverage; +@override final int? totalCarcassesQuantity; +@override final int? totalCarcassesWeight; +@override final int? freezingQuantity; +@override final int? freezingWeight; +@override final int? lossWeight; +@override final int? outProvinceAllocatedQuantity; +@override final int? outProvinceAllocatedWeight; +@override final int? provinceAllocatedQuantity; +@override final int? provinceAllocatedWeight; +@override final int? realAllocatedQuantity; +@override final int? realAllocatedWeight; +@override final int? coldHouseAllocatedWeight; +@override final int? posAllocatedWeight; +@override final int? segmentationWeight; +@override final int? totalRemainQuantity; +@override final int? totalRemainWeight; +@override final int? freePrice; +@override final int? approvedPrice; +@override final bool? approvedPriceStatus; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final int? parentProduct; +@override final dynamic killHouse; +@override final int? guild; + +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProductModelCopyWith<_ProductModel> get copyWith => __$ProductModelCopyWithImpl<_ProductModel>(this, _$identity); + +@override +Map toJson() { + return _$ProductModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ProductModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.name, name) || other.name == name)&&(identical(other.provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesQuantity) || other.provinceGovernmentalCarcassesQuantity == provinceGovernmentalCarcassesQuantity)&&(identical(other.provinceGovernmentalCarcassesWeight, provinceGovernmentalCarcassesWeight) || other.provinceGovernmentalCarcassesWeight == provinceGovernmentalCarcassesWeight)&&(identical(other.provinceFreeCarcassesQuantity, provinceFreeCarcassesQuantity) || other.provinceFreeCarcassesQuantity == provinceFreeCarcassesQuantity)&&(identical(other.provinceFreeCarcassesWeight, provinceFreeCarcassesWeight) || other.provinceFreeCarcassesWeight == provinceFreeCarcassesWeight)&&(identical(other.receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesQuantity) || other.receiveGovernmentalCarcassesQuantity == receiveGovernmentalCarcassesQuantity)&&(identical(other.receiveGovernmentalCarcassesWeight, receiveGovernmentalCarcassesWeight) || other.receiveGovernmentalCarcassesWeight == receiveGovernmentalCarcassesWeight)&&(identical(other.receiveFreeCarcassesQuantity, receiveFreeCarcassesQuantity) || other.receiveFreeCarcassesQuantity == receiveFreeCarcassesQuantity)&&(identical(other.receiveFreeCarcassesWeight, receiveFreeCarcassesWeight) || other.receiveFreeCarcassesWeight == receiveFreeCarcassesWeight)&&(identical(other.freeBuyingCarcassesQuantity, freeBuyingCarcassesQuantity) || other.freeBuyingCarcassesQuantity == freeBuyingCarcassesQuantity)&&(identical(other.freeBuyingCarcassesWeight, freeBuyingCarcassesWeight) || other.freeBuyingCarcassesWeight == freeBuyingCarcassesWeight)&&(identical(other.totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesQuantity) || other.totalGovernmentalCarcassesQuantity == totalGovernmentalCarcassesQuantity)&&(identical(other.totalGovernmentalCarcassesWeight, totalGovernmentalCarcassesWeight) || other.totalGovernmentalCarcassesWeight == totalGovernmentalCarcassesWeight)&&(identical(other.totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesQuantity) || other.totalFreeBarsCarcassesQuantity == totalFreeBarsCarcassesQuantity)&&(identical(other.totalFreeBarsCarcassesWeight, totalFreeBarsCarcassesWeight) || other.totalFreeBarsCarcassesWeight == totalFreeBarsCarcassesWeight)&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)&&(identical(other.totalCarcassesQuantity, totalCarcassesQuantity) || other.totalCarcassesQuantity == totalCarcassesQuantity)&&(identical(other.totalCarcassesWeight, totalCarcassesWeight) || other.totalCarcassesWeight == totalCarcassesWeight)&&(identical(other.freezingQuantity, freezingQuantity) || other.freezingQuantity == freezingQuantity)&&(identical(other.freezingWeight, freezingWeight) || other.freezingWeight == freezingWeight)&&(identical(other.lossWeight, lossWeight) || other.lossWeight == lossWeight)&&(identical(other.outProvinceAllocatedQuantity, outProvinceAllocatedQuantity) || other.outProvinceAllocatedQuantity == outProvinceAllocatedQuantity)&&(identical(other.outProvinceAllocatedWeight, outProvinceAllocatedWeight) || other.outProvinceAllocatedWeight == outProvinceAllocatedWeight)&&(identical(other.provinceAllocatedQuantity, provinceAllocatedQuantity) || other.provinceAllocatedQuantity == provinceAllocatedQuantity)&&(identical(other.provinceAllocatedWeight, provinceAllocatedWeight) || other.provinceAllocatedWeight == provinceAllocatedWeight)&&(identical(other.realAllocatedQuantity, realAllocatedQuantity) || other.realAllocatedQuantity == realAllocatedQuantity)&&(identical(other.realAllocatedWeight, realAllocatedWeight) || other.realAllocatedWeight == realAllocatedWeight)&&(identical(other.coldHouseAllocatedWeight, coldHouseAllocatedWeight) || other.coldHouseAllocatedWeight == coldHouseAllocatedWeight)&&(identical(other.posAllocatedWeight, posAllocatedWeight) || other.posAllocatedWeight == posAllocatedWeight)&&(identical(other.segmentationWeight, segmentationWeight) || other.segmentationWeight == segmentationWeight)&&(identical(other.totalRemainQuantity, totalRemainQuantity) || other.totalRemainQuantity == totalRemainQuantity)&&(identical(other.totalRemainWeight, totalRemainWeight) || other.totalRemainWeight == totalRemainWeight)&&(identical(other.freePrice, freePrice) || other.freePrice == freePrice)&&(identical(other.approvedPrice, approvedPrice) || other.approvedPrice == approvedPrice)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.parentProduct, parentProduct) || other.parentProduct == parentProduct)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&(identical(other.guild, guild) || other.guild == guild)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,key,create_date,modify_date,trash,name,provinceGovernmentalCarcassesQuantity,provinceGovernmentalCarcassesWeight,provinceFreeCarcassesQuantity,provinceFreeCarcassesWeight,receiveGovernmentalCarcassesQuantity,receiveGovernmentalCarcassesWeight,receiveFreeCarcassesQuantity,receiveFreeCarcassesWeight,freeBuyingCarcassesQuantity,freeBuyingCarcassesWeight,totalGovernmentalCarcassesQuantity,totalGovernmentalCarcassesWeight,totalFreeBarsCarcassesQuantity,totalFreeBarsCarcassesWeight,weightAverage,totalCarcassesQuantity,totalCarcassesWeight,freezingQuantity,freezingWeight,lossWeight,outProvinceAllocatedQuantity,outProvinceAllocatedWeight,provinceAllocatedQuantity,provinceAllocatedWeight,realAllocatedQuantity,realAllocatedWeight,coldHouseAllocatedWeight,posAllocatedWeight,segmentationWeight,totalRemainQuantity,totalRemainWeight,freePrice,approvedPrice,approvedPriceStatus,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),parentProduct,const DeepCollectionEquality().hash(killHouse),guild]); + +@override +String toString() { + return 'ProductModel(id: $id, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, name: $name, provinceGovernmentalCarcassesQuantity: $provinceGovernmentalCarcassesQuantity, provinceGovernmentalCarcassesWeight: $provinceGovernmentalCarcassesWeight, provinceFreeCarcassesQuantity: $provinceFreeCarcassesQuantity, provinceFreeCarcassesWeight: $provinceFreeCarcassesWeight, receiveGovernmentalCarcassesQuantity: $receiveGovernmentalCarcassesQuantity, receiveGovernmentalCarcassesWeight: $receiveGovernmentalCarcassesWeight, receiveFreeCarcassesQuantity: $receiveFreeCarcassesQuantity, receiveFreeCarcassesWeight: $receiveFreeCarcassesWeight, freeBuyingCarcassesQuantity: $freeBuyingCarcassesQuantity, freeBuyingCarcassesWeight: $freeBuyingCarcassesWeight, totalGovernmentalCarcassesQuantity: $totalGovernmentalCarcassesQuantity, totalGovernmentalCarcassesWeight: $totalGovernmentalCarcassesWeight, totalFreeBarsCarcassesQuantity: $totalFreeBarsCarcassesQuantity, totalFreeBarsCarcassesWeight: $totalFreeBarsCarcassesWeight, weightAverage: $weightAverage, totalCarcassesQuantity: $totalCarcassesQuantity, totalCarcassesWeight: $totalCarcassesWeight, freezingQuantity: $freezingQuantity, freezingWeight: $freezingWeight, lossWeight: $lossWeight, outProvinceAllocatedQuantity: $outProvinceAllocatedQuantity, outProvinceAllocatedWeight: $outProvinceAllocatedWeight, provinceAllocatedQuantity: $provinceAllocatedQuantity, provinceAllocatedWeight: $provinceAllocatedWeight, realAllocatedQuantity: $realAllocatedQuantity, realAllocatedWeight: $realAllocatedWeight, coldHouseAllocatedWeight: $coldHouseAllocatedWeight, posAllocatedWeight: $posAllocatedWeight, segmentationWeight: $segmentationWeight, totalRemainQuantity: $totalRemainQuantity, totalRemainWeight: $totalRemainWeight, freePrice: $freePrice, approvedPrice: $approvedPrice, approvedPriceStatus: $approvedPriceStatus, createdBy: $createdBy, modifiedBy: $modifiedBy, parentProduct: $parentProduct, killHouse: $killHouse, guild: $guild)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProductModelCopyWith<$Res> implements $ProductModelCopyWith<$Res> { + factory _$ProductModelCopyWith(_ProductModel value, $Res Function(_ProductModel) _then) = __$ProductModelCopyWithImpl; +@override @useResult +$Res call({ + int? id, String? key, String? create_date, String? modify_date, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, dynamic createdBy, dynamic modifiedBy, int? parentProduct, dynamic killHouse, int? guild +}); + + + + +} +/// @nodoc +class __$ProductModelCopyWithImpl<$Res> + implements _$ProductModelCopyWith<$Res> { + __$ProductModelCopyWithImpl(this._self, this._then); + + final _ProductModel _self; + final $Res Function(_ProductModel) _then; + +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? name = freezed,Object? provinceGovernmentalCarcassesQuantity = freezed,Object? provinceGovernmentalCarcassesWeight = freezed,Object? provinceFreeCarcassesQuantity = freezed,Object? provinceFreeCarcassesWeight = freezed,Object? receiveGovernmentalCarcassesQuantity = freezed,Object? receiveGovernmentalCarcassesWeight = freezed,Object? receiveFreeCarcassesQuantity = freezed,Object? receiveFreeCarcassesWeight = freezed,Object? freeBuyingCarcassesQuantity = freezed,Object? freeBuyingCarcassesWeight = freezed,Object? totalGovernmentalCarcassesQuantity = freezed,Object? totalGovernmentalCarcassesWeight = freezed,Object? totalFreeBarsCarcassesQuantity = freezed,Object? totalFreeBarsCarcassesWeight = freezed,Object? weightAverage = freezed,Object? totalCarcassesQuantity = freezed,Object? totalCarcassesWeight = freezed,Object? freezingQuantity = freezed,Object? freezingWeight = freezed,Object? lossWeight = freezed,Object? outProvinceAllocatedQuantity = freezed,Object? outProvinceAllocatedWeight = freezed,Object? provinceAllocatedQuantity = freezed,Object? provinceAllocatedWeight = freezed,Object? realAllocatedQuantity = freezed,Object? realAllocatedWeight = freezed,Object? coldHouseAllocatedWeight = freezed,Object? posAllocatedWeight = freezed,Object? segmentationWeight = freezed,Object? totalRemainQuantity = freezed,Object? totalRemainWeight = freezed,Object? freePrice = freezed,Object? approvedPrice = freezed,Object? approvedPriceStatus = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? parentProduct = freezed,Object? killHouse = freezed,Object? guild = freezed,}) { + return _then(_ProductModel( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,provinceGovernmentalCarcassesQuantity: freezed == provinceGovernmentalCarcassesQuantity ? _self.provinceGovernmentalCarcassesQuantity : provinceGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceGovernmentalCarcassesWeight: freezed == provinceGovernmentalCarcassesWeight ? _self.provinceGovernmentalCarcassesWeight : provinceGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesQuantity: freezed == provinceFreeCarcassesQuantity ? _self.provinceFreeCarcassesQuantity : provinceFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceFreeCarcassesWeight: freezed == provinceFreeCarcassesWeight ? _self.provinceFreeCarcassesWeight : provinceFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesQuantity: freezed == receiveGovernmentalCarcassesQuantity ? _self.receiveGovernmentalCarcassesQuantity : receiveGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveGovernmentalCarcassesWeight: freezed == receiveGovernmentalCarcassesWeight ? _self.receiveGovernmentalCarcassesWeight : receiveGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesQuantity: freezed == receiveFreeCarcassesQuantity ? _self.receiveFreeCarcassesQuantity : receiveFreeCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,receiveFreeCarcassesWeight: freezed == receiveFreeCarcassesWeight ? _self.receiveFreeCarcassesWeight : receiveFreeCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesQuantity: freezed == freeBuyingCarcassesQuantity ? _self.freeBuyingCarcassesQuantity : freeBuyingCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,freeBuyingCarcassesWeight: freezed == freeBuyingCarcassesWeight ? _self.freeBuyingCarcassesWeight : freeBuyingCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesQuantity: freezed == totalGovernmentalCarcassesQuantity ? _self.totalGovernmentalCarcassesQuantity : totalGovernmentalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalGovernmentalCarcassesWeight: freezed == totalGovernmentalCarcassesWeight ? _self.totalGovernmentalCarcassesWeight : totalGovernmentalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesQuantity: freezed == totalFreeBarsCarcassesQuantity ? _self.totalFreeBarsCarcassesQuantity : totalFreeBarsCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalFreeBarsCarcassesWeight: freezed == totalFreeBarsCarcassesWeight ? _self.totalFreeBarsCarcassesWeight : totalFreeBarsCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?,totalCarcassesQuantity: freezed == totalCarcassesQuantity ? _self.totalCarcassesQuantity : totalCarcassesQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalCarcassesWeight: freezed == totalCarcassesWeight ? _self.totalCarcassesWeight : totalCarcassesWeight // ignore: cast_nullable_to_non_nullable +as int?,freezingQuantity: freezed == freezingQuantity ? _self.freezingQuantity : freezingQuantity // ignore: cast_nullable_to_non_nullable +as int?,freezingWeight: freezed == freezingWeight ? _self.freezingWeight : freezingWeight // ignore: cast_nullable_to_non_nullable +as int?,lossWeight: freezed == lossWeight ? _self.lossWeight : lossWeight // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedQuantity: freezed == outProvinceAllocatedQuantity ? _self.outProvinceAllocatedQuantity : outProvinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,outProvinceAllocatedWeight: freezed == outProvinceAllocatedWeight ? _self.outProvinceAllocatedWeight : outProvinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedQuantity: freezed == provinceAllocatedQuantity ? _self.provinceAllocatedQuantity : provinceAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceAllocatedWeight: freezed == provinceAllocatedWeight ? _self.provinceAllocatedWeight : provinceAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedQuantity: freezed == realAllocatedQuantity ? _self.realAllocatedQuantity : realAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,realAllocatedWeight: freezed == realAllocatedWeight ? _self.realAllocatedWeight : realAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,coldHouseAllocatedWeight: freezed == coldHouseAllocatedWeight ? _self.coldHouseAllocatedWeight : coldHouseAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,posAllocatedWeight: freezed == posAllocatedWeight ? _self.posAllocatedWeight : posAllocatedWeight // ignore: cast_nullable_to_non_nullable +as int?,segmentationWeight: freezed == segmentationWeight ? _self.segmentationWeight : segmentationWeight // ignore: cast_nullable_to_non_nullable +as int?,totalRemainQuantity: freezed == totalRemainQuantity ? _self.totalRemainQuantity : totalRemainQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalRemainWeight: freezed == totalRemainWeight ? _self.totalRemainWeight : totalRemainWeight // ignore: cast_nullable_to_non_nullable +as int?,freePrice: freezed == freePrice ? _self.freePrice : freePrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPrice: freezed == approvedPrice ? _self.approvedPrice : approvedPrice // ignore: cast_nullable_to_non_nullable +as int?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,parentProduct: freezed == parentProduct ? _self.parentProduct : parentProduct // ignore: cast_nullable_to_non_nullable +as int?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/roles_products/roles_products.g.dart b/packages/chicken/lib/data/models/response/roles_products/roles_products.g.dart new file mode 100644 index 0000000..a81b24d --- /dev/null +++ b/packages/chicken/lib/data/models/response/roles_products/roles_products.g.dart @@ -0,0 +1,141 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'roles_products.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_RolesProductsModel _$RolesProductsModelFromJson(Map json) => + _RolesProductsModel( + products: (json['products'] as List) + .map((e) => ProductModel.fromJson(e as Map)) + .toList(), + ); + +Map _$RolesProductsModelToJson(_RolesProductsModel instance) => + {'products': instance.products}; + +_ProductModel _$ProductModelFromJson( + Map json, +) => _ProductModel( + id: (json['id'] as num?)?.toInt(), + key: json['key'] as String?, + create_date: json['create_date'] as String?, + modify_date: json['modify_date'] as String?, + trash: json['trash'] as bool?, + name: json['name'] as String?, + provinceGovernmentalCarcassesQuantity: + (json['province_governmental_carcasses_quantity'] as num?)?.toInt(), + provinceGovernmentalCarcassesWeight: + (json['province_governmental_carcasses_weight'] as num?)?.toInt(), + provinceFreeCarcassesQuantity: + (json['province_free_carcasses_quantity'] as num?)?.toInt(), + provinceFreeCarcassesWeight: (json['province_free_carcasses_weight'] as num?) + ?.toInt(), + receiveGovernmentalCarcassesQuantity: + (json['receive_governmental_carcasses_quantity'] as num?)?.toInt(), + receiveGovernmentalCarcassesWeight: + (json['receive_governmental_carcasses_weight'] as num?)?.toInt(), + receiveFreeCarcassesQuantity: + (json['receive_free_carcasses_quantity'] as num?)?.toInt(), + receiveFreeCarcassesWeight: (json['receive_free_carcasses_weight'] as num?) + ?.toInt(), + freeBuyingCarcassesQuantity: (json['free_buying_carcasses_quantity'] as num?) + ?.toInt(), + freeBuyingCarcassesWeight: (json['free_buying_carcasses_weight'] as num?) + ?.toInt(), + totalGovernmentalCarcassesQuantity: + (json['total_governmental_carcasses_quantity'] as num?)?.toInt(), + totalGovernmentalCarcassesWeight: + (json['total_governmental_carcasses_weight'] as num?)?.toInt(), + totalFreeBarsCarcassesQuantity: + (json['total_free_bars_carcasses_quantity'] as num?)?.toInt(), + totalFreeBarsCarcassesWeight: + (json['total_free_bars_carcasses_weight'] as num?)?.toInt(), + weightAverage: (json['weight_average'] as num?)?.toDouble(), + totalCarcassesQuantity: (json['total_carcasses_quantity'] as num?)?.toInt(), + totalCarcassesWeight: (json['total_carcasses_weight'] as num?)?.toInt(), + freezingQuantity: (json['freezing_quantity'] as num?)?.toInt(), + freezingWeight: (json['freezing_weight'] as num?)?.toInt(), + lossWeight: (json['loss_weight'] as num?)?.toInt(), + outProvinceAllocatedQuantity: + (json['out_province_allocated_quantity'] as num?)?.toInt(), + outProvinceAllocatedWeight: (json['out_province_allocated_weight'] as num?) + ?.toInt(), + provinceAllocatedQuantity: (json['province_allocated_quantity'] as num?) + ?.toInt(), + provinceAllocatedWeight: (json['province_allocated_weight'] as num?)?.toInt(), + realAllocatedQuantity: (json['real_allocated_quantity'] as num?)?.toInt(), + realAllocatedWeight: (json['real_allocated_weight'] as num?)?.toInt(), + coldHouseAllocatedWeight: (json['cold_house_allocated_weight'] as num?) + ?.toInt(), + posAllocatedWeight: (json['pos_allocated_weight'] as num?)?.toInt(), + segmentationWeight: (json['segmentation_weight'] as num?)?.toInt(), + totalRemainQuantity: (json['total_remain_quantity'] as num?)?.toInt(), + totalRemainWeight: (json['total_remain_weight'] as num?)?.toInt(), + freePrice: (json['free_price'] as num?)?.toInt(), + approvedPrice: (json['approved_price'] as num?)?.toInt(), + approvedPriceStatus: json['approved_price_status'] as bool?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + parentProduct: (json['parent_product'] as num?)?.toInt(), + killHouse: json['kill_house'], + guild: (json['guild'] as num?)?.toInt(), +); + +Map _$ProductModelToJson( + _ProductModel instance, +) => { + 'id': instance.id, + 'key': instance.key, + 'create_date': instance.create_date, + 'modify_date': instance.modify_date, + 'trash': instance.trash, + 'name': instance.name, + 'province_governmental_carcasses_quantity': + instance.provinceGovernmentalCarcassesQuantity, + 'province_governmental_carcasses_weight': + instance.provinceGovernmentalCarcassesWeight, + 'province_free_carcasses_quantity': instance.provinceFreeCarcassesQuantity, + 'province_free_carcasses_weight': instance.provinceFreeCarcassesWeight, + 'receive_governmental_carcasses_quantity': + instance.receiveGovernmentalCarcassesQuantity, + 'receive_governmental_carcasses_weight': + instance.receiveGovernmentalCarcassesWeight, + 'receive_free_carcasses_quantity': instance.receiveFreeCarcassesQuantity, + 'receive_free_carcasses_weight': instance.receiveFreeCarcassesWeight, + 'free_buying_carcasses_quantity': instance.freeBuyingCarcassesQuantity, + 'free_buying_carcasses_weight': instance.freeBuyingCarcassesWeight, + 'total_governmental_carcasses_quantity': + instance.totalGovernmentalCarcassesQuantity, + 'total_governmental_carcasses_weight': + instance.totalGovernmentalCarcassesWeight, + 'total_free_bars_carcasses_quantity': instance.totalFreeBarsCarcassesQuantity, + 'total_free_bars_carcasses_weight': instance.totalFreeBarsCarcassesWeight, + 'weight_average': instance.weightAverage, + 'total_carcasses_quantity': instance.totalCarcassesQuantity, + 'total_carcasses_weight': instance.totalCarcassesWeight, + 'freezing_quantity': instance.freezingQuantity, + 'freezing_weight': instance.freezingWeight, + 'loss_weight': instance.lossWeight, + 'out_province_allocated_quantity': instance.outProvinceAllocatedQuantity, + 'out_province_allocated_weight': instance.outProvinceAllocatedWeight, + 'province_allocated_quantity': instance.provinceAllocatedQuantity, + 'province_allocated_weight': instance.provinceAllocatedWeight, + 'real_allocated_quantity': instance.realAllocatedQuantity, + 'real_allocated_weight': instance.realAllocatedWeight, + 'cold_house_allocated_weight': instance.coldHouseAllocatedWeight, + 'pos_allocated_weight': instance.posAllocatedWeight, + 'segmentation_weight': instance.segmentationWeight, + 'total_remain_quantity': instance.totalRemainQuantity, + 'total_remain_weight': instance.totalRemainWeight, + 'free_price': instance.freePrice, + 'approved_price': instance.approvedPrice, + 'approved_price_status': instance.approvedPriceStatus, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'parent_product': instance.parentProduct, + 'kill_house': instance.killHouse, + 'guild': instance.guild, +}; diff --git a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart new file mode 100644 index 0000000..e93b258 --- /dev/null +++ b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart @@ -0,0 +1,266 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'waiting_arrival.freezed.dart'; +part 'waiting_arrival.g.dart'; + +@freezed +abstract class WaitingArrivalModel with _$WaitingArrivalModel { + factory WaitingArrivalModel({ + required int count, + String? next, + String? previous, + required List results, + }) = _WaitingArrivalModel; + + factory WaitingArrivalModel.fromJson(Map json) => _$WaitingArrivalModelFromJson(json); +} + +@freezed +abstract class ResultModel with _$ResultModel { + factory ResultModel({ + int? id, + ProductModel? product, + KillHouseModel? killHouse, + dynamic toKillHouse, + dynamic steward, + @JsonKey(name: 'to_steward') ToStewardModel? toSteward, + dynamic guilds, + dynamic toGuilds, + dynamic toColdHouse, + int? indexWeight, + int? dateTimestamp, + int? newState, + int? newReceiverState, + int? newAllocationState, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + int? numberOfCarcasses, + int? realNumberOfCarcasses, + int? receiverRealNumberOfCarcasses, + double? weightOfCarcasses, + double? realWeightOfCarcasses, + double? receiverRealWeightOfCarcasses, + double? weightLossOfCarcasses, + bool? finalRegistration, + String? sellType, + String? productName, + String? sellerType, + String? type, + String? saleType, + String? allocationType, + bool? systemRegistrationCode, + int? registrationCode, + int? amount, + int? totalAmount, + int? totalAmountPaid, + int? totalAmountRemain, + dynamic loggedRegistrationCode, + String? state, + String? receiverState, + String? allocationState, + String? date, + dynamic role, + dynamic stewardTempKey, + bool? approvedPriceStatus, + bool? calculateStatus, + bool? temporaryTrash, + bool? temporaryDeleted, + dynamic createdBy, + dynamic modifiedBy, + dynamic wareHouse, + dynamic stewardWareHouse, + dynamic car, + dynamic dispenser, + }) = _ResultModel; + + factory ResultModel.fromJson(Map json) => _$ResultModelFromJson(json); +} + +@freezed +abstract class ProductModel with _$ProductModel { + factory ProductModel({ + double? weightAverage, + }) = _ProductModel; + + factory ProductModel.fromJson(Map json) => _$ProductModelFromJson(json); +} + +@freezed +abstract class ToStewardModel with _$ToStewardModel { + factory ToStewardModel({ + int? id, + ToStewardUserModel? user, + AddressModel? address, + GuildAreaActivityModel? guildAreaActivity, + GuildTypeActivityModel? guildTypeActivity, + List? killHouse, + List? stewardKillHouse, + List? stewards, + GetPosStatusModel? getPosStatus, + String? key, + @JsonKey(name: 'create_date') String? createDate, + @JsonKey(name: 'modify_date') String? modifyDate, + bool? trash, + bool? active, + String? guildsId, + String? licenseNumber, + String? guildsName, + String? typeActivity, + String? areaActivity, + bool? steward, + bool? hasPos, + String? provinceAcceptState, + }) = _ToStewardModel; + + factory ToStewardModel.fromJson(Map json) => _$ToStewardModelFromJson(json); +} + +@freezed +abstract class ToStewardUserModel with _$ToStewardUserModel { + factory ToStewardUserModel({ + String? fullname, + @JsonKey(name: 'first_name') String? firstName, + @JsonKey(name: 'last_name') String? lastName, + String? mobile, + @JsonKey(name: 'national_id') String? nationalId, + String? city, + }) = _ToStewardUserModel; + + factory ToStewardUserModel.fromJson(Map json) => _$ToStewardUserModelFromJson(json); +} + +@freezed +abstract class ToStewardCityModel with _$ToStewardCityModel { + factory ToStewardCityModel({ + String? key, + @JsonKey(name: 'name') String? title, + }) = _ToStewardCityModel; + + factory ToStewardCityModel.fromJson(Map json) => _$ToStewardCityModelFromJson(json); +} + +@freezed +abstract class ToStewardProvinceModel with _$ToStewardProvinceModel { + factory ToStewardProvinceModel({ + String? key, + @JsonKey(name: 'name') String? title, + }) = _ToStewardProvinceModel; + + factory ToStewardProvinceModel.fromJson(Map json) => _$ToStewardProvinceModelFromJson(json); +} + +@freezed +abstract class AddressModel with _$AddressModel { + factory AddressModel({ + ToStewardProvinceModel? province, + ToStewardCityModel? city, + String? address, + String? postalCode, + }) = _AddressModel; + + factory AddressModel.fromJson(Map json) => _$AddressModelFromJson(json); +} + +@freezed +abstract class GuildAreaActivityModel with _$GuildAreaActivityModel { + factory GuildAreaActivityModel({ + String? key, + String? title, + }) = _GuildAreaActivityModel; + + factory GuildAreaActivityModel.fromJson(Map json) => _$GuildAreaActivityModelFromJson(json); +} + +@freezed +abstract class GuildTypeActivityModel with _$GuildTypeActivityModel { + factory GuildTypeActivityModel({ + String? key, + String? title, + }) = _GuildTypeActivityModel; + + factory GuildTypeActivityModel.fromJson(Map json) => _$GuildTypeActivityModelFromJson(json); +} + +@freezed +abstract class GetPosStatusModel with _$GetPosStatusModel { + factory GetPosStatusModel({ + int? lenActiveSessions, + bool? hasPons, + bool? hasActivePons, + }) = _GetPosStatusModel; + + factory GetPosStatusModel.fromJson(Map json) => _$GetPosStatusModelFromJson(json); +} + +@freezed +abstract class KillHouseModel with _$KillHouseModel { + factory KillHouseModel({ + String? key, + @JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? operator, + String? name, + bool? killer, + }) = _KillHouseModel; + + factory KillHouseModel.fromJson(Map json) => _$KillHouseModelFromJson(json); +} + +@freezed +abstract class KillHouseOperatorModel with _$KillHouseOperatorModel { + factory KillHouseOperatorModel({ + UserModel? user, + }) = _KillHouseOperatorModel; + + factory KillHouseOperatorModel.fromJson(Map json) => _$KillHouseOperatorModelFromJson(json); +} + +@freezed +abstract class UserModel with _$UserModel { + factory UserModel({ + String? fullname, + String? firstName, + String? lastName, + int? baseOrder, + String? mobile, + String? nationalId, + String? nationalCode, + String? key, + CityModel? city, + String? unitName, + String? unitNationalId, + String? unitRegistrationNumber, + String? unitEconomicalNumber, + String? unitProvince, + String? unitCity, + String? unitPostalCode, + String? unitAddress, + }) = _UserModel; + + factory UserModel.fromJson(Map json) => _$UserModelFromJson(json); +} + +@freezed +abstract class CityModel with _$CityModel { + factory CityModel({ + int? id, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + int? provinceIdForeignKey, + int? cityIdKey, + String? name, + double? productPrice, + bool? provinceCenter, + int? cityNumber, + String? cityName, + int? provinceNumber, + String? provinceName, + dynamic createdBy, + dynamic modifiedBy, + int? province, + }) = _CityModel; + + factory CityModel.fromJson(Map json) => _$CityModelFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart new file mode 100644 index 0000000..c13a17d --- /dev/null +++ b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart @@ -0,0 +1,2733 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'waiting_arrival.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$WaitingArrivalModel { + + int get count; String? get next; String? get previous; List get results; +/// Create a copy of WaitingArrivalModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$WaitingArrivalModelCopyWith get copyWith => _$WaitingArrivalModelCopyWithImpl(this as WaitingArrivalModel, _$identity); + + /// Serializes this WaitingArrivalModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is WaitingArrivalModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); + +@override +String toString() { + return 'WaitingArrivalModel(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class $WaitingArrivalModelCopyWith<$Res> { + factory $WaitingArrivalModelCopyWith(WaitingArrivalModel value, $Res Function(WaitingArrivalModel) _then) = _$WaitingArrivalModelCopyWithImpl; +@useResult +$Res call({ + int count, String? next, String? previous, List results +}); + + + + +} +/// @nodoc +class _$WaitingArrivalModelCopyWithImpl<$Res> + implements $WaitingArrivalModelCopyWith<$Res> { + _$WaitingArrivalModelCopyWithImpl(this._self, this._then); + + final WaitingArrivalModel _self; + final $Res Function(WaitingArrivalModel) _then; + +/// Create a copy of WaitingArrivalModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? count = null,Object? next = freezed,Object? previous = freezed,Object? results = null,}) { + return _then(_self.copyWith( +count: null == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: null == results ? _self.results : results // ignore: cast_nullable_to_non_nullable +as List, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _WaitingArrivalModel implements WaitingArrivalModel { + _WaitingArrivalModel({required this.count, this.next, this.previous, required final List results}): _results = results; + factory _WaitingArrivalModel.fromJson(Map json) => _$WaitingArrivalModelFromJson(json); + +@override final int count; +@override final String? next; +@override final String? previous; + final List _results; +@override List get results { + if (_results is EqualUnmodifiableListView) return _results; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_results); +} + + +/// Create a copy of WaitingArrivalModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$WaitingArrivalModelCopyWith<_WaitingArrivalModel> get copyWith => __$WaitingArrivalModelCopyWithImpl<_WaitingArrivalModel>(this, _$identity); + +@override +Map toJson() { + return _$WaitingArrivalModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _WaitingArrivalModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); + +@override +String toString() { + return 'WaitingArrivalModel(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class _$WaitingArrivalModelCopyWith<$Res> implements $WaitingArrivalModelCopyWith<$Res> { + factory _$WaitingArrivalModelCopyWith(_WaitingArrivalModel value, $Res Function(_WaitingArrivalModel) _then) = __$WaitingArrivalModelCopyWithImpl; +@override @useResult +$Res call({ + int count, String? next, String? previous, List results +}); + + + + +} +/// @nodoc +class __$WaitingArrivalModelCopyWithImpl<$Res> + implements _$WaitingArrivalModelCopyWith<$Res> { + __$WaitingArrivalModelCopyWithImpl(this._self, this._then); + + final _WaitingArrivalModel _self; + final $Res Function(_WaitingArrivalModel) _then; + +/// Create a copy of WaitingArrivalModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? count = null,Object? next = freezed,Object? previous = freezed,Object? results = null,}) { + return _then(_WaitingArrivalModel( +count: null == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: null == results ? _self._results : results // ignore: cast_nullable_to_non_nullable +as List, + )); +} + + +} + + +/// @nodoc +mixin _$ResultModel { + + int? get id; ProductModel? get product; KillHouseModel? get killHouse; dynamic get toKillHouse; dynamic get steward;@JsonKey(name: 'to_steward') ToStewardModel? get toSteward; dynamic get guilds; dynamic get toGuilds; dynamic get toColdHouse; int? get indexWeight; int? get dateTimestamp; int? get newState; int? get newReceiverState; int? get newAllocationState; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get numberOfCarcasses; int? get realNumberOfCarcasses; int? get receiverRealNumberOfCarcasses; double? get weightOfCarcasses; double? get realWeightOfCarcasses; double? get receiverRealWeightOfCarcasses; double? get weightLossOfCarcasses; bool? get finalRegistration; String? get sellType; String? get productName; String? get sellerType; String? get type; String? get saleType; String? get allocationType; bool? get systemRegistrationCode; int? get registrationCode; int? get amount; int? get totalAmount; int? get totalAmountPaid; int? get totalAmountRemain; dynamic get loggedRegistrationCode; String? get state; String? get receiverState; String? get allocationState; String? get date; dynamic get role; dynamic get stewardTempKey; bool? get approvedPriceStatus; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get createdBy; dynamic get modifiedBy; dynamic get wareHouse; dynamic get stewardWareHouse; dynamic get car; dynamic get dispenser; +/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ResultModelCopyWith get copyWith => _$ResultModelCopyWithImpl(this as ResultModel, _$identity); + + /// Serializes this ResultModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ResultModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); + +@override +String toString() { + return 'ResultModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; +} + + +} + +/// @nodoc +abstract mixin class $ResultModelCopyWith<$Res> { + factory $ResultModelCopyWith(ResultModel value, $Res Function(ResultModel) _then) = _$ResultModelCopyWithImpl; +@useResult +$Res call({ + int? id, ProductModel? product, KillHouseModel? killHouse, dynamic toKillHouse, dynamic steward,@JsonKey(name: 'to_steward') ToStewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser +}); + + +$ProductModelCopyWith<$Res>? get product;$KillHouseModelCopyWith<$Res>? get killHouse;$ToStewardModelCopyWith<$Res>? get toSteward; + +} +/// @nodoc +class _$ResultModelCopyWithImpl<$Res> + implements $ResultModelCopyWith<$Res> { + _$ResultModelCopyWithImpl(this._self, this._then); + + final ResultModel _self; + final $Res Function(ResultModel) _then; + +/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as ProductModel?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as KillHouseModel?,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as dynamic,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable +as ToStewardModel?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable +as dynamic,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable +as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable +as int?,dateTimestamp: freezed == dateTimestamp ? _self.dateTimestamp : dateTimestamp // ignore: cast_nullable_to_non_nullable +as int?,newState: freezed == newState ? _self.newState : newState // ignore: cast_nullable_to_non_nullable +as int?,newReceiverState: freezed == newReceiverState ? _self.newReceiverState : newReceiverState // ignore: cast_nullable_to_non_nullable +as int?,newAllocationState: freezed == newAllocationState ? _self.newAllocationState : newAllocationState // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realNumberOfCarcasses: freezed == realNumberOfCarcasses ? _self.realNumberOfCarcasses : realNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,realWeightOfCarcasses: freezed == realWeightOfCarcasses ? _self.realWeightOfCarcasses : realWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,finalRegistration: freezed == finalRegistration ? _self.finalRegistration : finalRegistration // ignore: cast_nullable_to_non_nullable +as bool?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,productName: freezed == productName ? _self.productName : productName // ignore: cast_nullable_to_non_nullable +as String?,sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,saleType: freezed == saleType ? _self.saleType : saleType // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,systemRegistrationCode: freezed == systemRegistrationCode ? _self.systemRegistrationCode : systemRegistrationCode // ignore: cast_nullable_to_non_nullable +as bool?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,totalAmountPaid: freezed == totalAmountPaid ? _self.totalAmountPaid : totalAmountPaid // ignore: cast_nullable_to_non_nullable +as int?,totalAmountRemain: freezed == totalAmountRemain ? _self.totalAmountRemain : totalAmountRemain // ignore: cast_nullable_to_non_nullable +as int?,loggedRegistrationCode: freezed == loggedRegistrationCode ? _self.loggedRegistrationCode : loggedRegistrationCode // ignore: cast_nullable_to_non_nullable +as dynamic,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,receiverState: freezed == receiverState ? _self.receiverState : receiverState // ignore: cast_nullable_to_non_nullable +as String?,allocationState: freezed == allocationState ? _self.allocationState : allocationState // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as dynamic,stewardTempKey: freezed == stewardTempKey ? _self.stewardTempKey : stewardTempKey // ignore: cast_nullable_to_non_nullable +as dynamic,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,stewardWareHouse: freezed == stewardWareHouse ? _self.stewardWareHouse : stewardWareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} +/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductModelCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductModelCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +}/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseModelCopyWith<$Res>? get killHouse { + if (_self.killHouse == null) { + return null; + } + + return $KillHouseModelCopyWith<$Res>(_self.killHouse!, (value) { + return _then(_self.copyWith(killHouse: value)); + }); +}/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardModelCopyWith<$Res>? get toSteward { + if (_self.toSteward == null) { + return null; + } + + return $ToStewardModelCopyWith<$Res>(_self.toSteward!, (value) { + return _then(_self.copyWith(toSteward: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _ResultModel implements ResultModel { + _ResultModel({this.id, this.product, this.killHouse, this.toKillHouse, this.steward, @JsonKey(name: 'to_steward') this.toSteward, this.guilds, this.toGuilds, this.toColdHouse, this.indexWeight, this.dateTimestamp, this.newState, this.newReceiverState, this.newAllocationState, this.key, this.createDate, this.modifyDate, this.trash, this.numberOfCarcasses, this.realNumberOfCarcasses, this.receiverRealNumberOfCarcasses, this.weightOfCarcasses, this.realWeightOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses, this.finalRegistration, this.sellType, this.productName, this.sellerType, this.type, this.saleType, this.allocationType, this.systemRegistrationCode, this.registrationCode, this.amount, this.totalAmount, this.totalAmountPaid, this.totalAmountRemain, this.loggedRegistrationCode, this.state, this.receiverState, this.allocationState, this.date, this.role, this.stewardTempKey, this.approvedPriceStatus, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy, this.wareHouse, this.stewardWareHouse, this.car, this.dispenser}); + factory _ResultModel.fromJson(Map json) => _$ResultModelFromJson(json); + +@override final int? id; +@override final ProductModel? product; +@override final KillHouseModel? killHouse; +@override final dynamic toKillHouse; +@override final dynamic steward; +@override@JsonKey(name: 'to_steward') final ToStewardModel? toSteward; +@override final dynamic guilds; +@override final dynamic toGuilds; +@override final dynamic toColdHouse; +@override final int? indexWeight; +@override final int? dateTimestamp; +@override final int? newState; +@override final int? newReceiverState; +@override final int? newAllocationState; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final int? numberOfCarcasses; +@override final int? realNumberOfCarcasses; +@override final int? receiverRealNumberOfCarcasses; +@override final double? weightOfCarcasses; +@override final double? realWeightOfCarcasses; +@override final double? receiverRealWeightOfCarcasses; +@override final double? weightLossOfCarcasses; +@override final bool? finalRegistration; +@override final String? sellType; +@override final String? productName; +@override final String? sellerType; +@override final String? type; +@override final String? saleType; +@override final String? allocationType; +@override final bool? systemRegistrationCode; +@override final int? registrationCode; +@override final int? amount; +@override final int? totalAmount; +@override final int? totalAmountPaid; +@override final int? totalAmountRemain; +@override final dynamic loggedRegistrationCode; +@override final String? state; +@override final String? receiverState; +@override final String? allocationState; +@override final String? date; +@override final dynamic role; +@override final dynamic stewardTempKey; +@override final bool? approvedPriceStatus; +@override final bool? calculateStatus; +@override final bool? temporaryTrash; +@override final bool? temporaryDeleted; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final dynamic wareHouse; +@override final dynamic stewardWareHouse; +@override final dynamic car; +@override final dynamic dispenser; + +/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ResultModelCopyWith<_ResultModel> get copyWith => __$ResultModelCopyWithImpl<_ResultModel>(this, _$identity); + +@override +Map toJson() { + return _$ResultModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ResultModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); + +@override +String toString() { + return 'ResultModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; +} + + +} + +/// @nodoc +abstract mixin class _$ResultModelCopyWith<$Res> implements $ResultModelCopyWith<$Res> { + factory _$ResultModelCopyWith(_ResultModel value, $Res Function(_ResultModel) _then) = __$ResultModelCopyWithImpl; +@override @useResult +$Res call({ + int? id, ProductModel? product, KillHouseModel? killHouse, dynamic toKillHouse, dynamic steward,@JsonKey(name: 'to_steward') ToStewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser +}); + + +@override $ProductModelCopyWith<$Res>? get product;@override $KillHouseModelCopyWith<$Res>? get killHouse;@override $ToStewardModelCopyWith<$Res>? get toSteward; + +} +/// @nodoc +class __$ResultModelCopyWithImpl<$Res> + implements _$ResultModelCopyWith<$Res> { + __$ResultModelCopyWithImpl(this._self, this._then); + + final _ResultModel _self; + final $Res Function(_ResultModel) _then; + +/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { + return _then(_ResultModel( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as ProductModel?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as KillHouseModel?,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as dynamic,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable +as ToStewardModel?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable +as dynamic,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable +as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable +as int?,dateTimestamp: freezed == dateTimestamp ? _self.dateTimestamp : dateTimestamp // ignore: cast_nullable_to_non_nullable +as int?,newState: freezed == newState ? _self.newState : newState // ignore: cast_nullable_to_non_nullable +as int?,newReceiverState: freezed == newReceiverState ? _self.newReceiverState : newReceiverState // ignore: cast_nullable_to_non_nullable +as int?,newAllocationState: freezed == newAllocationState ? _self.newAllocationState : newAllocationState // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realNumberOfCarcasses: freezed == realNumberOfCarcasses ? _self.realNumberOfCarcasses : realNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,realWeightOfCarcasses: freezed == realWeightOfCarcasses ? _self.realWeightOfCarcasses : realWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,finalRegistration: freezed == finalRegistration ? _self.finalRegistration : finalRegistration // ignore: cast_nullable_to_non_nullable +as bool?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,productName: freezed == productName ? _self.productName : productName // ignore: cast_nullable_to_non_nullable +as String?,sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,saleType: freezed == saleType ? _self.saleType : saleType // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,systemRegistrationCode: freezed == systemRegistrationCode ? _self.systemRegistrationCode : systemRegistrationCode // ignore: cast_nullable_to_non_nullable +as bool?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,totalAmountPaid: freezed == totalAmountPaid ? _self.totalAmountPaid : totalAmountPaid // ignore: cast_nullable_to_non_nullable +as int?,totalAmountRemain: freezed == totalAmountRemain ? _self.totalAmountRemain : totalAmountRemain // ignore: cast_nullable_to_non_nullable +as int?,loggedRegistrationCode: freezed == loggedRegistrationCode ? _self.loggedRegistrationCode : loggedRegistrationCode // ignore: cast_nullable_to_non_nullable +as dynamic,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,receiverState: freezed == receiverState ? _self.receiverState : receiverState // ignore: cast_nullable_to_non_nullable +as String?,allocationState: freezed == allocationState ? _self.allocationState : allocationState // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as dynamic,stewardTempKey: freezed == stewardTempKey ? _self.stewardTempKey : stewardTempKey // ignore: cast_nullable_to_non_nullable +as dynamic,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,stewardWareHouse: freezed == stewardWareHouse ? _self.stewardWareHouse : stewardWareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} + +/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductModelCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductModelCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +}/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseModelCopyWith<$Res>? get killHouse { + if (_self.killHouse == null) { + return null; + } + + return $KillHouseModelCopyWith<$Res>(_self.killHouse!, (value) { + return _then(_self.copyWith(killHouse: value)); + }); +}/// Create a copy of ResultModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardModelCopyWith<$Res>? get toSteward { + if (_self.toSteward == null) { + return null; + } + + return $ToStewardModelCopyWith<$Res>(_self.toSteward!, (value) { + return _then(_self.copyWith(toSteward: value)); + }); +} +} + + +/// @nodoc +mixin _$ProductModel { + + double? get weightAverage; +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProductModelCopyWith get copyWith => _$ProductModelCopyWithImpl(this as ProductModel, _$identity); + + /// Serializes this ProductModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ProductModel&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,weightAverage); + +@override +String toString() { + return 'ProductModel(weightAverage: $weightAverage)'; +} + + +} + +/// @nodoc +abstract mixin class $ProductModelCopyWith<$Res> { + factory $ProductModelCopyWith(ProductModel value, $Res Function(ProductModel) _then) = _$ProductModelCopyWithImpl; +@useResult +$Res call({ + double? weightAverage +}); + + + + +} +/// @nodoc +class _$ProductModelCopyWithImpl<$Res> + implements $ProductModelCopyWith<$Res> { + _$ProductModelCopyWithImpl(this._self, this._then); + + final ProductModel _self; + final $Res Function(ProductModel) _then; + +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? weightAverage = freezed,}) { + return _then(_self.copyWith( +weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ProductModel implements ProductModel { + _ProductModel({this.weightAverage}); + factory _ProductModel.fromJson(Map json) => _$ProductModelFromJson(json); + +@override final double? weightAverage; + +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProductModelCopyWith<_ProductModel> get copyWith => __$ProductModelCopyWithImpl<_ProductModel>(this, _$identity); + +@override +Map toJson() { + return _$ProductModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ProductModel&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,weightAverage); + +@override +String toString() { + return 'ProductModel(weightAverage: $weightAverage)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProductModelCopyWith<$Res> implements $ProductModelCopyWith<$Res> { + factory _$ProductModelCopyWith(_ProductModel value, $Res Function(_ProductModel) _then) = __$ProductModelCopyWithImpl; +@override @useResult +$Res call({ + double? weightAverage +}); + + + + +} +/// @nodoc +class __$ProductModelCopyWithImpl<$Res> + implements _$ProductModelCopyWith<$Res> { + __$ProductModelCopyWithImpl(this._self, this._then); + + final _ProductModel _self; + final $Res Function(_ProductModel) _then; + +/// Create a copy of ProductModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? weightAverage = freezed,}) { + return _then(_ProductModel( +weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + + +/// @nodoc +mixin _$ToStewardModel { + + int? get id; ToStewardUserModel? get user; AddressModel? get address; GuildAreaActivityModel? get guildAreaActivity; GuildTypeActivityModel? get guildTypeActivity; List? get killHouse; List? get stewardKillHouse; List? get stewards; GetPosStatusModel? get getPosStatus; String? get key;@JsonKey(name: 'create_date') String? get createDate;@JsonKey(name: 'modify_date') String? get modifyDate; bool? get trash; bool? get active; String? get guildsId; String? get licenseNumber; String? get guildsName; String? get typeActivity; String? get areaActivity; bool? get steward; bool? get hasPos; String? get provinceAcceptState; +/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ToStewardModelCopyWith get copyWith => _$ToStewardModelCopyWithImpl(this as ToStewardModel, _$identity); + + /// Serializes this ToStewardModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardModel&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.stewardKillHouse, stewardKillHouse)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.active, active) || other.active == active)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(stewardKillHouse),const DeepCollectionEquality().hash(stewards),getPosStatus,key,createDate,modifyDate,trash,active,guildsId,licenseNumber,guildsName,typeActivity,areaActivity,steward,hasPos,provinceAcceptState]); + +@override +String toString() { + return 'ToStewardModel(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, active: $active, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, typeActivity: $typeActivity, areaActivity: $areaActivity, steward: $steward, hasPos: $hasPos, provinceAcceptState: $provinceAcceptState)'; +} + + +} + +/// @nodoc +abstract mixin class $ToStewardModelCopyWith<$Res> { + factory $ToStewardModelCopyWith(ToStewardModel value, $Res Function(ToStewardModel) _then) = _$ToStewardModelCopyWithImpl; +@useResult +$Res call({ + int? id, ToStewardUserModel? user, AddressModel? address, GuildAreaActivityModel? guildAreaActivity, GuildTypeActivityModel? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key,@JsonKey(name: 'create_date') String? createDate,@JsonKey(name: 'modify_date') String? modifyDate, bool? trash, bool? active, String? guildsId, String? licenseNumber, String? guildsName, String? typeActivity, String? areaActivity, bool? steward, bool? hasPos, String? provinceAcceptState +}); + + +$ToStewardUserModelCopyWith<$Res>? get user;$AddressModelCopyWith<$Res>? get address;$GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity;$GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity;$GetPosStatusModelCopyWith<$Res>? get getPosStatus; + +} +/// @nodoc +class _$ToStewardModelCopyWithImpl<$Res> + implements $ToStewardModelCopyWith<$Res> { + _$ToStewardModelCopyWithImpl(this._self, this._then); + + final ToStewardModel _self; + final $Res Function(ToStewardModel) _then; + +/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? active = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? provinceAcceptState = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as ToStewardUserModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as AddressModel?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable +as GuildAreaActivityModel?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as GuildTypeActivityModel?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as List?,stewardKillHouse: freezed == stewardKillHouse ? _self.stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self.stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable +as GetPosStatusModel?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardUserModelCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $ToStewardUserModelCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressModelCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressModelCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity { + if (_self.guildAreaActivity == null) { + return null; + } + + return $GuildAreaActivityModelCopyWith<$Res>(_self.guildAreaActivity!, (value) { + return _then(_self.copyWith(guildAreaActivity: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity { + if (_self.guildTypeActivity == null) { + return null; + } + + return $GuildTypeActivityModelCopyWith<$Res>(_self.guildTypeActivity!, (value) { + return _then(_self.copyWith(guildTypeActivity: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GetPosStatusModelCopyWith<$Res>? get getPosStatus { + if (_self.getPosStatus == null) { + return null; + } + + return $GetPosStatusModelCopyWith<$Res>(_self.getPosStatus!, (value) { + return _then(_self.copyWith(getPosStatus: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _ToStewardModel implements ToStewardModel { + _ToStewardModel({this.id, this.user, this.address, this.guildAreaActivity, this.guildTypeActivity, final List? killHouse, final List? stewardKillHouse, final List? stewards, this.getPosStatus, this.key, @JsonKey(name: 'create_date') this.createDate, @JsonKey(name: 'modify_date') this.modifyDate, this.trash, this.active, this.guildsId, this.licenseNumber, this.guildsName, this.typeActivity, this.areaActivity, this.steward, this.hasPos, this.provinceAcceptState}): _killHouse = killHouse,_stewardKillHouse = stewardKillHouse,_stewards = stewards; + factory _ToStewardModel.fromJson(Map json) => _$ToStewardModelFromJson(json); + +@override final int? id; +@override final ToStewardUserModel? user; +@override final AddressModel? address; +@override final GuildAreaActivityModel? guildAreaActivity; +@override final GuildTypeActivityModel? guildTypeActivity; + final List? _killHouse; +@override List? get killHouse { + final value = _killHouse; + if (value == null) return null; + if (_killHouse is EqualUnmodifiableListView) return _killHouse; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _stewardKillHouse; +@override List? get stewardKillHouse { + final value = _stewardKillHouse; + if (value == null) return null; + if (_stewardKillHouse is EqualUnmodifiableListView) return _stewardKillHouse; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _stewards; +@override List? get stewards { + final value = _stewards; + if (value == null) return null; + if (_stewards is EqualUnmodifiableListView) return _stewards; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + +@override final GetPosStatusModel? getPosStatus; +@override final String? key; +@override@JsonKey(name: 'create_date') final String? createDate; +@override@JsonKey(name: 'modify_date') final String? modifyDate; +@override final bool? trash; +@override final bool? active; +@override final String? guildsId; +@override final String? licenseNumber; +@override final String? guildsName; +@override final String? typeActivity; +@override final String? areaActivity; +@override final bool? steward; +@override final bool? hasPos; +@override final String? provinceAcceptState; + +/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ToStewardModelCopyWith<_ToStewardModel> get copyWith => __$ToStewardModelCopyWithImpl<_ToStewardModel>(this, _$identity); + +@override +Map toJson() { + return _$ToStewardModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardModel&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other._killHouse, _killHouse)&&const DeepCollectionEquality().equals(other._stewardKillHouse, _stewardKillHouse)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.active, active) || other.active == active)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(_killHouse),const DeepCollectionEquality().hash(_stewardKillHouse),const DeepCollectionEquality().hash(_stewards),getPosStatus,key,createDate,modifyDate,trash,active,guildsId,licenseNumber,guildsName,typeActivity,areaActivity,steward,hasPos,provinceAcceptState]); + +@override +String toString() { + return 'ToStewardModel(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, active: $active, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, typeActivity: $typeActivity, areaActivity: $areaActivity, steward: $steward, hasPos: $hasPos, provinceAcceptState: $provinceAcceptState)'; +} + + +} + +/// @nodoc +abstract mixin class _$ToStewardModelCopyWith<$Res> implements $ToStewardModelCopyWith<$Res> { + factory _$ToStewardModelCopyWith(_ToStewardModel value, $Res Function(_ToStewardModel) _then) = __$ToStewardModelCopyWithImpl; +@override @useResult +$Res call({ + int? id, ToStewardUserModel? user, AddressModel? address, GuildAreaActivityModel? guildAreaActivity, GuildTypeActivityModel? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key,@JsonKey(name: 'create_date') String? createDate,@JsonKey(name: 'modify_date') String? modifyDate, bool? trash, bool? active, String? guildsId, String? licenseNumber, String? guildsName, String? typeActivity, String? areaActivity, bool? steward, bool? hasPos, String? provinceAcceptState +}); + + +@override $ToStewardUserModelCopyWith<$Res>? get user;@override $AddressModelCopyWith<$Res>? get address;@override $GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity;@override $GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity;@override $GetPosStatusModelCopyWith<$Res>? get getPosStatus; + +} +/// @nodoc +class __$ToStewardModelCopyWithImpl<$Res> + implements _$ToStewardModelCopyWith<$Res> { + __$ToStewardModelCopyWithImpl(this._self, this._then); + + final _ToStewardModel _self; + final $Res Function(_ToStewardModel) _then; + +/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? active = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? provinceAcceptState = freezed,}) { + return _then(_ToStewardModel( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as ToStewardUserModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as AddressModel?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable +as GuildAreaActivityModel?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as GuildTypeActivityModel?,killHouse: freezed == killHouse ? _self._killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as List?,stewardKillHouse: freezed == stewardKillHouse ? _self._stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable +as List?,stewards: freezed == stewards ? _self._stewards : stewards // ignore: cast_nullable_to_non_nullable +as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable +as GetPosStatusModel?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardUserModelCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $ToStewardUserModelCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressModelCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressModelCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity { + if (_self.guildAreaActivity == null) { + return null; + } + + return $GuildAreaActivityModelCopyWith<$Res>(_self.guildAreaActivity!, (value) { + return _then(_self.copyWith(guildAreaActivity: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity { + if (_self.guildTypeActivity == null) { + return null; + } + + return $GuildTypeActivityModelCopyWith<$Res>(_self.guildTypeActivity!, (value) { + return _then(_self.copyWith(guildTypeActivity: value)); + }); +}/// Create a copy of ToStewardModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$GetPosStatusModelCopyWith<$Res>? get getPosStatus { + if (_self.getPosStatus == null) { + return null; + } + + return $GetPosStatusModelCopyWith<$Res>(_self.getPosStatus!, (value) { + return _then(_self.copyWith(getPosStatus: value)); + }); +} +} + + +/// @nodoc +mixin _$ToStewardUserModel { + + String? get fullname;@JsonKey(name: 'first_name') String? get firstName;@JsonKey(name: 'last_name') String? get lastName; String? get mobile;@JsonKey(name: 'national_id') String? get nationalId; String? get city; +/// Create a copy of ToStewardUserModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ToStewardUserModelCopyWith get copyWith => _$ToStewardUserModelCopyWithImpl(this as ToStewardUserModel, _$identity); + + /// Serializes this ToStewardUserModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardUserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); + +@override +String toString() { + return 'ToStewardUserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class $ToStewardUserModelCopyWith<$Res> { + factory $ToStewardUserModelCopyWith(ToStewardUserModel value, $Res Function(ToStewardUserModel) _then) = _$ToStewardUserModelCopyWithImpl; +@useResult +$Res call({ + String? fullname,@JsonKey(name: 'first_name') String? firstName,@JsonKey(name: 'last_name') String? lastName, String? mobile,@JsonKey(name: 'national_id') String? nationalId, String? city +}); + + + + +} +/// @nodoc +class _$ToStewardUserModelCopyWithImpl<$Res> + implements $ToStewardUserModelCopyWith<$Res> { + _$ToStewardUserModelCopyWithImpl(this._self, this._then); + + final ToStewardUserModel _self; + final $Res Function(ToStewardUserModel) _then; + +/// Create a copy of ToStewardUserModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ToStewardUserModel implements ToStewardUserModel { + _ToStewardUserModel({this.fullname, @JsonKey(name: 'first_name') this.firstName, @JsonKey(name: 'last_name') this.lastName, this.mobile, @JsonKey(name: 'national_id') this.nationalId, this.city}); + factory _ToStewardUserModel.fromJson(Map json) => _$ToStewardUserModelFromJson(json); + +@override final String? fullname; +@override@JsonKey(name: 'first_name') final String? firstName; +@override@JsonKey(name: 'last_name') final String? lastName; +@override final String? mobile; +@override@JsonKey(name: 'national_id') final String? nationalId; +@override final String? city; + +/// Create a copy of ToStewardUserModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ToStewardUserModelCopyWith<_ToStewardUserModel> get copyWith => __$ToStewardUserModelCopyWithImpl<_ToStewardUserModel>(this, _$identity); + +@override +Map toJson() { + return _$ToStewardUserModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardUserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); + +@override +String toString() { + return 'ToStewardUserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class _$ToStewardUserModelCopyWith<$Res> implements $ToStewardUserModelCopyWith<$Res> { + factory _$ToStewardUserModelCopyWith(_ToStewardUserModel value, $Res Function(_ToStewardUserModel) _then) = __$ToStewardUserModelCopyWithImpl; +@override @useResult +$Res call({ + String? fullname,@JsonKey(name: 'first_name') String? firstName,@JsonKey(name: 'last_name') String? lastName, String? mobile,@JsonKey(name: 'national_id') String? nationalId, String? city +}); + + + + +} +/// @nodoc +class __$ToStewardUserModelCopyWithImpl<$Res> + implements _$ToStewardUserModelCopyWith<$Res> { + __$ToStewardUserModelCopyWithImpl(this._self, this._then); + + final _ToStewardUserModel _self; + final $Res Function(_ToStewardUserModel) _then; + +/// Create a copy of ToStewardUserModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { + return _then(_ToStewardUserModel( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$ToStewardCityModel { + + String? get key;@JsonKey(name: 'name') String? get title; +/// Create a copy of ToStewardCityModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ToStewardCityModelCopyWith get copyWith => _$ToStewardCityModelCopyWithImpl(this as ToStewardCityModel, _$identity); + + /// Serializes this ToStewardCityModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardCityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'ToStewardCityModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $ToStewardCityModelCopyWith<$Res> { + factory $ToStewardCityModelCopyWith(ToStewardCityModel value, $Res Function(ToStewardCityModel) _then) = _$ToStewardCityModelCopyWithImpl; +@useResult +$Res call({ + String? key,@JsonKey(name: 'name') String? title +}); + + + + +} +/// @nodoc +class _$ToStewardCityModelCopyWithImpl<$Res> + implements $ToStewardCityModelCopyWith<$Res> { + _$ToStewardCityModelCopyWithImpl(this._self, this._then); + + final ToStewardCityModel _self; + final $Res Function(ToStewardCityModel) _then; + +/// Create a copy of ToStewardCityModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ToStewardCityModel implements ToStewardCityModel { + _ToStewardCityModel({this.key, @JsonKey(name: 'name') this.title}); + factory _ToStewardCityModel.fromJson(Map json) => _$ToStewardCityModelFromJson(json); + +@override final String? key; +@override@JsonKey(name: 'name') final String? title; + +/// Create a copy of ToStewardCityModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ToStewardCityModelCopyWith<_ToStewardCityModel> get copyWith => __$ToStewardCityModelCopyWithImpl<_ToStewardCityModel>(this, _$identity); + +@override +Map toJson() { + return _$ToStewardCityModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardCityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'ToStewardCityModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$ToStewardCityModelCopyWith<$Res> implements $ToStewardCityModelCopyWith<$Res> { + factory _$ToStewardCityModelCopyWith(_ToStewardCityModel value, $Res Function(_ToStewardCityModel) _then) = __$ToStewardCityModelCopyWithImpl; +@override @useResult +$Res call({ + String? key,@JsonKey(name: 'name') String? title +}); + + + + +} +/// @nodoc +class __$ToStewardCityModelCopyWithImpl<$Res> + implements _$ToStewardCityModelCopyWith<$Res> { + __$ToStewardCityModelCopyWithImpl(this._self, this._then); + + final _ToStewardCityModel _self; + final $Res Function(_ToStewardCityModel) _then; + +/// Create a copy of ToStewardCityModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_ToStewardCityModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$ToStewardProvinceModel { + + String? get key;@JsonKey(name: 'name') String? get title; +/// Create a copy of ToStewardProvinceModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ToStewardProvinceModelCopyWith get copyWith => _$ToStewardProvinceModelCopyWithImpl(this as ToStewardProvinceModel, _$identity); + + /// Serializes this ToStewardProvinceModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardProvinceModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'ToStewardProvinceModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $ToStewardProvinceModelCopyWith<$Res> { + factory $ToStewardProvinceModelCopyWith(ToStewardProvinceModel value, $Res Function(ToStewardProvinceModel) _then) = _$ToStewardProvinceModelCopyWithImpl; +@useResult +$Res call({ + String? key,@JsonKey(name: 'name') String? title +}); + + + + +} +/// @nodoc +class _$ToStewardProvinceModelCopyWithImpl<$Res> + implements $ToStewardProvinceModelCopyWith<$Res> { + _$ToStewardProvinceModelCopyWithImpl(this._self, this._then); + + final ToStewardProvinceModel _self; + final $Res Function(ToStewardProvinceModel) _then; + +/// Create a copy of ToStewardProvinceModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ToStewardProvinceModel implements ToStewardProvinceModel { + _ToStewardProvinceModel({this.key, @JsonKey(name: 'name') this.title}); + factory _ToStewardProvinceModel.fromJson(Map json) => _$ToStewardProvinceModelFromJson(json); + +@override final String? key; +@override@JsonKey(name: 'name') final String? title; + +/// Create a copy of ToStewardProvinceModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ToStewardProvinceModelCopyWith<_ToStewardProvinceModel> get copyWith => __$ToStewardProvinceModelCopyWithImpl<_ToStewardProvinceModel>(this, _$identity); + +@override +Map toJson() { + return _$ToStewardProvinceModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardProvinceModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'ToStewardProvinceModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$ToStewardProvinceModelCopyWith<$Res> implements $ToStewardProvinceModelCopyWith<$Res> { + factory _$ToStewardProvinceModelCopyWith(_ToStewardProvinceModel value, $Res Function(_ToStewardProvinceModel) _then) = __$ToStewardProvinceModelCopyWithImpl; +@override @useResult +$Res call({ + String? key,@JsonKey(name: 'name') String? title +}); + + + + +} +/// @nodoc +class __$ToStewardProvinceModelCopyWithImpl<$Res> + implements _$ToStewardProvinceModelCopyWith<$Res> { + __$ToStewardProvinceModelCopyWithImpl(this._self, this._then); + + final _ToStewardProvinceModel _self; + final $Res Function(_ToStewardProvinceModel) _then; + +/// Create a copy of ToStewardProvinceModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_ToStewardProvinceModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$AddressModel { + + ToStewardProvinceModel? get province; ToStewardCityModel? get city; String? get address; String? get postalCode; +/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AddressModelCopyWith get copyWith => _$AddressModelCopyWithImpl(this as AddressModel, _$identity); + + /// Serializes this AddressModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AddressModel&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); + +@override +String toString() { + return 'AddressModel(province: $province, city: $city, address: $address, postalCode: $postalCode)'; +} + + +} + +/// @nodoc +abstract mixin class $AddressModelCopyWith<$Res> { + factory $AddressModelCopyWith(AddressModel value, $Res Function(AddressModel) _then) = _$AddressModelCopyWithImpl; +@useResult +$Res call({ + ToStewardProvinceModel? province, ToStewardCityModel? city, String? address, String? postalCode +}); + + +$ToStewardProvinceModelCopyWith<$Res>? get province;$ToStewardCityModelCopyWith<$Res>? get city; + +} +/// @nodoc +class _$AddressModelCopyWithImpl<$Res> + implements $AddressModelCopyWith<$Res> { + _$AddressModelCopyWithImpl(this._self, this._then); + + final AddressModel _self; + final $Res Function(AddressModel) _then; + +/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { + return _then(_self.copyWith( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as ToStewardProvinceModel?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as ToStewardCityModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardProvinceModelCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ToStewardProvinceModelCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardCityModelCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $ToStewardCityModelCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _AddressModel implements AddressModel { + _AddressModel({this.province, this.city, this.address, this.postalCode}); + factory _AddressModel.fromJson(Map json) => _$AddressModelFromJson(json); + +@override final ToStewardProvinceModel? province; +@override final ToStewardCityModel? city; +@override final String? address; +@override final String? postalCode; + +/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AddressModelCopyWith<_AddressModel> get copyWith => __$AddressModelCopyWithImpl<_AddressModel>(this, _$identity); + +@override +Map toJson() { + return _$AddressModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AddressModel&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); + +@override +String toString() { + return 'AddressModel(province: $province, city: $city, address: $address, postalCode: $postalCode)'; +} + + +} + +/// @nodoc +abstract mixin class _$AddressModelCopyWith<$Res> implements $AddressModelCopyWith<$Res> { + factory _$AddressModelCopyWith(_AddressModel value, $Res Function(_AddressModel) _then) = __$AddressModelCopyWithImpl; +@override @useResult +$Res call({ + ToStewardProvinceModel? province, ToStewardCityModel? city, String? address, String? postalCode +}); + + +@override $ToStewardProvinceModelCopyWith<$Res>? get province;@override $ToStewardCityModelCopyWith<$Res>? get city; + +} +/// @nodoc +class __$AddressModelCopyWithImpl<$Res> + implements _$AddressModelCopyWith<$Res> { + __$AddressModelCopyWithImpl(this._self, this._then); + + final _AddressModel _self; + final $Res Function(_AddressModel) _then; + +/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { + return _then(_AddressModel( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as ToStewardProvinceModel?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as ToStewardCityModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardProvinceModelCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ToStewardProvinceModelCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of AddressModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToStewardCityModelCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $ToStewardCityModelCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$GuildAreaActivityModel { + + String? get key; String? get title; +/// Create a copy of GuildAreaActivityModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GuildAreaActivityModelCopyWith get copyWith => _$GuildAreaActivityModelCopyWithImpl(this as GuildAreaActivityModel, _$identity); + + /// Serializes this GuildAreaActivityModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildAreaActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildAreaActivityModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $GuildAreaActivityModelCopyWith<$Res> { + factory $GuildAreaActivityModelCopyWith(GuildAreaActivityModel value, $Res Function(GuildAreaActivityModel) _then) = _$GuildAreaActivityModelCopyWithImpl; +@useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class _$GuildAreaActivityModelCopyWithImpl<$Res> + implements $GuildAreaActivityModelCopyWith<$Res> { + _$GuildAreaActivityModelCopyWithImpl(this._self, this._then); + + final GuildAreaActivityModel _self; + final $Res Function(GuildAreaActivityModel) _then; + +/// Create a copy of GuildAreaActivityModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _GuildAreaActivityModel implements GuildAreaActivityModel { + _GuildAreaActivityModel({this.key, this.title}); + factory _GuildAreaActivityModel.fromJson(Map json) => _$GuildAreaActivityModelFromJson(json); + +@override final String? key; +@override final String? title; + +/// Create a copy of GuildAreaActivityModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GuildAreaActivityModelCopyWith<_GuildAreaActivityModel> get copyWith => __$GuildAreaActivityModelCopyWithImpl<_GuildAreaActivityModel>(this, _$identity); + +@override +Map toJson() { + return _$GuildAreaActivityModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildAreaActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildAreaActivityModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$GuildAreaActivityModelCopyWith<$Res> implements $GuildAreaActivityModelCopyWith<$Res> { + factory _$GuildAreaActivityModelCopyWith(_GuildAreaActivityModel value, $Res Function(_GuildAreaActivityModel) _then) = __$GuildAreaActivityModelCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class __$GuildAreaActivityModelCopyWithImpl<$Res> + implements _$GuildAreaActivityModelCopyWith<$Res> { + __$GuildAreaActivityModelCopyWithImpl(this._self, this._then); + + final _GuildAreaActivityModel _self; + final $Res Function(_GuildAreaActivityModel) _then; + +/// Create a copy of GuildAreaActivityModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_GuildAreaActivityModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$GuildTypeActivityModel { + + String? get key; String? get title; +/// Create a copy of GuildTypeActivityModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GuildTypeActivityModelCopyWith get copyWith => _$GuildTypeActivityModelCopyWithImpl(this as GuildTypeActivityModel, _$identity); + + /// Serializes this GuildTypeActivityModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildTypeActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildTypeActivityModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class $GuildTypeActivityModelCopyWith<$Res> { + factory $GuildTypeActivityModelCopyWith(GuildTypeActivityModel value, $Res Function(GuildTypeActivityModel) _then) = _$GuildTypeActivityModelCopyWithImpl; +@useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class _$GuildTypeActivityModelCopyWithImpl<$Res> + implements $GuildTypeActivityModelCopyWith<$Res> { + _$GuildTypeActivityModelCopyWithImpl(this._self, this._then); + + final GuildTypeActivityModel _self; + final $Res Function(GuildTypeActivityModel) _then; + +/// Create a copy of GuildTypeActivityModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _GuildTypeActivityModel implements GuildTypeActivityModel { + _GuildTypeActivityModel({this.key, this.title}); + factory _GuildTypeActivityModel.fromJson(Map json) => _$GuildTypeActivityModelFromJson(json); + +@override final String? key; +@override final String? title; + +/// Create a copy of GuildTypeActivityModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GuildTypeActivityModelCopyWith<_GuildTypeActivityModel> get copyWith => __$GuildTypeActivityModelCopyWithImpl<_GuildTypeActivityModel>(this, _$identity); + +@override +Map toJson() { + return _$GuildTypeActivityModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildTypeActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,title); + +@override +String toString() { + return 'GuildTypeActivityModel(key: $key, title: $title)'; +} + + +} + +/// @nodoc +abstract mixin class _$GuildTypeActivityModelCopyWith<$Res> implements $GuildTypeActivityModelCopyWith<$Res> { + factory _$GuildTypeActivityModelCopyWith(_GuildTypeActivityModel value, $Res Function(_GuildTypeActivityModel) _then) = __$GuildTypeActivityModelCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? title +}); + + + + +} +/// @nodoc +class __$GuildTypeActivityModelCopyWithImpl<$Res> + implements _$GuildTypeActivityModelCopyWith<$Res> { + __$GuildTypeActivityModelCopyWithImpl(this._self, this._then); + + final _GuildTypeActivityModel _self; + final $Res Function(_GuildTypeActivityModel) _then; + +/// Create a copy of GuildTypeActivityModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { + return _then(_GuildTypeActivityModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$GetPosStatusModel { + + int? get lenActiveSessions; bool? get hasPons; bool? get hasActivePons; +/// Create a copy of GetPosStatusModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$GetPosStatusModelCopyWith get copyWith => _$GetPosStatusModelCopyWithImpl(this as GetPosStatusModel, _$identity); + + /// Serializes this GetPosStatusModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is GetPosStatusModel&&(identical(other.lenActiveSessions, lenActiveSessions) || other.lenActiveSessions == lenActiveSessions)&&(identical(other.hasPons, hasPons) || other.hasPons == hasPons)&&(identical(other.hasActivePons, hasActivePons) || other.hasActivePons == hasActivePons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,lenActiveSessions,hasPons,hasActivePons); + +@override +String toString() { + return 'GetPosStatusModel(lenActiveSessions: $lenActiveSessions, hasPons: $hasPons, hasActivePons: $hasActivePons)'; +} + + +} + +/// @nodoc +abstract mixin class $GetPosStatusModelCopyWith<$Res> { + factory $GetPosStatusModelCopyWith(GetPosStatusModel value, $Res Function(GetPosStatusModel) _then) = _$GetPosStatusModelCopyWithImpl; +@useResult +$Res call({ + int? lenActiveSessions, bool? hasPons, bool? hasActivePons +}); + + + + +} +/// @nodoc +class _$GetPosStatusModelCopyWithImpl<$Res> + implements $GetPosStatusModelCopyWith<$Res> { + _$GetPosStatusModelCopyWithImpl(this._self, this._then); + + final GetPosStatusModel _self; + final $Res Function(GetPosStatusModel) _then; + +/// Create a copy of GetPosStatusModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? lenActiveSessions = freezed,Object? hasPons = freezed,Object? hasActivePons = freezed,}) { + return _then(_self.copyWith( +lenActiveSessions: freezed == lenActiveSessions ? _self.lenActiveSessions : lenActiveSessions // ignore: cast_nullable_to_non_nullable +as int?,hasPons: freezed == hasPons ? _self.hasPons : hasPons // ignore: cast_nullable_to_non_nullable +as bool?,hasActivePons: freezed == hasActivePons ? _self.hasActivePons : hasActivePons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _GetPosStatusModel implements GetPosStatusModel { + _GetPosStatusModel({this.lenActiveSessions, this.hasPons, this.hasActivePons}); + factory _GetPosStatusModel.fromJson(Map json) => _$GetPosStatusModelFromJson(json); + +@override final int? lenActiveSessions; +@override final bool? hasPons; +@override final bool? hasActivePons; + +/// Create a copy of GetPosStatusModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$GetPosStatusModelCopyWith<_GetPosStatusModel> get copyWith => __$GetPosStatusModelCopyWithImpl<_GetPosStatusModel>(this, _$identity); + +@override +Map toJson() { + return _$GetPosStatusModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _GetPosStatusModel&&(identical(other.lenActiveSessions, lenActiveSessions) || other.lenActiveSessions == lenActiveSessions)&&(identical(other.hasPons, hasPons) || other.hasPons == hasPons)&&(identical(other.hasActivePons, hasActivePons) || other.hasActivePons == hasActivePons)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,lenActiveSessions,hasPons,hasActivePons); + +@override +String toString() { + return 'GetPosStatusModel(lenActiveSessions: $lenActiveSessions, hasPons: $hasPons, hasActivePons: $hasActivePons)'; +} + + +} + +/// @nodoc +abstract mixin class _$GetPosStatusModelCopyWith<$Res> implements $GetPosStatusModelCopyWith<$Res> { + factory _$GetPosStatusModelCopyWith(_GetPosStatusModel value, $Res Function(_GetPosStatusModel) _then) = __$GetPosStatusModelCopyWithImpl; +@override @useResult +$Res call({ + int? lenActiveSessions, bool? hasPons, bool? hasActivePons +}); + + + + +} +/// @nodoc +class __$GetPosStatusModelCopyWithImpl<$Res> + implements _$GetPosStatusModelCopyWith<$Res> { + __$GetPosStatusModelCopyWithImpl(this._self, this._then); + + final _GetPosStatusModel _self; + final $Res Function(_GetPosStatusModel) _then; + +/// Create a copy of GetPosStatusModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? lenActiveSessions = freezed,Object? hasPons = freezed,Object? hasActivePons = freezed,}) { + return _then(_GetPosStatusModel( +lenActiveSessions: freezed == lenActiveSessions ? _self.lenActiveSessions : lenActiveSessions // ignore: cast_nullable_to_non_nullable +as int?,hasPons: freezed == hasPons ? _self.hasPons : hasPons // ignore: cast_nullable_to_non_nullable +as bool?,hasActivePons: freezed == hasActivePons ? _self.hasActivePons : hasActivePons // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + + +/// @nodoc +mixin _$KillHouseModel { + + String? get key;@JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? get operator; String? get name; bool? get killer; +/// Create a copy of KillHouseModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$KillHouseModelCopyWith get copyWith => _$KillHouseModelCopyWithImpl(this as KillHouseModel, _$identity); + + /// Serializes this KillHouseModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouseModel&&(identical(other.key, key) || other.key == key)&&(identical(other.operator, operator) || other.operator == operator)&&(identical(other.name, name) || other.name == name)&&(identical(other.killer, killer) || other.killer == killer)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,operator,name,killer); + +@override +String toString() { + return 'KillHouseModel(key: $key, operator: $operator, name: $name, killer: $killer)'; +} + + +} + +/// @nodoc +abstract mixin class $KillHouseModelCopyWith<$Res> { + factory $KillHouseModelCopyWith(KillHouseModel value, $Res Function(KillHouseModel) _then) = _$KillHouseModelCopyWithImpl; +@useResult +$Res call({ + String? key,@JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? operator, String? name, bool? killer +}); + + +$KillHouseOperatorModelCopyWith<$Res>? get operator; + +} +/// @nodoc +class _$KillHouseModelCopyWithImpl<$Res> + implements $KillHouseModelCopyWith<$Res> { + _$KillHouseModelCopyWithImpl(this._self, this._then); + + final KillHouseModel _self; + final $Res Function(KillHouseModel) _then; + +/// Create a copy of KillHouseModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? operator = freezed,Object? name = freezed,Object? killer = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,operator: freezed == operator ? _self.operator : operator // ignore: cast_nullable_to_non_nullable +as KillHouseOperatorModel?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,killer: freezed == killer ? _self.killer : killer // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} +/// Create a copy of KillHouseModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseOperatorModelCopyWith<$Res>? get operator { + if (_self.operator == null) { + return null; + } + + return $KillHouseOperatorModelCopyWith<$Res>(_self.operator!, (value) { + return _then(_self.copyWith(operator: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _KillHouseModel implements KillHouseModel { + _KillHouseModel({this.key, @JsonKey(name: 'kill_house_operator') this.operator, this.name, this.killer}); + factory _KillHouseModel.fromJson(Map json) => _$KillHouseModelFromJson(json); + +@override final String? key; +@override@JsonKey(name: 'kill_house_operator') final KillHouseOperatorModel? operator; +@override final String? name; +@override final bool? killer; + +/// Create a copy of KillHouseModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$KillHouseModelCopyWith<_KillHouseModel> get copyWith => __$KillHouseModelCopyWithImpl<_KillHouseModel>(this, _$identity); + +@override +Map toJson() { + return _$KillHouseModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouseModel&&(identical(other.key, key) || other.key == key)&&(identical(other.operator, operator) || other.operator == operator)&&(identical(other.name, name) || other.name == name)&&(identical(other.killer, killer) || other.killer == killer)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,operator,name,killer); + +@override +String toString() { + return 'KillHouseModel(key: $key, operator: $operator, name: $name, killer: $killer)'; +} + + +} + +/// @nodoc +abstract mixin class _$KillHouseModelCopyWith<$Res> implements $KillHouseModelCopyWith<$Res> { + factory _$KillHouseModelCopyWith(_KillHouseModel value, $Res Function(_KillHouseModel) _then) = __$KillHouseModelCopyWithImpl; +@override @useResult +$Res call({ + String? key,@JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? operator, String? name, bool? killer +}); + + +@override $KillHouseOperatorModelCopyWith<$Res>? get operator; + +} +/// @nodoc +class __$KillHouseModelCopyWithImpl<$Res> + implements _$KillHouseModelCopyWith<$Res> { + __$KillHouseModelCopyWithImpl(this._self, this._then); + + final _KillHouseModel _self; + final $Res Function(_KillHouseModel) _then; + +/// Create a copy of KillHouseModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? operator = freezed,Object? name = freezed,Object? killer = freezed,}) { + return _then(_KillHouseModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,operator: freezed == operator ? _self.operator : operator // ignore: cast_nullable_to_non_nullable +as KillHouseOperatorModel?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,killer: freezed == killer ? _self.killer : killer // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +/// Create a copy of KillHouseModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillHouseOperatorModelCopyWith<$Res>? get operator { + if (_self.operator == null) { + return null; + } + + return $KillHouseOperatorModelCopyWith<$Res>(_self.operator!, (value) { + return _then(_self.copyWith(operator: value)); + }); +} +} + + +/// @nodoc +mixin _$KillHouseOperatorModel { + + UserModel? get user; +/// Create a copy of KillHouseOperatorModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$KillHouseOperatorModelCopyWith get copyWith => _$KillHouseOperatorModelCopyWithImpl(this as KillHouseOperatorModel, _$identity); + + /// Serializes this KillHouseOperatorModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouseOperatorModel&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user); + +@override +String toString() { + return 'KillHouseOperatorModel(user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class $KillHouseOperatorModelCopyWith<$Res> { + factory $KillHouseOperatorModelCopyWith(KillHouseOperatorModel value, $Res Function(KillHouseOperatorModel) _then) = _$KillHouseOperatorModelCopyWithImpl; +@useResult +$Res call({ + UserModel? user +}); + + +$UserModelCopyWith<$Res>? get user; + +} +/// @nodoc +class _$KillHouseOperatorModelCopyWithImpl<$Res> + implements $KillHouseOperatorModelCopyWith<$Res> { + _$KillHouseOperatorModelCopyWithImpl(this._self, this._then); + + final KillHouseOperatorModel _self; + final $Res Function(KillHouseOperatorModel) _then; + +/// Create a copy of KillHouseOperatorModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? user = freezed,}) { + return _then(_self.copyWith( +user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as UserModel?, + )); +} +/// Create a copy of KillHouseOperatorModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserModelCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserModelCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _KillHouseOperatorModel implements KillHouseOperatorModel { + _KillHouseOperatorModel({this.user}); + factory _KillHouseOperatorModel.fromJson(Map json) => _$KillHouseOperatorModelFromJson(json); + +@override final UserModel? user; + +/// Create a copy of KillHouseOperatorModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$KillHouseOperatorModelCopyWith<_KillHouseOperatorModel> get copyWith => __$KillHouseOperatorModelCopyWithImpl<_KillHouseOperatorModel>(this, _$identity); + +@override +Map toJson() { + return _$KillHouseOperatorModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouseOperatorModel&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user); + +@override +String toString() { + return 'KillHouseOperatorModel(user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class _$KillHouseOperatorModelCopyWith<$Res> implements $KillHouseOperatorModelCopyWith<$Res> { + factory _$KillHouseOperatorModelCopyWith(_KillHouseOperatorModel value, $Res Function(_KillHouseOperatorModel) _then) = __$KillHouseOperatorModelCopyWithImpl; +@override @useResult +$Res call({ + UserModel? user +}); + + +@override $UserModelCopyWith<$Res>? get user; + +} +/// @nodoc +class __$KillHouseOperatorModelCopyWithImpl<$Res> + implements _$KillHouseOperatorModelCopyWith<$Res> { + __$KillHouseOperatorModelCopyWithImpl(this._self, this._then); + + final _KillHouseOperatorModel _self; + final $Res Function(_KillHouseOperatorModel) _then; + +/// Create a copy of KillHouseOperatorModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? user = freezed,}) { + return _then(_KillHouseOperatorModel( +user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as UserModel?, + )); +} + +/// Create a copy of KillHouseOperatorModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserModelCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserModelCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +mixin _$UserModel { + + String? get fullname; String? get firstName; String? get lastName; int? get baseOrder; String? get mobile; String? get nationalId; String? get nationalCode; String? get key; CityModel? get city; String? get unitName; String? get unitNationalId; String? get unitRegistrationNumber; String? get unitEconomicalNumber; String? get unitProvince; String? get unitCity; String? get unitPostalCode; String? get unitAddress; +/// Create a copy of UserModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserModelCopyWith get copyWith => _$UserModelCopyWithImpl(this as UserModel, _$identity); + + /// Serializes this UserModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); + +@override +String toString() { + return 'UserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; +} + + +} + +/// @nodoc +abstract mixin class $UserModelCopyWith<$Res> { + factory $UserModelCopyWith(UserModel value, $Res Function(UserModel) _then) = _$UserModelCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, CityModel? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress +}); + + +$CityModelCopyWith<$Res>? get city; + +} +/// @nodoc +class _$UserModelCopyWithImpl<$Res> + implements $UserModelCopyWith<$Res> { + _$UserModelCopyWithImpl(this._self, this._then); + + final UserModel _self; + final $Res Function(UserModel) _then; + +/// Create a copy of UserModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as CityModel?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of UserModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityModelCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityModelCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _UserModel implements UserModel { + _UserModel({this.fullname, this.firstName, this.lastName, this.baseOrder, this.mobile, this.nationalId, this.nationalCode, this.key, this.city, this.unitName, this.unitNationalId, this.unitRegistrationNumber, this.unitEconomicalNumber, this.unitProvince, this.unitCity, this.unitPostalCode, this.unitAddress}); + factory _UserModel.fromJson(Map json) => _$UserModelFromJson(json); + +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final int? baseOrder; +@override final String? mobile; +@override final String? nationalId; +@override final String? nationalCode; +@override final String? key; +@override final CityModel? city; +@override final String? unitName; +@override final String? unitNationalId; +@override final String? unitRegistrationNumber; +@override final String? unitEconomicalNumber; +@override final String? unitProvince; +@override final String? unitCity; +@override final String? unitPostalCode; +@override final String? unitAddress; + +/// Create a copy of UserModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserModelCopyWith<_UserModel> get copyWith => __$UserModelCopyWithImpl<_UserModel>(this, _$identity); + +@override +Map toJson() { + return _$UserModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _UserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); + +@override +String toString() { + return 'UserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserModelCopyWith<$Res> implements $UserModelCopyWith<$Res> { + factory _$UserModelCopyWith(_UserModel value, $Res Function(_UserModel) _then) = __$UserModelCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, CityModel? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress +}); + + +@override $CityModelCopyWith<$Res>? get city; + +} +/// @nodoc +class __$UserModelCopyWithImpl<$Res> + implements _$UserModelCopyWith<$Res> { + __$UserModelCopyWithImpl(this._self, this._then); + + final _UserModel _self; + final $Res Function(_UserModel) _then; + +/// Create a copy of UserModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { + return _then(_UserModel( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as CityModel?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of UserModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityModelCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityModelCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$CityModel { + + int? get id; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get provinceIdForeignKey; int? get cityIdKey; String? get name; double? get productPrice; bool? get provinceCenter; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; dynamic get createdBy; dynamic get modifiedBy; int? get province; +/// Create a copy of CityModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CityModelCopyWith get copyWith => _$CityModelCopyWithImpl(this as CityModel, _$identity); + + /// Serializes this CityModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is CityModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.province, province) || other.province == province)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),province); + +@override +String toString() { + return 'CityModel(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; +} + + +} + +/// @nodoc +abstract mixin class $CityModelCopyWith<$Res> { + factory $CityModelCopyWith(CityModel value, $Res Function(CityModel) _then) = _$CityModelCopyWithImpl; +@useResult +$Res call({ + int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province +}); + + + + +} +/// @nodoc +class _$CityModelCopyWithImpl<$Res> + implements $CityModelCopyWith<$Res> { + _$CityModelCopyWithImpl(this._self, this._then); + + final CityModel _self; + final $Res Function(CityModel) _then; + +/// Create a copy of CityModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable +as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _CityModel implements CityModel { + _CityModel({this.id, this.key, this.createDate, this.modifyDate, this.trash, this.provinceIdForeignKey, this.cityIdKey, this.name, this.productPrice, this.provinceCenter, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.createdBy, this.modifiedBy, this.province}); + factory _CityModel.fromJson(Map json) => _$CityModelFromJson(json); + +@override final int? id; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final int? provinceIdForeignKey; +@override final int? cityIdKey; +@override final String? name; +@override final double? productPrice; +@override final bool? provinceCenter; +@override final int? cityNumber; +@override final String? cityName; +@override final int? provinceNumber; +@override final String? provinceName; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final int? province; + +/// Create a copy of CityModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CityModelCopyWith<_CityModel> get copyWith => __$CityModelCopyWithImpl<_CityModel>(this, _$identity); + +@override +Map toJson() { + return _$CityModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CityModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.province, province) || other.province == province)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),province); + +@override +String toString() { + return 'CityModel(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; +} + + +} + +/// @nodoc +abstract mixin class _$CityModelCopyWith<$Res> implements $CityModelCopyWith<$Res> { + factory _$CityModelCopyWith(_CityModel value, $Res Function(_CityModel) _then) = __$CityModelCopyWithImpl; +@override @useResult +$Res call({ + int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province +}); + + + + +} +/// @nodoc +class __$CityModelCopyWithImpl<$Res> + implements _$CityModelCopyWith<$Res> { + __$CityModelCopyWithImpl(this._self, this._then); + + final _CityModel _self; + final $Res Function(_CityModel) _then; + +/// Create a copy of CityModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { + return _then(_CityModel( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable +as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart new file mode 100644 index 0000000..92eaf82 --- /dev/null +++ b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart @@ -0,0 +1,440 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'waiting_arrival.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_WaitingArrivalModel _$WaitingArrivalModelFromJson(Map json) => + _WaitingArrivalModel( + count: (json['count'] as num).toInt(), + next: json['next'] as String?, + previous: json['previous'] as String?, + results: (json['results'] as List) + .map((e) => ResultModel.fromJson(e as Map)) + .toList(), + ); + +Map _$WaitingArrivalModelToJson( + _WaitingArrivalModel instance, +) => { + 'count': instance.count, + 'next': instance.next, + 'previous': instance.previous, + 'results': instance.results, +}; + +_ResultModel _$ResultModelFromJson(Map json) => _ResultModel( + id: (json['id'] as num?)?.toInt(), + product: json['product'] == null + ? null + : ProductModel.fromJson(json['product'] as Map), + killHouse: json['kill_house'] == null + ? null + : KillHouseModel.fromJson(json['kill_house'] as Map), + toKillHouse: json['to_kill_house'], + steward: json['steward'], + toSteward: json['to_steward'] == null + ? null + : ToStewardModel.fromJson(json['to_steward'] as Map), + guilds: json['guilds'], + toGuilds: json['to_guilds'], + toColdHouse: json['to_cold_house'], + indexWeight: (json['index_weight'] as num?)?.toInt(), + dateTimestamp: (json['date_timestamp'] as num?)?.toInt(), + newState: (json['new_state'] as num?)?.toInt(), + newReceiverState: (json['new_receiver_state'] as num?)?.toInt(), + newAllocationState: (json['new_allocation_state'] as num?)?.toInt(), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + realNumberOfCarcasses: (json['real_number_of_carcasses'] as num?)?.toInt(), + receiverRealNumberOfCarcasses: + (json['receiver_real_number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toDouble(), + realWeightOfCarcasses: (json['real_weight_of_carcasses'] as num?)?.toDouble(), + receiverRealWeightOfCarcasses: + (json['receiver_real_weight_of_carcasses'] as num?)?.toDouble(), + weightLossOfCarcasses: (json['weight_loss_of_carcasses'] as num?)?.toDouble(), + finalRegistration: json['final_registration'] as bool?, + sellType: json['sell_type'] as String?, + productName: json['product_name'] as String?, + sellerType: json['seller_type'] as String?, + type: json['type'] as String?, + saleType: json['sale_type'] as String?, + allocationType: json['allocation_type'] as String?, + systemRegistrationCode: json['system_registration_code'] as bool?, + registrationCode: (json['registration_code'] as num?)?.toInt(), + amount: (json['amount'] as num?)?.toInt(), + totalAmount: (json['total_amount'] as num?)?.toInt(), + totalAmountPaid: (json['total_amount_paid'] as num?)?.toInt(), + totalAmountRemain: (json['total_amount_remain'] as num?)?.toInt(), + loggedRegistrationCode: json['logged_registration_code'], + state: json['state'] as String?, + receiverState: json['receiver_state'] as String?, + allocationState: json['allocation_state'] as String?, + date: json['date'] as String?, + role: json['role'], + stewardTempKey: json['steward_temp_key'], + approvedPriceStatus: json['approved_price_status'] as bool?, + calculateStatus: json['calculate_status'] as bool?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + wareHouse: json['ware_house'], + stewardWareHouse: json['steward_ware_house'], + car: json['car'], + dispenser: json['dispenser'], +); + +Map _$ResultModelToJson( + _ResultModel instance, +) => { + 'id': instance.id, + 'product': instance.product, + 'kill_house': instance.killHouse, + 'to_kill_house': instance.toKillHouse, + 'steward': instance.steward, + 'to_steward': instance.toSteward, + 'guilds': instance.guilds, + 'to_guilds': instance.toGuilds, + 'to_cold_house': instance.toColdHouse, + 'index_weight': instance.indexWeight, + 'date_timestamp': instance.dateTimestamp, + 'new_state': instance.newState, + 'new_receiver_state': instance.newReceiverState, + 'new_allocation_state': instance.newAllocationState, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'number_of_carcasses': instance.numberOfCarcasses, + 'real_number_of_carcasses': instance.realNumberOfCarcasses, + 'receiver_real_number_of_carcasses': instance.receiverRealNumberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'real_weight_of_carcasses': instance.realWeightOfCarcasses, + 'receiver_real_weight_of_carcasses': instance.receiverRealWeightOfCarcasses, + 'weight_loss_of_carcasses': instance.weightLossOfCarcasses, + 'final_registration': instance.finalRegistration, + 'sell_type': instance.sellType, + 'product_name': instance.productName, + 'seller_type': instance.sellerType, + 'type': instance.type, + 'sale_type': instance.saleType, + 'allocation_type': instance.allocationType, + 'system_registration_code': instance.systemRegistrationCode, + 'registration_code': instance.registrationCode, + 'amount': instance.amount, + 'total_amount': instance.totalAmount, + 'total_amount_paid': instance.totalAmountPaid, + 'total_amount_remain': instance.totalAmountRemain, + 'logged_registration_code': instance.loggedRegistrationCode, + 'state': instance.state, + 'receiver_state': instance.receiverState, + 'allocation_state': instance.allocationState, + 'date': instance.date, + 'role': instance.role, + 'steward_temp_key': instance.stewardTempKey, + 'approved_price_status': instance.approvedPriceStatus, + 'calculate_status': instance.calculateStatus, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'ware_house': instance.wareHouse, + 'steward_ware_house': instance.stewardWareHouse, + 'car': instance.car, + 'dispenser': instance.dispenser, +}; + +_ProductModel _$ProductModelFromJson(Map json) => + _ProductModel(weightAverage: (json['weight_average'] as num?)?.toDouble()); + +Map _$ProductModelToJson(_ProductModel instance) => + {'weight_average': instance.weightAverage}; + +_ToStewardModel _$ToStewardModelFromJson(Map json) => + _ToStewardModel( + id: (json['id'] as num?)?.toInt(), + user: json['user'] == null + ? null + : ToStewardUserModel.fromJson(json['user'] as Map), + address: json['address'] == null + ? null + : AddressModel.fromJson(json['address'] as Map), + guildAreaActivity: json['guild_area_activity'] == null + ? null + : GuildAreaActivityModel.fromJson( + json['guild_area_activity'] as Map, + ), + guildTypeActivity: json['guild_type_activity'] == null + ? null + : GuildTypeActivityModel.fromJson( + json['guild_type_activity'] as Map, + ), + killHouse: json['kill_house'] as List?, + stewardKillHouse: json['steward_kill_house'] as List?, + stewards: json['stewards'] as List?, + getPosStatus: json['get_pos_status'] == null + ? null + : GetPosStatusModel.fromJson( + json['get_pos_status'] as Map, + ), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + active: json['active'] as bool?, + guildsId: json['guilds_id'] as String?, + licenseNumber: json['license_number'] as String?, + guildsName: json['guilds_name'] as String?, + typeActivity: json['type_activity'] as String?, + areaActivity: json['area_activity'] as String?, + steward: json['steward'] as bool?, + hasPos: json['has_pos'] as bool?, + provinceAcceptState: json['province_accept_state'] as String?, + ); + +Map _$ToStewardModelToJson(_ToStewardModel instance) => + { + 'id': instance.id, + 'user': instance.user, + 'address': instance.address, + 'guild_area_activity': instance.guildAreaActivity, + 'guild_type_activity': instance.guildTypeActivity, + 'kill_house': instance.killHouse, + 'steward_kill_house': instance.stewardKillHouse, + 'stewards': instance.stewards, + 'get_pos_status': instance.getPosStatus, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'active': instance.active, + 'guilds_id': instance.guildsId, + 'license_number': instance.licenseNumber, + 'guilds_name': instance.guildsName, + 'type_activity': instance.typeActivity, + 'area_activity': instance.areaActivity, + 'steward': instance.steward, + 'has_pos': instance.hasPos, + 'province_accept_state': instance.provinceAcceptState, + }; + +_ToStewardUserModel _$ToStewardUserModelFromJson(Map json) => + _ToStewardUserModel( + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + mobile: json['mobile'] as String?, + nationalId: json['national_id'] as String?, + city: json['city'] as String?, + ); + +Map _$ToStewardUserModelToJson(_ToStewardUserModel instance) => + { + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'mobile': instance.mobile, + 'national_id': instance.nationalId, + 'city': instance.city, + }; + +_ToStewardCityModel _$ToStewardCityModelFromJson(Map json) => + _ToStewardCityModel( + key: json['key'] as String?, + title: json['name'] as String?, + ); + +Map _$ToStewardCityModelToJson(_ToStewardCityModel instance) => + {'key': instance.key, 'name': instance.title}; + +_ToStewardProvinceModel _$ToStewardProvinceModelFromJson( + Map json, +) => _ToStewardProvinceModel( + key: json['key'] as String?, + title: json['name'] as String?, +); + +Map _$ToStewardProvinceModelToJson( + _ToStewardProvinceModel instance, +) => {'key': instance.key, 'name': instance.title}; + +_AddressModel _$AddressModelFromJson(Map json) => + _AddressModel( + province: json['province'] == null + ? null + : ToStewardProvinceModel.fromJson( + json['province'] as Map, + ), + city: json['city'] == null + ? null + : ToStewardCityModel.fromJson(json['city'] as Map), + address: json['address'] as String?, + postalCode: json['postal_code'] as String?, + ); + +Map _$AddressModelToJson(_AddressModel instance) => + { + 'province': instance.province, + 'city': instance.city, + 'address': instance.address, + 'postal_code': instance.postalCode, + }; + +_GuildAreaActivityModel _$GuildAreaActivityModelFromJson( + Map json, +) => _GuildAreaActivityModel( + key: json['key'] as String?, + title: json['title'] as String?, +); + +Map _$GuildAreaActivityModelToJson( + _GuildAreaActivityModel instance, +) => {'key': instance.key, 'title': instance.title}; + +_GuildTypeActivityModel _$GuildTypeActivityModelFromJson( + Map json, +) => _GuildTypeActivityModel( + key: json['key'] as String?, + title: json['title'] as String?, +); + +Map _$GuildTypeActivityModelToJson( + _GuildTypeActivityModel instance, +) => {'key': instance.key, 'title': instance.title}; + +_GetPosStatusModel _$GetPosStatusModelFromJson(Map json) => + _GetPosStatusModel( + lenActiveSessions: (json['len_active_sessions'] as num?)?.toInt(), + hasPons: json['has_pons'] as bool?, + hasActivePons: json['has_active_pons'] as bool?, + ); + +Map _$GetPosStatusModelToJson(_GetPosStatusModel instance) => + { + 'len_active_sessions': instance.lenActiveSessions, + 'has_pons': instance.hasPons, + 'has_active_pons': instance.hasActivePons, + }; + +_KillHouseModel _$KillHouseModelFromJson(Map json) => + _KillHouseModel( + key: json['key'] as String?, + operator: json['kill_house_operator'] == null + ? null + : KillHouseOperatorModel.fromJson( + json['kill_house_operator'] as Map, + ), + name: json['name'] as String?, + killer: json['killer'] as bool?, + ); + +Map _$KillHouseModelToJson(_KillHouseModel instance) => + { + 'key': instance.key, + 'kill_house_operator': instance.operator, + 'name': instance.name, + 'killer': instance.killer, + }; + +_KillHouseOperatorModel _$KillHouseOperatorModelFromJson( + Map json, +) => _KillHouseOperatorModel( + user: json['user'] == null + ? null + : UserModel.fromJson(json['user'] as Map), +); + +Map _$KillHouseOperatorModelToJson( + _KillHouseOperatorModel instance, +) => {'user': instance.user}; + +_UserModel _$UserModelFromJson(Map json) => _UserModel( + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + baseOrder: (json['base_order'] as num?)?.toInt(), + mobile: json['mobile'] as String?, + nationalId: json['national_id'] as String?, + nationalCode: json['national_code'] as String?, + key: json['key'] as String?, + city: json['city'] == null + ? null + : CityModel.fromJson(json['city'] as Map), + unitName: json['unit_name'] as String?, + unitNationalId: json['unit_national_id'] as String?, + unitRegistrationNumber: json['unit_registration_number'] as String?, + unitEconomicalNumber: json['unit_economical_number'] as String?, + unitProvince: json['unit_province'] as String?, + unitCity: json['unit_city'] as String?, + unitPostalCode: json['unit_postal_code'] as String?, + unitAddress: json['unit_address'] as String?, +); + +Map _$UserModelToJson(_UserModel instance) => + { + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'base_order': instance.baseOrder, + 'mobile': instance.mobile, + 'national_id': instance.nationalId, + 'national_code': instance.nationalCode, + 'key': instance.key, + 'city': instance.city, + 'unit_name': instance.unitName, + 'unit_national_id': instance.unitNationalId, + 'unit_registration_number': instance.unitRegistrationNumber, + 'unit_economical_number': instance.unitEconomicalNumber, + 'unit_province': instance.unitProvince, + 'unit_city': instance.unitCity, + 'unit_postal_code': instance.unitPostalCode, + 'unit_address': instance.unitAddress, + }; + +_CityModel _$CityModelFromJson(Map json) => _CityModel( + id: (json['id'] as num?)?.toInt(), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + provinceIdForeignKey: (json['province_id_foreign_key'] as num?)?.toInt(), + cityIdKey: (json['city_id_key'] as num?)?.toInt(), + name: json['name'] as String?, + productPrice: (json['product_price'] as num?)?.toDouble(), + provinceCenter: json['province_center'] as bool?, + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + province: (json['province'] as num?)?.toInt(), +); + +Map _$CityModelToJson(_CityModel instance) => + { + 'id': instance.id, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'province_id_foreign_key': instance.provinceIdForeignKey, + 'city_id_key': instance.cityIdKey, + 'name': instance.name, + 'product_price': instance.productPrice, + 'province_center': instance.provinceCenter, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'province': instance.province, + }; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart new file mode 100644 index 0000000..4bbb4b4 --- /dev/null +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -0,0 +1,60 @@ +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; + +abstract class ChickenRepository { + Future?> getInventory({required String token}); + + Future getIKillHouseDistributionInfo({ + required String token, + }); + + Future getGeneralBarInformation({required String token}); + + Future getWaitingArrivals({ + required String token, + int? page, + }); + + Future setSateForArrivals({ + required String token, + required Map request, + }); + + Future getImportedLoadsModel({ + required String token, + required int page, + }); + + Future getAllocatedMade({ + required String token, + required int page, + }); + + Future confirmAllocation({ + required String token, + required Map allocation, + }); + + Future denyAllocation({ + required String token, + required String allocationToken, + }); + + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }); + + Future?> getRolesProducts({required String token}); + Future?> getGuilds({required String token,required bool isFree}); + Future getProfile({required String token}); + Future postSubmitStewardAllocation({required String token,required SubmitStewardAllocation request}); +} diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart new file mode 100644 index 0000000..a356919 --- /dev/null +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -0,0 +1,194 @@ +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; +import 'package:rasadyar_core/core.dart'; + +import 'chicken_repository.dart'; + +class ChickenRepositoryImpl implements ChickenRepository { + final DioRemote _httpClient; + + ChickenRepositoryImpl(this._httpClient); + + @override + Future?> getInventory({required String token}) async { + var res = await _httpClient.get( + '/roles-products/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJsonList: (json) => (json) + .map((item) => InventoryModel.fromJson(item as Map)) + .toList(), + ); + + return res.data; + } + + @override + Future getIKillHouseDistributionInfo({ + required String token, + }) async { + var res = await _httpClient.get( + '/kill-house-distribution-info/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJson: KillHouseDistributionInfo.fromJson, + ); + + return res.data; + } + + @override + Future getGeneralBarInformation({ + required String token, + }) async { + var res = await _httpClient.get( + '/bars_for_kill_house_dashboard/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJson: BarInformation.fromJson, + ); + return res.data; + } + + @override + Future getWaitingArrivals({ + required String token, + int? page, + }) async { + var res = await _httpClient.get( + '/steward-allocation/?search=filter&value=&role=Steward&page=${page ?? 1}&page_size=10&type=not_entered', + headers: {'Authorization': 'Bearer $token'}, + fromJson: WaitingArrivalModel.fromJson, + ); + return res.data; + } + + @override + Future setSateForArrivals({ + required String token, + required Map request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: request, + ); + } + + @override + Future getImportedLoadsModel({ + required String token, + required int page, + }) async { + var res = await _httpClient.get( + '/steward-allocation/?role=Steward&search=filter&page=${page}&page_size=10&value=&type=entered', + headers: {'Authorization': 'Bearer $token'}, + fromJson: ImportedLoadsModel.fromJson, + ); + return res.data; + } + + @override + Future getAllocatedMade({ + required String token, + required int page, + }) async { + var res = await _httpClient.get( + '/steward-allocation/?search=filter&value=&role=Steward&page=$page&page_size=100', + headers: {'Authorization': 'Bearer $token'}, + fromJson: AllocatedMadeModel.fromJson, + ); + return res.data; + } + + @override + Future confirmAllocation({ + required String token, + required Map allocation, + }) async { + var res = await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: allocation, + ); + } + + @override + Future denyAllocation({ + required String token, + required String allocationToken, + }) async { + await _httpClient.delete( + '/steward-allocation/0/?steward_allocation_key=$allocationToken', + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: {'steward_allocation_list': allocationTokens}, + ); + } + + @override + Future?> getRolesProducts({required String token}) async { + var res = await _httpClient.get( + '/roles-products/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJsonList: (json) => json + .map((item) => ProductModel.fromJson(item as Map)) + .toList(), + ); + return res.data; + } + + @override + Future?> getGuilds({ + required String token, + required bool isFree, + }) async { + var res = await _httpClient.get( + '/guilds/?role=Steward&free=$isFree', + headers: {'Authorization': 'Bearer $token'}, + + fromJsonList: (json) => json + .map((item) => GuildModel.fromJson(item as Map)) + .toList(), + ); + return res.data; + } + + @override + Future getProfile({required String token}) async { + var res = await _httpClient.get( + '/guilds/0/?profile', + headers: {'Authorization': 'Bearer $token'}, + fromJson: GuildProfile.fromJson, + ); + return res.data; + } + + @override + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }) async { + await _httpClient.post( + '/steward-allocation/', + headers: {'Authorization': 'Bearer $token'}, + data: request.toJson(), + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart new file mode 100644 index 0000000..366f449 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_allocation/steward_allocation_request.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; +import 'package:rasadyar_core/core.dart'; + +class EnteringTheWarehouseLogic extends GetxController { + RootLogic rootLogic = Get.find(); + Rxn barInformation = Rxn(); + Rxn waitingForArrival = Rxn(); + Rxn importedLoads = Rxn(); + RxInt acceptType = 1.obs; + TextEditingController weightController = TextEditingController(); + TextEditingController volumeController = TextEditingController(); + TextEditingController weightLossController = TextEditingController(); + TextEditingController authenticationCodeController = TextEditingController(); + + @override + void onReady() { + super.onReady(); + rootLogic.getInventory(); + getBarGeneralInformation(); + getWaitingArrivals(); + getImportedEntried(); + } + + Future getBarGeneralInformation() async { + safeCall( + call: () async => + await rootLogic.chickenRepository.getGeneralBarInformation( + token: rootLogic.tokenService.accessToken.value!, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + if (result != null) { + barInformation.value = result; + } + }, + ); + } + + Future getWaitingArrivals() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getWaitingArrivals( + token: rootLogic.tokenService.accessToken.value!, + page: 1, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + if (result != null) { + waitingForArrival.value = result; + } + }, + ); + } + + Future acceptEntried(String key) async { + var request = StewardAllocationRequest( + allocationKey: key, + checkAllocation: true, + state: 'accepted', + receiverRealNumberOfCarcasses: int.parse( + volumeController.text.isNotEmpty ? volumeController.text : '0', + ), + receiverRealWeightOfCarcasses: int.parse( + weightController.text.isNotEmpty ? weightController.text : '0', + ), + registrationCode: acceptType.value == 1 + ? int.parse( + authenticationCodeController.text.isNotEmpty + ? authenticationCodeController.text + : '0', + ) + : null, + weightLossOfCarcasses: int.parse( + weightLossController.text.isNotEmpty ? weightLossController.text : '0', + ), + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + clearControllers(); + getWaitingArrivals(); + getBarGeneralInformation(); + }, + ); + } + + Future denyEntried(String key) async { + var request = StewardAllocationRequest( + allocationKey: key, + checkAllocation: true, + state: 'rejected', + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + getWaitingArrivals(); + getBarGeneralInformation(); + }, + ); + } + + Future getImportedEntried() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getImportedLoadsModel( + token: rootLogic.tokenService.accessToken.value!, + page: 1, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + if(result!=null){ + importedLoads.value = result; + } + + }, + ); + } + + clearControllers() { + weightController.clear(); + volumeController.clear(); + weightLossController.clear(); + authenticationCodeController.clear(); + } +} diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart new file mode 100644 index 0000000..1fe6819 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart @@ -0,0 +1,25 @@ +extension xStringUtils on String { + get faAllocationType { + final tmp = split('_'); + tmp.insert(1, '_'); + if (tmp.length > 1) { + return tmp.map((e) => utilsMap[e] ?? e).join(' '); + } else { + return utilsMap[this] ?? this; + } + } + + get faItem => utilsMap[this] ?? this; + +} + +Map utilsMap = { + 'killhouse': 'کشتارگاه', + '_': 'به', + 'steward': 'مباشر', + 'exclusive': 'اختصاصی', + 'free': 'آزاد', + 'pending': 'در انتظار', + 'accepted': 'تایید شده', + 'guild':'صنف' +}; diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart new file mode 100644 index 0000000..0bff7d7 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart @@ -0,0 +1,600 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; +import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class EnteringTheWarehousePage extends GetView { + EnteringTheWarehousePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: RAppBar(title: 'ورود به انبار'), + body: SingleChildScrollView( + child: Column( + children: [ + inventoryWidget(), + ObxValue((data) { + return generalBarInformation(data.value); + }, controller.barInformation), + waitingForArrival(), + importedLoads(), + ], + ), + ), + ); + } + + Widget inventoryWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text( + 'موجودی انبار', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(height: 4), + ObxValue( + (data) => data.isEmpty + ? Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 80, + padding: EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.rootLogic.inventoryList.length, + separatorBuilder: (context, index) => + const SizedBox(height: 8), + itemBuilder: (context, index) { + return ObxValue((expand) { + return GestureDetector( + onTap: () { + controller.rootLogic.toggleExpanded(index); + }, + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + onEnd: () { + controller + .rootLogic + .inventoryExpandedList[index] = !controller + .rootLogic + .inventoryExpandedList[index]!; + }, + margin: const EdgeInsets.symmetric(vertical: 2), + padding: EdgeInsets.all(6), + curve: Curves.easeInOut, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: AppColor.blueNormal, + width: 1, + ), + ), + duration: const Duration(seconds: 1), + height: expand.keys.contains(index) ? 250 : 80, + child: inventoryItem( + isExpanded: + expand.keys.contains(index) && expand[index]!, + index: index, + model: controller.rootLogic.inventoryList[index], + ), + ), + ); + }, controller.rootLogic.inventoryExpandedList); + }, + ), + controller.rootLogic.inventoryList, + ), + ], + ), + ); + } + + Widget inventoryItem({ + required bool isExpanded, + required int index, + required InventoryModel model, + }) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + buildRow('نام محصول', model.name ?? ''), + Visibility( + visible: isExpanded, + child: Column( + spacing: 8, + children: [ + buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0'), + buildRow( + 'وزن خریدهای آزاد داخل استان (کیلوگرم)', + model.receiveFreeCarcassesWeight.toString(), + ), + buildRow( + 'وزن خریدهای خارج استان (کیلوگرم)', + model.freeBuyingCarcassesWeight.toString(), + ), + buildRow( + 'کل ورودی به انبار (کیلوگرم)', + model.totalFreeBarsCarcassesWeight.toString(), + ), + buildRow( + 'کل فروش (کیلوگرم)', + model.realAllocatedWeight.toString(), + ), + buildRow( + 'مانده انبار (کیلوگرم)', + model.totalRemainWeight.toString(), + ), + ], + ), + ), + ], + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + Flexible( + flex: 1, + child: Text( + value, + textAlign: TextAlign.left, + + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + ], + ), + ); + } + + Widget generalBarInformation(BarInformation? model) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Align( + alignment: Alignment.centerRight, + child: Text( + 'اطلاعات کلی بارها', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + ), + Container( + height: 290, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: model != null + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8, + children: [ + buildRow( + 'تعداد کل بارها', + model.totalBars!.toInt().toString(), + ), + buildRow( + 'وزن کل بارها (کیلوگرم)', + model.totalBarsWeight!.toInt().toString(), + ), + buildRow( + 'تعداد کل بارهای وارد شده', + model.totalEnteredBars!.toInt().toString(), + ), + buildRow( + 'وزن کل بار وارد شده (کیلوگرم)', + model.totalEnteredBarsWeight!.toInt().toString(), + ), + buildRow( + 'تعداد کل بارهای وارد نشده', + model.totalNotEnteredBars!.toInt().toString(), + ), + buildRow( + 'وزن کل بار وارد نشده (کیلوگرم)', + model.totalNotEnteredKillHouseRequestsWeight! + .toInt() + .toString(), + ), + buildRow( + 'تعداد کل بارهای رد شده', + model.totalRejectedBars!.toInt().toString(), + ), + buildRow( + ' وزن کل بارهای رد شده', + model.totalRejectedBarsWeight!.toInt().toString(), + ), + ], + ) + : const Center(child: CircularProgressIndicator()), + ), + ], + ); + } + + Widget waitingForArrival() { + return Column( + children: [ + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Align( + alignment: Alignment.centerRight, + child: Text( + 'موجودی انبار', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + ), + ObxValue((data) { + if (data.value == null) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ); + } else if (data.value?.results.isEmpty ?? true) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: Text('هیچ ورودی در انتظار نیست')), + ); + } else { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 700, + padding: const EdgeInsets.all(6), + child: + ListView.separated( + padding: const EdgeInsets.all(8.0), + itemCount: data.value?.results.length ?? 0, + itemBuilder: (BuildContext context, int index) { + final result = data.value!.results[index]; + return Card( + margin: const EdgeInsets.symmetric(vertical: 4.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide( + color: AppColor.blueNormal, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildRow('ردیف', '${index + 1}'), + buildRow( + 'تاریخ ثبت', + result.date!.formattedJalaliDate ?? 'N/A', + ), + buildRow( + 'نوع تخصیص', + result.allocationType?.faAllocationType ?? 'N/A', + ), + buildRow( + 'مشخصات خریدار', + result.toSteward?.user?.fullname ?? 'N/A', + ), + buildRow( + 'مشخصات فروشنده', + result.killHouse?.name ?? 'N/A', + ), + buildRow( + 'نوع فروش', + result.sellType?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${result.amount ?? 0} تومان', + ), + buildRow( + 'قیمت کل', + '${result.totalAmount ?? 0} تومان', + ), + buildRow( + 'وزن تخصیصی', + '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', + ), + buildRow('وضعیت', result.state?.faItem ?? 'N/A'), + Row( + children: [ + Expanded( + child: RElevated( + text: 'تایید', + onPressed: () { + Get.bottomSheet(acceptBottomSheet(result)); + }, + height: 40, + ), + ), + SizedBox(width: 20), + Expanded( + child: RElevated( + text: 'رد', + onPressed: () { + controller.denyEntried(result.key!); + Get.back(); + }, + backgroundColor: AppColor.error, + height: 40, + ), + ), + ], + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => + SizedBox(height: 8), + ), + + ); + } + }, controller.waitingForArrival) + ] + ); + } + + Widget importedLoads() { + return Column( + children: [ + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Align( + alignment: Alignment.centerRight, + child: Text( + 'بارهای وارد شده', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + ), + ObxValue((data) { + if (data.value == null) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ); + } + else if (data.value?.results?.isEmpty ?? true) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: Text( 'هیچ بار وارد شده‌ای وجود ندارد')), + ); + } else { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 700, + padding: const EdgeInsets.all(6), + child: + ListView.separated( + padding: const EdgeInsets.all(8.0), + itemCount: data.value?.results?.length ?? 0, + itemBuilder: (BuildContext context, int index) { + final result = data.value!.results![index]; + return Card( + margin: const EdgeInsets.symmetric(vertical: 4.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide( + color: AppColor.blueNormal, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildRow('ردیف', '${index + 1}'), + buildRow( + 'تاریخ ثبت', + result.date!.formattedJalaliDate ?? 'N/A', + ), + buildRow( + 'نوع تخصیص', + result.allocationType?.faAllocationType ?? 'N/A', + ), + buildRow( + 'مشخصات خریدار', + '${result.toSteward?.user?.fullname} - ${result.toSteward?.guildsName}' ?? 'N/A', + ), + buildRow( + 'مشخصات فروشنده', + result.killHouse?.name ?? 'N/A', + ), + buildRow( + 'نوع فروش', + result.sellType?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${result.amount ?? 0} ریال ', + ), + buildRow( + 'قیمت کل', + '${result.totalAmount ?? 0} ریال', + ), + buildRow( + 'وزن تخصیصی', + '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', + ), + buildRow('کداحراز', result.registrationCode?.toString() ?? 'N/A'), + buildRow('وضعیت کد احراز', result.systemRegistrationCode == true ?"ارسال شده":"ارسال نشده" ?? 'N/A'), + buildRow('افت وزن(کیلوگرم)', result.weightLossOfCarcasses?.toInt().toString() ?? 'N/A'), + buildRow('وضعیت', result.receiverState?.faItem ?? 'N/A'), + + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => + SizedBox(height: 8), + ), + + ); + } + }, controller.importedLoads) + ] + ); + } + + + + + + + Widget acceptBottomSheet(ResultModel resultModel) { + return BaseBottomSheet( + height: 500, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8, + children: [ + RTextField( + controller: controller.weightController, + initText: resultModel.realWeightOfCarcasses?.toInt().toString(), + label: 'ورزن', + keyboardType: TextInputType.number, + ), + const SizedBox(height: 8), + RTextField( + controller: controller.volumeController, + label: 'حجم', + keyboardType: TextInputType.number, + ), + const SizedBox(height: 8), + RTextField( + controller: controller.weightLossController, + label: 'افت وزن(کیلوگرم)', + keyboardType: TextInputType.number, + ), + const SizedBox(height: 8), + + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.acceptType.value, + onChanged: (value) { + controller.acceptType.value = value!; + }, + ), + Text('با کد احراز', style: AppFonts.yekan14), + + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.acceptType.value, + onChanged: (value) { + controller.acceptType.value = value!; + }, + ), + Text('با کد احراز', style: AppFonts.yekan14), + ], + ); + }, controller.acceptType), + ), + + const SizedBox(height: 8), + ObxValue( + (data) => Visibility( + visible: data.value == 1, + child: RTextField( + controller: controller.authenticationCodeController, + label: 'کد احراز', + keyboardType: TextInputType.number, + ), + ), + controller.acceptType, + ), + + RElevated( + text: 'تایید', + onPressed: () { + controller.acceptEntried(resultModel.key!); + Get.back(); + }, + ), + ], + ), + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 638a409..3f61aa6 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,33 +1,115 @@ -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' show Text, EdgeInsets, Colors; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_auth/presentation/routes/pages.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; +import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; - enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { - RxInt currentIndex = 0.obs; - List pages = [ - Container(color: Colors.deepOrange,), - Container(color: Colors.amberAccent,), - Container(color: Colors.black,), - ]; RxList errorLocationType = RxList(); + RxMap inventoryExpandedList = RxMap(); + var tokenService = Get.find(); + late ChickenRepository chickenRepository; + late DioRemote dioRemote; + RxInt count = 5.obs; - + RxList inventoryList = RxList(); + Rxn killHouseDistributionInfo = + Rxn(); @override - void onReady() { - super.onReady(); - + void onInit() { + super.onInit(); + dioRemote = DioRemote(baseUrl: tokenService.baseurl.value); + dioRemote.init(); + chickenRepository = ChickenRepositoryImpl(dioRemote); + getInventory(); + getKillHouseDistributionInfo(); } - void changePage(int index) { - currentIndex.value = index; + + void toggleExpanded(int index) { + if (inventoryExpandedList.keys.contains(index)) { + inventoryExpandedList.remove(index); + } else { + inventoryExpandedList[index] = false; + } } - @override - void onClose() { - // TODO: implement onClose - super.onClose(); + Future getInventory() async { + await safeCall?>( + call: () async => await chickenRepository.getInventory( + token: tokenService.accessToken.value!, + ), + onSuccess: (result) { + if (result != null) { + iLog(result); + inventoryList.clear(); + inventoryList.addAll(result); + iLog(inventoryList); + } + }, + onError: (error, stackTrace) { + switch (error.response?.statusCode) { + case 401: + _handleGeneric(error); + break; + case 403: + _handleGeneric(error); + break; + default: + _handleGeneric(error); + } + }, + ); + } + + Future getKillHouseDistributionInfo() async { + await safeCall( + call: () async => await chickenRepository.getIKillHouseDistributionInfo( + token: tokenService.accessToken.value!, + ), + onSuccess: (result) { + if (result != null) { + iLog(result); + killHouseDistributionInfo.value = result; + iLog(killHouseDistributionInfo.value); + } + }, + onError: (error, stackTrace) {}, + ); + } + + + void _handleGeneric(DioException error) { + Get.showSnackbar( + _errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید' + ), + ); + tokenService.deleteTokens(); + Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken ); + } + GetSnackBar _errorSnackBar(String message) { + return GetSnackBar( + titleText: Text( + 'خطا', + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + messageText: Text( + message, + style: AppFonts.yekan12.copyWith(color: Colors.white), + ), + backgroundColor: AppColor.error, + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: 12, + duration: Duration(milliseconds: 3500), + snackPosition: SnackPosition.TOP, + ); } } diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 071cdfa..2fb3977 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -1,82 +1,455 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_core/core.dart'; -import 'logic.dart'; - class RootPage extends GetView { const RootPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( - body: Stack( - children: [ - ObxValue( - (currentIndex) => IndexedStack( - index: currentIndex.value, - children: controller.pages, + appBar: RAppBar(title: 'مدیریت انبار', centerTitle: true, hasBack: false), + body: SingleChildScrollView( + child: Column( + children: [ + inventoryWidget(), + ObxValue( + (data) => broadcastInformationWidget(data.value), + controller.killHouseDistributionInfo, ), - controller.currentIndex, - ), - - ], - ), - bottomNavigationBar: WaveBottomNavigation( - items: [ - WaveBottomNavigationItem(title: 'خانه', icon: Assets.vec.mapSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - )), - WaveBottomNavigationItem( - title: 'عملیات', - icon: Assets.vec.userSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + cardWidget( + title: 'ورود به انبار', + iconPath: Assets.icons.whareHouse.path, + onTap: () { + Get.toNamed(ChickenRoutes.enteringTheWarehouse); + }, + ), + cardWidget( + title: 'فروش داخل استان', + iconPath: Assets.icons.inside.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesWithinProvince); + }, + ), + cardWidget( + title: 'فروش خارج استان', + iconPath: Assets.icons.outside.path, + onTap: () {}, + ), + ], + ), ), - ), - WaveBottomNavigationItem( - title: 'افزودن', - icon: Assets.vec.addSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'آمار', - icon: Assets.vec.diagramSvg.svg(width: 32,height: 32,colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),), - ), - WaveBottomNavigationItem( - title: 'تماس', - icon: Assets.vec.callSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'مکان ', - icon: Assets.vec.gpsSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'تاریخ', - icon: Assets.vec.calendarSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - ], - onPageChanged: (index) { - controller.changePage(index); - }, + ], + ), ), ); } + + Widget inventoryWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text( + 'موجودی انبار', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(height: 4), + ObxValue( + (data) => data.isEmpty + ? Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 80, + padding: EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.inventoryList.length, + separatorBuilder: (context, index) => + const SizedBox(height: 8), + itemBuilder: (context, index) { + return ObxValue((expand) { + return GestureDetector( + onTap: () { + controller.toggleExpanded(index); + }, + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + onEnd: () { + controller.inventoryExpandedList[index] = + !controller.inventoryExpandedList[index]!; + }, + margin: const EdgeInsets.symmetric(vertical: 2), + padding: EdgeInsets.all(6), + curve: Curves.easeInOut, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: AppColor.blueNormal, + width: 1, + ), + ), + duration: const Duration(seconds: 1), + height: expand.keys.contains(index) ? 250 : 80, + child: inventoryItem( + isExpanded: + expand.keys.contains(index) && expand[index]!, + index: index, + model: controller.inventoryList[index], + ), + ), + ); + }, controller.inventoryExpandedList); + }, + ), + controller.inventoryList, + ), + ], + ), + ); + } + + Widget inventoryItem({ + required bool isExpanded, + required int index, + required InventoryModel model, + }) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + buildRow('نام محصول', model.name ?? ''), + Visibility( + visible: isExpanded, + child: Column( + spacing: 8, + children: [ + buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), + buildRow( + 'وزن خریدهای آزاد داخل استان (کیلوگرم)', + model.receiveFreeCarcassesWeight.toString(), + ), + buildRow( + 'وزن خریدهای خارج استان (کیلوگرم)', + model.freeBuyingCarcassesWeight.toString(), + ), + buildRow( + 'کل ورودی به انبار (کیلوگرم)', + model.totalFreeBarsCarcassesWeight.toString(), + ), + buildRow( + 'کل فروش (کیلوگرم)', + model.realAllocatedWeight.toString(), + ), + buildRow( + 'مانده انبار (کیلوگرم)', + model.totalRemainWeight.toString(), + ), + ], + ), + ), + ], + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + Flexible( + flex: 1, + child: Text( + value, + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + ], + ), + ); + } + + Widget broadcastInformationWidget(KillHouseDistributionInfo? model) { + return Container( + height: 140, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: model != null + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Text( + 'اطلاعات ارسالی', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + const SizedBox(height: 12), + buildRow( + 'فروش و توزیع داخل استان (کیلوگرم)', + model.stewardAllocationsWeight!.toInt().toString(), + ), + buildRow( + 'فروش و توزیع خارج استان (کیلوگرم)', + model.freeSalesWeight!.toInt().toString(), + ), + ], + ) + : const Center(child: CircularProgressIndicator()), + ); + } +} + +Widget expandedContainer(bool isExpanded, VoidCallback onTap) { + return AnimatedContainer( + margin: EdgeInsets.symmetric(horizontal: 30, vertical: 10), + curve: Curves.easeInOut, + duration: Duration(seconds: 1), + height: isExpanded ? 364 : 80, + child: markerDetailsWidget(ontap: onTap), + ); +} + +Widget markerDetailsWidget({required VoidCallback ontap}) { + return GestureDetector( + onTap: ontap, + behavior: HitTestBehavior.opaque, + child: Container( + clipBehavior: Clip.antiAlias, + + padding: EdgeInsets.symmetric(horizontal: 0, vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 12, + children: [ + vecWidgetWithOnTap( + child: Assets.vec.editSvg.svg(), + onTap: () {}, + width: 24, + height: 24, + color: AppColor.blueNormal, + ), + Text( + 'سوابق بازرسی من', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + vecWidgetWithOnTap( + child: Assets.vec.trashSvg.svg(), + width: 24, + height: 24, + color: AppColor.redNormal, + onTap: () {}, + ), + ], + ), + Container( + height: 32, + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تاریخ بازرسی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '1403/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + + ...List.generate( + 5, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + ), + ], + ), + ), + ); +} + +Widget cardWidget({ + required String title, + required String iconPath, + required VoidCallback onTap, +}) { + return Container( + width: Get.width / 4, + height: 130, + child: GestureDetector( + onTap: onTap, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 1, color: AppColor.blueNormal), + ), + child: Padding( + padding: EdgeInsets.all(16), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgGenImage(iconPath).svg(width: 50, height: 50), + SizedBox(height: 4), + Text( + title, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + ), + ); } diff --git a/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart new file mode 100644 index 0000000..856267f --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart @@ -0,0 +1,213 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +class SalesWithinProvinceLogic extends GetxController { + var rootLogic = Get.find(); + Rxn allocatedMadeModel = Rxn(); + RxList rolesProductsModel = RxList(); + + RxList guildsModel = [].obs; + + Rxn selectedProductModel = Rxn(); + Rxn selectedGuildModel = Rxn(); + Rxn guildProfile = Rxn(); + RxInt saleType = 1.obs; + RxInt weight = 0.obs; + RxInt pricePerKilo = 0.obs; + RxInt totalCost = 0.obs; + RxBool isValid = false.obs; + final weightController = TextEditingController(); + final pricePerKiloController = TextEditingController(); + final totalCostController = TextEditingController(); + + @override + void onInit() { + super.onInit(); + rootLogic.getInventory(); + getAllocatedMade(); + getRolesProducts(); + getGuilds(); + getGuildProfile(); + ever(saleType, (callback) { + getGuilds(); + }); + + weight.listen((num) { + totalCost.value = num * pricePerKilo.value; + }); + + pricePerKilo.listen((num) { + totalCost.value = num * weight.value; + }); + + totalCost.listen((data) { + totalCostController.text = data.toString(); + + isValid.value = + weight.value > 0 && + pricePerKilo.value > 0 && + totalCost.value > 0 && + selectedProductModel.value != null && + selectedGuildModel.value != null; + }); + } + + Future getAllocatedMade() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getAllocatedMade( + token: rootLogic.tokenService.accessToken.value!, + page: 1, + ), + onSuccess: (result) { + if (result != null) { + allocatedMadeModel.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } + + void checkVerfication() { + isValid.value = + weight.value > 0 && + pricePerKilo.value > 0 && + totalCost.value > 0 && + selectedProductModel.value != null && + selectedGuildModel.value != null; + } + + void confirmAllocation(ConformAllocation allocation) { + safeCall( + call: () async => await rootLogic.chickenRepository.confirmAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocation: allocation.toJson(), + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + void denyAllocation(String token) { + safeCall( + call: () async => await rootLogic.chickenRepository.denyAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocationToken: token, + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + Future confirmAllAllocations() async { + safeCall( + call: () async => await rootLogic.chickenRepository.confirmAllAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocationTokens: + allocatedMadeModel.value?.results?.map((e) => e.key!).toList() ?? + [], + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + Future getRolesProducts() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getRolesProducts( + token: rootLogic.tokenService.accessToken.value!, + ), + onSuccess: (result) { + if (result != null) { + rolesProductsModel.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } + + Future getGuilds() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getGuilds( + token: rootLogic.tokenService.accessToken.value!, + isFree: saleType.value == 2 ? true : false, + ), + onSuccess: (result) { + if (result != null) { + guildsModel.clear(); + guildsModel.addAll(result); + } + }, + onError: (error, stacktrace) {}, + ); + } + + Future addSale() async {} + + void setSelectedGuild(GuildModel value) { + selectedGuildModel.value = value; + update(); + } + + void setSelectedProduct(ProductModel value) { + selectedProductModel.value = value; + update(); + } + + Future getGuildProfile() async { + await safeCall( + call: () async => await rootLogic.chickenRepository.getProfile( + token: rootLogic.tokenService.accessToken.value!, + ), + onError: (error, stackTrace) {}, + onSuccess: (result) { + guildProfile.value = result; + }, + ); + } + + Future submitAllocation() async { + SubmitStewardAllocation stewardAllocation = SubmitStewardAllocation( + approvedPriceStatus: false, + allocationType: + '${guildProfile.value?.steward == true ? "steward" : "guild"}-${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', + sellerType: guildProfile.value?.steward == true ? "Steward" : "Guild", + buyerType: selectedGuildModel.value?.steward == true + ? "Steward" + : "Guild", + amount: pricePerKilo.value, + totalAmount: totalCost.value, + weightOfCarcasses: weight.value, + guildKey: selectedGuildModel.value?.key, + productKey: selectedProductModel.value?.key, + date: DateTime.now().formattedGregorianDate, + type: "manual", + ); + + safeCall( + call: () async => + await rootLogic.chickenRepository.postSubmitStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: stewardAllocation, + ), + + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stackTrace) {}, + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_within_province/view.dart b/packages/chicken/lib/presentation/pages/sales_within_province/view.dart new file mode 100644 index 0000000..7594cb2 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_within_province/view.dart @@ -0,0 +1,574 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class SalesWithinProvincePage extends GetView { + SalesWithinProvincePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: RAppBar(title: 'فروش در استان'), + body: SingleChildScrollView( + child: Column( + children: [ + inventoryWidget(), + allocationsMade(), + SizedBox(height: 20), + RElevated( + text: 'ثبت توزیع/ فروش', + onPressed: () { + showAddBottomSheet(); + }, + ), + SizedBox(height: 40), + ], + ), + ), + ); + } + + Widget inventoryWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text( + 'موجودی انبار', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(height: 4), + ObxValue( + (data) => data.isEmpty + ? Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 80, + padding: EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.rootLogic.inventoryList.length, + separatorBuilder: (context, index) => + const SizedBox(height: 8), + itemBuilder: (context, index) { + return ObxValue((expand) { + return GestureDetector( + onTap: () { + controller.rootLogic.toggleExpanded(index); + }, + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + onEnd: () { + controller + .rootLogic + .inventoryExpandedList[index] = !controller + .rootLogic + .inventoryExpandedList[index]!; + }, + margin: const EdgeInsets.symmetric(vertical: 2), + padding: EdgeInsets.all(6), + curve: Curves.easeInOut, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: AppColor.blueNormal, + width: 1, + ), + ), + duration: const Duration(seconds: 1), + height: expand.keys.contains(index) ? 250 : 80, + child: inventoryItem( + isExpanded: + expand.keys.contains(index) && expand[index]!, + index: index, + model: controller.rootLogic.inventoryList[index], + ), + ), + ); + }, controller.rootLogic.inventoryExpandedList); + }, + ), + controller.rootLogic.inventoryList, + ), + ], + ), + ); + } + + Widget inventoryItem({ + required bool isExpanded, + required int index, + required InventoryModel model, + }) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + buildRow('نام محصول', model.name ?? ''), + Visibility( + visible: isExpanded, + child: Column( + spacing: 8, + children: [ + buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), + buildRow( + 'وزن خریدهای آزاد داخل استان (کیلوگرم)', + model.receiveFreeCarcassesWeight.toString(), + ), + buildRow( + 'وزن خریدهای خارج استان (کیلوگرم)', + model.freeBuyingCarcassesWeight.toString(), + ), + buildRow( + 'کل ورودی به انبار (کیلوگرم)', + model.totalFreeBarsCarcassesWeight.toString(), + ), + buildRow( + 'کل فروش (کیلوگرم)', + model.realAllocatedWeight.toString(), + ), + buildRow( + 'مانده انبار (کیلوگرم)', + model.totalRemainWeight.toString(), + ), + ], + ), + ), + ], + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + ], + ), + ); + } + + Widget allocationsMade() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تخصیصات صورت گرفته', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + RElevated( + text: 'تایید یکجا', + height: 30, + onPressed: () { + controller.confirmAllAllocations(); + }, + ), + ], + ), + SizedBox(height: 4), + ObxValue((data) { + if (data.value == null) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ); + } else if (data.value?.results?.isEmpty ?? true) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), + ); + } else { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 700, + padding: const EdgeInsets.all(6), + child: ListView.separated( + padding: const EdgeInsets.all(8.0), + itemCount: data.value?.results?.length ?? 0, + itemBuilder: (BuildContext context, int index) { + final result = data.value!.results![index]; + return Card( + margin: const EdgeInsets.symmetric(vertical: 4.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide( + color: AppColor.blueNormal, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildRow('ردیف', '${index + 1}'), + buildRow( + 'تاریخ ثبت', + result.date!.formattedJalaliDate ?? 'N/A', + ), + buildRow( + 'نوع تخصیص', + result.allocation_type?.faAllocationType ?? 'N/A', + ), + buildRow( + 'مشخصات خریدار', + '${result.to_guilds?.user?.fullname} - ${result.to_guilds?.guilds_name}' ?? + 'N/A', + ), + buildRow( + 'مشخصات فروشنده', + result.steward?.user?.fullname ?? 'N/A', + ), + buildRow( + 'نوع فروش', + result.sell_type?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${result.amount ?? 0} ریال ', + ), + buildRow( + 'قیمت کل', + '${result.total_amount ?? 0} ریال', + ), + buildRow( + 'وزن تخصیصی', + '${result.weight_of_carcasses?.toInt() ?? 0} کیلوگرم', + ), + buildRow( + 'کداحراز', + result.registration_code?.toString() ?? 'N/A', + ), + buildRow( + 'وضعیت کد احراز', + result.system_registration_code == true + ? "ارسال شده" + : "ارسال نشده" ?? 'N/A', + ), + buildRow( + 'افت وزن(کیلوگرم)', + result.weight_loss_of_carcasses + ?.toInt() + .toString() ?? + 'N/A', + ), + buildRow( + 'وضعیت', + result.receiver_state?.faItem ?? 'N/A', + ), + + Row( + spacing: 10, + children: [ + Expanded( + child: RElevated( + height: 40, + text: 'تایید', + onPressed: () { + ConformAllocation confromation = + ConformAllocation( + allocation_key: result.key, + number_of_carcasses: + result.number_of_carcasses, + weight_of_carcasses: result + .weight_of_carcasses + ?.toInt(), + amount: result.amount, + total_amount: result.total_amount, + ); + + controller.confirmAllocation( + confromation, + ); + }, + ), + ), + Expanded( + child: RElevated( + height: 40, + backgroundColor: AppColor.error, + text: 'رد', + onPressed: () { + controller.denyAllocation( + result.key ?? '', + ); + }, + ), + ), + ], + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => + SizedBox(height: 8), + ), + ); + } + }, controller.allocatedMadeModel), + ], + ), + ); + } + + void showAddBottomSheet() { + Get.bottomSheet( + SafeArea( + child: BaseBottomSheet( + height: 700, + child: Padding( + padding: EdgeInsets.only( + left: 16, + right: 16, + top: 16, + bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'ثبت توزیع/ فروش', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material( + type: MaterialType.transparency, + child: productDropDown(), + ), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + Material( + type: MaterialType.transparency, + child: guildsDropDown(), + ), + + const SizedBox(height: 12), + RTextField( + controller: controller.weightController, + keyboardType: TextInputType.number, + onChanged: (p0) { + controller.weight.value = int.tryParse(p0) ?? 0; + }, + label: 'وزن لاشه', + ), + const SizedBox(height: 12), + RTextField( + controller: controller.pricePerKiloController, + onChanged: (p0) { + controller.pricePerKilo.value = int.tryParse(p0) ?? 0; + }, + keyboardType: TextInputType.number, + label: 'قیمت هر کیلو', + ), + const SizedBox(height: 12), + ObxValue( + (p0) => RTextField( + enabled: false, + keyboardType: TextInputType.number, + initText: controller.totalCost.value.toString(), + controller: controller.totalCostController, + label: 'هزینه کل', + ), + controller.totalCost, + ), + const SizedBox(height: 20), + ObxValue((data) { + return RElevated( + text: 'ثبت', + onPressed: data.value + ? () { + controller.submitAllocation(); + } + : null, + ); + }, controller.isValid), + const SizedBox(height: 20), + ], + ), + ), + ), + ), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); + } + + Widget guildsDropDown() { + return ObxValue((p0) { + return DropdownButtonFormField( + value: controller.selectedGuildModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب مباشر/صنف', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.guildsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text( + '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user?.fullname} (${guild.user?.mobile})', + ), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedGuild(value); + controller.checkVerfication(); + } + }, + ); + }, controller.guildsModel); + /* return GetBuilder( + builder: (controller) { + return DropdownButtonFormField( + value: controller.selectedGuildModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب مباشر/صنف', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.guildsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text( + '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user + ?.fullname} (${guild.user?.mobile})', + ), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedGuild(value); + } + }, + ); + }, + );*/ + } + + Widget productDropDown() { + return GetBuilder( + builder: (controller) { + return DropdownButtonFormField( + value: controller.selectedProductModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب محصول', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.rolesProductsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text('${guild.name}'), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedProduct(value); + controller.checkVerfication(); + } + }, + ); + }, + ); + } +} diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index bcc7a8e..ec0978b 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,5 +1,10 @@ import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_within_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_within_province/view.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; @@ -11,7 +16,27 @@ sealed class ChickenPages { name: ChickenRoutes.init, page: () => RootPage(), middlewares: [AuthMiddleware()], - binding: BindingsBuilder(() {}), + binding: BindingsBuilder(() { + Get.put(RootLogic()); + }), + ), + + GetPage( + name: ChickenRoutes.enteringTheWarehouse, + page: () => EnteringTheWarehousePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.put(EnteringTheWarehouseLogic()); + Get.put(RootLogic()); + }), + ), GetPage( + name: ChickenRoutes.salesWithinProvince, + page: () => SalesWithinProvincePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.put(SalesWithinProvinceLogic()); + Get.put(RootLogic()); + }), ), ]; } diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index 9fe67b5..ef1d2d2 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -1,6 +1,9 @@ sealed class ChickenRoutes { ChickenRoutes._(); + static const _base = '/init'; + static const init = '$_base/init'; - static const init = '/chicken/init'; + static const enteringTheWarehouse = '$_base/enteringTheWarehouse'; + static const salesWithinProvince = '$_base/SalesWithinProvincePage'; } diff --git a/packages/chicken/test/chicken_test.dart b/packages/chicken/test/chicken_test.dart deleted file mode 100644 index a8c331b..0000000 --- a/packages/chicken/test/chicken_test.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:chicken/chicken.dart'; -import 'package:test/test.dart'; - -void main() { - group('A group of tests', () { - final awesome = Awesome(); - - setUp(() { - // Additional setup goes here. - }); - - test('First Test', () { - expect(awesome.isAwesome, isTrue); - }); - }); -} diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index bdaabab..c98a137 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -44,3 +44,4 @@ export 'package:dio/dio.dart' show DioException; //utils export 'utils/logger_utils.dart'; export 'utils/safe_call_utils.dart'; +export 'utils/date_time_utils.dart'; diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index dc92ede..bec2bf5 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -1,6 +1,4 @@ -import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; -import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart'; @@ -14,30 +12,42 @@ class DioRemote implements IHttpClient { @override Future init() async { - final dio = Dio(BaseOptions(baseUrl: baseUrl??'')); + final dio = Dio(BaseOptions(baseUrl: baseUrl ?? '')); if (kDebugMode) { - dio.interceptors.add(PrettyDioLogger( - requestHeader: true, - responseHeader: true, - requestBody: true - )); + dio.interceptors.add( + PrettyDioLogger( + requestHeader: true, + responseHeader: true, + requestBody: true, + ), + ); } _dio = dio; } @override Future> get( - String path, { - Map? queryParameters, - Map? headers, - ProgressCallback? onReceiveProgress, - }) async { + String path, { + Map? queryParameters, + Map? headers, + ProgressCallback? onReceiveProgress, + T Function(Map json)? fromJson, + T Function(List json)? fromJsonList, + }) async { final response = await _dio.get( path, queryParameters: queryParameters, options: Options(headers: headers), onReceiveProgress: onReceiveProgress, ); + if (fromJsonList != null && response.data is List) { + response.data = fromJsonList(response.data); + return DioResponse(response); + } + if (fromJson != null && response.data is Map) { + response.data = fromJson(response.data); + return DioResponse(response); + } return DioResponse(response); } @@ -62,13 +72,14 @@ class DioRemote implements IHttpClient { if (fromJson != null) { final rawData = response.data; - final parsedData = - rawData is Map ? fromJson(rawData) : null; + final parsedData = rawData is Map + ? fromJson(rawData) + : null; response.data = parsedData; return DioResponse(response); } - return DioResponse(response ); + return DioResponse(response); } @override diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index c289778..9be3066 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -57,6 +57,9 @@ class $AssetsIconsGen { /// File path: assets/icons/information.svg SvgGenImage get information => const SvgGenImage('assets/icons/information.svg'); + /// File path: assets/icons/inside.svg + SvgGenImage get inside => const SvgGenImage('assets/icons/inside.svg'); + /// File path: assets/icons/inspection.svg SvgGenImage get inspection => const SvgGenImage('assets/icons/inspection.svg'); @@ -78,6 +81,9 @@ class $AssetsIconsGen { /// File path: assets/icons/message_add.svg SvgGenImage get messageAdd => const SvgGenImage('assets/icons/message_add.svg'); + /// File path: assets/icons/outside.svg + SvgGenImage get outside => const SvgGenImage('assets/icons/outside.svg'); + /// File path: assets/icons/pdf_download.svg SvgGenImage get pdfDownload => const SvgGenImage('assets/icons/pdf_download.svg'); @@ -129,6 +135,9 @@ class $AssetsIconsGen { /// File path: assets/icons/virtual.svg SvgGenImage get virtual => const SvgGenImage('assets/icons/virtual.svg'); + /// File path: assets/icons/whare_house.svg + SvgGenImage get whareHouse => const SvgGenImage('assets/icons/whare_house.svg'); + /// List of all assets List get values => [ add, @@ -145,6 +154,7 @@ class $AssetsIconsGen { filter, gps, information, + inside, inspection, key, liveStock, @@ -152,6 +162,7 @@ class $AssetsIconsGen { map, mapMarker, messageAdd, + outside, pdfDownload, pictureFrame, placeHolder, @@ -169,6 +180,7 @@ class $AssetsIconsGen { user, userSquare, virtual, + whareHouse, ]; } diff --git a/packages/core/lib/presentation/common/fonts.gen.dart b/packages/core/lib/presentation/common/fonts.gen.dart index 66ad118..9e7368f 100644 --- a/packages/core/lib/presentation/common/fonts.gen.dart +++ b/packages/core/lib/presentation/common/fonts.gen.dart @@ -10,6 +10,6 @@ class FontFamily { FontFamily._(); - /// Font family: yekan - static const String yekan = 'yekan'; + /// Font family: iranyekanregularfanum + static const String iranyekanregularfanum = 'iranyekanregularfanum'; } diff --git a/packages/core/lib/presentation/utils/data_time_utils.dart b/packages/core/lib/presentation/utils/data_time_utils.dart new file mode 100644 index 0000000..65bb382 --- /dev/null +++ b/packages/core/lib/presentation/utils/data_time_utils.dart @@ -0,0 +1,8 @@ +extension XDataTime on DateTime { + String get formattedGregorianDate { + + return "$year/${month.toString().padLeft(2, '0')}/${day.toString().padLeft(2, '0')}"; + } + + +} \ No newline at end of file diff --git a/packages/core/lib/presentation/utils/list_extensions.dart b/packages/core/lib/presentation/utils/list_extensions.dart index 746a00c..b97cced 100644 --- a/packages/core/lib/presentation/utils/list_extensions.dart +++ b/packages/core/lib/presentation/utils/list_extensions.dart @@ -1,9 +1,9 @@ extension ListExtensions on List { void toggle(T item) { if (contains(item)) { - if (length > 1) { + remove(item); - } + } else { add(item); } diff --git a/packages/core/lib/presentation/utils/utils.dart b/packages/core/lib/presentation/utils/utils.dart index edfacc8..507c240 100644 --- a/packages/core/lib/presentation/utils/utils.dart +++ b/packages/core/lib/presentation/utils/utils.dart @@ -1,2 +1,3 @@ export 'color_utils.dart'; -export 'list_extensions.dart'; \ No newline at end of file +export 'list_extensions.dart'; +export 'data_time_utils.dart'; \ No newline at end of file diff --git a/packages/core/lib/utils/date_time_utils.dart b/packages/core/lib/utils/date_time_utils.dart new file mode 100644 index 0000000..3244f49 --- /dev/null +++ b/packages/core/lib/utils/date_time_utils.dart @@ -0,0 +1,10 @@ +import 'package:persian_datetime_picker/persian_datetime_picker.dart'; + +extension xDateTime on String{ + get toDateTime => DateTime.parse(this); + get formattedJalaliDate{ + final dateTime = DateTime.parse(this); + final jalaliDate = Jalali.fromDateTime(dateTime); + return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; + } +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 69a73b6..361ece4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -60,6 +60,9 @@ flutter: assets: - assets/icons/ + - assets/icons/inside.svg + - assets/icons/outside.svg + - assets/icons/whare_house.svg - assets/images/ - assets/logos/ - assets/vec/ From 34ce98d31fd9dfda7235f0c4c88957acbe593a66 Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 6 Jun 2025 09:27:11 +0330 Subject: [PATCH 103/256] some change --- .../steward_free_bar/steward_free_bar.dart | 152 +++++ .../steward_free_bar_dashboard.dart | 17 + .../lib/presentation/pages/root/view.dart | 4 +- .../pages/sales_with_out_province/logic.dart | 205 ++++++ .../pages/sales_with_out_province/view.dart | 604 ++++++++++++++++++ .../lib/presentation/routes/pages.dart | 14 +- .../lib/presentation/routes/routes.dart | 1 + 7 files changed, 995 insertions(+), 2 deletions(-) create mode 100644 packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart create mode 100644 packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart new file mode 100644 index 0000000..359451a --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart @@ -0,0 +1,152 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'steward_free_bar.freezed.dart'; +part 'steward_free_bar.g.dart'; + +@freezed +abstract class StewardFreeBar with _$StewardFreeBar { + const factory StewardFreeBar({ + int? count, + String? next, + String? previous, + List? results, + }) = _StewardFreeBar; + + factory StewardFreeBar.fromJson(Map json) => + _$StewardFreeBarFromJson(json); +} + +@freezed +abstract class Result with _$Result { + const factory Result({ + int? id, + Steward? steward, + dynamic guild, + Product? product, + String? key, + String? create_date, + String? modify_date, + bool? trash, + String? kill_house_name, + String? kill_house_mobile, + String? kill_house_vet_name, + String? kill_house_vet_mobile, + String? province, + String? city, + String? driver_name, + String? driver_mobile, + dynamic car, + String? pelak, + int? number_of_carcasses, + int? weight_of_carcasses, + String? bar_image, + String? date, + bool? temporary_trash, + bool? temporary_deleted, + String? created_by, + String? modified_by, + }) = _Result; + + factory Result.fromJson(Map json) => _$ResultFromJson(json); +} + +@freezed +abstract class Steward with _$Steward { + const factory Steward({ + User? user, + String? guilds_name, + bool? steward, + dynamic allocation_limit, + Address? address, + String? license_number, + String? type_activity, + String? area_activity, + String? guilds_id, + String? create_date, + }) = _Steward; + + factory Steward.fromJson(Map json) => _$StewardFromJson(json); +} + +@freezed +abstract class User with _$User { + const factory User({ + String? fullname, + String? first_name, + String? last_name, + int? base_order, + String? mobile, + String? national_id, + String? national_code, + String? key, + City? city, + String? unit_name, + String? unit_national_id, + String? unit_registration_number, + String? unit_economical_number, + String? unit_province, + String? unit_city, + String? unit_postal_code, + String? unit_address, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} + +@freezed +abstract class City with _$City { + const factory City({ + int? id, + String? key, + String? create_date, + String? modify_date, + bool? trash, + int? province_id_foreign_key, + int? city_id_key, + String? name, + int? product_price, + bool? province_center, + int? city_number, + String? city_name, + int? province_number, + String? province_name, + String? created_by, + String? modified_by, + int? province, + }) = _City; + + factory City.fromJson(Map json) => _$CityFromJson(json); +} + +@freezed +abstract class Address with _$Address { + const factory Address({ + Province? province, + City? city, + String? address, + String? postal_code, + }) = _Address; + + factory Address.fromJson(Map json) => _$AddressFromJson(json); +} + +@freezed +abstract class Province with _$Province { + const factory Province({ + String? key, + String? name, + }) = _Province; + + factory Province.fromJson(Map json) => + _$ProvinceFromJson(json); +} + +@freezed +abstract class Product with _$Product { + const factory Product({ + String? key, + String? name, + }) = _Product; + + factory Product.fromJson(Map json) => _$ProductFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart new file mode 100644 index 0000000..11bcb46 --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'steward_free_bar_dashboard.freezed.dart'; +part 'steward_free_bar_dashboard.g.dart'; + +@freezed +abstract class StewardFreeBarDashboard with _$StewardFreeBarDashboard { + const factory StewardFreeBarDashboard({ + String? product, + int? totalBars, + double? totalQuantity, + double? totalWeight, + }) = _StewardFreeBarDashboard; + + factory StewardFreeBarDashboard.fromJson(Map json) => + _$StewardFreeBarDashboardFromJson(json); +} diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 2fb3977..9fe687d 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -42,7 +42,9 @@ class RootPage extends GetView { cardWidget( title: 'فروش خارج استان', iconPath: Assets.icons.outside.path, - onTap: () {}, + onTap: () { + Get.toNamed(ChickenRoutes.salesWithOutProvince); + }, ), ], ), diff --git a/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart new file mode 100644 index 0000000..da14cb4 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart @@ -0,0 +1,205 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +class SalesWithOutProvinceLogic extends GetxController { + var rootLogic = Get.find(); + Rxn allocatedMadeModel = Rxn(); + RxList rolesProductsModel = RxList(); + + RxList guildsModel = [].obs; + + Rxn stewardFreeDashboard = Rxn(); + + + @override + void onInit() { + super.onInit(); + rootLogic.getInventory(); + getAllocatedMade(); + getRolesProducts(); + getGuilds(); + getGuildProfile(); + ever(saleType, (callback) { + getGuilds(); + }); + + weight.listen((num) { + totalCost.value = num * pricePerKilo.value; + }); + + pricePerKilo.listen((num) { + totalCost.value = num * weight.value; + }); + + totalCost.listen((data) { + totalCostController.text = data.toString(); + + isValid.value = + weight.value > 0 && + pricePerKilo.value > 0 && + totalCost.value > 0 && + selectedProductModel.value != null && + selectedGuildModel.value != null; + }); + } + + Future getAllocatedMade() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getAllocatedMade( + token: rootLogic.tokenService.accessToken.value!, + page: 1, + ), + onSuccess: (result) { + if (result != null) { + allocatedMadeModel.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } + + void checkVerfication() { + isValid.value = + weight.value > 0 && + pricePerKilo.value > 0 && + totalCost.value > 0 && + selectedProductModel.value != null && + selectedGuildModel.value != null; + } + + void confirmAllocation(ConformAllocation allocation) { + safeCall( + call: () async => await rootLogic.chickenRepository.confirmAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocation: allocation.toJson(), + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + void denyAllocation(String token) { + safeCall( + call: () async => await rootLogic.chickenRepository.denyAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocationToken: token, + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + Future confirmAllAllocations() async { + safeCall( + call: () async => await rootLogic.chickenRepository.confirmAllAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocationTokens: + allocatedMadeModel.value?.results?.map((e) => e.key!).toList() ?? + [], + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + Future getRolesProducts() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getRolesProducts( + token: rootLogic.tokenService.accessToken.value!, + ), + onSuccess: (result) { + if (result != null) { + rolesProductsModel.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } + + Future getGuilds() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getGuilds( + token: rootLogic.tokenService.accessToken.value!, + isFree: saleType.value == 2 ? true : false, + ), + onSuccess: (result) { + if (result != null) { + guildsModel.clear(); + guildsModel.addAll(result); + } + }, + onError: (error, stacktrace) {}, + ); + } + + Future addSale() async {} + + void setSelectedGuild(GuildModel value) { + selectedGuildModel.value = value; + update(); + } + + void setSelectedProduct(ProductModel value) { + selectedProductModel.value = value; + update(); + } + + Future getGuildProfile() async { + await safeCall( + call: () async => await rootLogic.chickenRepository.getProfile( + token: rootLogic.tokenService.accessToken.value!, + ), + onError: (error, stackTrace) {}, + onSuccess: (result) { + guildProfile.value = result; + }, + ); + } + + Future submitAllocation() async { + SubmitStewardAllocation stewardAllocation = SubmitStewardAllocation( + approvedPriceStatus: false, + allocationType: + '${guildProfile.value?.steward == true ? "steward" : "guild"}-${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', + sellerType: guildProfile.value?.steward == true ? "Steward" : "Guild", + buyerType: selectedGuildModel.value?.steward == true + ? "Steward" + : "Guild", + amount: pricePerKilo.value, + totalAmount: totalCost.value, + weightOfCarcasses: weight.value, + guildKey: selectedGuildModel.value?.key, + productKey: selectedProductModel.value?.key, + date: DateTime.now().formattedGregorianDate, + type: "manual", + ); + + safeCall( + call: () async => + await rootLogic.chickenRepository.postSubmitStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: stewardAllocation, + ), + + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stackTrace) {}, + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart b/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart new file mode 100644 index 0000000..5017f06 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart @@ -0,0 +1,604 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class SalesWithOutProvincePage extends GetView { + SalesWithOutProvincePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: RAppBar(title: 'فروش خارج استان'), + body: SingleChildScrollView( + child: Column( + spacing: 10, + children: [ + ObxValue( + (model) => summaryOfInformation(model.value), + controller.stewardFreeDashboard, + ), + ], + ), + ), + ); + } + + Widget summaryOfInformation(StewardFreeBarDashboard? model) { + return Column( + children: [ + Text( + 'خلاصه اطلاعات', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Container( + height: 140, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: model == null + ? const Center(child: CircularProgressIndicator()) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + const SizedBox(height: 12), + buildRow('تعداد کل بارها', model.totalQuantity.toString()), + buildRow('تعداد کل', model.totalBars.toString()), + buildRow('وزن کل (کیلوگرم)', model.totalWeight.toString()), + ], + ), + ), + ], + ); + } + + Widget inventoryWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text( + 'موجودی انبار', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(height: 4), + ObxValue( + (data) => data.isEmpty + ? Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 80, + padding: EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.rootLogic.inventoryList.length, + separatorBuilder: (context, index) => + const SizedBox(height: 8), + itemBuilder: (context, index) { + return ObxValue((expand) { + return GestureDetector( + onTap: () { + controller.rootLogic.toggleExpanded(index); + }, + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + onEnd: () { + controller + .rootLogic + .inventoryExpandedList[index] = !controller + .rootLogic + .inventoryExpandedList[index]!; + }, + margin: const EdgeInsets.symmetric(vertical: 2), + padding: EdgeInsets.all(6), + curve: Curves.easeInOut, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: AppColor.blueNormal, + width: 1, + ), + ), + duration: const Duration(seconds: 1), + height: expand.keys.contains(index) ? 250 : 80, + child: inventoryItem( + isExpanded: + expand.keys.contains(index) && expand[index]!, + index: index, + model: controller.rootLogic.inventoryList[index], + ), + ), + ); + }, controller.rootLogic.inventoryExpandedList); + }, + ), + controller.rootLogic.inventoryList, + ), + ], + ), + ); + } + + Widget inventoryItem({ + required bool isExpanded, + required int index, + required InventoryModel model, + }) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + buildRow('نام محصول', model.name ?? ''), + Visibility( + visible: isExpanded, + child: Column( + spacing: 8, + children: [ + buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), + buildRow( + 'وزن خریدهای آزاد داخل استان (کیلوگرم)', + model.receiveFreeCarcassesWeight.toString(), + ), + buildRow( + 'وزن خریدهای خارج استان (کیلوگرم)', + model.freeBuyingCarcassesWeight.toString(), + ), + buildRow( + 'کل ورودی به انبار (کیلوگرم)', + model.totalFreeBarsCarcassesWeight.toString(), + ), + buildRow( + 'کل فروش (کیلوگرم)', + model.realAllocatedWeight.toString(), + ), + buildRow( + 'مانده انبار (کیلوگرم)', + model.totalRemainWeight.toString(), + ), + ], + ), + ), + ], + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + ], + ), + ); + } + + Widget allocationsMade() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تخصیصات صورت گرفته', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + RElevated( + text: 'تایید یکجا', + height: 30, + onPressed: () { + controller.confirmAllAllocations(); + }, + ), + ], + ), + SizedBox(height: 4), + ObxValue((data) { + if (data.value == null) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ); + } else if (data.value?.results?.isEmpty ?? true) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), + ); + } else { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 700, + padding: const EdgeInsets.all(6), + child: ListView.separated( + padding: const EdgeInsets.all(8.0), + itemCount: data.value?.results?.length ?? 0, + itemBuilder: (BuildContext context, int index) { + final result = data.value!.results![index]; + return Card( + margin: const EdgeInsets.symmetric(vertical: 4.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide( + color: AppColor.blueNormal, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildRow('ردیف', '${index + 1}'), + buildRow( + 'تاریخ ثبت', + result.date!.formattedJalaliDate ?? 'N/A', + ), + buildRow( + 'نوع تخصیص', + result.allocation_type?.faAllocationType ?? 'N/A', + ), + buildRow( + 'مشخصات خریدار', + '${result.to_guilds?.user?.fullname} - ${result.to_guilds?.guilds_name}' ?? + 'N/A', + ), + buildRow( + 'مشخصات فروشنده', + result.steward?.user?.fullname ?? 'N/A', + ), + buildRow( + 'نوع فروش', + result.sell_type?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${result.amount ?? 0} ریال ', + ), + buildRow( + 'قیمت کل', + '${result.total_amount ?? 0} ریال', + ), + buildRow( + 'وزن تخصیصی', + '${result.weight_of_carcasses?.toInt() ?? 0} کیلوگرم', + ), + buildRow( + 'کداحراز', + result.registration_code?.toString() ?? 'N/A', + ), + buildRow( + 'وضعیت کد احراز', + result.system_registration_code == true + ? "ارسال شده" + : "ارسال نشده" ?? 'N/A', + ), + buildRow( + 'افت وزن(کیلوگرم)', + result.weight_loss_of_carcasses + ?.toInt() + .toString() ?? + 'N/A', + ), + buildRow( + 'وضعیت', + result.receiver_state?.faItem ?? 'N/A', + ), + + Row( + spacing: 10, + children: [ + Expanded( + child: RElevated( + height: 40, + text: 'تایید', + onPressed: () { + ConformAllocation confromation = + ConformAllocation( + allocation_key: result.key, + number_of_carcasses: + result.number_of_carcasses, + weight_of_carcasses: result + .weight_of_carcasses + ?.toInt(), + amount: result.amount, + total_amount: result.total_amount, + ); + + controller.confirmAllocation( + confromation, + ); + }, + ), + ), + Expanded( + child: RElevated( + height: 40, + backgroundColor: AppColor.error, + text: 'رد', + onPressed: () { + controller.denyAllocation( + result.key ?? '', + ); + }, + ), + ), + ], + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => + SizedBox(height: 8), + ), + ); + } + }, controller.allocatedMadeModel), + ], + ), + ); + } + + void showAddBottomSheet() { + Get.bottomSheet( + SafeArea( + child: BaseBottomSheet( + height: 700, + child: Padding( + padding: EdgeInsets.only( + left: 16, + right: 16, + top: 16, + bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'ثبت توزیع/ فروش', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material( + type: MaterialType.transparency, + child: productDropDown(), + ), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + Material( + type: MaterialType.transparency, + child: guildsDropDown(), + ), + + const SizedBox(height: 12), + RTextField( + controller: controller.weightController, + keyboardType: TextInputType.number, + onChanged: (p0) { + controller.weight.value = int.tryParse(p0) ?? 0; + }, + label: 'وزن لاشه', + ), + const SizedBox(height: 12), + RTextField( + controller: controller.pricePerKiloController, + onChanged: (p0) { + controller.pricePerKilo.value = int.tryParse(p0) ?? 0; + }, + keyboardType: TextInputType.number, + label: 'قیمت هر کیلو', + ), + const SizedBox(height: 12), + ObxValue( + (p0) => RTextField( + enabled: false, + keyboardType: TextInputType.number, + initText: controller.totalCost.value.toString(), + controller: controller.totalCostController, + label: 'هزینه کل', + ), + controller.totalCost, + ), + const SizedBox(height: 20), + ObxValue((data) { + return RElevated( + text: 'ثبت', + onPressed: data.value + ? () { + controller.submitAllocation(); + } + : null, + ); + }, controller.isValid), + const SizedBox(height: 20), + ], + ), + ), + ), + ), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); + } + + Widget guildsDropDown() { + return ObxValue((p0) { + return DropdownButtonFormField( + value: controller.selectedGuildModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب مباشر/صنف', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.guildsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text( + '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user?.fullname} (${guild.user?.mobile})', + ), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedGuild(value); + controller.checkVerfication(); + } + }, + ); + }, controller.guildsModel); + /* return GetBuilder( + builder: (controller) { + return DropdownButtonFormField( + value: controller.selectedGuildModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب مباشر/صنف', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.guildsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text( + '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user + ?.fullname} (${guild.user?.mobile})', + ), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedGuild(value); + } + }, + ); + }, + );*/ + } + + Widget productDropDown() { + return GetBuilder( + builder: (controller) { + return DropdownButtonFormField( + value: controller.selectedProductModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب محصول', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.rolesProductsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text('${guild.name}'), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedProduct(value); + controller.checkVerfication(); + } + }, + ); + }, + ); + } +} diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index ec0978b..1e794c0 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -3,6 +3,8 @@ import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/logic import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/view.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_with_out_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_with_out_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_within_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_within_province/view.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; @@ -29,7 +31,8 @@ sealed class ChickenPages { Get.put(EnteringTheWarehouseLogic()); Get.put(RootLogic()); }), - ), GetPage( + ), + GetPage( name: ChickenRoutes.salesWithinProvince, page: () => SalesWithinProvincePage(), middlewares: [AuthMiddleware()], @@ -38,5 +41,14 @@ sealed class ChickenPages { Get.put(RootLogic()); }), ), + GetPage( + name: ChickenRoutes.salesWithOutProvince, + page: () => SalesWithOutProvincePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.put(SalesWithOutProvinceLogic()); + Get.put(RootLogic()); + }), + ), ]; } diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index ef1d2d2..7f47386 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -5,5 +5,6 @@ sealed class ChickenRoutes { static const enteringTheWarehouse = '$_base/enteringTheWarehouse'; static const salesWithinProvince = '$_base/SalesWithinProvincePage'; + static const salesWithOutProvince = '$_base/SalesWithOutProvincePage'; } From 857ae6b5501c7dd2da1b8a663f8413f505eb569d Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 6 Jun 2025 09:27:15 +0330 Subject: [PATCH 104/256] some change --- .../steward_free_bar.freezed.dart | 1477 +++++++++++++++++ .../steward_free_bar/steward_free_bar.g.dart | 233 +++ .../steward_free_bar_dashboard.freezed.dart | 157 ++ .../steward_free_bar_dashboard.g.dart | 25 + 4 files changed, 1892 insertions(+) create mode 100644 packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart create mode 100644 packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.g.dart diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart new file mode 100644 index 0000000..84c082a --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart @@ -0,0 +1,1477 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'steward_free_bar.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$StewardFreeBar { + + int? get count; String? get next; String? get previous; List? get results; +/// Create a copy of StewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StewardFreeBarCopyWith get copyWith => _$StewardFreeBarCopyWithImpl(this as StewardFreeBar, _$identity); + + /// Serializes this StewardFreeBar to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardFreeBar&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); + +@override +String toString() { + return 'StewardFreeBar(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class $StewardFreeBarCopyWith<$Res> { + factory $StewardFreeBarCopyWith(StewardFreeBar value, $Res Function(StewardFreeBar) _then) = _$StewardFreeBarCopyWithImpl; +@useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class _$StewardFreeBarCopyWithImpl<$Res> + implements $StewardFreeBarCopyWith<$Res> { + _$StewardFreeBarCopyWithImpl(this._self, this._then); + + final StewardFreeBar _self; + final $Res Function(StewardFreeBar) _then; + +/// Create a copy of StewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_self.copyWith( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self.results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _StewardFreeBar implements StewardFreeBar { + const _StewardFreeBar({this.count, this.next, this.previous, final List? results}): _results = results; + factory _StewardFreeBar.fromJson(Map json) => _$StewardFreeBarFromJson(json); + +@override final int? count; +@override final String? next; +@override final String? previous; + final List? _results; +@override List? get results { + final value = _results; + if (value == null) return null; + if (_results is EqualUnmodifiableListView) return _results; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of StewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$StewardFreeBarCopyWith<_StewardFreeBar> get copyWith => __$StewardFreeBarCopyWithImpl<_StewardFreeBar>(this, _$identity); + +@override +Map toJson() { + return _$StewardFreeBarToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardFreeBar&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); + +@override +String toString() { + return 'StewardFreeBar(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class _$StewardFreeBarCopyWith<$Res> implements $StewardFreeBarCopyWith<$Res> { + factory _$StewardFreeBarCopyWith(_StewardFreeBar value, $Res Function(_StewardFreeBar) _then) = __$StewardFreeBarCopyWithImpl; +@override @useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class __$StewardFreeBarCopyWithImpl<$Res> + implements _$StewardFreeBarCopyWith<$Res> { + __$StewardFreeBarCopyWithImpl(this._self, this._then); + + final _StewardFreeBar _self; + final $Res Function(_StewardFreeBar) _then; + +/// Create a copy of StewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_StewardFreeBar( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self._results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + + +} + + +/// @nodoc +mixin _$Result { + + int? get id; Steward? get steward; dynamic get guild; Product? get product; String? get key; String? get create_date; String? get modify_date; bool? get trash; String? get kill_house_name; String? get kill_house_mobile; String? get kill_house_vet_name; String? get kill_house_vet_mobile; String? get province; String? get city; String? get driver_name; String? get driver_mobile; dynamic get car; String? get pelak; int? get number_of_carcasses; int? get weight_of_carcasses; String? get bar_image; String? get date; bool? get temporary_trash; bool? get temporary_deleted; String? get created_by; String? get modified_by; +/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ResultCopyWith get copyWith => _$ResultCopyWithImpl(this as Result, _$identity); + + /// Serializes this Result to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.kill_house_name, kill_house_name) || other.kill_house_name == kill_house_name)&&(identical(other.kill_house_mobile, kill_house_mobile) || other.kill_house_mobile == kill_house_mobile)&&(identical(other.kill_house_vet_name, kill_house_vet_name) || other.kill_house_vet_name == kill_house_vet_name)&&(identical(other.kill_house_vet_mobile, kill_house_vet_mobile) || other.kill_house_vet_mobile == kill_house_vet_mobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driver_name, driver_name) || other.driver_name == driver_name)&&(identical(other.driver_mobile, driver_mobile) || other.driver_mobile == driver_mobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.bar_image, bar_image) || other.bar_image == bar_image)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,create_date,modify_date,trash,kill_house_name,kill_house_mobile,kill_house_vet_name,kill_house_vet_mobile,province,city,driver_name,driver_mobile,const DeepCollectionEquality().hash(car),pelak,number_of_carcasses,weight_of_carcasses,bar_image,date,temporary_trash,temporary_deleted,created_by,modified_by]); + +@override +String toString() { + return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, kill_house_name: $kill_house_name, kill_house_mobile: $kill_house_mobile, kill_house_vet_name: $kill_house_vet_name, kill_house_vet_mobile: $kill_house_vet_mobile, province: $province, city: $city, driver_name: $driver_name, driver_mobile: $driver_mobile, car: $car, pelak: $pelak, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, bar_image: $bar_image, date: $date, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by)'; +} + + +} + +/// @nodoc +abstract mixin class $ResultCopyWith<$Res> { + factory $ResultCopyWith(Result value, $Res Function(Result) _then) = _$ResultCopyWithImpl; +@useResult +$Res call({ + int? id, Steward? steward, dynamic guild, Product? product, String? key, String? create_date, String? modify_date, bool? trash, String? kill_house_name, String? kill_house_mobile, String? kill_house_vet_name, String? kill_house_vet_mobile, String? province, String? city, String? driver_name, String? driver_mobile, dynamic car, String? pelak, int? number_of_carcasses, int? weight_of_carcasses, String? bar_image, String? date, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by +}); + + +$StewardCopyWith<$Res>? get steward;$ProductCopyWith<$Res>? get product; + +} +/// @nodoc +class _$ResultCopyWithImpl<$Res> + implements $ResultCopyWith<$Res> { + _$ResultCopyWithImpl(this._self, this._then); + + final Result _self; + final $Res Function(Result) _then; + +/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? kill_house_name = freezed,Object? kill_house_mobile = freezed,Object? kill_house_vet_name = freezed,Object? kill_house_vet_mobile = freezed,Object? province = freezed,Object? city = freezed,Object? driver_name = freezed,Object? driver_mobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? bar_image = freezed,Object? date = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as Steward?,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as Product?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,kill_house_name: freezed == kill_house_name ? _self.kill_house_name : kill_house_name // ignore: cast_nullable_to_non_nullable +as String?,kill_house_mobile: freezed == kill_house_mobile ? _self.kill_house_mobile : kill_house_mobile // ignore: cast_nullable_to_non_nullable +as String?,kill_house_vet_name: freezed == kill_house_vet_name ? _self.kill_house_vet_name : kill_house_vet_name // ignore: cast_nullable_to_non_nullable +as String?,kill_house_vet_mobile: freezed == kill_house_vet_mobile ? _self.kill_house_vet_mobile : kill_house_vet_mobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,driver_name: freezed == driver_name ? _self.driver_name : driver_name // ignore: cast_nullable_to_non_nullable +as String?,driver_mobile: freezed == driver_mobile ? _self.driver_mobile : driver_mobile // ignore: cast_nullable_to_non_nullable +as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,pelak: freezed == pelak ? _self.pelak : pelak // ignore: cast_nullable_to_non_nullable +as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,bar_image: freezed == bar_image ? _self.bar_image : bar_image // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable +as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get steward { + if (_self.steward == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); + }); +}/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Result implements Result { + const _Result({this.id, this.steward, this.guild, this.product, this.key, this.create_date, this.modify_date, this.trash, this.kill_house_name, this.kill_house_mobile, this.kill_house_vet_name, this.kill_house_vet_mobile, this.province, this.city, this.driver_name, this.driver_mobile, this.car, this.pelak, this.number_of_carcasses, this.weight_of_carcasses, this.bar_image, this.date, this.temporary_trash, this.temporary_deleted, this.created_by, this.modified_by}); + factory _Result.fromJson(Map json) => _$ResultFromJson(json); + +@override final int? id; +@override final Steward? steward; +@override final dynamic guild; +@override final Product? product; +@override final String? key; +@override final String? create_date; +@override final String? modify_date; +@override final bool? trash; +@override final String? kill_house_name; +@override final String? kill_house_mobile; +@override final String? kill_house_vet_name; +@override final String? kill_house_vet_mobile; +@override final String? province; +@override final String? city; +@override final String? driver_name; +@override final String? driver_mobile; +@override final dynamic car; +@override final String? pelak; +@override final int? number_of_carcasses; +@override final int? weight_of_carcasses; +@override final String? bar_image; +@override final String? date; +@override final bool? temporary_trash; +@override final bool? temporary_deleted; +@override final String? created_by; +@override final String? modified_by; + +/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ResultCopyWith<_Result> get copyWith => __$ResultCopyWithImpl<_Result>(this, _$identity); + +@override +Map toJson() { + return _$ResultToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.kill_house_name, kill_house_name) || other.kill_house_name == kill_house_name)&&(identical(other.kill_house_mobile, kill_house_mobile) || other.kill_house_mobile == kill_house_mobile)&&(identical(other.kill_house_vet_name, kill_house_vet_name) || other.kill_house_vet_name == kill_house_vet_name)&&(identical(other.kill_house_vet_mobile, kill_house_vet_mobile) || other.kill_house_vet_mobile == kill_house_vet_mobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driver_name, driver_name) || other.driver_name == driver_name)&&(identical(other.driver_mobile, driver_mobile) || other.driver_mobile == driver_mobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.bar_image, bar_image) || other.bar_image == bar_image)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,create_date,modify_date,trash,kill_house_name,kill_house_mobile,kill_house_vet_name,kill_house_vet_mobile,province,city,driver_name,driver_mobile,const DeepCollectionEquality().hash(car),pelak,number_of_carcasses,weight_of_carcasses,bar_image,date,temporary_trash,temporary_deleted,created_by,modified_by]); + +@override +String toString() { + return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, kill_house_name: $kill_house_name, kill_house_mobile: $kill_house_mobile, kill_house_vet_name: $kill_house_vet_name, kill_house_vet_mobile: $kill_house_vet_mobile, province: $province, city: $city, driver_name: $driver_name, driver_mobile: $driver_mobile, car: $car, pelak: $pelak, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, bar_image: $bar_image, date: $date, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by)'; +} + + +} + +/// @nodoc +abstract mixin class _$ResultCopyWith<$Res> implements $ResultCopyWith<$Res> { + factory _$ResultCopyWith(_Result value, $Res Function(_Result) _then) = __$ResultCopyWithImpl; +@override @useResult +$Res call({ + int? id, Steward? steward, dynamic guild, Product? product, String? key, String? create_date, String? modify_date, bool? trash, String? kill_house_name, String? kill_house_mobile, String? kill_house_vet_name, String? kill_house_vet_mobile, String? province, String? city, String? driver_name, String? driver_mobile, dynamic car, String? pelak, int? number_of_carcasses, int? weight_of_carcasses, String? bar_image, String? date, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by +}); + + +@override $StewardCopyWith<$Res>? get steward;@override $ProductCopyWith<$Res>? get product; + +} +/// @nodoc +class __$ResultCopyWithImpl<$Res> + implements _$ResultCopyWith<$Res> { + __$ResultCopyWithImpl(this._self, this._then); + + final _Result _self; + final $Res Function(_Result) _then; + +/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? kill_house_name = freezed,Object? kill_house_mobile = freezed,Object? kill_house_vet_name = freezed,Object? kill_house_vet_mobile = freezed,Object? province = freezed,Object? city = freezed,Object? driver_name = freezed,Object? driver_mobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? bar_image = freezed,Object? date = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,}) { + return _then(_Result( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as Steward?,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as Product?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,kill_house_name: freezed == kill_house_name ? _self.kill_house_name : kill_house_name // ignore: cast_nullable_to_non_nullable +as String?,kill_house_mobile: freezed == kill_house_mobile ? _self.kill_house_mobile : kill_house_mobile // ignore: cast_nullable_to_non_nullable +as String?,kill_house_vet_name: freezed == kill_house_vet_name ? _self.kill_house_vet_name : kill_house_vet_name // ignore: cast_nullable_to_non_nullable +as String?,kill_house_vet_mobile: freezed == kill_house_vet_mobile ? _self.kill_house_vet_mobile : kill_house_vet_mobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,driver_name: freezed == driver_name ? _self.driver_name : driver_name // ignore: cast_nullable_to_non_nullable +as String?,driver_mobile: freezed == driver_mobile ? _self.driver_mobile : driver_mobile // ignore: cast_nullable_to_non_nullable +as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,pelak: freezed == pelak ? _self.pelak : pelak // ignore: cast_nullable_to_non_nullable +as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable +as int?,bar_image: freezed == bar_image ? _self.bar_image : bar_image // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable +as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable +as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get steward { + if (_self.steward == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); + }); +}/// Create a copy of Result +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + + return $ProductCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +} +} + + +/// @nodoc +mixin _$Steward { + + User? get user; String? get guilds_name; bool? get steward; dynamic get allocation_limit; Address? get address; String? get license_number; String? get type_activity; String? get area_activity; String? get guilds_id; String? get create_date; +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StewardCopyWith get copyWith => _$StewardCopyWithImpl(this as Steward, _$identity); + + /// Serializes this Steward to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Steward&&(identical(other.user, user) || other.user == user)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.address, address) || other.address == address)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.create_date, create_date) || other.create_date == create_date)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user,guilds_name,steward,const DeepCollectionEquality().hash(allocation_limit),address,license_number,type_activity,area_activity,guilds_id,create_date); + +@override +String toString() { + return 'Steward(user: $user, guilds_name: $guilds_name, steward: $steward, allocation_limit: $allocation_limit, address: $address, license_number: $license_number, type_activity: $type_activity, area_activity: $area_activity, guilds_id: $guilds_id, create_date: $create_date)'; +} + + +} + +/// @nodoc +abstract mixin class $StewardCopyWith<$Res> { + factory $StewardCopyWith(Steward value, $Res Function(Steward) _then) = _$StewardCopyWithImpl; +@useResult +$Res call({ + User? user, String? guilds_name, bool? steward, dynamic allocation_limit, Address? address, String? license_number, String? type_activity, String? area_activity, String? guilds_id, String? create_date +}); + + +$UserCopyWith<$Res>? get user;$AddressCopyWith<$Res>? get address; + +} +/// @nodoc +class _$StewardCopyWithImpl<$Res> + implements $StewardCopyWith<$Res> { + _$StewardCopyWithImpl(this._self, this._then); + + final Steward _self; + final $Res Function(Steward) _then; + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? user = freezed,Object? guilds_name = freezed,Object? steward = freezed,Object? allocation_limit = freezed,Object? address = freezed,Object? license_number = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? guilds_id = freezed,Object? create_date = freezed,}) { + return _then(_self.copyWith( +user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable +as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable +as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable +as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Steward implements Steward { + const _Steward({this.user, this.guilds_name, this.steward, this.allocation_limit, this.address, this.license_number, this.type_activity, this.area_activity, this.guilds_id, this.create_date}); + factory _Steward.fromJson(Map json) => _$StewardFromJson(json); + +@override final User? user; +@override final String? guilds_name; +@override final bool? steward; +@override final dynamic allocation_limit; +@override final Address? address; +@override final String? license_number; +@override final String? type_activity; +@override final String? area_activity; +@override final String? guilds_id; +@override final String? create_date; + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$StewardCopyWith<_Steward> get copyWith => __$StewardCopyWithImpl<_Steward>(this, _$identity); + +@override +Map toJson() { + return _$StewardToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Steward&&(identical(other.user, user) || other.user == user)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.address, address) || other.address == address)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.create_date, create_date) || other.create_date == create_date)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user,guilds_name,steward,const DeepCollectionEquality().hash(allocation_limit),address,license_number,type_activity,area_activity,guilds_id,create_date); + +@override +String toString() { + return 'Steward(user: $user, guilds_name: $guilds_name, steward: $steward, allocation_limit: $allocation_limit, address: $address, license_number: $license_number, type_activity: $type_activity, area_activity: $area_activity, guilds_id: $guilds_id, create_date: $create_date)'; +} + + +} + +/// @nodoc +abstract mixin class _$StewardCopyWith<$Res> implements $StewardCopyWith<$Res> { + factory _$StewardCopyWith(_Steward value, $Res Function(_Steward) _then) = __$StewardCopyWithImpl; +@override @useResult +$Res call({ + User? user, String? guilds_name, bool? steward, dynamic allocation_limit, Address? address, String? license_number, String? type_activity, String? area_activity, String? guilds_id, String? create_date +}); + + +@override $UserCopyWith<$Res>? get user;@override $AddressCopyWith<$Res>? get address; + +} +/// @nodoc +class __$StewardCopyWithImpl<$Res> + implements _$StewardCopyWith<$Res> { + __$StewardCopyWithImpl(this._self, this._then); + + final _Steward _self; + final $Res Function(_Steward) _then; + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? user = freezed,Object? guilds_name = freezed,Object? steward = freezed,Object? allocation_limit = freezed,Object? address = freezed,Object? license_number = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? guilds_id = freezed,Object? create_date = freezed,}) { + return _then(_Steward( +user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable +as dynamic,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable +as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable +as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable +as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of Steward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + String? get fullname; String? get first_name; String? get last_name; int? get base_order; String? get mobile; String? get national_id; String? get national_code; String? get key; City? get city; String? get unit_name; String? get unit_national_id; String? get unit_registration_number; String? get unit_economical_number; String? get unit_province; String? get unit_city; String? get unit_postal_code; String? get unit_address; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.base_order, base_order) || other.base_order == base_order)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.national_code, national_code) || other.national_code == national_code)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unit_name, unit_name) || other.unit_name == unit_name)&&(identical(other.unit_national_id, unit_national_id) || other.unit_national_id == unit_national_id)&&(identical(other.unit_registration_number, unit_registration_number) || other.unit_registration_number == unit_registration_number)&&(identical(other.unit_economical_number, unit_economical_number) || other.unit_economical_number == unit_economical_number)&&(identical(other.unit_province, unit_province) || other.unit_province == unit_province)&&(identical(other.unit_city, unit_city) || other.unit_city == unit_city)&&(identical(other.unit_postal_code, unit_postal_code) || other.unit_postal_code == unit_postal_code)&&(identical(other.unit_address, unit_address) || other.unit_address == unit_address)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,base_order,mobile,national_id,national_code,key,city,unit_name,unit_national_id,unit_registration_number,unit_economical_number,unit_province,unit_city,unit_postal_code,unit_address); + +@override +String toString() { + return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, base_order: $base_order, mobile: $mobile, national_id: $national_id, national_code: $national_code, key: $key, city: $city, unit_name: $unit_name, unit_national_id: $unit_national_id, unit_registration_number: $unit_registration_number, unit_economical_number: $unit_economical_number, unit_province: $unit_province, unit_city: $unit_city, unit_postal_code: $unit_postal_code, unit_address: $unit_address)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? first_name, String? last_name, int? base_order, String? mobile, String? national_id, String? national_code, String? key, City? city, String? unit_name, String? unit_national_id, String? unit_registration_number, String? unit_economical_number, String? unit_province, String? unit_city, String? unit_postal_code, String? unit_address +}); + + +$CityCopyWith<$Res>? get city; + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? base_order = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? national_code = freezed,Object? key = freezed,Object? city = freezed,Object? unit_name = freezed,Object? unit_national_id = freezed,Object? unit_registration_number = freezed,Object? unit_economical_number = freezed,Object? unit_province = freezed,Object? unit_city = freezed,Object? unit_postal_code = freezed,Object? unit_address = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable +as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,base_order: freezed == base_order ? _self.base_order : base_order // ignore: cast_nullable_to_non_nullable +as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,national_code: freezed == national_code ? _self.national_code : national_code // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,unit_name: freezed == unit_name ? _self.unit_name : unit_name // ignore: cast_nullable_to_non_nullable +as String?,unit_national_id: freezed == unit_national_id ? _self.unit_national_id : unit_national_id // ignore: cast_nullable_to_non_nullable +as String?,unit_registration_number: freezed == unit_registration_number ? _self.unit_registration_number : unit_registration_number // ignore: cast_nullable_to_non_nullable +as String?,unit_economical_number: freezed == unit_economical_number ? _self.unit_economical_number : unit_economical_number // ignore: cast_nullable_to_non_nullable +as String?,unit_province: freezed == unit_province ? _self.unit_province : unit_province // ignore: cast_nullable_to_non_nullable +as String?,unit_city: freezed == unit_city ? _self.unit_city : unit_city // ignore: cast_nullable_to_non_nullable +as String?,unit_postal_code: freezed == unit_postal_code ? _self.unit_postal_code : unit_postal_code // ignore: cast_nullable_to_non_nullable +as String?,unit_address: freezed == unit_address ? _self.unit_address : unit_address // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _User implements User { + const _User({this.fullname, this.first_name, this.last_name, this.base_order, this.mobile, this.national_id, this.national_code, this.key, this.city, this.unit_name, this.unit_national_id, this.unit_registration_number, this.unit_economical_number, this.unit_province, this.unit_city, this.unit_postal_code, this.unit_address}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final String? fullname; +@override final String? first_name; +@override final String? last_name; +@override final int? base_order; +@override final String? mobile; +@override final String? national_id; +@override final String? national_code; +@override final String? key; +@override final City? city; +@override final String? unit_name; +@override final String? unit_national_id; +@override final String? unit_registration_number; +@override final String? unit_economical_number; +@override final String? unit_province; +@override final String? unit_city; +@override final String? unit_postal_code; +@override final String? unit_address; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.base_order, base_order) || other.base_order == base_order)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.national_code, national_code) || other.national_code == national_code)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unit_name, unit_name) || other.unit_name == unit_name)&&(identical(other.unit_national_id, unit_national_id) || other.unit_national_id == unit_national_id)&&(identical(other.unit_registration_number, unit_registration_number) || other.unit_registration_number == unit_registration_number)&&(identical(other.unit_economical_number, unit_economical_number) || other.unit_economical_number == unit_economical_number)&&(identical(other.unit_province, unit_province) || other.unit_province == unit_province)&&(identical(other.unit_city, unit_city) || other.unit_city == unit_city)&&(identical(other.unit_postal_code, unit_postal_code) || other.unit_postal_code == unit_postal_code)&&(identical(other.unit_address, unit_address) || other.unit_address == unit_address)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,base_order,mobile,national_id,national_code,key,city,unit_name,unit_national_id,unit_registration_number,unit_economical_number,unit_province,unit_city,unit_postal_code,unit_address); + +@override +String toString() { + return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, base_order: $base_order, mobile: $mobile, national_id: $national_id, national_code: $national_code, key: $key, city: $city, unit_name: $unit_name, unit_national_id: $unit_national_id, unit_registration_number: $unit_registration_number, unit_economical_number: $unit_economical_number, unit_province: $unit_province, unit_city: $unit_city, unit_postal_code: $unit_postal_code, unit_address: $unit_address)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? first_name, String? last_name, int? base_order, String? mobile, String? national_id, String? national_code, String? key, City? city, String? unit_name, String? unit_national_id, String? unit_registration_number, String? unit_economical_number, String? unit_province, String? unit_city, String? unit_postal_code, String? unit_address +}); + + +@override $CityCopyWith<$Res>? get city; + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? base_order = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? national_code = freezed,Object? key = freezed,Object? city = freezed,Object? unit_name = freezed,Object? unit_national_id = freezed,Object? unit_registration_number = freezed,Object? unit_economical_number = freezed,Object? unit_province = freezed,Object? unit_city = freezed,Object? unit_postal_code = freezed,Object? unit_address = freezed,}) { + return _then(_User( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable +as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,base_order: freezed == base_order ? _self.base_order : base_order // ignore: cast_nullable_to_non_nullable +as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,national_code: freezed == national_code ? _self.national_code : national_code // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,unit_name: freezed == unit_name ? _self.unit_name : unit_name // ignore: cast_nullable_to_non_nullable +as String?,unit_national_id: freezed == unit_national_id ? _self.unit_national_id : unit_national_id // ignore: cast_nullable_to_non_nullable +as String?,unit_registration_number: freezed == unit_registration_number ? _self.unit_registration_number : unit_registration_number // ignore: cast_nullable_to_non_nullable +as String?,unit_economical_number: freezed == unit_economical_number ? _self.unit_economical_number : unit_economical_number // ignore: cast_nullable_to_non_nullable +as String?,unit_province: freezed == unit_province ? _self.unit_province : unit_province // ignore: cast_nullable_to_non_nullable +as String?,unit_city: freezed == unit_city ? _self.unit_city : unit_city // ignore: cast_nullable_to_non_nullable +as String?,unit_postal_code: freezed == unit_postal_code ? _self.unit_postal_code : unit_postal_code // ignore: cast_nullable_to_non_nullable +as String?,unit_address: freezed == unit_address ? _self.unit_address : unit_address // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$City { + + int? get id; String? get key; String? get create_date; String? get modify_date; bool? get trash; int? get province_id_foreign_key; int? get city_id_key; String? get name; int? get product_price; bool? get province_center; int? get city_number; String? get city_name; int? get province_number; String? get province_name; String? get created_by; String? get modified_by; int? get province; +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CityCopyWith get copyWith => _$CityCopyWithImpl(this as City, _$identity); + + /// Serializes this City to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.province_id_foreign_key, province_id_foreign_key) || other.province_id_foreign_key == province_id_foreign_key)&&(identical(other.city_id_key, city_id_key) || other.city_id_key == city_id_key)&&(identical(other.name, name) || other.name == name)&&(identical(other.product_price, product_price) || other.product_price == product_price)&&(identical(other.province_center, province_center) || other.province_center == province_center)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&(identical(other.province, province) || other.province == province)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,key,create_date,modify_date,trash,province_id_foreign_key,city_id_key,name,product_price,province_center,city_number,city_name,province_number,province_name,created_by,modified_by,province); + +@override +String toString() { + return 'City(id: $id, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, province_id_foreign_key: $province_id_foreign_key, city_id_key: $city_id_key, name: $name, product_price: $product_price, province_center: $province_center, city_number: $city_number, city_name: $city_name, province_number: $province_number, province_name: $province_name, created_by: $created_by, modified_by: $modified_by, province: $province)'; +} + + +} + +/// @nodoc +abstract mixin class $CityCopyWith<$Res> { + factory $CityCopyWith(City value, $Res Function(City) _then) = _$CityCopyWithImpl; +@useResult +$Res call({ + int? id, String? key, String? create_date, String? modify_date, bool? trash, int? province_id_foreign_key, int? city_id_key, String? name, int? product_price, bool? province_center, int? city_number, String? city_name, int? province_number, String? province_name, String? created_by, String? modified_by, int? province +}); + + + + +} +/// @nodoc +class _$CityCopyWithImpl<$Res> + implements $CityCopyWith<$Res> { + _$CityCopyWithImpl(this._self, this._then); + + final City _self; + final $Res Function(City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? province_id_foreign_key = freezed,Object? city_id_key = freezed,Object? name = freezed,Object? product_price = freezed,Object? province_center = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? province = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,province_id_foreign_key: freezed == province_id_foreign_key ? _self.province_id_foreign_key : province_id_foreign_key // ignore: cast_nullable_to_non_nullable +as int?,city_id_key: freezed == city_id_key ? _self.city_id_key : city_id_key // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,product_price: freezed == product_price ? _self.product_price : product_price // ignore: cast_nullable_to_non_nullable +as int?,province_center: freezed == province_center ? _self.province_center : province_center // ignore: cast_nullable_to_non_nullable +as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable +as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable +as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable +as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _City implements City { + const _City({this.id, this.key, this.create_date, this.modify_date, this.trash, this.province_id_foreign_key, this.city_id_key, this.name, this.product_price, this.province_center, this.city_number, this.city_name, this.province_number, this.province_name, this.created_by, this.modified_by, this.province}); + factory _City.fromJson(Map json) => _$CityFromJson(json); + +@override final int? id; +@override final String? key; +@override final String? create_date; +@override final String? modify_date; +@override final bool? trash; +@override final int? province_id_foreign_key; +@override final int? city_id_key; +@override final String? name; +@override final int? product_price; +@override final bool? province_center; +@override final int? city_number; +@override final String? city_name; +@override final int? province_number; +@override final String? province_name; +@override final String? created_by; +@override final String? modified_by; +@override final int? province; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CityCopyWith<_City> get copyWith => __$CityCopyWithImpl<_City>(this, _$identity); + +@override +Map toJson() { + return _$CityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.province_id_foreign_key, province_id_foreign_key) || other.province_id_foreign_key == province_id_foreign_key)&&(identical(other.city_id_key, city_id_key) || other.city_id_key == city_id_key)&&(identical(other.name, name) || other.name == name)&&(identical(other.product_price, product_price) || other.product_price == product_price)&&(identical(other.province_center, province_center) || other.province_center == province_center)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&(identical(other.province, province) || other.province == province)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,key,create_date,modify_date,trash,province_id_foreign_key,city_id_key,name,product_price,province_center,city_number,city_name,province_number,province_name,created_by,modified_by,province); + +@override +String toString() { + return 'City(id: $id, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, province_id_foreign_key: $province_id_foreign_key, city_id_key: $city_id_key, name: $name, product_price: $product_price, province_center: $province_center, city_number: $city_number, city_name: $city_name, province_number: $province_number, province_name: $province_name, created_by: $created_by, modified_by: $modified_by, province: $province)'; +} + + +} + +/// @nodoc +abstract mixin class _$CityCopyWith<$Res> implements $CityCopyWith<$Res> { + factory _$CityCopyWith(_City value, $Res Function(_City) _then) = __$CityCopyWithImpl; +@override @useResult +$Res call({ + int? id, String? key, String? create_date, String? modify_date, bool? trash, int? province_id_foreign_key, int? city_id_key, String? name, int? product_price, bool? province_center, int? city_number, String? city_name, int? province_number, String? province_name, String? created_by, String? modified_by, int? province +}); + + + + +} +/// @nodoc +class __$CityCopyWithImpl<$Res> + implements _$CityCopyWith<$Res> { + __$CityCopyWithImpl(this._self, this._then); + + final _City _self; + final $Res Function(_City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? province_id_foreign_key = freezed,Object? city_id_key = freezed,Object? name = freezed,Object? product_price = freezed,Object? province_center = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? province = freezed,}) { + return _then(_City( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,province_id_foreign_key: freezed == province_id_foreign_key ? _self.province_id_foreign_key : province_id_foreign_key // ignore: cast_nullable_to_non_nullable +as int?,city_id_key: freezed == city_id_key ? _self.city_id_key : city_id_key // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,product_price: freezed == product_price ? _self.product_price : product_price // ignore: cast_nullable_to_non_nullable +as int?,province_center: freezed == province_center ? _self.province_center : province_center // ignore: cast_nullable_to_non_nullable +as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable +as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable +as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable +as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable +as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + + +/// @nodoc +mixin _$Address { + + Province? get province; City? get city; String? get address; String? get postal_code; +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AddressCopyWith
get copyWith => _$AddressCopyWithImpl
(this as Address, _$identity); + + /// Serializes this Address to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; +} + + +} + +/// @nodoc +abstract mixin class $AddressCopyWith<$Res> { + factory $AddressCopyWith(Address value, $Res Function(Address) _then) = _$AddressCopyWithImpl; +@useResult +$Res call({ + Province? province, City? city, String? address, String? postal_code +}); + + +$ProvinceCopyWith<$Res>? get province;$CityCopyWith<$Res>? get city; + +} +/// @nodoc +class _$AddressCopyWithImpl<$Res> + implements $AddressCopyWith<$Res> { + _$AddressCopyWithImpl(this._self, this._then); + + final Address _self; + final $Res Function(Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { + return _then(_self.copyWith( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Address implements Address { + const _Address({this.province, this.city, this.address, this.postal_code}); + factory _Address.fromJson(Map json) => _$AddressFromJson(json); + +@override final Province? province; +@override final City? city; +@override final String? address; +@override final String? postal_code; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AddressCopyWith<_Address> get copyWith => __$AddressCopyWithImpl<_Address>(this, _$identity); + +@override +Map toJson() { + return _$AddressToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); + +@override +String toString() { + return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; +} + + +} + +/// @nodoc +abstract mixin class _$AddressCopyWith<$Res> implements $AddressCopyWith<$Res> { + factory _$AddressCopyWith(_Address value, $Res Function(_Address) _then) = __$AddressCopyWithImpl; +@override @useResult +$Res call({ + Province? province, City? city, String? address, String? postal_code +}); + + +@override $ProvinceCopyWith<$Res>? get province;@override $CityCopyWith<$Res>? get city; + +} +/// @nodoc +class __$AddressCopyWithImpl<$Res> + implements _$AddressCopyWith<$Res> { + __$AddressCopyWithImpl(this._self, this._then); + + final _Address _self; + final $Res Function(_Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { + return _then(_Address( +province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProvinceCopyWith<$Res>? get province { + if (_self.province == null) { + return null; + } + + return $ProvinceCopyWith<$Res>(_self.province!, (value) { + return _then(_self.copyWith(province: value)); + }); +}/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$Province { + + String? get key; String? get name; +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProvinceCopyWith get copyWith => _$ProvinceCopyWithImpl(this as Province, _$identity); + + /// Serializes this Province to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $ProvinceCopyWith<$Res> { + factory $ProvinceCopyWith(Province value, $Res Function(Province) _then) = _$ProvinceCopyWithImpl; +@useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class _$ProvinceCopyWithImpl<$Res> + implements $ProvinceCopyWith<$Res> { + _$ProvinceCopyWithImpl(this._self, this._then); + + final Province _self; + final $Res Function(Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Province implements Province { + const _Province({this.key, this.name}); + factory _Province.fromJson(Map json) => _$ProvinceFromJson(json); + +@override final String? key; +@override final String? name; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProvinceCopyWith<_Province> get copyWith => __$ProvinceCopyWithImpl<_Province>(this, _$identity); + +@override +Map toJson() { + return _$ProvinceToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Province&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Province(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProvinceCopyWith<$Res> implements $ProvinceCopyWith<$Res> { + factory _$ProvinceCopyWith(_Province value, $Res Function(_Province) _then) = __$ProvinceCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class __$ProvinceCopyWithImpl<$Res> + implements _$ProvinceCopyWith<$Res> { + __$ProvinceCopyWithImpl(this._self, this._then); + + final _Province _self; + final $Res Function(_Province) _then; + +/// Create a copy of Province +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_Province( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$Product { + + String? get key; String? get name; +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ProductCopyWith get copyWith => _$ProductCopyWithImpl(this as Product, _$identity); + + /// Serializes this Product to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Product&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Product(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $ProductCopyWith<$Res> { + factory $ProductCopyWith(Product value, $Res Function(Product) _then) = _$ProductCopyWithImpl; +@useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class _$ProductCopyWithImpl<$Res> + implements $ProductCopyWith<$Res> { + _$ProductCopyWithImpl(this._self, this._then); + + final Product _self; + final $Res Function(Product) _then; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Product implements Product { + const _Product({this.key, this.name}); + factory _Product.fromJson(Map json) => _$ProductFromJson(json); + +@override final String? key; +@override final String? name; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ProductCopyWith<_Product> get copyWith => __$ProductCopyWithImpl<_Product>(this, _$identity); + +@override +Map toJson() { + return _$ProductToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Product&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'Product(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$ProductCopyWith<$Res> implements $ProductCopyWith<$Res> { + factory _$ProductCopyWith(_Product value, $Res Function(_Product) _then) = __$ProductCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? name +}); + + + + +} +/// @nodoc +class __$ProductCopyWithImpl<$Res> + implements _$ProductCopyWith<$Res> { + __$ProductCopyWithImpl(this._self, this._then); + + final _Product _self; + final $Res Function(_Product) _then; + +/// Create a copy of Product +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_Product( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart new file mode 100644 index 0000000..3059d21 --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart @@ -0,0 +1,233 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'steward_free_bar.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_StewardFreeBar _$StewardFreeBarFromJson(Map json) => + _StewardFreeBar( + count: (json['count'] as num?)?.toInt(), + next: json['next'] as String?, + previous: json['previous'] as String?, + results: (json['results'] as List?) + ?.map((e) => Result.fromJson(e as Map)) + .toList(), + ); + +Map _$StewardFreeBarToJson(_StewardFreeBar instance) => + { + 'count': instance.count, + 'next': instance.next, + 'previous': instance.previous, + 'results': instance.results, + }; + +_Result _$ResultFromJson(Map json) => _Result( + id: (json['id'] as num?)?.toInt(), + steward: json['steward'] == null + ? null + : Steward.fromJson(json['steward'] as Map), + guild: json['guild'], + product: json['product'] == null + ? null + : Product.fromJson(json['product'] as Map), + key: json['key'] as String?, + create_date: json['create_date'] as String?, + modify_date: json['modify_date'] as String?, + trash: json['trash'] as bool?, + kill_house_name: json['kill_house_name'] as String?, + kill_house_mobile: json['kill_house_mobile'] as String?, + kill_house_vet_name: json['kill_house_vet_name'] as String?, + kill_house_vet_mobile: json['kill_house_vet_mobile'] as String?, + province: json['province'] as String?, + city: json['city'] as String?, + driver_name: json['driver_name'] as String?, + driver_mobile: json['driver_mobile'] as String?, + car: json['car'], + pelak: json['pelak'] as String?, + number_of_carcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weight_of_carcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + bar_image: json['bar_image'] as String?, + date: json['date'] as String?, + temporary_trash: json['temporary_trash'] as bool?, + temporary_deleted: json['temporary_deleted'] as bool?, + created_by: json['created_by'] as String?, + modified_by: json['modified_by'] as String?, +); + +Map _$ResultToJson(_Result instance) => { + 'id': instance.id, + 'steward': instance.steward, + 'guild': instance.guild, + 'product': instance.product, + 'key': instance.key, + 'create_date': instance.create_date, + 'modify_date': instance.modify_date, + 'trash': instance.trash, + 'kill_house_name': instance.kill_house_name, + 'kill_house_mobile': instance.kill_house_mobile, + 'kill_house_vet_name': instance.kill_house_vet_name, + 'kill_house_vet_mobile': instance.kill_house_vet_mobile, + 'province': instance.province, + 'city': instance.city, + 'driver_name': instance.driver_name, + 'driver_mobile': instance.driver_mobile, + 'car': instance.car, + 'pelak': instance.pelak, + 'number_of_carcasses': instance.number_of_carcasses, + 'weight_of_carcasses': instance.weight_of_carcasses, + 'bar_image': instance.bar_image, + 'date': instance.date, + 'temporary_trash': instance.temporary_trash, + 'temporary_deleted': instance.temporary_deleted, + 'created_by': instance.created_by, + 'modified_by': instance.modified_by, +}; + +_Steward _$StewardFromJson(Map json) => _Steward( + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + guilds_name: json['guilds_name'] as String?, + steward: json['steward'] as bool?, + allocation_limit: json['allocation_limit'], + address: json['address'] == null + ? null + : Address.fromJson(json['address'] as Map), + license_number: json['license_number'] as String?, + type_activity: json['type_activity'] as String?, + area_activity: json['area_activity'] as String?, + guilds_id: json['guilds_id'] as String?, + create_date: json['create_date'] as String?, +); + +Map _$StewardToJson(_Steward instance) => { + 'user': instance.user, + 'guilds_name': instance.guilds_name, + 'steward': instance.steward, + 'allocation_limit': instance.allocation_limit, + 'address': instance.address, + 'license_number': instance.license_number, + 'type_activity': instance.type_activity, + 'area_activity': instance.area_activity, + 'guilds_id': instance.guilds_id, + 'create_date': instance.create_date, +}; + +_User _$UserFromJson(Map json) => _User( + fullname: json['fullname'] as String?, + first_name: json['first_name'] as String?, + last_name: json['last_name'] as String?, + base_order: (json['base_order'] as num?)?.toInt(), + mobile: json['mobile'] as String?, + national_id: json['national_id'] as String?, + national_code: json['national_code'] as String?, + key: json['key'] as String?, + city: json['city'] == null + ? null + : City.fromJson(json['city'] as Map), + unit_name: json['unit_name'] as String?, + unit_national_id: json['unit_national_id'] as String?, + unit_registration_number: json['unit_registration_number'] as String?, + unit_economical_number: json['unit_economical_number'] as String?, + unit_province: json['unit_province'] as String?, + unit_city: json['unit_city'] as String?, + unit_postal_code: json['unit_postal_code'] as String?, + unit_address: json['unit_address'] as String?, +); + +Map _$UserToJson(_User instance) => { + 'fullname': instance.fullname, + 'first_name': instance.first_name, + 'last_name': instance.last_name, + 'base_order': instance.base_order, + 'mobile': instance.mobile, + 'national_id': instance.national_id, + 'national_code': instance.national_code, + 'key': instance.key, + 'city': instance.city, + 'unit_name': instance.unit_name, + 'unit_national_id': instance.unit_national_id, + 'unit_registration_number': instance.unit_registration_number, + 'unit_economical_number': instance.unit_economical_number, + 'unit_province': instance.unit_province, + 'unit_city': instance.unit_city, + 'unit_postal_code': instance.unit_postal_code, + 'unit_address': instance.unit_address, +}; + +_City _$CityFromJson(Map json) => _City( + id: (json['id'] as num?)?.toInt(), + key: json['key'] as String?, + create_date: json['create_date'] as String?, + modify_date: json['modify_date'] as String?, + trash: json['trash'] as bool?, + province_id_foreign_key: (json['province_id_foreign_key'] as num?)?.toInt(), + city_id_key: (json['city_id_key'] as num?)?.toInt(), + name: json['name'] as String?, + product_price: (json['product_price'] as num?)?.toInt(), + province_center: json['province_center'] as bool?, + city_number: (json['city_number'] as num?)?.toInt(), + city_name: json['city_name'] as String?, + province_number: (json['province_number'] as num?)?.toInt(), + province_name: json['province_name'] as String?, + created_by: json['created_by'] as String?, + modified_by: json['modified_by'] as String?, + province: (json['province'] as num?)?.toInt(), +); + +Map _$CityToJson(_City instance) => { + 'id': instance.id, + 'key': instance.key, + 'create_date': instance.create_date, + 'modify_date': instance.modify_date, + 'trash': instance.trash, + 'province_id_foreign_key': instance.province_id_foreign_key, + 'city_id_key': instance.city_id_key, + 'name': instance.name, + 'product_price': instance.product_price, + 'province_center': instance.province_center, + 'city_number': instance.city_number, + 'city_name': instance.city_name, + 'province_number': instance.province_number, + 'province_name': instance.province_name, + 'created_by': instance.created_by, + 'modified_by': instance.modified_by, + 'province': instance.province, +}; + +_Address _$AddressFromJson(Map json) => _Address( + province: json['province'] == null + ? null + : Province.fromJson(json['province'] as Map), + city: json['city'] == null + ? null + : City.fromJson(json['city'] as Map), + address: json['address'] as String?, + postal_code: json['postal_code'] as String?, +); + +Map _$AddressToJson(_Address instance) => { + 'province': instance.province, + 'city': instance.city, + 'address': instance.address, + 'postal_code': instance.postal_code, +}; + +_Province _$ProvinceFromJson(Map json) => + _Province(key: json['key'] as String?, name: json['name'] as String?); + +Map _$ProvinceToJson(_Province instance) => { + 'key': instance.key, + 'name': instance.name, +}; + +_Product _$ProductFromJson(Map json) => + _Product(key: json['key'] as String?, name: json['name'] as String?); + +Map _$ProductToJson(_Product instance) => { + 'key': instance.key, + 'name': instance.name, +}; diff --git a/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart new file mode 100644 index 0000000..bebb59d --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart @@ -0,0 +1,157 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'steward_free_bar_dashboard.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$StewardFreeBarDashboard { + + String? get product; int? get totalBars; double? get totalQuantity; double? get totalWeight; +/// Create a copy of StewardFreeBarDashboard +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StewardFreeBarDashboardCopyWith get copyWith => _$StewardFreeBarDashboardCopyWithImpl(this as StewardFreeBarDashboard, _$identity); + + /// Serializes this StewardFreeBarDashboard to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardFreeBarDashboard&&(identical(other.product, product) || other.product == product)&&(identical(other.totalBars, totalBars) || other.totalBars == totalBars)&&(identical(other.totalQuantity, totalQuantity) || other.totalQuantity == totalQuantity)&&(identical(other.totalWeight, totalWeight) || other.totalWeight == totalWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,product,totalBars,totalQuantity,totalWeight); + +@override +String toString() { + return 'StewardFreeBarDashboard(product: $product, totalBars: $totalBars, totalQuantity: $totalQuantity, totalWeight: $totalWeight)'; +} + + +} + +/// @nodoc +abstract mixin class $StewardFreeBarDashboardCopyWith<$Res> { + factory $StewardFreeBarDashboardCopyWith(StewardFreeBarDashboard value, $Res Function(StewardFreeBarDashboard) _then) = _$StewardFreeBarDashboardCopyWithImpl; +@useResult +$Res call({ + String? product, int? totalBars, double? totalQuantity, double? totalWeight +}); + + + + +} +/// @nodoc +class _$StewardFreeBarDashboardCopyWithImpl<$Res> + implements $StewardFreeBarDashboardCopyWith<$Res> { + _$StewardFreeBarDashboardCopyWithImpl(this._self, this._then); + + final StewardFreeBarDashboard _self; + final $Res Function(StewardFreeBarDashboard) _then; + +/// Create a copy of StewardFreeBarDashboard +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? product = freezed,Object? totalBars = freezed,Object? totalQuantity = freezed,Object? totalWeight = freezed,}) { + return _then(_self.copyWith( +product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as String?,totalBars: freezed == totalBars ? _self.totalBars : totalBars // ignore: cast_nullable_to_non_nullable +as int?,totalQuantity: freezed == totalQuantity ? _self.totalQuantity : totalQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalWeight: freezed == totalWeight ? _self.totalWeight : totalWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _StewardFreeBarDashboard implements StewardFreeBarDashboard { + const _StewardFreeBarDashboard({this.product, this.totalBars, this.totalQuantity, this.totalWeight}); + factory _StewardFreeBarDashboard.fromJson(Map json) => _$StewardFreeBarDashboardFromJson(json); + +@override final String? product; +@override final int? totalBars; +@override final double? totalQuantity; +@override final double? totalWeight; + +/// Create a copy of StewardFreeBarDashboard +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$StewardFreeBarDashboardCopyWith<_StewardFreeBarDashboard> get copyWith => __$StewardFreeBarDashboardCopyWithImpl<_StewardFreeBarDashboard>(this, _$identity); + +@override +Map toJson() { + return _$StewardFreeBarDashboardToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardFreeBarDashboard&&(identical(other.product, product) || other.product == product)&&(identical(other.totalBars, totalBars) || other.totalBars == totalBars)&&(identical(other.totalQuantity, totalQuantity) || other.totalQuantity == totalQuantity)&&(identical(other.totalWeight, totalWeight) || other.totalWeight == totalWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,product,totalBars,totalQuantity,totalWeight); + +@override +String toString() { + return 'StewardFreeBarDashboard(product: $product, totalBars: $totalBars, totalQuantity: $totalQuantity, totalWeight: $totalWeight)'; +} + + +} + +/// @nodoc +abstract mixin class _$StewardFreeBarDashboardCopyWith<$Res> implements $StewardFreeBarDashboardCopyWith<$Res> { + factory _$StewardFreeBarDashboardCopyWith(_StewardFreeBarDashboard value, $Res Function(_StewardFreeBarDashboard) _then) = __$StewardFreeBarDashboardCopyWithImpl; +@override @useResult +$Res call({ + String? product, int? totalBars, double? totalQuantity, double? totalWeight +}); + + + + +} +/// @nodoc +class __$StewardFreeBarDashboardCopyWithImpl<$Res> + implements _$StewardFreeBarDashboardCopyWith<$Res> { + __$StewardFreeBarDashboardCopyWithImpl(this._self, this._then); + + final _StewardFreeBarDashboard _self; + final $Res Function(_StewardFreeBarDashboard) _then; + +/// Create a copy of StewardFreeBarDashboard +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? product = freezed,Object? totalBars = freezed,Object? totalQuantity = freezed,Object? totalWeight = freezed,}) { + return _then(_StewardFreeBarDashboard( +product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as String?,totalBars: freezed == totalBars ? _self.totalBars : totalBars // ignore: cast_nullable_to_non_nullable +as int?,totalQuantity: freezed == totalQuantity ? _self.totalQuantity : totalQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalWeight: freezed == totalWeight ? _self.totalWeight : totalWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.g.dart b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.g.dart new file mode 100644 index 0000000..075281b --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'steward_free_bar_dashboard.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_StewardFreeBarDashboard _$StewardFreeBarDashboardFromJson( + Map json, +) => _StewardFreeBarDashboard( + product: json['product'] as String?, + totalBars: (json['total_bars'] as num?)?.toInt(), + totalQuantity: (json['total_quantity'] as num?)?.toDouble(), + totalWeight: (json['total_weight'] as num?)?.toDouble(), +); + +Map _$StewardFreeBarDashboardToJson( + _StewardFreeBarDashboard instance, +) => { + 'product': instance.product, + 'total_bars': instance.totalBars, + 'total_quantity': instance.totalQuantity, + 'total_weight': instance.totalWeight, +}; From 9e3629ed1e7ed50cb363d9f46529b33abe682e14 Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 6 Jun 2025 17:33:34 +0330 Subject: [PATCH 105/256] feat : sale out province --- .../submit_kill_house_free_bar.dart | 29 ++ .../submit_kill_house_free_bar.freezed.dart | 190 +++++++++++ .../submit_kill_house_free_bar.g.dart | 47 +++ .../dashboard_kill_house_free_bar.dart | 18 + ...dashboard_kill_house_free_bar.freezed.dart | 160 +++++++++ .../dashboard_kill_house_free_bar.g.dart | 29 ++ .../kill_house_free_bar.dart | 71 ++++ .../kill_house_free_bar.freezed.dart | 319 ++++++++++++++++++ .../kill_house_free_bar.g.dart | 131 +++++++ .../data/repositories/chicken_repository.dart | 30 +- .../repositories/chicken_repository_imp.dart | 33 ++ .../pages/sales_with_out_province/logic.dart | 122 ++----- .../pages/sales_with_out_province/view.dart | 123 ++++--- .../presentation/utils/data_time_utils.dart | 5 + .../widget/app_bar/r_app_bar.dart | 24 +- 15 files changed, 1171 insertions(+), 160 deletions(-) create mode 100644 packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.dart create mode 100644 packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart create mode 100644 packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.g.dart create mode 100644 packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart create mode 100644 packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.g.dart create mode 100644 packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.dart create mode 100644 packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.g.dart diff --git a/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.dart b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.dart new file mode 100644 index 0000000..d3f43cd --- /dev/null +++ b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.dart @@ -0,0 +1,29 @@ + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'submit_kill_house_free_bar.freezed.dart'; +part 'submit_kill_house_free_bar.g.dart'; + +@freezed +abstract class SubmitKillHouseFreeBar with _$SubmitKillHouseFreeBar { + const factory SubmitKillHouseFreeBar({ + String? driverName, + String? driverMobile, + String? poultryName, + String? poultryMobile, + String? province, + String? city, + String? barClearanceCode, + String? barImage, + String? killerKey, + String? date, + String? buyType, + String? productKey, + String? car, + String? numberOfCarcasses, + String? weightOfCarcasses, + }) = _SubmitKillHouseFreeBar; + + factory SubmitKillHouseFreeBar.fromJson(Map json) => + _$SubmitKillHouseFreeBarFromJson(json); +} diff --git a/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart new file mode 100644 index 0000000..a770592 --- /dev/null +++ b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart @@ -0,0 +1,190 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'submit_kill_house_free_bar.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$SubmitKillHouseFreeBar { + + String? get driverName; String? get driverMobile; String? get poultryName; String? get poultryMobile; String? get province; String? get city; String? get barClearanceCode; String? get barImage; String? get killerKey; String? get date; String? get buyType; String? get productKey; String? get car; String? get numberOfCarcasses; String? get weightOfCarcasses; +/// Create a copy of SubmitKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SubmitKillHouseFreeBarCopyWith get copyWith => _$SubmitKillHouseFreeBarCopyWithImpl(this as SubmitKillHouseFreeBar, _$identity); + + /// Serializes this SubmitKillHouseFreeBar to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SubmitKillHouseFreeBar&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&(identical(other.poultryName, poultryName) || other.poultryName == poultryName)&&(identical(other.poultryMobile, poultryMobile) || other.poultryMobile == poultryMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.barClearanceCode, barClearanceCode) || other.barClearanceCode == barClearanceCode)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.killerKey, killerKey) || other.killerKey == killerKey)&&(identical(other.date, date) || other.date == date)&&(identical(other.buyType, buyType) || other.buyType == buyType)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.car, car) || other.car == car)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,driverName,driverMobile,poultryName,poultryMobile,province,city,barClearanceCode,barImage,killerKey,date,buyType,productKey,car,numberOfCarcasses,weightOfCarcasses); + +@override +String toString() { + return 'SubmitKillHouseFreeBar(driverName: $driverName, driverMobile: $driverMobile, poultryName: $poultryName, poultryMobile: $poultryMobile, province: $province, city: $city, barClearanceCode: $barClearanceCode, barImage: $barImage, killerKey: $killerKey, date: $date, buyType: $buyType, productKey: $productKey, car: $car, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses)'; +} + + +} + +/// @nodoc +abstract mixin class $SubmitKillHouseFreeBarCopyWith<$Res> { + factory $SubmitKillHouseFreeBarCopyWith(SubmitKillHouseFreeBar value, $Res Function(SubmitKillHouseFreeBar) _then) = _$SubmitKillHouseFreeBarCopyWithImpl; +@useResult +$Res call({ + String? driverName, String? driverMobile, String? poultryName, String? poultryMobile, String? province, String? city, String? barClearanceCode, String? barImage, String? killerKey, String? date, String? buyType, String? productKey, String? car, String? numberOfCarcasses, String? weightOfCarcasses +}); + + + + +} +/// @nodoc +class _$SubmitKillHouseFreeBarCopyWithImpl<$Res> + implements $SubmitKillHouseFreeBarCopyWith<$Res> { + _$SubmitKillHouseFreeBarCopyWithImpl(this._self, this._then); + + final SubmitKillHouseFreeBar _self; + final $Res Function(SubmitKillHouseFreeBar) _then; + +/// Create a copy of SubmitKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? driverName = freezed,Object? driverMobile = freezed,Object? poultryName = freezed,Object? poultryMobile = freezed,Object? province = freezed,Object? city = freezed,Object? barClearanceCode = freezed,Object? barImage = freezed,Object? killerKey = freezed,Object? date = freezed,Object? buyType = freezed,Object? productKey = freezed,Object? car = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,}) { + return _then(_self.copyWith( +driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable +as String?,poultryName: freezed == poultryName ? _self.poultryName : poultryName // ignore: cast_nullable_to_non_nullable +as String?,poultryMobile: freezed == poultryMobile ? _self.poultryMobile : poultryMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,barClearanceCode: freezed == barClearanceCode ? _self.barClearanceCode : barClearanceCode // ignore: cast_nullable_to_non_nullable +as String?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable +as String?,killerKey: freezed == killerKey ? _self.killerKey : killerKey // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,buyType: freezed == buyType ? _self.buyType : buyType // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as String?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _SubmitKillHouseFreeBar implements SubmitKillHouseFreeBar { + const _SubmitKillHouseFreeBar({this.driverName, this.driverMobile, this.poultryName, this.poultryMobile, this.province, this.city, this.barClearanceCode, this.barImage, this.killerKey, this.date, this.buyType, this.productKey, this.car, this.numberOfCarcasses, this.weightOfCarcasses}); + factory _SubmitKillHouseFreeBar.fromJson(Map json) => _$SubmitKillHouseFreeBarFromJson(json); + +@override final String? driverName; +@override final String? driverMobile; +@override final String? poultryName; +@override final String? poultryMobile; +@override final String? province; +@override final String? city; +@override final String? barClearanceCode; +@override final String? barImage; +@override final String? killerKey; +@override final String? date; +@override final String? buyType; +@override final String? productKey; +@override final String? car; +@override final String? numberOfCarcasses; +@override final String? weightOfCarcasses; + +/// Create a copy of SubmitKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SubmitKillHouseFreeBarCopyWith<_SubmitKillHouseFreeBar> get copyWith => __$SubmitKillHouseFreeBarCopyWithImpl<_SubmitKillHouseFreeBar>(this, _$identity); + +@override +Map toJson() { + return _$SubmitKillHouseFreeBarToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SubmitKillHouseFreeBar&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&(identical(other.poultryName, poultryName) || other.poultryName == poultryName)&&(identical(other.poultryMobile, poultryMobile) || other.poultryMobile == poultryMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.barClearanceCode, barClearanceCode) || other.barClearanceCode == barClearanceCode)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.killerKey, killerKey) || other.killerKey == killerKey)&&(identical(other.date, date) || other.date == date)&&(identical(other.buyType, buyType) || other.buyType == buyType)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.car, car) || other.car == car)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,driverName,driverMobile,poultryName,poultryMobile,province,city,barClearanceCode,barImage,killerKey,date,buyType,productKey,car,numberOfCarcasses,weightOfCarcasses); + +@override +String toString() { + return 'SubmitKillHouseFreeBar(driverName: $driverName, driverMobile: $driverMobile, poultryName: $poultryName, poultryMobile: $poultryMobile, province: $province, city: $city, barClearanceCode: $barClearanceCode, barImage: $barImage, killerKey: $killerKey, date: $date, buyType: $buyType, productKey: $productKey, car: $car, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses)'; +} + + +} + +/// @nodoc +abstract mixin class _$SubmitKillHouseFreeBarCopyWith<$Res> implements $SubmitKillHouseFreeBarCopyWith<$Res> { + factory _$SubmitKillHouseFreeBarCopyWith(_SubmitKillHouseFreeBar value, $Res Function(_SubmitKillHouseFreeBar) _then) = __$SubmitKillHouseFreeBarCopyWithImpl; +@override @useResult +$Res call({ + String? driverName, String? driverMobile, String? poultryName, String? poultryMobile, String? province, String? city, String? barClearanceCode, String? barImage, String? killerKey, String? date, String? buyType, String? productKey, String? car, String? numberOfCarcasses, String? weightOfCarcasses +}); + + + + +} +/// @nodoc +class __$SubmitKillHouseFreeBarCopyWithImpl<$Res> + implements _$SubmitKillHouseFreeBarCopyWith<$Res> { + __$SubmitKillHouseFreeBarCopyWithImpl(this._self, this._then); + + final _SubmitKillHouseFreeBar _self; + final $Res Function(_SubmitKillHouseFreeBar) _then; + +/// Create a copy of SubmitKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? driverName = freezed,Object? driverMobile = freezed,Object? poultryName = freezed,Object? poultryMobile = freezed,Object? province = freezed,Object? city = freezed,Object? barClearanceCode = freezed,Object? barImage = freezed,Object? killerKey = freezed,Object? date = freezed,Object? buyType = freezed,Object? productKey = freezed,Object? car = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,}) { + return _then(_SubmitKillHouseFreeBar( +driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable +as String?,poultryName: freezed == poultryName ? _self.poultryName : poultryName // ignore: cast_nullable_to_non_nullable +as String?,poultryMobile: freezed == poultryMobile ? _self.poultryMobile : poultryMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,barClearanceCode: freezed == barClearanceCode ? _self.barClearanceCode : barClearanceCode // ignore: cast_nullable_to_non_nullable +as String?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable +as String?,killerKey: freezed == killerKey ? _self.killerKey : killerKey // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,buyType: freezed == buyType ? _self.buyType : buyType // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as String?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.g.dart b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.g.dart new file mode 100644 index 0000000..1f3b912 --- /dev/null +++ b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'submit_kill_house_free_bar.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_SubmitKillHouseFreeBar _$SubmitKillHouseFreeBarFromJson( + Map json, +) => _SubmitKillHouseFreeBar( + driverName: json['driver_name'] as String?, + driverMobile: json['driver_mobile'] as String?, + poultryName: json['poultry_name'] as String?, + poultryMobile: json['poultry_mobile'] as String?, + province: json['province'] as String?, + city: json['city'] as String?, + barClearanceCode: json['bar_clearance_code'] as String?, + barImage: json['bar_image'] as String?, + killerKey: json['killer_key'] as String?, + date: json['date'] as String?, + buyType: json['buy_type'] as String?, + productKey: json['product_key'] as String?, + car: json['car'] as String?, + numberOfCarcasses: json['number_of_carcasses'] as String?, + weightOfCarcasses: json['weight_of_carcasses'] as String?, +); + +Map _$SubmitKillHouseFreeBarToJson( + _SubmitKillHouseFreeBar instance, +) => { + 'driver_name': instance.driverName, + 'driver_mobile': instance.driverMobile, + 'poultry_name': instance.poultryName, + 'poultry_mobile': instance.poultryMobile, + 'province': instance.province, + 'city': instance.city, + 'bar_clearance_code': instance.barClearanceCode, + 'bar_image': instance.barImage, + 'killer_key': instance.killerKey, + 'date': instance.date, + 'buy_type': instance.buyType, + 'product_key': instance.productKey, + 'car': instance.car, + 'number_of_carcasses': instance.numberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, +}; diff --git a/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart new file mode 100644 index 0000000..3f48858 --- /dev/null +++ b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart @@ -0,0 +1,18 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'dashboard_kill_house_free_bar.freezed.dart'; +part 'dashboard_kill_house_free_bar.g.dart'; + +@freezed +abstract class DashboardKillHouseFreeBar with _$DashboardKillHouseFreeBar { + const factory DashboardKillHouseFreeBar({ + int? totalBars, + int? totalBarsQuantity, + int? totalBarsLiveWeight, + int? totalBarsNumberOfCarcasses, + int? totalBarsWeightOfCarcasses, + }) = _DashboardKillHouseFreeBar; + + factory DashboardKillHouseFreeBar.fromJson(Map json) => + _$DashboardKillHouseFreeBarFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart new file mode 100644 index 0000000..99a036a --- /dev/null +++ b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart @@ -0,0 +1,160 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'dashboard_kill_house_free_bar.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$DashboardKillHouseFreeBar { + + int? get totalBars; int? get totalBarsQuantity; int? get totalBarsLiveWeight; int? get totalBarsNumberOfCarcasses; int? get totalBarsWeightOfCarcasses; +/// Create a copy of DashboardKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$DashboardKillHouseFreeBarCopyWith get copyWith => _$DashboardKillHouseFreeBarCopyWithImpl(this as DashboardKillHouseFreeBar, _$identity); + + /// Serializes this DashboardKillHouseFreeBar to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is DashboardKillHouseFreeBar&&(identical(other.totalBars, totalBars) || other.totalBars == totalBars)&&(identical(other.totalBarsQuantity, totalBarsQuantity) || other.totalBarsQuantity == totalBarsQuantity)&&(identical(other.totalBarsLiveWeight, totalBarsLiveWeight) || other.totalBarsLiveWeight == totalBarsLiveWeight)&&(identical(other.totalBarsNumberOfCarcasses, totalBarsNumberOfCarcasses) || other.totalBarsNumberOfCarcasses == totalBarsNumberOfCarcasses)&&(identical(other.totalBarsWeightOfCarcasses, totalBarsWeightOfCarcasses) || other.totalBarsWeightOfCarcasses == totalBarsWeightOfCarcasses)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,totalBars,totalBarsQuantity,totalBarsLiveWeight,totalBarsNumberOfCarcasses,totalBarsWeightOfCarcasses); + +@override +String toString() { + return 'DashboardKillHouseFreeBar(totalBars: $totalBars, totalBarsQuantity: $totalBarsQuantity, totalBarsLiveWeight: $totalBarsLiveWeight, totalBarsNumberOfCarcasses: $totalBarsNumberOfCarcasses, totalBarsWeightOfCarcasses: $totalBarsWeightOfCarcasses)'; +} + + +} + +/// @nodoc +abstract mixin class $DashboardKillHouseFreeBarCopyWith<$Res> { + factory $DashboardKillHouseFreeBarCopyWith(DashboardKillHouseFreeBar value, $Res Function(DashboardKillHouseFreeBar) _then) = _$DashboardKillHouseFreeBarCopyWithImpl; +@useResult +$Res call({ + int? totalBars, int? totalBarsQuantity, int? totalBarsLiveWeight, int? totalBarsNumberOfCarcasses, int? totalBarsWeightOfCarcasses +}); + + + + +} +/// @nodoc +class _$DashboardKillHouseFreeBarCopyWithImpl<$Res> + implements $DashboardKillHouseFreeBarCopyWith<$Res> { + _$DashboardKillHouseFreeBarCopyWithImpl(this._self, this._then); + + final DashboardKillHouseFreeBar _self; + final $Res Function(DashboardKillHouseFreeBar) _then; + +/// Create a copy of DashboardKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? totalBars = freezed,Object? totalBarsQuantity = freezed,Object? totalBarsLiveWeight = freezed,Object? totalBarsNumberOfCarcasses = freezed,Object? totalBarsWeightOfCarcasses = freezed,}) { + return _then(_self.copyWith( +totalBars: freezed == totalBars ? _self.totalBars : totalBars // ignore: cast_nullable_to_non_nullable +as int?,totalBarsQuantity: freezed == totalBarsQuantity ? _self.totalBarsQuantity : totalBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalBarsLiveWeight: freezed == totalBarsLiveWeight ? _self.totalBarsLiveWeight : totalBarsLiveWeight // ignore: cast_nullable_to_non_nullable +as int?,totalBarsNumberOfCarcasses: freezed == totalBarsNumberOfCarcasses ? _self.totalBarsNumberOfCarcasses : totalBarsNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,totalBarsWeightOfCarcasses: freezed == totalBarsWeightOfCarcasses ? _self.totalBarsWeightOfCarcasses : totalBarsWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _DashboardKillHouseFreeBar implements DashboardKillHouseFreeBar { + const _DashboardKillHouseFreeBar({this.totalBars, this.totalBarsQuantity, this.totalBarsLiveWeight, this.totalBarsNumberOfCarcasses, this.totalBarsWeightOfCarcasses}); + factory _DashboardKillHouseFreeBar.fromJson(Map json) => _$DashboardKillHouseFreeBarFromJson(json); + +@override final int? totalBars; +@override final int? totalBarsQuantity; +@override final int? totalBarsLiveWeight; +@override final int? totalBarsNumberOfCarcasses; +@override final int? totalBarsWeightOfCarcasses; + +/// Create a copy of DashboardKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$DashboardKillHouseFreeBarCopyWith<_DashboardKillHouseFreeBar> get copyWith => __$DashboardKillHouseFreeBarCopyWithImpl<_DashboardKillHouseFreeBar>(this, _$identity); + +@override +Map toJson() { + return _$DashboardKillHouseFreeBarToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _DashboardKillHouseFreeBar&&(identical(other.totalBars, totalBars) || other.totalBars == totalBars)&&(identical(other.totalBarsQuantity, totalBarsQuantity) || other.totalBarsQuantity == totalBarsQuantity)&&(identical(other.totalBarsLiveWeight, totalBarsLiveWeight) || other.totalBarsLiveWeight == totalBarsLiveWeight)&&(identical(other.totalBarsNumberOfCarcasses, totalBarsNumberOfCarcasses) || other.totalBarsNumberOfCarcasses == totalBarsNumberOfCarcasses)&&(identical(other.totalBarsWeightOfCarcasses, totalBarsWeightOfCarcasses) || other.totalBarsWeightOfCarcasses == totalBarsWeightOfCarcasses)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,totalBars,totalBarsQuantity,totalBarsLiveWeight,totalBarsNumberOfCarcasses,totalBarsWeightOfCarcasses); + +@override +String toString() { + return 'DashboardKillHouseFreeBar(totalBars: $totalBars, totalBarsQuantity: $totalBarsQuantity, totalBarsLiveWeight: $totalBarsLiveWeight, totalBarsNumberOfCarcasses: $totalBarsNumberOfCarcasses, totalBarsWeightOfCarcasses: $totalBarsWeightOfCarcasses)'; +} + + +} + +/// @nodoc +abstract mixin class _$DashboardKillHouseFreeBarCopyWith<$Res> implements $DashboardKillHouseFreeBarCopyWith<$Res> { + factory _$DashboardKillHouseFreeBarCopyWith(_DashboardKillHouseFreeBar value, $Res Function(_DashboardKillHouseFreeBar) _then) = __$DashboardKillHouseFreeBarCopyWithImpl; +@override @useResult +$Res call({ + int? totalBars, int? totalBarsQuantity, int? totalBarsLiveWeight, int? totalBarsNumberOfCarcasses, int? totalBarsWeightOfCarcasses +}); + + + + +} +/// @nodoc +class __$DashboardKillHouseFreeBarCopyWithImpl<$Res> + implements _$DashboardKillHouseFreeBarCopyWith<$Res> { + __$DashboardKillHouseFreeBarCopyWithImpl(this._self, this._then); + + final _DashboardKillHouseFreeBar _self; + final $Res Function(_DashboardKillHouseFreeBar) _then; + +/// Create a copy of DashboardKillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? totalBars = freezed,Object? totalBarsQuantity = freezed,Object? totalBarsLiveWeight = freezed,Object? totalBarsNumberOfCarcasses = freezed,Object? totalBarsWeightOfCarcasses = freezed,}) { + return _then(_DashboardKillHouseFreeBar( +totalBars: freezed == totalBars ? _self.totalBars : totalBars // ignore: cast_nullable_to_non_nullable +as int?,totalBarsQuantity: freezed == totalBarsQuantity ? _self.totalBarsQuantity : totalBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalBarsLiveWeight: freezed == totalBarsLiveWeight ? _self.totalBarsLiveWeight : totalBarsLiveWeight // ignore: cast_nullable_to_non_nullable +as int?,totalBarsNumberOfCarcasses: freezed == totalBarsNumberOfCarcasses ? _self.totalBarsNumberOfCarcasses : totalBarsNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,totalBarsWeightOfCarcasses: freezed == totalBarsWeightOfCarcasses ? _self.totalBarsWeightOfCarcasses : totalBarsWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.g.dart b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.g.dart new file mode 100644 index 0000000..175c035 --- /dev/null +++ b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'dashboard_kill_house_free_bar.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_DashboardKillHouseFreeBar _$DashboardKillHouseFreeBarFromJson( + Map json, +) => _DashboardKillHouseFreeBar( + totalBars: (json['total_bars'] as num?)?.toInt(), + totalBarsQuantity: (json['total_bars_quantity'] as num?)?.toInt(), + totalBarsLiveWeight: (json['total_bars_live_weight'] as num?)?.toInt(), + totalBarsNumberOfCarcasses: (json['total_bars_number_of_carcasses'] as num?) + ?.toInt(), + totalBarsWeightOfCarcasses: (json['total_bars_weight_of_carcasses'] as num?) + ?.toInt(), +); + +Map _$DashboardKillHouseFreeBarToJson( + _DashboardKillHouseFreeBar instance, +) => { + 'total_bars': instance.totalBars, + 'total_bars_quantity': instance.totalBarsQuantity, + 'total_bars_live_weight': instance.totalBarsLiveWeight, + 'total_bars_number_of_carcasses': instance.totalBarsNumberOfCarcasses, + 'total_bars_weight_of_carcasses': instance.totalBarsWeightOfCarcasses, +}; diff --git a/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.dart b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.dart new file mode 100644 index 0000000..ce20daa --- /dev/null +++ b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.dart @@ -0,0 +1,71 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'kill_house_free_bar.freezed.dart'; +part 'kill_house_free_bar.g.dart'; + +@freezed +abstract class KillHouseFreeBar with _$KillHouseFreeBar { + const factory KillHouseFreeBar({ + int? id, + dynamic killHouse, + dynamic exclusiveKiller, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + String? poultryName, + String? poultryMobile, + String? sellerName, + String? sellerMobile, + String? province, + String? city, + String? vetFarmName, + String? vetFarmMobile, + String? driverName, + String? driverMobile, + String? car, + String? clearanceCode, + String? barClearanceCode, + int? quantity, + int? numberOfCarcasses, + int? weightOfCarcasses, + int? killHouseVetQuantity, + int? killHouseVetWeight, + String? killHouseVetState, + String? dateOfAcceptReject, + dynamic acceptorRejector, + int? liveWeight, + String? barImage, + String? buyType, + bool? wareHouse, + String? date, + int? wage, + int? totalWageAmount, + int? unionShare, + int? unionSharePercent, + int? companyShare, + int? companySharePercent, + int? guildsShare, + int? guildsSharePercent, + int? cityShare, + int? citySharePercent, + int? walletShare, + int? walletSharePercent, + int? otherShare, + int? otherSharePercent, + bool? archiveWage, + int? weightLoss, + bool? calculateStatus, + bool? temporaryTrash, + bool? temporaryDeleted, + String? enteredMessage, + int? barCode, + String? registerType, + dynamic createdBy, + dynamic modifiedBy, + int? product, + }) = _KillHouseFreeBar; + + factory KillHouseFreeBar.fromJson(Map json) => + _$KillHouseFreeBarFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart new file mode 100644 index 0000000..df76f38 --- /dev/null +++ b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart @@ -0,0 +1,319 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'kill_house_free_bar.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$KillHouseFreeBar { + + int? get id; dynamic get killHouse; dynamic get exclusiveKiller; String? get key; String? get createDate; String? get modifyDate; bool? get trash; String? get poultryName; String? get poultryMobile; String? get sellerName; String? get sellerMobile; String? get province; String? get city; String? get vetFarmName; String? get vetFarmMobile; String? get driverName; String? get driverMobile; String? get car; String? get clearanceCode; String? get barClearanceCode; int? get quantity; int? get numberOfCarcasses; int? get weightOfCarcasses; int? get killHouseVetQuantity; int? get killHouseVetWeight; String? get killHouseVetState; String? get dateOfAcceptReject; dynamic get acceptorRejector; int? get liveWeight; String? get barImage; String? get buyType; bool? get wareHouse; String? get date; int? get wage; int? get totalWageAmount; int? get unionShare; int? get unionSharePercent; int? get companyShare; int? get companySharePercent; int? get guildsShare; int? get guildsSharePercent; int? get cityShare; int? get citySharePercent; int? get walletShare; int? get walletSharePercent; int? get otherShare; int? get otherSharePercent; bool? get archiveWage; int? get weightLoss; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; String? get enteredMessage; int? get barCode; String? get registerType; dynamic get createdBy; dynamic get modifiedBy; int? get product; +/// Create a copy of KillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$KillHouseFreeBarCopyWith get copyWith => _$KillHouseFreeBarCopyWithImpl(this as KillHouseFreeBar, _$identity); + + /// Serializes this KillHouseFreeBar to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouseFreeBar&&(identical(other.id, id) || other.id == id)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.exclusiveKiller, exclusiveKiller)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.poultryName, poultryName) || other.poultryName == poultryName)&&(identical(other.poultryMobile, poultryMobile) || other.poultryMobile == poultryMobile)&&(identical(other.sellerName, sellerName) || other.sellerName == sellerName)&&(identical(other.sellerMobile, sellerMobile) || other.sellerMobile == sellerMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.vetFarmName, vetFarmName) || other.vetFarmName == vetFarmName)&&(identical(other.vetFarmMobile, vetFarmMobile) || other.vetFarmMobile == vetFarmMobile)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&(identical(other.car, car) || other.car == car)&&(identical(other.clearanceCode, clearanceCode) || other.clearanceCode == clearanceCode)&&(identical(other.barClearanceCode, barClearanceCode) || other.barClearanceCode == barClearanceCode)&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.killHouseVetQuantity, killHouseVetQuantity) || other.killHouseVetQuantity == killHouseVetQuantity)&&(identical(other.killHouseVetWeight, killHouseVetWeight) || other.killHouseVetWeight == killHouseVetWeight)&&(identical(other.killHouseVetState, killHouseVetState) || other.killHouseVetState == killHouseVetState)&&(identical(other.dateOfAcceptReject, dateOfAcceptReject) || other.dateOfAcceptReject == dateOfAcceptReject)&&const DeepCollectionEquality().equals(other.acceptorRejector, acceptorRejector)&&(identical(other.liveWeight, liveWeight) || other.liveWeight == liveWeight)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.buyType, buyType) || other.buyType == buyType)&&(identical(other.wareHouse, wareHouse) || other.wareHouse == wareHouse)&&(identical(other.date, date) || other.date == date)&&(identical(other.wage, wage) || other.wage == wage)&&(identical(other.totalWageAmount, totalWageAmount) || other.totalWageAmount == totalWageAmount)&&(identical(other.unionShare, unionShare) || other.unionShare == unionShare)&&(identical(other.unionSharePercent, unionSharePercent) || other.unionSharePercent == unionSharePercent)&&(identical(other.companyShare, companyShare) || other.companyShare == companyShare)&&(identical(other.companySharePercent, companySharePercent) || other.companySharePercent == companySharePercent)&&(identical(other.guildsShare, guildsShare) || other.guildsShare == guildsShare)&&(identical(other.guildsSharePercent, guildsSharePercent) || other.guildsSharePercent == guildsSharePercent)&&(identical(other.cityShare, cityShare) || other.cityShare == cityShare)&&(identical(other.citySharePercent, citySharePercent) || other.citySharePercent == citySharePercent)&&(identical(other.walletShare, walletShare) || other.walletShare == walletShare)&&(identical(other.walletSharePercent, walletSharePercent) || other.walletSharePercent == walletSharePercent)&&(identical(other.otherShare, otherShare) || other.otherShare == otherShare)&&(identical(other.otherSharePercent, otherSharePercent) || other.otherSharePercent == otherSharePercent)&&(identical(other.archiveWage, archiveWage) || other.archiveWage == archiveWage)&&(identical(other.weightLoss, weightLoss) || other.weightLoss == weightLoss)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.enteredMessage, enteredMessage) || other.enteredMessage == enteredMessage)&&(identical(other.barCode, barCode) || other.barCode == barCode)&&(identical(other.registerType, registerType) || other.registerType == registerType)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.product, product) || other.product == product)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(exclusiveKiller),key,createDate,modifyDate,trash,poultryName,poultryMobile,sellerName,sellerMobile,province,city,vetFarmName,vetFarmMobile,driverName,driverMobile,car,clearanceCode,barClearanceCode,quantity,numberOfCarcasses,weightOfCarcasses,killHouseVetQuantity,killHouseVetWeight,killHouseVetState,dateOfAcceptReject,const DeepCollectionEquality().hash(acceptorRejector),liveWeight,barImage,buyType,wareHouse,date,wage,totalWageAmount,unionShare,unionSharePercent,companyShare,companySharePercent,guildsShare,guildsSharePercent,cityShare,citySharePercent,walletShare,walletSharePercent,otherShare,otherSharePercent,archiveWage,weightLoss,calculateStatus,temporaryTrash,temporaryDeleted,enteredMessage,barCode,registerType,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),product]); + +@override +String toString() { + return 'KillHouseFreeBar(id: $id, killHouse: $killHouse, exclusiveKiller: $exclusiveKiller, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, poultryName: $poultryName, poultryMobile: $poultryMobile, sellerName: $sellerName, sellerMobile: $sellerMobile, province: $province, city: $city, vetFarmName: $vetFarmName, vetFarmMobile: $vetFarmMobile, driverName: $driverName, driverMobile: $driverMobile, car: $car, clearanceCode: $clearanceCode, barClearanceCode: $barClearanceCode, quantity: $quantity, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, killHouseVetQuantity: $killHouseVetQuantity, killHouseVetWeight: $killHouseVetWeight, killHouseVetState: $killHouseVetState, dateOfAcceptReject: $dateOfAcceptReject, acceptorRejector: $acceptorRejector, liveWeight: $liveWeight, barImage: $barImage, buyType: $buyType, wareHouse: $wareHouse, date: $date, wage: $wage, totalWageAmount: $totalWageAmount, unionShare: $unionShare, unionSharePercent: $unionSharePercent, companyShare: $companyShare, companySharePercent: $companySharePercent, guildsShare: $guildsShare, guildsSharePercent: $guildsSharePercent, cityShare: $cityShare, citySharePercent: $citySharePercent, walletShare: $walletShare, walletSharePercent: $walletSharePercent, otherShare: $otherShare, otherSharePercent: $otherSharePercent, archiveWage: $archiveWage, weightLoss: $weightLoss, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, enteredMessage: $enteredMessage, barCode: $barCode, registerType: $registerType, createdBy: $createdBy, modifiedBy: $modifiedBy, product: $product)'; +} + + +} + +/// @nodoc +abstract mixin class $KillHouseFreeBarCopyWith<$Res> { + factory $KillHouseFreeBarCopyWith(KillHouseFreeBar value, $Res Function(KillHouseFreeBar) _then) = _$KillHouseFreeBarCopyWithImpl; +@useResult +$Res call({ + int? id, dynamic killHouse, dynamic exclusiveKiller, String? key, String? createDate, String? modifyDate, bool? trash, String? poultryName, String? poultryMobile, String? sellerName, String? sellerMobile, String? province, String? city, String? vetFarmName, String? vetFarmMobile, String? driverName, String? driverMobile, String? car, String? clearanceCode, String? barClearanceCode, int? quantity, int? numberOfCarcasses, int? weightOfCarcasses, int? killHouseVetQuantity, int? killHouseVetWeight, String? killHouseVetState, String? dateOfAcceptReject, dynamic acceptorRejector, int? liveWeight, String? barImage, String? buyType, bool? wareHouse, String? date, int? wage, int? totalWageAmount, int? unionShare, int? unionSharePercent, int? companyShare, int? companySharePercent, int? guildsShare, int? guildsSharePercent, int? cityShare, int? citySharePercent, int? walletShare, int? walletSharePercent, int? otherShare, int? otherSharePercent, bool? archiveWage, int? weightLoss, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? enteredMessage, int? barCode, String? registerType, dynamic createdBy, dynamic modifiedBy, int? product +}); + + + + +} +/// @nodoc +class _$KillHouseFreeBarCopyWithImpl<$Res> + implements $KillHouseFreeBarCopyWith<$Res> { + _$KillHouseFreeBarCopyWithImpl(this._self, this._then); + + final KillHouseFreeBar _self; + final $Res Function(KillHouseFreeBar) _then; + +/// Create a copy of KillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? killHouse = freezed,Object? exclusiveKiller = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? poultryName = freezed,Object? poultryMobile = freezed,Object? sellerName = freezed,Object? sellerMobile = freezed,Object? province = freezed,Object? city = freezed,Object? vetFarmName = freezed,Object? vetFarmMobile = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? car = freezed,Object? clearanceCode = freezed,Object? barClearanceCode = freezed,Object? quantity = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? killHouseVetQuantity = freezed,Object? killHouseVetWeight = freezed,Object? killHouseVetState = freezed,Object? dateOfAcceptReject = freezed,Object? acceptorRejector = freezed,Object? liveWeight = freezed,Object? barImage = freezed,Object? buyType = freezed,Object? wareHouse = freezed,Object? date = freezed,Object? wage = freezed,Object? totalWageAmount = freezed,Object? unionShare = freezed,Object? unionSharePercent = freezed,Object? companyShare = freezed,Object? companySharePercent = freezed,Object? guildsShare = freezed,Object? guildsSharePercent = freezed,Object? cityShare = freezed,Object? citySharePercent = freezed,Object? walletShare = freezed,Object? walletSharePercent = freezed,Object? otherShare = freezed,Object? otherSharePercent = freezed,Object? archiveWage = freezed,Object? weightLoss = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? enteredMessage = freezed,Object? barCode = freezed,Object? registerType = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? product = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,exclusiveKiller: freezed == exclusiveKiller ? _self.exclusiveKiller : exclusiveKiller // ignore: cast_nullable_to_non_nullable +as dynamic,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,poultryName: freezed == poultryName ? _self.poultryName : poultryName // ignore: cast_nullable_to_non_nullable +as String?,poultryMobile: freezed == poultryMobile ? _self.poultryMobile : poultryMobile // ignore: cast_nullable_to_non_nullable +as String?,sellerName: freezed == sellerName ? _self.sellerName : sellerName // ignore: cast_nullable_to_non_nullable +as String?,sellerMobile: freezed == sellerMobile ? _self.sellerMobile : sellerMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,vetFarmName: freezed == vetFarmName ? _self.vetFarmName : vetFarmName // ignore: cast_nullable_to_non_nullable +as String?,vetFarmMobile: freezed == vetFarmMobile ? _self.vetFarmMobile : vetFarmMobile // ignore: cast_nullable_to_non_nullable +as String?,driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable +as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as String?,clearanceCode: freezed == clearanceCode ? _self.clearanceCode : clearanceCode // ignore: cast_nullable_to_non_nullable +as String?,barClearanceCode: freezed == barClearanceCode ? _self.barClearanceCode : barClearanceCode // ignore: cast_nullable_to_non_nullable +as String?,quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable +as int?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,killHouseVetQuantity: freezed == killHouseVetQuantity ? _self.killHouseVetQuantity : killHouseVetQuantity // ignore: cast_nullable_to_non_nullable +as int?,killHouseVetWeight: freezed == killHouseVetWeight ? _self.killHouseVetWeight : killHouseVetWeight // ignore: cast_nullable_to_non_nullable +as int?,killHouseVetState: freezed == killHouseVetState ? _self.killHouseVetState : killHouseVetState // ignore: cast_nullable_to_non_nullable +as String?,dateOfAcceptReject: freezed == dateOfAcceptReject ? _self.dateOfAcceptReject : dateOfAcceptReject // ignore: cast_nullable_to_non_nullable +as String?,acceptorRejector: freezed == acceptorRejector ? _self.acceptorRejector : acceptorRejector // ignore: cast_nullable_to_non_nullable +as dynamic,liveWeight: freezed == liveWeight ? _self.liveWeight : liveWeight // ignore: cast_nullable_to_non_nullable +as int?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable +as String?,buyType: freezed == buyType ? _self.buyType : buyType // ignore: cast_nullable_to_non_nullable +as String?,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as bool?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,wage: freezed == wage ? _self.wage : wage // ignore: cast_nullable_to_non_nullable +as int?,totalWageAmount: freezed == totalWageAmount ? _self.totalWageAmount : totalWageAmount // ignore: cast_nullable_to_non_nullable +as int?,unionShare: freezed == unionShare ? _self.unionShare : unionShare // ignore: cast_nullable_to_non_nullable +as int?,unionSharePercent: freezed == unionSharePercent ? _self.unionSharePercent : unionSharePercent // ignore: cast_nullable_to_non_nullable +as int?,companyShare: freezed == companyShare ? _self.companyShare : companyShare // ignore: cast_nullable_to_non_nullable +as int?,companySharePercent: freezed == companySharePercent ? _self.companySharePercent : companySharePercent // ignore: cast_nullable_to_non_nullable +as int?,guildsShare: freezed == guildsShare ? _self.guildsShare : guildsShare // ignore: cast_nullable_to_non_nullable +as int?,guildsSharePercent: freezed == guildsSharePercent ? _self.guildsSharePercent : guildsSharePercent // ignore: cast_nullable_to_non_nullable +as int?,cityShare: freezed == cityShare ? _self.cityShare : cityShare // ignore: cast_nullable_to_non_nullable +as int?,citySharePercent: freezed == citySharePercent ? _self.citySharePercent : citySharePercent // ignore: cast_nullable_to_non_nullable +as int?,walletShare: freezed == walletShare ? _self.walletShare : walletShare // ignore: cast_nullable_to_non_nullable +as int?,walletSharePercent: freezed == walletSharePercent ? _self.walletSharePercent : walletSharePercent // ignore: cast_nullable_to_non_nullable +as int?,otherShare: freezed == otherShare ? _self.otherShare : otherShare // ignore: cast_nullable_to_non_nullable +as int?,otherSharePercent: freezed == otherSharePercent ? _self.otherSharePercent : otherSharePercent // ignore: cast_nullable_to_non_nullable +as int?,archiveWage: freezed == archiveWage ? _self.archiveWage : archiveWage // ignore: cast_nullable_to_non_nullable +as bool?,weightLoss: freezed == weightLoss ? _self.weightLoss : weightLoss // ignore: cast_nullable_to_non_nullable +as int?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,enteredMessage: freezed == enteredMessage ? _self.enteredMessage : enteredMessage // ignore: cast_nullable_to_non_nullable +as String?,barCode: freezed == barCode ? _self.barCode : barCode // ignore: cast_nullable_to_non_nullable +as int?,registerType: freezed == registerType ? _self.registerType : registerType // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _KillHouseFreeBar implements KillHouseFreeBar { + const _KillHouseFreeBar({this.id, this.killHouse, this.exclusiveKiller, this.key, this.createDate, this.modifyDate, this.trash, this.poultryName, this.poultryMobile, this.sellerName, this.sellerMobile, this.province, this.city, this.vetFarmName, this.vetFarmMobile, this.driverName, this.driverMobile, this.car, this.clearanceCode, this.barClearanceCode, this.quantity, this.numberOfCarcasses, this.weightOfCarcasses, this.killHouseVetQuantity, this.killHouseVetWeight, this.killHouseVetState, this.dateOfAcceptReject, this.acceptorRejector, this.liveWeight, this.barImage, this.buyType, this.wareHouse, this.date, this.wage, this.totalWageAmount, this.unionShare, this.unionSharePercent, this.companyShare, this.companySharePercent, this.guildsShare, this.guildsSharePercent, this.cityShare, this.citySharePercent, this.walletShare, this.walletSharePercent, this.otherShare, this.otherSharePercent, this.archiveWage, this.weightLoss, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.enteredMessage, this.barCode, this.registerType, this.createdBy, this.modifiedBy, this.product}); + factory _KillHouseFreeBar.fromJson(Map json) => _$KillHouseFreeBarFromJson(json); + +@override final int? id; +@override final dynamic killHouse; +@override final dynamic exclusiveKiller; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final String? poultryName; +@override final String? poultryMobile; +@override final String? sellerName; +@override final String? sellerMobile; +@override final String? province; +@override final String? city; +@override final String? vetFarmName; +@override final String? vetFarmMobile; +@override final String? driverName; +@override final String? driverMobile; +@override final String? car; +@override final String? clearanceCode; +@override final String? barClearanceCode; +@override final int? quantity; +@override final int? numberOfCarcasses; +@override final int? weightOfCarcasses; +@override final int? killHouseVetQuantity; +@override final int? killHouseVetWeight; +@override final String? killHouseVetState; +@override final String? dateOfAcceptReject; +@override final dynamic acceptorRejector; +@override final int? liveWeight; +@override final String? barImage; +@override final String? buyType; +@override final bool? wareHouse; +@override final String? date; +@override final int? wage; +@override final int? totalWageAmount; +@override final int? unionShare; +@override final int? unionSharePercent; +@override final int? companyShare; +@override final int? companySharePercent; +@override final int? guildsShare; +@override final int? guildsSharePercent; +@override final int? cityShare; +@override final int? citySharePercent; +@override final int? walletShare; +@override final int? walletSharePercent; +@override final int? otherShare; +@override final int? otherSharePercent; +@override final bool? archiveWage; +@override final int? weightLoss; +@override final bool? calculateStatus; +@override final bool? temporaryTrash; +@override final bool? temporaryDeleted; +@override final String? enteredMessage; +@override final int? barCode; +@override final String? registerType; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final int? product; + +/// Create a copy of KillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$KillHouseFreeBarCopyWith<_KillHouseFreeBar> get copyWith => __$KillHouseFreeBarCopyWithImpl<_KillHouseFreeBar>(this, _$identity); + +@override +Map toJson() { + return _$KillHouseFreeBarToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouseFreeBar&&(identical(other.id, id) || other.id == id)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.exclusiveKiller, exclusiveKiller)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.poultryName, poultryName) || other.poultryName == poultryName)&&(identical(other.poultryMobile, poultryMobile) || other.poultryMobile == poultryMobile)&&(identical(other.sellerName, sellerName) || other.sellerName == sellerName)&&(identical(other.sellerMobile, sellerMobile) || other.sellerMobile == sellerMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.vetFarmName, vetFarmName) || other.vetFarmName == vetFarmName)&&(identical(other.vetFarmMobile, vetFarmMobile) || other.vetFarmMobile == vetFarmMobile)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&(identical(other.car, car) || other.car == car)&&(identical(other.clearanceCode, clearanceCode) || other.clearanceCode == clearanceCode)&&(identical(other.barClearanceCode, barClearanceCode) || other.barClearanceCode == barClearanceCode)&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.killHouseVetQuantity, killHouseVetQuantity) || other.killHouseVetQuantity == killHouseVetQuantity)&&(identical(other.killHouseVetWeight, killHouseVetWeight) || other.killHouseVetWeight == killHouseVetWeight)&&(identical(other.killHouseVetState, killHouseVetState) || other.killHouseVetState == killHouseVetState)&&(identical(other.dateOfAcceptReject, dateOfAcceptReject) || other.dateOfAcceptReject == dateOfAcceptReject)&&const DeepCollectionEquality().equals(other.acceptorRejector, acceptorRejector)&&(identical(other.liveWeight, liveWeight) || other.liveWeight == liveWeight)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.buyType, buyType) || other.buyType == buyType)&&(identical(other.wareHouse, wareHouse) || other.wareHouse == wareHouse)&&(identical(other.date, date) || other.date == date)&&(identical(other.wage, wage) || other.wage == wage)&&(identical(other.totalWageAmount, totalWageAmount) || other.totalWageAmount == totalWageAmount)&&(identical(other.unionShare, unionShare) || other.unionShare == unionShare)&&(identical(other.unionSharePercent, unionSharePercent) || other.unionSharePercent == unionSharePercent)&&(identical(other.companyShare, companyShare) || other.companyShare == companyShare)&&(identical(other.companySharePercent, companySharePercent) || other.companySharePercent == companySharePercent)&&(identical(other.guildsShare, guildsShare) || other.guildsShare == guildsShare)&&(identical(other.guildsSharePercent, guildsSharePercent) || other.guildsSharePercent == guildsSharePercent)&&(identical(other.cityShare, cityShare) || other.cityShare == cityShare)&&(identical(other.citySharePercent, citySharePercent) || other.citySharePercent == citySharePercent)&&(identical(other.walletShare, walletShare) || other.walletShare == walletShare)&&(identical(other.walletSharePercent, walletSharePercent) || other.walletSharePercent == walletSharePercent)&&(identical(other.otherShare, otherShare) || other.otherShare == otherShare)&&(identical(other.otherSharePercent, otherSharePercent) || other.otherSharePercent == otherSharePercent)&&(identical(other.archiveWage, archiveWage) || other.archiveWage == archiveWage)&&(identical(other.weightLoss, weightLoss) || other.weightLoss == weightLoss)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.enteredMessage, enteredMessage) || other.enteredMessage == enteredMessage)&&(identical(other.barCode, barCode) || other.barCode == barCode)&&(identical(other.registerType, registerType) || other.registerType == registerType)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.product, product) || other.product == product)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(exclusiveKiller),key,createDate,modifyDate,trash,poultryName,poultryMobile,sellerName,sellerMobile,province,city,vetFarmName,vetFarmMobile,driverName,driverMobile,car,clearanceCode,barClearanceCode,quantity,numberOfCarcasses,weightOfCarcasses,killHouseVetQuantity,killHouseVetWeight,killHouseVetState,dateOfAcceptReject,const DeepCollectionEquality().hash(acceptorRejector),liveWeight,barImage,buyType,wareHouse,date,wage,totalWageAmount,unionShare,unionSharePercent,companyShare,companySharePercent,guildsShare,guildsSharePercent,cityShare,citySharePercent,walletShare,walletSharePercent,otherShare,otherSharePercent,archiveWage,weightLoss,calculateStatus,temporaryTrash,temporaryDeleted,enteredMessage,barCode,registerType,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),product]); + +@override +String toString() { + return 'KillHouseFreeBar(id: $id, killHouse: $killHouse, exclusiveKiller: $exclusiveKiller, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, poultryName: $poultryName, poultryMobile: $poultryMobile, sellerName: $sellerName, sellerMobile: $sellerMobile, province: $province, city: $city, vetFarmName: $vetFarmName, vetFarmMobile: $vetFarmMobile, driverName: $driverName, driverMobile: $driverMobile, car: $car, clearanceCode: $clearanceCode, barClearanceCode: $barClearanceCode, quantity: $quantity, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, killHouseVetQuantity: $killHouseVetQuantity, killHouseVetWeight: $killHouseVetWeight, killHouseVetState: $killHouseVetState, dateOfAcceptReject: $dateOfAcceptReject, acceptorRejector: $acceptorRejector, liveWeight: $liveWeight, barImage: $barImage, buyType: $buyType, wareHouse: $wareHouse, date: $date, wage: $wage, totalWageAmount: $totalWageAmount, unionShare: $unionShare, unionSharePercent: $unionSharePercent, companyShare: $companyShare, companySharePercent: $companySharePercent, guildsShare: $guildsShare, guildsSharePercent: $guildsSharePercent, cityShare: $cityShare, citySharePercent: $citySharePercent, walletShare: $walletShare, walletSharePercent: $walletSharePercent, otherShare: $otherShare, otherSharePercent: $otherSharePercent, archiveWage: $archiveWage, weightLoss: $weightLoss, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, enteredMessage: $enteredMessage, barCode: $barCode, registerType: $registerType, createdBy: $createdBy, modifiedBy: $modifiedBy, product: $product)'; +} + + +} + +/// @nodoc +abstract mixin class _$KillHouseFreeBarCopyWith<$Res> implements $KillHouseFreeBarCopyWith<$Res> { + factory _$KillHouseFreeBarCopyWith(_KillHouseFreeBar value, $Res Function(_KillHouseFreeBar) _then) = __$KillHouseFreeBarCopyWithImpl; +@override @useResult +$Res call({ + int? id, dynamic killHouse, dynamic exclusiveKiller, String? key, String? createDate, String? modifyDate, bool? trash, String? poultryName, String? poultryMobile, String? sellerName, String? sellerMobile, String? province, String? city, String? vetFarmName, String? vetFarmMobile, String? driverName, String? driverMobile, String? car, String? clearanceCode, String? barClearanceCode, int? quantity, int? numberOfCarcasses, int? weightOfCarcasses, int? killHouseVetQuantity, int? killHouseVetWeight, String? killHouseVetState, String? dateOfAcceptReject, dynamic acceptorRejector, int? liveWeight, String? barImage, String? buyType, bool? wareHouse, String? date, int? wage, int? totalWageAmount, int? unionShare, int? unionSharePercent, int? companyShare, int? companySharePercent, int? guildsShare, int? guildsSharePercent, int? cityShare, int? citySharePercent, int? walletShare, int? walletSharePercent, int? otherShare, int? otherSharePercent, bool? archiveWage, int? weightLoss, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? enteredMessage, int? barCode, String? registerType, dynamic createdBy, dynamic modifiedBy, int? product +}); + + + + +} +/// @nodoc +class __$KillHouseFreeBarCopyWithImpl<$Res> + implements _$KillHouseFreeBarCopyWith<$Res> { + __$KillHouseFreeBarCopyWithImpl(this._self, this._then); + + final _KillHouseFreeBar _self; + final $Res Function(_KillHouseFreeBar) _then; + +/// Create a copy of KillHouseFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? killHouse = freezed,Object? exclusiveKiller = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? poultryName = freezed,Object? poultryMobile = freezed,Object? sellerName = freezed,Object? sellerMobile = freezed,Object? province = freezed,Object? city = freezed,Object? vetFarmName = freezed,Object? vetFarmMobile = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? car = freezed,Object? clearanceCode = freezed,Object? barClearanceCode = freezed,Object? quantity = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? killHouseVetQuantity = freezed,Object? killHouseVetWeight = freezed,Object? killHouseVetState = freezed,Object? dateOfAcceptReject = freezed,Object? acceptorRejector = freezed,Object? liveWeight = freezed,Object? barImage = freezed,Object? buyType = freezed,Object? wareHouse = freezed,Object? date = freezed,Object? wage = freezed,Object? totalWageAmount = freezed,Object? unionShare = freezed,Object? unionSharePercent = freezed,Object? companyShare = freezed,Object? companySharePercent = freezed,Object? guildsShare = freezed,Object? guildsSharePercent = freezed,Object? cityShare = freezed,Object? citySharePercent = freezed,Object? walletShare = freezed,Object? walletSharePercent = freezed,Object? otherShare = freezed,Object? otherSharePercent = freezed,Object? archiveWage = freezed,Object? weightLoss = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? enteredMessage = freezed,Object? barCode = freezed,Object? registerType = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? product = freezed,}) { + return _then(_KillHouseFreeBar( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,exclusiveKiller: freezed == exclusiveKiller ? _self.exclusiveKiller : exclusiveKiller // ignore: cast_nullable_to_non_nullable +as dynamic,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,poultryName: freezed == poultryName ? _self.poultryName : poultryName // ignore: cast_nullable_to_non_nullable +as String?,poultryMobile: freezed == poultryMobile ? _self.poultryMobile : poultryMobile // ignore: cast_nullable_to_non_nullable +as String?,sellerName: freezed == sellerName ? _self.sellerName : sellerName // ignore: cast_nullable_to_non_nullable +as String?,sellerMobile: freezed == sellerMobile ? _self.sellerMobile : sellerMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,vetFarmName: freezed == vetFarmName ? _self.vetFarmName : vetFarmName // ignore: cast_nullable_to_non_nullable +as String?,vetFarmMobile: freezed == vetFarmMobile ? _self.vetFarmMobile : vetFarmMobile // ignore: cast_nullable_to_non_nullable +as String?,driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable +as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as String?,clearanceCode: freezed == clearanceCode ? _self.clearanceCode : clearanceCode // ignore: cast_nullable_to_non_nullable +as String?,barClearanceCode: freezed == barClearanceCode ? _self.barClearanceCode : barClearanceCode // ignore: cast_nullable_to_non_nullable +as String?,quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable +as int?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,killHouseVetQuantity: freezed == killHouseVetQuantity ? _self.killHouseVetQuantity : killHouseVetQuantity // ignore: cast_nullable_to_non_nullable +as int?,killHouseVetWeight: freezed == killHouseVetWeight ? _self.killHouseVetWeight : killHouseVetWeight // ignore: cast_nullable_to_non_nullable +as int?,killHouseVetState: freezed == killHouseVetState ? _self.killHouseVetState : killHouseVetState // ignore: cast_nullable_to_non_nullable +as String?,dateOfAcceptReject: freezed == dateOfAcceptReject ? _self.dateOfAcceptReject : dateOfAcceptReject // ignore: cast_nullable_to_non_nullable +as String?,acceptorRejector: freezed == acceptorRejector ? _self.acceptorRejector : acceptorRejector // ignore: cast_nullable_to_non_nullable +as dynamic,liveWeight: freezed == liveWeight ? _self.liveWeight : liveWeight // ignore: cast_nullable_to_non_nullable +as int?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable +as String?,buyType: freezed == buyType ? _self.buyType : buyType // ignore: cast_nullable_to_non_nullable +as String?,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as bool?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,wage: freezed == wage ? _self.wage : wage // ignore: cast_nullable_to_non_nullable +as int?,totalWageAmount: freezed == totalWageAmount ? _self.totalWageAmount : totalWageAmount // ignore: cast_nullable_to_non_nullable +as int?,unionShare: freezed == unionShare ? _self.unionShare : unionShare // ignore: cast_nullable_to_non_nullable +as int?,unionSharePercent: freezed == unionSharePercent ? _self.unionSharePercent : unionSharePercent // ignore: cast_nullable_to_non_nullable +as int?,companyShare: freezed == companyShare ? _self.companyShare : companyShare // ignore: cast_nullable_to_non_nullable +as int?,companySharePercent: freezed == companySharePercent ? _self.companySharePercent : companySharePercent // ignore: cast_nullable_to_non_nullable +as int?,guildsShare: freezed == guildsShare ? _self.guildsShare : guildsShare // ignore: cast_nullable_to_non_nullable +as int?,guildsSharePercent: freezed == guildsSharePercent ? _self.guildsSharePercent : guildsSharePercent // ignore: cast_nullable_to_non_nullable +as int?,cityShare: freezed == cityShare ? _self.cityShare : cityShare // ignore: cast_nullable_to_non_nullable +as int?,citySharePercent: freezed == citySharePercent ? _self.citySharePercent : citySharePercent // ignore: cast_nullable_to_non_nullable +as int?,walletShare: freezed == walletShare ? _self.walletShare : walletShare // ignore: cast_nullable_to_non_nullable +as int?,walletSharePercent: freezed == walletSharePercent ? _self.walletSharePercent : walletSharePercent // ignore: cast_nullable_to_non_nullable +as int?,otherShare: freezed == otherShare ? _self.otherShare : otherShare // ignore: cast_nullable_to_non_nullable +as int?,otherSharePercent: freezed == otherSharePercent ? _self.otherSharePercent : otherSharePercent // ignore: cast_nullable_to_non_nullable +as int?,archiveWage: freezed == archiveWage ? _self.archiveWage : archiveWage // ignore: cast_nullable_to_non_nullable +as bool?,weightLoss: freezed == weightLoss ? _self.weightLoss : weightLoss // ignore: cast_nullable_to_non_nullable +as int?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,enteredMessage: freezed == enteredMessage ? _self.enteredMessage : enteredMessage // ignore: cast_nullable_to_non_nullable +as String?,barCode: freezed == barCode ? _self.barCode : barCode // ignore: cast_nullable_to_non_nullable +as int?,registerType: freezed == registerType ? _self.registerType : registerType // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.g.dart b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.g.dart new file mode 100644 index 0000000..c808032 --- /dev/null +++ b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.g.dart @@ -0,0 +1,131 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'kill_house_free_bar.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_KillHouseFreeBar _$KillHouseFreeBarFromJson(Map json) => + _KillHouseFreeBar( + id: (json['id'] as num?)?.toInt(), + killHouse: json['kill_house'], + exclusiveKiller: json['exclusive_killer'], + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + poultryName: json['poultry_name'] as String?, + poultryMobile: json['poultry_mobile'] as String?, + sellerName: json['seller_name'] as String?, + sellerMobile: json['seller_mobile'] as String?, + province: json['province'] as String?, + city: json['city'] as String?, + vetFarmName: json['vet_farm_name'] as String?, + vetFarmMobile: json['vet_farm_mobile'] as String?, + driverName: json['driver_name'] as String?, + driverMobile: json['driver_mobile'] as String?, + car: json['car'] as String?, + clearanceCode: json['clearance_code'] as String?, + barClearanceCode: json['bar_clearance_code'] as String?, + quantity: (json['quantity'] as num?)?.toInt(), + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + killHouseVetQuantity: (json['kill_house_vet_quantity'] as num?)?.toInt(), + killHouseVetWeight: (json['kill_house_vet_weight'] as num?)?.toInt(), + killHouseVetState: json['kill_house_vet_state'] as String?, + dateOfAcceptReject: json['date_of_accept_reject'] as String?, + acceptorRejector: json['acceptor_rejector'], + liveWeight: (json['live_weight'] as num?)?.toInt(), + barImage: json['bar_image'] as String?, + buyType: json['buy_type'] as String?, + wareHouse: json['ware_house'] as bool?, + date: json['date'] as String?, + wage: (json['wage'] as num?)?.toInt(), + totalWageAmount: (json['total_wage_amount'] as num?)?.toInt(), + unionShare: (json['union_share'] as num?)?.toInt(), + unionSharePercent: (json['union_share_percent'] as num?)?.toInt(), + companyShare: (json['company_share'] as num?)?.toInt(), + companySharePercent: (json['company_share_percent'] as num?)?.toInt(), + guildsShare: (json['guilds_share'] as num?)?.toInt(), + guildsSharePercent: (json['guilds_share_percent'] as num?)?.toInt(), + cityShare: (json['city_share'] as num?)?.toInt(), + citySharePercent: (json['city_share_percent'] as num?)?.toInt(), + walletShare: (json['wallet_share'] as num?)?.toInt(), + walletSharePercent: (json['wallet_share_percent'] as num?)?.toInt(), + otherShare: (json['other_share'] as num?)?.toInt(), + otherSharePercent: (json['other_share_percent'] as num?)?.toInt(), + archiveWage: json['archive_wage'] as bool?, + weightLoss: (json['weight_loss'] as num?)?.toInt(), + calculateStatus: json['calculate_status'] as bool?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + enteredMessage: json['entered_message'] as String?, + barCode: (json['bar_code'] as num?)?.toInt(), + registerType: json['register_type'] as String?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + product: (json['product'] as num?)?.toInt(), + ); + +Map _$KillHouseFreeBarToJson(_KillHouseFreeBar instance) => + { + 'id': instance.id, + 'kill_house': instance.killHouse, + 'exclusive_killer': instance.exclusiveKiller, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'poultry_name': instance.poultryName, + 'poultry_mobile': instance.poultryMobile, + 'seller_name': instance.sellerName, + 'seller_mobile': instance.sellerMobile, + 'province': instance.province, + 'city': instance.city, + 'vet_farm_name': instance.vetFarmName, + 'vet_farm_mobile': instance.vetFarmMobile, + 'driver_name': instance.driverName, + 'driver_mobile': instance.driverMobile, + 'car': instance.car, + 'clearance_code': instance.clearanceCode, + 'bar_clearance_code': instance.barClearanceCode, + 'quantity': instance.quantity, + 'number_of_carcasses': instance.numberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'kill_house_vet_quantity': instance.killHouseVetQuantity, + 'kill_house_vet_weight': instance.killHouseVetWeight, + 'kill_house_vet_state': instance.killHouseVetState, + 'date_of_accept_reject': instance.dateOfAcceptReject, + 'acceptor_rejector': instance.acceptorRejector, + 'live_weight': instance.liveWeight, + 'bar_image': instance.barImage, + 'buy_type': instance.buyType, + 'ware_house': instance.wareHouse, + 'date': instance.date, + 'wage': instance.wage, + 'total_wage_amount': instance.totalWageAmount, + 'union_share': instance.unionShare, + 'union_share_percent': instance.unionSharePercent, + 'company_share': instance.companyShare, + 'company_share_percent': instance.companySharePercent, + 'guilds_share': instance.guildsShare, + 'guilds_share_percent': instance.guildsSharePercent, + 'city_share': instance.cityShare, + 'city_share_percent': instance.citySharePercent, + 'wallet_share': instance.walletShare, + 'wallet_share_percent': instance.walletSharePercent, + 'other_share': instance.otherShare, + 'other_share_percent': instance.otherSharePercent, + 'archive_wage': instance.archiveWage, + 'weight_loss': instance.weightLoss, + 'calculate_status': instance.calculateStatus, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'entered_message': instance.enteredMessage, + 'bar_code': instance.barCode, + 'register_type': instance.registerType, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'product': instance.product, + }; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 4bbb4b4..a39a053 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -1,13 +1,16 @@ import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; abstract class ChickenRepository { Future?> getInventory({required String token}); @@ -54,7 +57,28 @@ abstract class ChickenRepository { }); Future?> getRolesProducts({required String token}); - Future?> getGuilds({required String token,required bool isFree}); + + Future?> getGuilds({ + required String token, + required bool isFree, + }); + Future getProfile({required String token}); - Future postSubmitStewardAllocation({required String token,required SubmitStewardAllocation request}); + + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }); + + Future getStewardDashboard({ + required String token, + required String stratDate, + required String endDate, + }); + + Future getDashboardKillHouseFreeBar({ + required String token, + required String stratDate, + required String endDate, + }); } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index a356919..6990d79 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,12 +1,14 @@ import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; import 'package:rasadyar_core/core.dart'; @@ -191,4 +193,35 @@ class ChickenRepositoryImpl implements ChickenRepository { data: request.toJson(), ); } + + @override + Future getStewardDashboard({ + required String token, + required String stratDate, + required String endDate, + }) async { + var res = await _httpClient.get( + '/steward_free_bar_dashboard/?date1=$stratDate&date2=$endDate&search=filter', + headers: {'Authorization': 'Bearer $token'}, + fromJson: StewardFreeBarDashboard.fromJson, + ); + return res.data; + } + + @override + Future getDashboardKillHouseFreeBar({ + required String token, + required String stratDate, + required String endDate, + }) async { + var res = await _httpClient.get( + '/dashboard_kill_house_free_bar/?date1=$stratDate&date2=$endDate&search=filter', + headers: {'Authorization': 'Bearer $token'}, + fromJson: DashboardKillHouseFreeBar.fromJson, + ); + return res.data; + + + + } } diff --git a/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart index da14cb4..4973676 100644 --- a/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart @@ -1,10 +1,8 @@ -import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; -import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; -import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; @@ -17,39 +15,13 @@ class SalesWithOutProvinceLogic extends GetxController { RxList guildsModel = [].obs; - Rxn stewardFreeDashboard = Rxn(); - + Rxn stewardFreeDashboard = + Rxn(); @override void onInit() { super.onInit(); - rootLogic.getInventory(); - getAllocatedMade(); - getRolesProducts(); - getGuilds(); - getGuildProfile(); - ever(saleType, (callback) { - getGuilds(); - }); - - weight.listen((num) { - totalCost.value = num * pricePerKilo.value; - }); - - pricePerKilo.listen((num) { - totalCost.value = num * weight.value; - }); - - totalCost.listen((data) { - totalCostController.text = data.toString(); - - isValid.value = - weight.value > 0 && - pricePerKilo.value > 0 && - totalCost.value > 0 && - selectedProductModel.value != null && - selectedGuildModel.value != null; - }); + getStewardDashBord(); } Future getAllocatedMade() async { @@ -67,14 +39,7 @@ class SalesWithOutProvinceLogic extends GetxController { ); } - void checkVerfication() { - isValid.value = - weight.value > 0 && - pricePerKilo.value > 0 && - totalCost.value > 0 && - selectedProductModel.value != null && - selectedGuildModel.value != null; - } + void checkVerfication() {} void confirmAllocation(ConformAllocation allocation) { safeCall( @@ -131,75 +96,46 @@ class SalesWithOutProvinceLogic extends GetxController { ); } - Future getGuilds() async { + Future getGuilds() async {} + + Future addSale() async {} + + void setSelectedGuild(GuildModel value) {} + + void setSelectedProduct(ProductModel value) {} + + Future getStewardDashBord() async { safeCall( - call: () async => await rootLogic.chickenRepository.getGuilds( + call: () async => await rootLogic.chickenRepository.getStewardDashboard( token: rootLogic.tokenService.accessToken.value!, - isFree: saleType.value == 2 ? true : false, + stratDate: DateTime.now().formattedDashedGregorian, + endDate: DateTime.now().formattedDashedGregorian, ), onSuccess: (result) { if (result != null) { - guildsModel.clear(); - guildsModel.addAll(result); + stewardFreeDashboard.value = result; } }, onError: (error, stacktrace) {}, ); } - Future addSale() async {} - - void setSelectedGuild(GuildModel value) { - selectedGuildModel.value = value; - update(); - } - - void setSelectedProduct(ProductModel value) { - selectedProductModel.value = value; - update(); - } - - Future getGuildProfile() async { - await safeCall( - call: () async => await rootLogic.chickenRepository.getProfile( - token: rootLogic.tokenService.accessToken.value!, - ), - onError: (error, stackTrace) {}, - onSuccess: (result) { - guildProfile.value = result; - }, - ); - } - - Future submitAllocation() async { - SubmitStewardAllocation stewardAllocation = SubmitStewardAllocation( - approvedPriceStatus: false, - allocationType: - '${guildProfile.value?.steward == true ? "steward" : "guild"}-${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', - sellerType: guildProfile.value?.steward == true ? "Steward" : "Guild", - buyerType: selectedGuildModel.value?.steward == true - ? "Steward" - : "Guild", - amount: pricePerKilo.value, - totalAmount: totalCost.value, - weightOfCarcasses: weight.value, - guildKey: selectedGuildModel.value?.key, - productKey: selectedProductModel.value?.key, - date: DateTime.now().formattedGregorianDate, - type: "manual", - ); - +/* Future getKillHouseDashBord() async { safeCall( call: () async => - await rootLogic.chickenRepository.postSubmitStewardAllocation( + await rootLogic.chickenRepository.getDashboardKillHouseFreeBar( token: rootLogic.tokenService.accessToken.value!, - request: stewardAllocation, + stratDate: DateTime.now().formattedDashedGregorian, + endDate: DateTime.now().formattedDashedGregorian, ), - onSuccess: (result) { - getAllocatedMade(); + if (result != null) { + killHouseDashboard.value = result; + } }, - onError: (error, stackTrace) {}, + onError: (error, stacktrace) {}, ); - } + }*/ + + Future submitAllocation() async {} } diff --git a/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart b/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart index 5017f06..832e3fb 100644 --- a/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart @@ -1,10 +1,6 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; -import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; -import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; -import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; -import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -15,11 +11,18 @@ class SalesWithOutProvincePage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar(title: 'فروش خارج استان'), + appBar: RAppBar( + title: 'فروش خارج استان', + + + + + + ), body: SingleChildScrollView( child: Column( - spacing: 10, children: [ + SizedBox(height: 12), ObxValue( (model) => summaryOfInformation(model.value), controller.stewardFreeDashboard, @@ -33,10 +36,18 @@ class SalesWithOutProvincePage extends GetView { Widget summaryOfInformation(StewardFreeBarDashboard? model) { return Column( children: [ - Text( - 'خلاصه اطلاعات', - textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + children: [ + Text( + 'خلاصه اطلاعات', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), ), Container( height: 140, @@ -54,9 +65,15 @@ class SalesWithOutProvincePage extends GetView { spacing: 10, children: [ const SizedBox(height: 12), - buildRow('تعداد کل بارها', model.totalQuantity.toString()), - buildRow('تعداد کل', model.totalBars.toString()), - buildRow('وزن کل (کیلوگرم)', model.totalWeight.toString()), + buildRow( + 'تعداد کل بارها', + model.totalQuantity?.toString() ?? '0', + ), + buildRow('تعداد کل', model.totalBars?.toString() ?? '0'), + buildRow( + 'وزن کل (کیلوگرم)', + model.totalWeight?.toString() ?? '0', + ), ], ), ), @@ -64,7 +81,40 @@ class SalesWithOutProvincePage extends GetView { ); } - Widget inventoryWidget() { + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + ], + ), + ); + } + + + + /* Widget inventoryWidget() { return Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0), child: Column( @@ -73,7 +123,7 @@ class SalesWithOutProvincePage extends GetView { Align( alignment: Alignment.centerRight, child: Text( - 'موجودی انبار', + 'خرید های خارج استان', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), ), @@ -141,9 +191,9 @@ class SalesWithOutProvincePage extends GetView { ], ), ); - } + }*/ - Widget inventoryItem({ + /* Widget inventoryItem({ required bool isExpanded, required int index, required InventoryModel model, @@ -186,36 +236,7 @@ class SalesWithOutProvincePage extends GetView { ); } - Widget buildRow(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ), - Flexible( - flex: 2, - child: Text( - value, - textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ), - ], - ), - ); - } + Widget allocationsMade() { return Padding( @@ -547,7 +568,7 @@ class SalesWithOutProvincePage extends GetView { }, ); }, controller.guildsModel); - /* return GetBuilder( + */ /* return GetBuilder( builder: (controller) { return DropdownButtonFormField( value: controller.selectedGuildModel.value, @@ -572,7 +593,7 @@ class SalesWithOutProvincePage extends GetView { }, ); }, - );*/ + );*/ /* } Widget productDropDown() { @@ -600,5 +621,5 @@ class SalesWithOutProvincePage extends GetView { ); }, ); - } + }*/ } diff --git a/packages/core/lib/presentation/utils/data_time_utils.dart b/packages/core/lib/presentation/utils/data_time_utils.dart index 65bb382..f62a641 100644 --- a/packages/core/lib/presentation/utils/data_time_utils.dart +++ b/packages/core/lib/presentation/utils/data_time_utils.dart @@ -4,5 +4,10 @@ extension XDataTime on DateTime { return "$year/${month.toString().padLeft(2, '0')}/${day.toString().padLeft(2, '0')}"; } + String get formattedDashedGregorian { + + return "$year-${month.toString().padLeft(2, '0')}-${day.toString().padLeft(2, '0')}"; + } + } \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index 67bec05..3871758 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -15,6 +15,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { final List? additionalActions; final int? leadingWidth; final Widget? leading; + final PreferredSizeWidget? bottom; const RAppBar({ super.key, @@ -27,7 +28,8 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { this.leading, this.hasBack = true, this.centerTitle = false, - this.leadingWidth + this.leadingWidth, + this.bottom, }); @override @@ -39,20 +41,18 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { excludeHeaderSemantics: true, scrolledUnderElevation: 0, centerTitle: centerTitle, + titleTextStyle: - titleTextStyle ?? - AppFonts.yekan16.copyWith(color:Colors.white), + titleTextStyle ?? AppFonts.yekan16.copyWith(color: Colors.white), title: Text(title), leadingWidth: leadingWidth?.toDouble(), - - leading:leading!=null ? Padding( - padding: const EdgeInsets.only(right: 16), - child: leading, - ) : null, + leading: leading != null + ? Padding(padding: const EdgeInsets.only(right: 16), child: leading) + : null, titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, - if(hasBack)...{ + if (hasBack) ...{ Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: IconButton( @@ -61,11 +61,9 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { color: iconColor, ), ), - } - - - + }, ], + bottom: bottom, ); } From 9a1e7cc768384aa90c9aa62945b3f251d4f98839 Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 6 Jun 2025 18:13:54 +0330 Subject: [PATCH 106/256] feat : pagination --- .../repositories/chicken_repository_imp.dart | 2 +- .../pages/entering_the_warehouse/logic.dart | 36 ++- .../pages/entering_the_warehouse/view.dart | 261 ++++++++++-------- 3 files changed, 172 insertions(+), 127 deletions(-) diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 6990d79..a6c3631 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -89,7 +89,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required int page, }) async { var res = await _httpClient.get( - '/steward-allocation/?role=Steward&search=filter&page=${page}&page_size=10&value=&type=entered', + '/steward-allocation/?role=Steward&search=filter&page=$page&page_size=10&value=&type=entered', headers: {'Authorization': 'Bearer $token'}, fromJson: ImportedLoadsModel.fromJson, ); diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart index 366f449..f156845 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart @@ -18,6 +18,12 @@ class EnteringTheWarehouseLogic extends GetxController { TextEditingController weightLossController = TextEditingController(); TextEditingController authenticationCodeController = TextEditingController(); + final ScrollController scrollControllerImportedLoad = ScrollController(); + final RxInt currentPageImportedLoad = 1.obs; + final RxBool isLoadingMoreImportedLoad = false.obs; + final RxBool addPageImportedLoad = false.obs; + final RxBool hasMoreDataImportedLoad = true.obs; + @override void onReady() { super.onReady(); @@ -25,6 +31,14 @@ class EnteringTheWarehouseLogic extends GetxController { getBarGeneralInformation(); getWaitingArrivals(); getImportedEntried(); + + scrollControllerImportedLoad.addListener(() { + if (scrollControllerImportedLoad.position.pixels >= + scrollControllerImportedLoad.position.maxScrollExtent - 100) { + addPageImportedLoad.value = true; + getImportedEntried(); + } + }); } Future getBarGeneralInformation() async { @@ -125,19 +139,31 @@ class EnteringTheWarehouseLogic extends GetxController { } Future getImportedEntried() async { + if (isLoadingMoreImportedLoad.value || !hasMoreDataImportedLoad.value) { + return; + } + + if (addPageImportedLoad.value) { + currentPageImportedLoad.value++; + } + safeCall( call: () async => await rootLogic.chickenRepository.getImportedLoadsModel( token: rootLogic.tokenService.accessToken.value!, - page: 1, + page: currentPageImportedLoad.value, ), onError: (error, stackTrace) { - eLog(error); + isLoadingMoreImportedLoad.value = false; }, onSuccess: (result) { - if(result!=null){ - importedLoads.value = result; + if (result != null) { + if (isLoadingMoreImportedLoad.value && result.results != null) { + importedLoads.value?.results?.addAll(result.results!); + } else { + importedLoads.value = result; + } + isLoadingMoreImportedLoad.value = false; } - }, ); } diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart index 0bff7d7..f998308 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart @@ -296,8 +296,7 @@ class EnteringTheWarehousePage extends GetView { margin: const EdgeInsets.symmetric(vertical: 2), height: 700, padding: const EdgeInsets.all(6), - child: - ListView.separated( + child: ListView.separated( padding: const EdgeInsets.all(8.0), itemCount: data.value?.results.length ?? 0, itemBuilder: (BuildContext context, int index) { @@ -384,139 +383,159 @@ class EnteringTheWarehousePage extends GetView { separatorBuilder: (BuildContext context, int index) => SizedBox(height: 8), ), - ); } - }, controller.waitingForArrival) - ] + }, controller.waitingForArrival), + ], ); } Widget importedLoads() { return Column( - children: [ - const SizedBox(height: 8), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Align( - alignment: Alignment.centerRight, - child: Text( - 'بارهای وارد شده', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), + children: [ + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Align( + alignment: Alignment.centerRight, + child: Text( + 'بارهای وارد شده', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), ), - ObxValue((data) { - if (data.value == null) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ); - } - else if (data.value?.results?.isEmpty ?? true) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: Text( 'هیچ بار وارد شده‌ای وجود ندارد')), - ); - } else { - return Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 700, - padding: const EdgeInsets.all(6), - child: - ListView.separated( - padding: const EdgeInsets.all(8.0), - itemCount: data.value?.results?.length ?? 0, - itemBuilder: (BuildContext context, int index) { - final result = data.value!.results![index]; - return Card( - margin: const EdgeInsets.symmetric(vertical: 4.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: const BorderSide( - color: AppColor.blueNormal, - width: 1, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildRow('ردیف', '${index + 1}'), - buildRow( - 'تاریخ ثبت', - result.date!.formattedJalaliDate ?? 'N/A', - ), - buildRow( - 'نوع تخصیص', - result.allocationType?.faAllocationType ?? 'N/A', - ), - buildRow( - 'مشخصات خریدار', - '${result.toSteward?.user?.fullname} - ${result.toSteward?.guildsName}' ?? 'N/A', - ), - buildRow( - 'مشخصات فروشنده', - result.killHouse?.name ?? 'N/A', - ), - buildRow( - 'نوع فروش', - result.sellType?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${result.amount ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${result.totalAmount ?? 0} ریال', - ), - buildRow( - 'وزن تخصیصی', - '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', - ), - buildRow('کداحراز', result.registrationCode?.toString() ?? 'N/A'), - buildRow('وضعیت کد احراز', result.systemRegistrationCode == true ?"ارسال شده":"ارسال نشده" ?? 'N/A'), - buildRow('افت وزن(کیلوگرم)', result.weightLossOfCarcasses?.toInt().toString() ?? 'N/A'), - buildRow('وضعیت', result.receiverState?.faItem ?? 'N/A'), - - ], - ), - ), + ), + ObxValue((data) { + if (data.value == null) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ); + } else if (data.value?.results?.isEmpty ?? true) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: Text('هیچ بار وارد شده‌ای وجود ندارد')), + ); + } else { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 700, + padding: const EdgeInsets.all(6), + child: ListView.separated( + controller: controller.scrollControllerImportedLoad, + padding: const EdgeInsets.all(8.0), + itemCount: data.value!.results!.length + 1, + itemBuilder: (BuildContext context, int index) { + if (index == data.value!.results!.length) { + return Obx( + () => controller.isLoadingMoreImportedLoad.value + ? const Padding( + padding: EdgeInsets.symmetric(vertical: 16), + child: Center(child: CircularProgressIndicator()), + ) + : const SizedBox(), ); - }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), - ), + } - ); - } - }, controller.importedLoads) - ] + final result = data.value!.results![index]; + + return Card( + color: Colors.white, + margin: const EdgeInsets.symmetric(vertical: 4.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide( + color: AppColor.blueNormal, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildRow('ردیف', '${index + 1}'), + buildRow( + 'تاریخ ثبت', + result.date!.formattedJalaliDate ?? 'N/A', + ), + buildRow( + 'نوع تخصیص', + result.allocationType?.faAllocationType ?? 'N/A', + ), + buildRow( + 'مشخصات خریدار', + '${result.toSteward?.user?.fullname} - ${result.toSteward?.guildsName}' ?? + 'N/A', + ), + buildRow( + 'مشخصات فروشنده', + result.killHouse?.name ?? 'N/A', + ), + buildRow( + 'نوع فروش', + result.sellType?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${result.amount ?? 0} ریال ', + ), + buildRow( + 'قیمت کل', + '${result.totalAmount ?? 0} ریال', + ), + buildRow( + 'وزن تخصیصی', + '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', + ), + buildRow( + 'کداحراز', + result.registrationCode?.toString() ?? 'N/A', + ), + buildRow( + 'وضعیت کد احراز', + result.systemRegistrationCode == true + ? "ارسال شده" + : "ارسال نشده" ?? 'N/A', + ), + buildRow( + 'افت وزن(کیلوگرم)', + result.weightLossOfCarcasses?.toInt().toString() ?? + 'N/A', + ), + buildRow( + 'وضعیت', + result.receiverState?.faItem ?? 'N/A', + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => + SizedBox(height: 8), + ), + ); + } + }, controller.importedLoads), + ], ); } - - - - - Widget acceptBottomSheet(ResultModel resultModel) { return BaseBottomSheet( height: 500, From 31792a2f8a41f390dd36ed09179feb6fcf900eaf Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 6 Jun 2025 18:18:36 +0330 Subject: [PATCH 107/256] feat : pagination --- .../pages/entering_the_warehouse/logic.dart | 34 +++++++++++++++++-- .../pages/entering_the_warehouse/view.dart | 13 ++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart index f156845..3e90fb0 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart @@ -24,6 +24,12 @@ class EnteringTheWarehouseLogic extends GetxController { final RxBool addPageImportedLoad = false.obs; final RxBool hasMoreDataImportedLoad = true.obs; + final ScrollController scrollControllerWaitingForArrival = ScrollController(); + final RxInt currentPageWaitingForArrival = 1.obs; + final RxBool isLoadingMoreWaitingForArrival = false.obs; + final RxBool addPageWaitingForArrival = false.obs; + final RxBool hasMoreDataWaitingForArrival = true.obs; + @override void onReady() { super.onReady(); @@ -39,6 +45,14 @@ class EnteringTheWarehouseLogic extends GetxController { getImportedEntried(); } }); + + scrollControllerWaitingForArrival.addListener(() { + if (scrollControllerWaitingForArrival.position.pixels >= + scrollControllerWaitingForArrival.position.maxScrollExtent - 100) { + addPageWaitingForArrival.value = true; + getWaitingArrivals(); + } + }); } Future getBarGeneralInformation() async { @@ -59,18 +73,34 @@ class EnteringTheWarehouseLogic extends GetxController { } Future getWaitingArrivals() async { + if (isLoadingMoreWaitingForArrival.value || + !hasMoreDataWaitingForArrival.value) { + return; + } + + if (addPageWaitingForArrival.value) { + currentPageWaitingForArrival.value++; + } + safeCall( call: () async => await rootLogic.chickenRepository.getWaitingArrivals( token: rootLogic.tokenService.accessToken.value!, - page: 1, + page: currentPageWaitingForArrival.value, ), onError: (error, stackTrace) { - eLog(error); + isLoadingMoreImportedLoad.value = false; }, onSuccess: (result) { if (result != null) { waitingForArrival.value = result; + if (isLoadingMoreWaitingForArrival.value) { + waitingForArrival.value?.results.addAll(result.results); + } else { + waitingForArrival.value = result; + } } + + isLoadingMoreImportedLoad.value = false; }, ); } diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart index f998308..ca6c1ee 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart @@ -298,8 +298,19 @@ class EnteringTheWarehousePage extends GetView { padding: const EdgeInsets.all(6), child: ListView.separated( padding: const EdgeInsets.all(8.0), - itemCount: data.value?.results.length ?? 0, + itemCount: data.value!.results.length+1 , itemBuilder: (BuildContext context, int index) { + + if (index == data.value!.results!.length) { + return Obx( + () => controller.isLoadingMoreWaitingForArrival.value + ? const Padding( + padding: EdgeInsets.symmetric(vertical: 16), + child: Center(child: CircularProgressIndicator()), + ) + : const SizedBox(), + ); + } final result = data.value!.results[index]; return Card( margin: const EdgeInsets.symmetric(vertical: 4.0), From 63e9ec585d5e14496a0361983c98b5f80a7ebaa1 Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 6 Jun 2025 18:50:16 +0330 Subject: [PATCH 108/256] feat : pagination --- .../repositories/chicken_repository_imp.dart | 3 -- .../pages/entering_the_warehouse/logic.dart | 6 +++ .../pages/entering_the_warehouse/view.dart | 13 +++--- .../lib/presentation/pages/root/logic.dart | 8 ++-- .../pages/sales_with_out_province/logic.dart | 6 +++ .../pages/sales_within_province/logic.dart | 45 +++++++++++++++++-- .../pages/sales_within_province/view.dart | 17 ++++++- 7 files changed, 78 insertions(+), 20 deletions(-) diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index a6c3631..5c14e85 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -220,8 +220,5 @@ class ChickenRepositoryImpl implements ChickenRepository { fromJson: DashboardKillHouseFreeBar.fromJson, ); return res.data; - - - } } diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart index 3e90fb0..76e94f9 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart @@ -204,4 +204,10 @@ class EnteringTheWarehouseLogic extends GetxController { weightLossController.clear(); authenticationCodeController.clear(); } + @override + void dispose() { + rootLogic.inventoryExpandedList.clear(); + super.dispose(); + } + } diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart index ca6c1ee..cf09d6b 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart @@ -58,7 +58,6 @@ class EnteringTheWarehousePage extends GetView { ) : ListView.separated( shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), itemCount: controller.rootLogic.inventoryList.length, separatorBuilder: (context, index) => const SizedBox(height: 8), @@ -297,17 +296,17 @@ class EnteringTheWarehousePage extends GetView { height: 700, padding: const EdgeInsets.all(6), child: ListView.separated( + controller: controller.scrollControllerWaitingForArrival, padding: const EdgeInsets.all(8.0), - itemCount: data.value!.results.length+1 , + itemCount: data.value!.results.length + 1, itemBuilder: (BuildContext context, int index) { - if (index == data.value!.results!.length) { return Obx( - () => controller.isLoadingMoreWaitingForArrival.value + () => controller.isLoadingMoreWaitingForArrival.value ? const Padding( - padding: EdgeInsets.symmetric(vertical: 16), - child: Center(child: CircularProgressIndicator()), - ) + padding: EdgeInsets.symmetric(vertical: 16), + child: Center(child: CircularProgressIndicator()), + ) : const SizedBox(), ); } diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 3f61aa6..65bb286 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -33,7 +33,6 @@ class RootLogic extends GetxController { getKillHouseDistributionInfo(); } - void toggleExpanded(int index) { if (inventoryExpandedList.keys.contains(index)) { inventoryExpandedList.remove(index); @@ -86,15 +85,14 @@ class RootLogic extends GetxController { ); } - void _handleGeneric(DioException error) { Get.showSnackbar( - _errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید' - ), + _errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید'), ); tokenService.deleteTokens(); - Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken ); + Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); } + GetSnackBar _errorSnackBar(String message) { return GetSnackBar( titleText: Text( diff --git a/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart index 4973676..499dcb9 100644 --- a/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart @@ -138,4 +138,10 @@ class SalesWithOutProvinceLogic extends GetxController { }*/ Future submitAllocation() async {} + + @override + void dispose() { + rootLogic.inventoryExpandedList.clear(); + super.dispose(); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart index 856267f..7d35e2e 100644 --- a/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart @@ -28,6 +28,12 @@ class SalesWithinProvinceLogic extends GetxController { final pricePerKiloController = TextEditingController(); final totalCostController = TextEditingController(); + final ScrollController scrollControllerAllocationsMade = ScrollController(); + final RxInt currentPageAllocationsMade = 1.obs; + final RxBool isLoadingMoreAllocationsMade = false.obs; + final RxBool addPageAllocationsMade = false.obs; + final RxBool hasMoreDataAllocationsMade = true.obs; + @override void onInit() { super.onInit(); @@ -58,20 +64,45 @@ class SalesWithinProvinceLogic extends GetxController { selectedProductModel.value != null && selectedGuildModel.value != null; }); + + scrollControllerAllocationsMade.addListener(() { + if (scrollControllerAllocationsMade.position.pixels >= + scrollControllerAllocationsMade.position.maxScrollExtent - 100) { + addPageAllocationsMade.value = true; + getAllocatedMade(); + } + }); } Future getAllocatedMade() async { + if (isLoadingMoreAllocationsMade.value || + !hasMoreDataAllocationsMade.value) { + return; + } + + if (addPageAllocationsMade.value) { + currentPageAllocationsMade.value++; + } safeCall( call: () async => await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, - page: 1, + page: currentPageAllocationsMade.value, ), onSuccess: (result) { if (result != null) { - allocatedMadeModel.value = result; + if (isLoadingMoreAllocationsMade.value && + allocatedMadeModel.value?.results != null) { + allocatedMadeModel.value?.results?.addAll(result.results!); + } else { + allocatedMadeModel.value = result; + } } + + isLoadingMoreAllocationsMade.value = false; + }, + onError: (error, stacktrace) { + isLoadingMoreAllocationsMade.value = false; }, - onError: (error, stacktrace) {}, ); } @@ -210,4 +241,12 @@ class SalesWithinProvinceLogic extends GetxController { onError: (error, stackTrace) {}, ); } + + + + @override + void dispose() { + rootLogic.inventoryExpandedList.clear(); + super.dispose(); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_within_province/view.dart b/packages/chicken/lib/presentation/pages/sales_within_province/view.dart index 7594cb2..fdd57df 100644 --- a/packages/chicken/lib/presentation/pages/sales_within_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_within_province/view.dart @@ -63,7 +63,6 @@ class SalesWithinProvincePage extends GetView { ) : ListView.separated( shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), itemCount: controller.rootLogic.inventoryList.length, separatorBuilder: (context, index) => const SizedBox(height: 8), @@ -94,7 +93,7 @@ class SalesWithinProvincePage extends GetView { ), ), duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 250 : 80, + height: expand.keys.contains(index) ? 300 : 80, child: inventoryItem( isExpanded: expand.keys.contains(index) && expand[index]!, @@ -244,10 +243,24 @@ class SalesWithinProvincePage extends GetView { padding: const EdgeInsets.all(6), child: ListView.separated( padding: const EdgeInsets.all(8.0), + controller: controller.scrollControllerAllocationsMade, itemCount: data.value?.results?.length ?? 0, itemBuilder: (BuildContext context, int index) { + if (index == data.value!.results!.length) { + return Obx( + () => controller.isLoadingMoreAllocationsMade.value + ? const Padding( + padding: EdgeInsets.symmetric(vertical: 16), + child: Center( + child: CircularProgressIndicator(), + ), + ) + : const SizedBox(), + ); + } final result = data.value!.results![index]; return Card( + color: Colors.white, margin: const EdgeInsets.symmetric(vertical: 4.0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), From 4ce059be1ce4e6e737532e925071a9cf76b594ca Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 7 Jun 2025 12:33:16 +0330 Subject: [PATCH 109/256] feat : 1- icon launcher 2- change package name --- android/app/build.gradle.kts | 4 +- android/app/src/main/AndroidManifest.xml | 4 +- .../mnpc/rasadyar}/MainActivity.kt | 2 +- .../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 9206 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 4637 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 14999 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 29732 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 48190 bytes assets/logos/final_logo.png | Bin 0 -> 268584 bytes flutter_launcher_icons.yaml | 16 +++ ios/Runner.xcodeproj/project.pbxproj | 16 +-- .../AppIcon.appiconset/Contents.json | 123 +----------------- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 704065 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 295 -> 1106 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 406 -> 3414 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 450 -> 6792 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 282 -> 2011 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 462 -> 6394 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 704 -> 12711 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 406 -> 3414 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 586 -> 11024 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 862 -> 21977 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 4982 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 16102 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 6164 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 20042 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 862 -> 21977 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 1674 -> 43216 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 9206 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 29732 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 762 -> 10108 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 1226 -> 32442 bytes .../Icon-App-83.5x83.5@2x.png | Bin 1418 -> 37923 bytes pubspec.lock | 32 +++++ pubspec.yaml | 3 +- 35 files changed, 64 insertions(+), 136 deletions(-) rename android/app/src/main/kotlin/{com/hoshomandsazan/rasadyar_app => ir/mnpc/rasadyar}/MainActivity.kt (69%) create mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png create mode 100644 assets/logos/final_logo.png create mode 100644 flutter_launcher_icons.yaml create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d77a86b..8686b85 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } android { - namespace = "com.hoshomandsazan.rasadyar_app" + namespace = "ir.mnpc.rasadyar" compileSdk = flutter.compileSdkVersion ndkVersion = "27.0.12077973" @@ -19,7 +19,7 @@ android { } defaultConfig { - applicationId = "com.hoshomandsazan.rasadyar_app" + applicationId = "ir.mnpc.rasadyar" minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 83fb7fb..0c41f54 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,9 +4,9 @@ + android:icon="@mipmap/launcher_icon"> Am;f zW?+~;U(O!Llf2g(O?*t=?}zJhgqbtvoW1Y8_A2*U2PQtrJB9gwJ%In;gjcDWXz~}P;8lbAG3LO(IeS?0Qwr(u?@Nvp?XiNBLF3xF) zdHp6brljFkQVs863zsMSr^o(}0_13{-Dg@~hktw++ z?iIHlEU2ul|EK2gj{szEs%I5!r?YifVBmB(4`W=6j>FY8o6#u{f+h!awX`s9cmUj- zonh6pCzO&*PxN-MBuHU@}V?zVXn?6Hl?#SS8 zC&t`ee&=<@fip?PAx&+(j*mT;j|z~g3Y#_8#r*qe!w0Nm51gQ~|HfV14_!vo!cbQi zOJ>c1r@K2Enwt>!CJ9&W+#&#oBocr|ha9vnXlMi|Hj@b(D=T=oxM1(*%}`b0ApG%T z+3)in>@5vL;)7HjdZ(q!rG7WY%Hn8Z?1NwTpP*GN< zR0#Y|0UDc|P+C!m%-kHrCnsaomQ4@}1sFFx5SNaGA|*2uVdu|df7l6J(9^~CHEVio z?OS@MztR0OAu+kjo4LHsk1?;00?-)8o}*We^1MnL`kC6~9U&;IsDQq=87 zWANnV3vAl62h)}=CbsNqSQxhM-G}>8Pmz|LgR>jH_Bp3!rJ#9J$ z`S^fNrxPusyje+EDJsh=U}|oTo42lGiJ1oK_+0pDupn$K!Hs)&FlTx&yj)#z?c_
^BnAP`^hUV2Y7ys)3&GmJdHFJdT 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 M07*qoM6N<$g530c-~a#s literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4a71c7859b7448f84d0901693af763e4231fa383 GIT binary patch literal 4637 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 T`(2~k00000NkvXXu0mjf*ELAn literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b3df652d8a1ee78eb93259114646c5ae0a90e5 GIT binary patch literal 14999 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2efdd5c30fb8d86a3c85c5dce552dd6f3000c7da GIT binary patch literal 29732 zcmb4KQ*$O0YQ|Nkx={hCj8%lf%Se$g@fDz$scobYP9+sFNWQ|bWnE)@{j1A2=8Mfnbu@9>y*iXYfB zZ&>*MFZ@u0YSg6HR_0auSwp*7RKWF9MrE<9f67B(Jv4A%_{O~P%7q^kXX7GF5eyRd zI}+d|>CiEw@bjFQpDNJa2$h!MC)d=X?UeQS)|#R%-gDF@EeKinJU4!AKK?)i(xoD} zR_&h{Fb|2(4@jq}#xGWc3}x$@u*vq}35yV&g7Py{(`-eHUGF0$Du56~&wUUYWo{Yh56 zZO;43EB&Dd)fk!-R~w)0Rx7V;@?zyLEr_PArL%p{PoDJK(`bRp2AdqHkl^Kcg%ky9 zg@Q??l!>`3Avr(XCzMQtwTQrn?0^J@NRS0}hk$1j=BO-?MIc%2=;y{IN|KdQUMR5WRO6l?)MfRhy+rDU!oXTo}Zud-Ga^BI% zc|xMqS|RK%MmSgq;uP58{o;|NF#vE&u0_LN^*A#~&$mx^qK-yR$#kk<=D~C%P1eX7 zFApKli#}$;-8b0}r&{#brV5o(N*g5$c!~!~!_>sF)4*q8StXy0tgMgbh)aipA8!yy z$k&NZEu>3Sx>W@ePF_mMOpn{x)1ZAu?}2`5l#GlF9`|<)r7HZ`i&h8m>XqP>i9R$v z76cq3!h{C4Ibz;#54w)A0I+ZxX9+X>K30VLhb9@%Z@9Zi=2L%*`+y=MqM8~jy)q)c z7Mp0m4R(P5e6gM&tv_~itz0O+c1cB=nbPm03DpS0zZS%?Jpmu|$h(H6Ke`~Ak1vnW zG}jBQrL86;WnMQon0nAXPaA!ey5s_WDWRMnaeJRnm2F?QqzXoT4GaAXau4Dtb%XWHRJ(`*b=1kkAjjH#s5%CRAqN~XIN=ylo~ z1;$r=ryHe=WEOVdX*uCdwqfw`$xM^R@lWS?&9p9}XiqO0pltAKpc8CuhA# zBEtfD1mWQ+=^EM7gwyHpm(g0bQ4QVH;`^6Di5r|Y4Bo+t= zFf9NN8}4Jm8Z9aT4q&0bALj8XtkyyG_2a#NeI57N-92I4OvCQ%(c6jx@9?j4;yo#* zLsC*=`Xg3+p1{atu}AU;04LR%@qP3*kdbB%_&5yD<8>!+NQTwT?>2}$7*S-fn&|2A zgz;grJMkWy@%WBvPcNwZ!qIs$f8jwCaCP@p^k@i9LR}&z(B?1GtBbUOn{9CPUzN2b zMDtZVLlVxU`{ls(V8reF7e7D}ZLAz%0y)#)Z^tFhfJ)xv%c}uj9V3THS7?(mL34b9 zoG25Ty`|@?pe%h}#$je|e()9XGKYcDXT+f<0+3+9VB;kqBv5TCN2Uu4%?FfG>*?zy z*3L-pPo@E)1A;%|iAbrqux1TI1UX zb{Ud)r$@r03@r z^dpXFq$ULV_Hx;_pAdxZng@%==Lt?pza5aU$EL$|K^^+zi!%FCo#-OXjg+k?wNv5| zBBV}j$KSz3t!@5E2mTFxDvT#0D%q|75sHz4%dmpv?#M`o{QXTW6GCTt_pYeZYRliS zYy-f>LW`arLQw_du$=?B(ruDh43EuMp+WKcz&d6!jKcT$eE?i6o5MUML6ax-ge6Ve zxLb%oO}1b+Dm{-kigfyX69pmp6NJic#EaDah9{xl9^9zSG}z=wlubaWBG|-+w^S2S z`h;ind7J3@=N6+AnQ*9JvF!F+oK7dT^;SnJ_!XOZuH2TIqf#9^x^!A1XN2(fJWU2# z^|5`-UVnh^#y6Aq`ZV^#qxYKO^Jg)DA+TeqR<+(X@HL;5zFK2lDMY2?!&9%_9Z~Q+ zLVXYAOG>PC*^a7~D`(Gukk4d4-Rbt>NpkC8^wsHEfq=&a&88cPEHT|id?_7GzQSd0 zcp362Sf0Geju!)&Asplf#M8%nV0axDuARUn5fDXEG!GLi6P7k{Xp7xIL0lw`9?Os@vYHPs#e|QTKkb zcAucY4Z8iJJCP4i9!RiOZ?;PL5)~LmJD1{Lo#q7?bg?6EGMh#6l=M*p81XEb4Ei?g zH=Q_-u`rVmo>)QUxvK}qqfhFL7BDy{Ozcg68iqyH-FQTod}r$cukqP0x3#OLr(Qe7x|Wx*<^)&g`#zeT=Ew)_;wW+6lE0W6CEF)$RB> znQd|j_}mdZkZbQhmP8v(f#-zI67L(&8n4Ho4VNW~m zw8xLa0*C>CZ&Q$^cK4Dwrd-Ih61b6)m27<$zK?v#w3)WNbdXe25;m6=YkYnymeQC! zkY?SGZ}MD}& zf8nK1_@r-F_`VY}eS6>Fd-)n_=Goy&k?qhs zcfYUITxNJbHxOQ4-U2t-7x$~^Q|^wmibFN8%h@*H7tnB}%WwisAqfmli}Srol@5*- z2Hhw%QObJHH@2#+E?B&7P_+y&G}I6+#mxMG)?6!%Rv{cw<_1SZ6TU&o7tM3L03vs-_1LCBfmKy=z#n+v}?kpM`uQbd(6XNR9KhMR}oa2IhIaHkzU zz0sBRnSf8B8@VbYXvRpalk|(#c#h?h#Tyi@g$W~KSD@SCrTiu;cEjsz^iprx!ThRM z!H`fS+PjtLGLfKhr&>Xh%5FrfYNHKxF^#E|AP{o^7DAxt{b{i3-w)T_J~aOo(Fs-D zm;Yig`L(vbY5b-PuhQ*o&O?{Nfnrmpu}~54!i1Yv=#a0V!a^6J)i+$ZS{}CC=FX#Z zwQI?_9O;tS+T>Y>GR%AS#s7+R7bKSguZ)cR{xPb2=J~({ONh@QW=l++?U##CRw>Qe zA}Kz_>k9U}W`@W68=;0!F!o%ta^92!QkSQb$K*87-wJacfjyOBczf-`h-BpHqrQBz zf)Gn7I~Y+utw_C+>y*n3<=#ySpzwJ$ZP*KiOe8$=J)MN5+6B@ochskfO| z5=eYWpb(5^-v-^|rN+mbADNl%0>#_hp7_F%aAUL>bxHY-vB)|+idSzP-Ga#8AvQYO zfQq@O=4$9D>rGG-KKw<~K*M_fQ7rnvF?f+j?h?H?5MjeA-8K~BMIn=m>unw)x77DY zD#pzC#WZG<<*hJ4d|dz7IJ)Ehz9e9ZVF)3_g}WyIAuwpI(O=L^Ny)R5xnXr5;9MAK znfEw7Gx=jf@@@l?x!S!>Q@gY_);DscVmt&Elf#F*i9}dT3i_9Z9pP^>a|C+li+D;} zg!gn75cqH+(8hz5B1UIC-sMHJe~pA}X-R|W3`Y>13(*gLd2#bmEn`FP4xQPi=o8ESw)^76-t}eZS(3kqkq8JGw>`up!13!^ zaLHy9Z8Mc&^jq;iR)=-9spuF8Q;X9!2}wig?iG8-voTZvfqwt*^ld-=GM4qZ!Pd^> z!(%_pvV&eEk_j*GR^0O(XP=6IK`xqg54iAH{1Cy>cz6RmB&wMhgDZZcapea`#&@W2 zMVxr$4Bn-~8WlE}MQX+Hv{r5mI9>{_4tQzFDQaIiW$7^IqkOfB(@pD^W2 z!~>JX$~ZzzjPF%~p!=)Wy1il3`geLV4s+_tJgC-EMWAdIID(yS5)V|d_3jT?HqDq; zh^GQ3Fj6BDrobs)8chKhaVq6dCCmK&y)xO_`M=s81e-nZlpo3?m4wm!RhN1m zCPjc}bh~`o-d4%vtMvkgUau2kyaAQbCt&_`se_XzDN$DmBG5z&OdA{9?!Oj1V0C7Z zjSdc(rIOU=rN8Io8nC<{8&tcNbZ!&8cBgFb@(5n1JV#Ox7&_KXg9-P30%nddpVM`2F=s>L&8MN7Yw-8Ps}TWGTnFlu@=B zf&RTa!7A*h&24%*GWhU)_4cU^%2DOFI0qwpuA8=isbV~)j3eyE_DsMprD!=PYEkd| zZ1;G%K!|RsFt~BWPl7pVMbhN4s#K1lhU!5i9NOB+AN2t(LY4|+i4~j*B8NpEo^LW- zm5Oe9(E0ZHbcmwY#p7PB9}#*oJ6~#v914*#@T7jScX;}mK|SV7g{DvZ_yq&;{$?_p zS}kM12S!(oIt-=^A+2-hDZ zn$BW}L2z|Bm+$W8tnNg8N1N$(0}#h=Js679x7uvw*7)mN zXQ7hdj>`ce-EtGCl!Ev?Rm029$L%A0BC-@0;7ewIY6z|peU3@TkyvctM6W$wv2pl> z^KlTr=KhMJ8E!rFAHzV;6Mp$%t!bV?o9_cv-XJ+vfx%!$xlV<^L>fcv#1Z`h3OIz! zkdSX+b?;^WXpC!HXGf9s*N7GVe2g=$m_;Kj?yp}nl-BGri%PGHz3u#a@Ce_Z#Y>gMA0n;=TFh&=T4i;HJBiT72iRHgs#&Y zeR-W58&R`v5lB&=9PI|(vp3rD?cX1ze%HWNWeh)kyv*l+dGK^wGUGI6RQvq?dH?-X zN&W47q%_sbS^EPQs7F93LFl)h!xlC~`}k4v>h*+Y$L|S1W^nFW)8#XTI$uJPKH#cG zNqY^Zn>3e89cl-U*gHNa%N}n@W<7mFP9_ zoAWag9zvCm_6(q8bG=xDov(k{JKsm3_VGz(M1`o=5#t?i+3u|K`w=>{g;&{HMLxg_ zB`xF-*Pn6#F}e8tsaMoc;!|G_@Oj6GwwRIXuU1ds z^X#jd5QRsE#S&uf`+l*R`gUz5MV5@^KK5)zKeB!yMh6#oiYBJwK>mi&}_8Bz;gzIT0kck0$5sr*xVw7ST_T2}GCW z3Vi(=GsOLS;B@UlU3D36;K|lQDMaW~)Ep;{oMp_}0K;T-Vij+YP>HtMix|tGe(z-V z4`u+;;7Im2e$@i`|{$lRujr<3y(J6)K8x=4j zy^kYOv_e9AM987b$hII%#>|Yo-Qg;+?rdIvmL}-=evgUgZWWSMR#<2M2KPw7iG~3C zz(O{qj~q&^@ z0q6-j3Qq?5Y5zX>D0fLO(>z#;D#58U;{C_J1|xI$RU36R&!HS0UBkN%(#|>ji#Rs@ ze-bjIOizk#^&hlYx_cliBA{bfv5o)G6eMS<4ubMLE5!@a>heS?wxySf-xvT5vvUSV zQYszKA8E}jEc>U2Q+}J{_PZIgsYd|gO-K5d*C8dNn+i9lsdjSquFj*pD#;VmKau>T zbIRdwYt|7suMIPn>ulcO({2R4o{^RAgyHjzHNh>! zlQ2|%_qj9ZwiDbr?A*d$A;5cJOK0zRpuCve7|#{ME~y^x?S;acQtv6+(A~qq?HwIM zQA2+)44zLOo07YQ@IFrxmyjj_|l0(JATm#Na+0n>;61w7Jvcu{y<9JaAI7gEwL^4@Bkp z2iqvnui_eC_YP6@RHr7T{lxR){;+~5Ue4F_L>ycHEC`MQyGLT&_}%Yw4fijA3Oc=J zxNxqJIBdTe6p@l953M%Jg=W6-AZaJX=#s>&EhET?a{t+q(iJAdDh(1S&6zS=7Y24N zTMDy%jS%2s#k^MM_VE+v(RCgHfhFt#5{DbHIPT8q&p%xtf&tlKfH*?O=RMKP@Cnu7 zZJ3aGkzL0D2taQH54yF4Axs#`tC^XZ$;FN!jp1L80bd+|T&%?PQOF!1Cx5ZGz)K)k ziOdz7UUgePDBYFw*_Unqc0B2Hw+LEc!0jJ%M9Se0nf7t-+Z@h0X7-bj4~y%f$tBXk zX$PBJsp_k4OhY9^kB#m0AUj&5)~MEnyq;l7Z+2wDn#zvfj3*)&q(_%;`7NX@@ z;l5-uPe4m7EIP!x=ItoV*JKmh;77GTzTi|K+)}}AvXI+I|5M@hEe(Q!u~$}Z?cX?A zB4I6i=Po|i^B*@3v8PQf{wkB#h zXL?yaf4W$No!jjjWRvn&1^RRkI5y!`%jWeLtaq*c&Av;3X<_?;M3ePNOeIHtEjg5N^vSQ$$ib>`#9=x&e0WpFibgsTv|QW^Ctz#}E*AQ#%U6)mtru za2aSHWxmKB(7bF-Py!0$LwEAptjE6u!YkaY+|3B_QW#+ESN>a??209ZdKxW!x|nyH z1F_R<$v$R&D4e(Jb|?rB2}dMbtr`C0Omy^c8|*=pSLK?6mh%u!kF~LK_))N(9%4E0 z?|=d#Iggp4opM5|G*~=7CmLIPqHpyCAanlJsE?A^hbK#0#5lDI&eo%9HsBQ&CMMGg zp1LIP*8W{nQ?B0)RZY|Wu}1`ja4PMmdrfqWv(*f}aivo)LMP{Rk=iEs^)EhG(Cf$GcGdmcK_)fwxhF4 z`1cdKD=f!=|E1NGUOkxc?0&uDIRi(9Au(K7%n1)c!k^42ap`yx=LadXlL{86A(~7a zW}ZhNs6^M5zlK8-A`?NWq)NZ;)dVb$tJx=p72GsDRC^Lq1hzce>n^IbMuXm-3H&{~;F{EY?l6F8EVPISn z4kltNeMM4(`plOER@q%>_JNSXyM-$!YStWGRw;6*YBddR0&ES9^A4XcG^z|J+_Sl( zxs_^h zud`4p(RidsIgPm<^ed(u20i{Eexq^sum=b#J+9UW*W1_+sSE>UT>>_-v6sRynDknq zL1O`;Ud_eYI%8^qc5hM+x(ow%f}M`Hr%qMt9gy*PBL`s{q1$;1G$n^BKa18&Pc9*r zI$m9}UeK1^L8THnXePjnq`1lGvi*G@PLuupQ+Kpu63K{dK39>!4Pd!J0YQyHckoj2 zDh#bY+&R7U-TmY5J{^!mlv_%#Rf{ClTsT&f23MN>(tH)}gewd7E^~%!Kbf)$8VNmT zjnJcCoC0cnGHQw>T^#Fw^(JDMHfH}rFh4ma<5rF>PDTzhmnz1PWg1mRr!u}RCN@H2 zKmGV}lt9hX4ukW&r696kkAR*<)`N7;p6XL97fE|-Jv-q4n$JSERs%BYV$mz%M}QS%PX4>t!;%SqNFhS z0g|uzJ@AI7%;o<^m9|olq8TQrCT91Sk$TR3D?dIA3dg(<-C&5(4H~J!IHd0Gi_{c0 z{uK_@m|7D&J1S8;bqg{hX#;oTKv4qveYL|@oKy#0&N-(j=x}0Mp0r`g>&dL6z&TD+2iWV!n<%Xl z6%|=^pyITgbTnvp;`cFQbtz+h1+5xj3ZZ6rXZY+vHJ!(qq62|wDvi0`gkiT0^h!B5 zT)cj|FxUH_3!R9_jqPWoDZUp`L~|n9`FYH1oA#0mS*xh1oQ5SA?o9;$gL6U zl-~*jE`|zEL66l3%Vrg!NGmGcyaHQ?4)x)f!KV={9Bj`UN;$!FdkW(nm{+KC(ZhO5jPqtn_ zh0Qu%zE)|r>y9nvcy=iKhuYWQRGg7>gN{@?VXz|qY&k+3318fPBb_{d&-+)_xZL={ zYE2srg#JAtKWj*Ep~=fPfzb%`PpKB9)>(3G0&mw#z(4b};AWa4ISCI)sTA_?1c9L$ zH8(ekYA{Vl!V2WXDD|}gbs~Vzn1_J1EG+ZNv>llmU58;Zge`Ngkv{I%^z61`Ty~oB zX55+#6H#qJT8MXuShxEpdBK_8aj|rhaJ?*`sES~DsYoV4aCk^IheRn-7O4>PVa*Ae z_>bW<_7y}i5!=4W>Jz=Hh0Pgg70wXU|} z_??^p?LOG@$5T=VafH@XAplgHTG+r?&Je>Vf)tyqZn58uy<__udq?gXRrjD^QEpvf%ofK#l0nY z2fJYT6S?;=rw?6GD>ovF+Oew2yJY0xF_)Y1LPJ4Gqi0##?P8FwHrs!C2q8!~40Q^M zgXBuoK-)E>7*V5P8kZ}qF~fDnP>PjA465xG3wi0Z$^m;eoO5NOJR_RVVM+U6ynk-l^voGhlemH*<*1+3 zuqb@oD&HG})V?P?RR!G-0HGWygI14#Ai?_LSf&>N_&sn2_$@&vYv#=R`4ug81^nm7 z3oYRx9?6x+rv=GX_qSJSJ6>+#7W;hy408Ano)1QS6$yvdd=5!c6|=&N$+PtTeym9g z_=J!LjBfofg4n1nR5nT!hM87Otj(DwB)ClVDNzlUi;CCZ%!%SerY+fxB&(XvRXLH1 z`eMRSZ2F3h9J^R(asA$H4*`@aR=p41l$i1G^Y_oM6Gb@eg1_8@Vl0VTl@d8pqeg&0 z<2EQVAotla2g{m z@KL%ajJO78W^#9>KE;buVkE%24UqXux-}iq^(Wc14tD5>oH3JY|AW>o zLXFn09f~2QGTzVTojXT-9OlPzLz+CEim;Wjm*DC7-OJAREetLq`YlPQ=e*m@!0L)M zW7rlL-_D!dh=R3MuZf@OTyOoN1V^`Tmepnj>aW`vjP=^y);2J>7$UXPy}bpz074QY zD`POKg*Mz!R%(&|N#?{ygki!0v?rC$K|CIM$Uat6ek9naBICI>4?ZPPv$}6+TmmAY zVghC8Mv#M)U`!Nv{uuYYaR_duur1wb?)j!d<>|l<&_nHygn0UDb7D+8@9vMEv(IJ4 zdKN8^(kaH?8|0p@kU-!fn`UqKRP_EXo3+!2%4hAukV4oHq7%sEM(X?aT_VV{XD^vUUa0CjI6;I3yjEw z*L_L~HrhYxJ3#Sw>0*Bc@r}`c0UHakqIq%PUSO~t_{z<8tn6-l0k6~~mqX#|M{;6V zH}p%9(^t#utD{)f-y?bcU7ve~lS=UNzqPi0kvgW>Yx(3@am3Jx31tds!yBBj`H?zz z%!Xi9Fq4)u{e42+JuU?BjVCNtmpX^%t{TaSq0ecu4;S4MP9Ybc5$CUr)` zIDRNT(EQYx67#j1&;JRu4#XSdDgxT`d-JBV-K?nIgMZO1$KIY-uP;7b52-)zvhvy2 z(s79#x)EBK!5iB?_jVtKIX}G!`QF017gS9Ju}L}ie$v9=^RQ3m%Q57-c{mH6$BN*tvvS$V!_aSEAN@_syDl{|t@2 zl2Y#2H0P^4%*yIPNqCT%DA#h6lzTey&|VfS93HHNxhy&T$4CM3a*(H{&ip)X+NC@j zs_sa0e)^~n>gxyMmGywvk>(I_!Tp;=kRRKm0>=W&YLfxXA_-QyaAsbDDOM@=7QlzW zqx3vOqdSC684NbxWsKfrJJPopn|Jw#?@Fn6-LusBlLeS1ODr7}i~3dam4g?j3K zKQK{33Q8l7)_{N1TYD9AzQv$ZjTTZW60$=TK_g1l(-kR5s^{jFsF0@~eB9H6Ye+kgpl1j7#IRLBYm#=d7eEeC*GWb(cr{-`I^)(|~#eUIv ztF`eT%6a#UFGFa09qy1oOq;#s{wGAb6xyRl65yL*RNXfv$a0m&403zkM4MK5tMp|rVO;c==tLY*(2`;68Ib>c*#_GB!k_^M}{Hrki2#&&3_8L@4wsI9 zJfGc(C-<)yqBbSj<U^~0T&x{OcJMX&KhtW6xnbT6C6U3Kq+a5=r z#_XLYg(4mYR!1M0ZOc_Kq}#WoUj^#G>g^`oLYS%d-mB~*5r33(agwT~YONOIlwo_6 z@;qcTJuCOTyNW~CPOlu^{u$9T38-oSBzOR#$aNH#Nru6tS|ON{VVjk`(%$)D=xtr* ztMQ1&gx{D1s?!Kds`OEnds;{lIGrX^f9aQx6-vT@6b?(n&-BNONz`;FEoHD7^cSf!3v@xWDbUfvJdT^rP1M`(xBPyy3m285_ zp+?KsL64em3Bk2(CwSqT(R-h}@RZZ8t%kn0xNZa(w)e&Wm+zNMT)N;6B$kDD=U zBZX4!71M6V48xx}2t=RwaH8KyxwB{RAY^jHS=^-18~kxUIbAP-hl6Wk!HsovcP}tG z*a{ltalPl+>5(5fpWYNP+1GY)b2QpFd->%NR7Zuc$I4oqZtZH%S}L^!adGmWAs^Z4ah7g z#z^5HSgi5#h!m+Fm^^aQtz4|uM9R0m<{sY&`HEQl7SfZ~4!_81UG{gW3`qFq2n-Gm z#wp8g+K5}O-1oO*7-Hki%N+*MoX{**swr!dh#1~8@M8@)*XYR6uw1d(!C)YS_A){>K&mnQk_$TEEn6Rwz7!9hT+rBgNDCVS z^ZLzh1;-3qyug86=nG$Md6@zigUk62(&&#`u#2yYCuy+X^QWW&B|+rPRImvsC<~sVjFKX1DiaFudy%?)sa#0v=_39n0->l~ zC~Sz-`A$r?qVeI>_%LwTv>Dd?vP44xlD-6{9$j=G)5>Hd$rnAfci9+_hlVeFrc$AY ztH+OTt{7%sl@Cn#ycR?RCR}*f%;Pa;auj$+1R|InRd|X|PQfz6?ES|Z>fo(pfPuDb z{#qwBY!M3*2}9obEG7io00+iL$%)8*JUg0OBz^mRAkEj}G>cwmziZIsu#6Yt^C3CYF!yLV-*eN($G<+uz{0+}DIuMx( zNxL!TmQ-mV9#Un4*XSeji9>iDOlrZz;idq5&E=Klw_pq;HJUn7-Omv0#+$#<>hZ~p+*O5(a0a6K(H;s5MCx|B!9}=&nH`$oF-%D)}qMWcyzR?=}egywf!kFqUHR2l7FdT z;L3JqQ*s)Br!bW6i0$0AfQVflNNU+~Ec)M=+O84S{jcyKieA(>rH&nRRZGk>D8c92ZIC>&9ao7CWJ0Bo z>DY75q5L~?5=?oNhdrU+!T`)aqBva&a)sG-I)TJ!XnBhl34dtn2awdTkxz348Q&~f z1AD!2RaFhN71#zgz@fqk`LB##A*CUh$2t(~Q+d&v&~?Xahl)8}&vB5)Fn^;3d_h4O+5B^+y0(ALPXa=1Le|8v66cA*mt??8wp6UmlDOBc^b z6X|J2Z(r`jdvxVjbMnzAG4Za=62|z@xUaXu#*Ox>>Erqb%kE^R6|kLe!hYW|fbY&l zfnlRTO%44LY%xoiG3bcd+9D{3i-z9cET-sE^0s%v0Xq2#P*f#j;}3Wn9TJe2DUHn0 z9ypmDxHnm^5C|CQq}8<>lu$&0mK(s|nIPfzw(; zL735X{+nDpyz7f>SC$k(1`Gos)K0F3c=sfHDUL{gobPD`lfqTIwzjI7sbv$Ft?o&k z?nJJW_(cP-z+W3d@Ky@k%GE{XsyWmCI6bNGP{0YDgt1JQ)AtT=7YoD;Y@lEnM*MOd zoi)USrE-SUER5umKkuNP&5`e?N|gztgnqp^eUt)riFHK)B(x-;BLTI>=mGiQ^nY&A z6?X=DilpHxNdAa*i`~)&IdgV2V8_-b-n^ja<|{VBU^saUUc4{^N!0EOAZZQ%ic^`( zno%Un;SvxMqR!XBa?R$%v$B^iy7w2OQu9997lOm0fAR4~8r+O!u=`F5vCTDIbPvn- z|C$?gvDBKopUTGM*TO-qp=6=FR}gmC7HelUJ?<<^l=0h-mcYAcc>D!s8j0ro2#Hj# zmceZm>O*R(Q)R>XcyBVdB(C?@xH&2)?MCQbU2*D%B~U;>U~cHqf|*{sjoW?`mr~I= zGfr-r@}3IT8^q|BK_tBfLB&Thqu!XJm5^+F{U!aaC!baJdZzePew{9c7|X&+KVHQBzP%ooxh>NJ9lS9&P@o@m+t9Kir6 zk?(JR1_c}9Ua4*ry!ntQ3i#321$dLhx0c=juD}8Ruv8d3Em(}Mb}h{ybTz@SAT$u$ ztlJ4>9yq}r1=0ljSzFv+YykR|>i%HNXxcOzATXFr4)$+5y*1JNc^U1kij3-@B&c#b zh9tqI6Qg_><7j;U^dh<<{z^n`d~5T=sHHJpw3=OxtWMr$AvmVVj`MEI;0rH(VQoU4 zO0=Rx@ohF&?An{le;krJ4~-1i1-pt;p%JltwcY0fRns0HMLczL#83$pBGTPlX4`Z4 ztgNT3$3FheLY2>x`HuB=BjF#8E8L^!9Pf5ULA$t;S-Zx9BYY~UeSj<06&9Gu-tHCl z^{r?ShEzV*UotwZ?pm}_s~K-?_p%{K{_ZSJWXVo-qxx>3$HU!46AY2P_7z9*lf)@H z-KOwbmupt~(+Q2n9bqgDu-iH%TE-&FU553Jgm zq}d1%#^M5Gvn5&ZV*_-tzXzeu6*!uMS~xHp$udnyE$qpKKL?${7G(D7f+_nkY9uFg zih@5?vV`#wvbMzKH!bDSdiGo!NtXF&>#C%!Ge{Dz^f5O)f~^`K$z3p_S3L{uBQoX0G_!U`GwTv;hnHmqIG3_MCt->c}3J-qxAHpQvw^z$uGN%l`X=0cE{P zDpVa_2PT56D=X1_0OOJ-gE*vd&m$Cijij{c`v4?B-go4J)71%P2ZI(@1I>@m4MO@; zY@j&FpLg^5s?2m&_rnrI$=&(!Vh0?^X*+-FwqKdX<0S-_R#f!n!!ih`HvXgI$sUjn zvd}wFm|dyirPJk(NGu1$nabe6eTL($<|#p+x!1yX!tCd>>Mr^~8FZTetgJtPT4fDCFg%Q} z%k&G22H=Qph=?>=kgPGAAp#;owLBlc6Oc)Q)XTvRSum5DFWB)NViFas3xbz~9SEl52 zw>DmLNlL#fCjM83E2fll-i5n^bmuWDjdn|nqc3ThNe>7*Y+ej5TWAN(zwss@G_5w& z6Td3bBX3meo8Zd{X^6GUW7r1&9;wnFeRO_GRLwyBRI$Y|mzftW&**1yiPrOz0TkO| ztL|Ev0r3yOA&b|{(h_=xY}dL?B0QF!{Ol&o=U4b5LWlu#6W3vt1uHO_iHV8pH3+dh0a4+w=VM-}@j) zgW`LUHwf_u1pObQ#aw-zX2(c#dd0J~<`?X8S3H^{IF5?{h)d*C>r|npPdA(C3xDgC z4SR*^a#@Mt`~6o7ny;GUShdxnY2^+3c(p>Pq!jnqufC{OZ?~;mY-w4jG5+Utz6Tu< zs{yN0rfx{@ia>>*;j*#+YNMV!wdz0U`ebGZl6_X-6a7WAY>U}a7`&sKi?mf3oTGt{D_G020ajNhC#lgD`%^J41bwq(m+*%Z;De<^I=~p>gsHX&CKak5Qv<3!qJ8D zoaDU7L=r(+Hqj+3EpN@9g9ov4*A6f=9>!tW`n3oyRzgq~g%x=i2JM=+gj_DOo|_y^ z+P4Jw`qEgQ)mAbW-v5VB>F6KTn$`&1j2VR=8bKwK{J0 zbli=)L^+1Ln;VAq>Wzh~*HBI}qF;ZyBsqk>(R+>^p(z&Rigjz&q)M=@U?St%pjJ(6 zJ9LQmJhOa9R#FZG>*xS+PZKa<@gj)nLzu8&$s#`6se(-h_QPVAa<-`X zvWfp6pg#;Co&)k%XDtpZ?sK<}g@_xUcHW@X6&%cB2@an;PJ8=Vh;SQL=qgVtRGT(z zNUx$77Rn{gKC<>#vxfC?=JI8F4cksz^=gO1Wy5;fe2M5J+5$ZuCOoy8?Pl7*+k~!y z?nC<{8jaMFA=I!=9qc@E7>vmzbkMUkt9kKDvL($T4kM>cLiH+@Y1s|A$Hw&=;z(2! z^{Y@W%rUgjHEAe1nJ#ev4DHtst2S+hgR=|zbmzfG(kcdw91e!2yYR<02&+lA5vAQ| zGSJ#OQ0`k7n-3hIViJO=HJi;=k$B!b5(cH!oVs|C9(w%T84T^)kM38kawWXDbsI}pufm$`TTx&zP`S=o6@3P7 z&Mtyj;iKudV`A`KJ04K=YSyI7Oo?qgwYHvd!fsiC%Mx$N`YoFgxrA4O%a$n(v(ZG? zBePgHWHM(gUy8QPTcAvEFl|-WuXAUb6V5kU;IMu7P9!8J@yk;Y1>R^vqk4Q27^&8{ zapMMh_v%IWtyd?UmQ|CwI^Ks?s4`n!7KA$yu^{4~+hjDur-+a3OwbAr_IFqf_q!>$ z|9kr5IuJ+F1y~4u zPSPyCGG+L;oh+QIkSl0{{iWM6IClCp+O_1DR3cf2Bth(lk)yD7>t-xmy^884bZi+8 zb%=PNT#lo;*d$_a1yG%EQbt0{iEKSk*5|dDD`t-BRgV&%S@$8=CGG}ttVPMEeWaEyVYoq7 zIOLeZ7@v){L=J6I1BCv^sEMxrcvGgwbWSY~E5>wE8cI z;F_#W8h`udXTKLZ`be6D8Vgn~ry`6L$hBzPl>(iZIY~S-A=_%VJ=CS$KK~7>NXy0K1j+tOZi|aP&%kEfsd9Nu{Ke6L5z{}kmQQd)2E(DH&RD@x zNKE0s4DlshM5h4*U=Xo|TWmra{13k=sQX{jpYTK*3vb<~Qy6UGKHL{P=}UhFnUKcq z+TlHMk_kSEIyGxq->~}+AJU~PNgrr3=w!hZa(sh2b*Q)@`7ES41MzEQ=jUU_$|YF3 zX$`h5S&23+c(K;BK||b*dx(l9OAEaSImE_2gpW@V%4P1|zYo7w{Bi=VBO)+<_AHxl zlO<+m>u2NL@5A~Jux@|wD2|@%OCezKE9p!ooV|FSu5C|tIC$nXwKf^fEUf3sPy>U1 zJ|H$Ojv5X=9v*n~}v+wryX9ATXK`@8o4wf7xhQC(Zx z@65o^yC_m@fDKVmv5N(JFNq~;j3pXlk0sXFqM$~xcVq9^Kt)BmybHM$P>`*Yg+%Gjrygv)9>s?X}+bUAJyy$i#^>M37Jv5nm5`zrOkj6N$pD z;;|~aC(YOHxc8DiUE`)sMs`*vLIQ%Q*d!eYkqAxP-64yNqVEEXsY6+bgz*|c>HHxptb*e38PA?>OcIsYSUWohAAo$92G@_Xae~hOb3sB zt!L*hxE2w~PUA`yx)L!a?((4jgNaNU_uROLIo+O(z+QC+jEW{a)sd|_g0ingAfaH(5IxV{@Xzl__dD*wep7zkG?+TQ;(#3vyhA0yD==ME9=V z^!46dx?uaEgK(m02KF3DaQ?%DaaFE~7y+k`nmmR6uHl>WinTKl4-_P=5hOZIfoY;p zr>1A5C&kbK1L&K{F_*4i3z39v@~c!U(W_%;Oq=jM{cQU-tsy15Rn;G%7d&E9BxVpA z5r&b&z8224Z#Qp*-eXCHjP5hTXcw+ex(lN$0qzd46fK4${=Iim{QIeJk{H**!)b?P z{)Rf()u0L_ZuTnP&Yqt*x+k42Mb2*(}PuRoIF;%Q~PTPH8>a~i%X zN4wsPpD~RpqOJOQk?=fQSz6I0AS)-24zh`%A(qdYFC4d$5`fnN#dM_8$ZEV*U>UM)<7J5TU4AJGVkisT%KHL`5aU%i@S zb@|dD`w1NiIsSSK{a1Ej96tF^GMb|Ie)2b0L=$+KxE>aQzBD_^4y!L|bJ@Qy*6!F2 z@$Q`zTTB4$Qn4O13=63sPc2Ezk*}l_XtK>OD#5Dlo8er$7Q8!pp|+zFof+T6$0G1r z5K77`DJE(4mQ9ds-%Rfn$v&$T8t8H8LDHvvfv*qUPLn{G$_a}_xOw*uD=$p;>|z$L zO(;h>Sy_1T<`v`$C6{3r35iOAb>cSwx;KI3!KN==%%%oN2Am{0MPjH$Y>DN1LFYi|E&>sYnBPopjhC+j{bZ8yFZPB|QTNPMxH|JSj~O<^vHN zAUhfI^X`L(!p=i1aI)9{S6)$uJNMb%wB)!dN}*vjtgGyBIZA|~fj$+{q&n5QDKL&L z!QT-!H^f4A3yVr{>+XFz>#Ef3jKAC(bFfiuLc{) zi#P&;Zs~zP5p5)#Us#9>fdTk>@L=IR%NH(0U|1+i_u=CphTpS&Kpo>RZR1rCCPFQR ziT#~zm#y`0k~s$VB#^(}ef|um&!3~cPNKQ_{{9jiI z*GfJu(J=UB<}CcO*$)FdcZEn#guu`ch?QzwIdKX}Ny)IawL!Wp10lEXAmsKf=o99J zfgv1f*x}jRw{*AV?phx~k>RvqZ6lX@c=;|4hy1o;!RnP%hPP>>Ml|ST1V$)B%Q61@ z_G91SLx_Cx7-gm9bhaQ5M*|mUyorlNo8}&L`Mt$ueC=%Q@KwM5`2F-rESfO`e)|b9 zjP1ljl9!p;S#+i#RA~)IKXP%Zg+_H<;O*TRKP+5?fZtD||M;=&lEuYXDvcVpmR41Q zZCW(tyq@skm#z1qOBaF6kWaa~IAiMAvDkL-kdCGhQ`G@Kl>?FNg;>PSqm)g`Eox+X z9`n^#I`bhzb%NS9_rRlesD}KApQztdWDgJ+6n{#F81au=~jGNKZ{g6Bk#iaM9Gw9cCt`6or_S zo{IXl>!Cm4-isw@>{=h+jT(cC*DmAUlW163SipDj5}25p;6}(z9J%NZ14Ah)Qs?|6h7>Kxp1axWJ4zUUEU}a+R_@^)~-c-LLB|B z!+x7!Vq}O0wH?u=ofpmqUZk9VW2rtxVQLp32JKq3fT@8Y-Sv{2mXMi&lm7nrj=qn* zhfC+p$HmK6k(QfN1%@aVC{>@xfym}l%*8g0hF{AVtY5SU-MV)9!zPrV2K$T{L0dhN z_hlF4!?RBhteU@&VpNQc48U-~YHn@;#{MuFsaaW=JYozA3i7aW$s!61NlrV4(&WmS|l9tKaFY@=D2Y9 z7;LLo*GWJyFgG{Bv7I|HdggSwZ~*(bK1LSUWK?b8|6i z{%p)#wh(>2d&0xbox(Tv9zTNYfLtzvU&py{0`>5tPgj#hP0+AG1N`Q<5oVUw=+(6w{LlGg*MS2#dgU^_I(EX^ zom-GmT!>!nJK}XrEIPJojXl2~!1C>z(XE{q?q3bTnvLs`l9`V4*KW{~yoeM1Z0uYg z4mIuJyTuO)Y3X|M(}bhXqNT{o&c&@KkFaFx zZ!EKfpc$nGIJjXGmTmCGp3}$a?vvqZ&@@_5(^LpiI$5)1IV`QMk&>3K#X4~{FXwvo zFy))E*m7VmU2?PX^3l3qFHHMx68iS+NfWR{pK|-Ub=bOl7q%SU%W>`SX?I~F8q=uQ z$|9F~3Ai4F^H&3e?W?d;;NlnZ1nL_aa(yOPN-pWnr&OqMG3W{|T)o1Ekz%m`nhyvK z#^vVjR8WEN?)i!WKf94;YYxqt(D*^mzzBRfoVfR!cd_XH^)T9ug!G;`e?5pEw!i$EK2;zVAtO5*Lnn@> zF%1c-$v_a8*yQ>1Aj{3c@BXKtB+B;sMmToi5>39Y*t`V>Vi9DydGtFNF}U581k2X> zB0VRY{!Y#XVhFh<){ofT*~B@sXsdB;Ak2*k_h0g0=~En$nBHeneA#yJ052XM3)mLJBxq|N9Sl#~js>T(OK3Xzh2s}i1&E@mGD zntu`aP^qhg@~jmh{H1MmRk9%@?jyeB50tZkh^~wmS z%J+zW+&O8_M`zcf;WUfHBB2&W^@$jbHnpMa>^y*-FE(qq;Db9MCFycVbpp8jnvRkO z!*k&I@A)$jmJUyz<$s9;ZE4{=IMxeEDHt0WV%o&-5qIezG^%pERajj6PyK+mzeH(0 zn5LdSyQZk^{e@rGaUL@lzH?_&Y%k4kNDUx0wWy*dT9v{6=l1XCvRJL4iu^oO7Ut2I z1mI;+ID8%F5CWM`sI2RVIEciY5Cm-{O`F4kYv@7`!Drd|ljAnfLI3vcf6xAs16>Oa%`0!#sMlOi`%MY^S9O2AYncJ-;Sw-L zmgu?fIwsATi?9dxb=aZ8ovz|6I&+Oyl|pyT;$|k{iBzd@@!(-tCEiEEvF(Cf9zS@z zo|&+Wir5&;z}^W)cD0f7FoL5-^WVz;A_fNq;%82d!q4Ur*;!DfVFZms;rzIopIGN~ zwXdn$M@h$#81fz0KdlN6o)I1f;ob>hg7(W8jc!gyd+{XQ;_lJ_ zLFdmSYVjBpy?ILWXCwxan3!b0HFo;V?@-uAqE7Nx?Jtw+BcHvAjePc|e|)u|i z>gDDXC{6SvHp7i8g5u8aml8@#%O2e+D^j>J{^H-0V$moS7&YuGm>3)3#oO0-^85wO z-|+X3=MGVsH5lP+esWw@}Ul>I)SiUW~rs#mKPTDmvG*{he?uBIM` zZk(C!I(P!6j2eZ_hYy2MX{bXGSOgiYa?(JAlOt)_tT}v^EXD1}2)qcrg3(>Pv2wvu z_-)^c8@HnbDPVTj$`S-=EsA^UNw6CzD@P4|F+6RgtaEZtAq`fcM#DLqz~pDZrfqjf zZS8mw9i2ij`!o{=5Lwhf>Y1HjB>Hd|J{2ZL`mk-^1IG4_P?neKYd-4UeV zpoocvVUspU3OWPVAC{oxVI;C1MY2px1_;knKqOb9vmHmd;aC~`TqqU}%}_jdx3;Y@ z_q%ae=KC804jn~`Oor);7Yd3fe5`3^W=?MsD_{<&MZkcrUD3I9YXnW~1k`g2n78Hd zxep!h_w8?Q`|TU`X33i7*8N{>TT*A%kH6x?`SZvwEM|2Ol`4$|x5Wi6+!Dq* znZ(E#qKZOfzl}!TyVtY{9iv?}IrTF3r;!yA3x5e1n9!vvGduuRZmkf%@LO28GyxA` z(Vap0r(UhBWGOlleH0wu4vB#jOkNuF9G!v3Q8dmXYoeEp5kwk88kcZK;C5zO)eu8{ zR$_*|OOK?|bW8##_xNycF76gr1rrkJ^27F_N49B_47g5TT&}Gxo+zi_{ zY{ctxdjVCsa{oh_&)+@P_!tg!@7asudoJESZJyuVQxW?V`!{dJpz+_)ftOcS;_36J z@b>PG8#ivy-I83b!in?e(5Y=Z9J+Z0UiDL8Wvxc_8ny8H$}t?>wHvb+FGPH5Dnx2_ z+0k$)K`{{`Aez&hV~M!EIk=q2vjBJ0#}@6H)ZT%Mb6K@*Vj<0CCCW%r%M;_Xd;bD5YyzN zFH#cXm+6}J4v-g@pj=gn)e9EENM3-XySE@IRnZ4gCX=C}qFliDkVmFni`IDh>{=3H-AH#u&?Y#BkNarD~zE3*2tyQ~qCoyv1 z0Gz%QNU!+$%jam+XgHjm>rvGWa`Ug7u+ix7V8IyQ&LVqC)Xn9r?(fve*FnQ zO_+)e`}QF*EseutX<+VD4>i4dP}O%`p}^+Zu>YOM!jO8W{cc*N{C3LBX@f$W^hDzaTL921?50^pQDr`ZOkd`z_)L51kRytY~a%66{^-BRMq&=MzdWq&yg+uKnTd z*%)Up9E9JmYccG*aZsv(f}&zDo}Q@Y>?yz_7_QHRMp(wU433D;)o3N+gff9nu0~s! z=H=qF)h3ZnWXtIMm(E^d9#&S>czli)fvAOX@_Ik~Y?^id0Y~!zRj(x}k%7H>flSVXetXV4onVZRK@y6?yrYS9oRQV-d2bEll7IYxbTeKw9ige3%+$?C z^05ygJxWNMPz{5!iZZB047z)DMqy$+DsxL|gS!%q67}je#PgTWC}e{i!mD)$1cl$A zPDLrtV6b7?a_GrRX`UzBvi7lk7apJeSYwQj=|IGMZa(?#%J}Ys5{~(`8M8S6k@xQ5 z; zW$e;(uO<~27r#eC|9kDDI#5AzsdD<&=wX{X*Si~YXr0r}jhm2~{uQ1)e+w1E;MMCF z@M!J{BdHD-azMgQ!#na*Z5@g=#biy9l+Z9xNPf!Pcg=2{xL+r5$k8 zsAg$_1wT$h^y{a{D$K!{A;Vy0WrNjQ`~<2qqg|`CB3T6PU}%VbJ$s;zgA)|;N=S{2 zkegpf3#V$0itco5Y^-5xZN+Al#S%Px`UGKjqS&~J)1MY*#P_!3{G>%j)84ikMh+bY zYfCFAlnPo8J9_>c(lRrlQ7GVGQyrG(CV0F1Fl5EWC|3h9a$uxueVn~?4n`&>aBb8W zckkR0oQLRKZ}(k~C%acdRUoSjR5?w}%FVC*nB$9&?Lfqyyh}>oWnX>xq|&QlB4cyI zV|(_a&&ZKTNJ)iQ14KW42m?|<<{smjzpjAa&r9L6Wi#%TOJHZ9L_};Uo|h^x-oprb zB8^s3mtb@VooDQ~FqG=kLu}cx6)P9aMyr-BaPZ)6T#AUqngxpx7QaXy?va_3gNVC#@#y(8n$Yanwk>=Y zF2f4H4XBi}W5rW^go=qEIZQzIrkMT1512Y(5=CngmH(}KcHu^NC?*acfoHE?;?j*^ zN+(j56{FzZ9VAsK@TgQl`@kwyl>~naLt|syxqVxR-w4w3rvG`AM~6WcabAAku-@=} z=YvB(_SoW6I1sUu5fAQpeK%m0=Gv*XrVe#*<>V=J=-V6lBpB8JN~MBTnkPY|h=K2} z?Kre;2gXdBj6LO2${DLJFGpgg40<9lltgPtqedME2P~RC8;durK^xB|aC2^iT6G*D zO^AidSEI3d<}}o8(*t`CRlvPbBWzjqD`qTRBrtg?U|y-h&$DJB?#(OAnK50Mq2zJ} zewaNAx1(+$H7OobCQU}OW=-L@Y9&?Bm@;QJZr{5DTXS;^>)jhCE?wf{9fr$7X*GCM zj0!`#_rTV5zoA++wyzh-QYR-Tqcpz&-P*Q?&n7?Y+qwnMUcQ39fdTGbIRkxtF*4<9 zWU3g97&-vwuLQDKYYL5JnWp4mCwA?DVMz||ANUnAtGesf9}Eus6yu6d977;HJXA5E;SaCG5f7}j-%WE9cMuaF1AB+s2n-HFMotPQj~EH>rtY|V_a45VHVu>dbws-X zLosH;1Sm37fXo>DICDCJcdbU^i>J6 zF&a$$b}UvcSqfv)ON8_*efSWOw{D?%v!=)|EWqwPyWm>C0Zc8-(V%WU9650crbZ^n z$dm$|^7r$=XOb@G3vxQ)S9XPmd13I_#K=8a_(35B~Rz;uma`|G|dw5X=sNvs?gHm3KtgKupO-&(HDTxRc44QRE zPW&r)j9rAY^ZY1aD`4Ly{Iq;2CVoE!>vnFV^FeV@5oS-CiiETjbRRkZdPat*SI-5t zYt(>+sToD>5x!bMaS@V|QwS!CQjdChd(&<`Jgk%g#58JjAqupMmashf|B35}zEtkdT~=HQP2qDiOiks|y-5XaFk{bG(at2MaS3NTm`=WFdW2TeoYCxxTBQP^npP z8wYtJGtck7>(JY?IYJkVfK;SP+4M%y{o$*))K58{_|y(WEH)!I`}=G1Zu|Q*ih8>C z2ai?@cj4NJ)9C-*Sd`?K(9%R~TnzH_b1`n@cQ||D6pBmB*d2^UgOaimhz;~{V(%7A z9uf<^n$CccIlUCK;vB@^e*vknFcts)~1inu4REsBMkYhBtci0s_R z(pjr+U99)pgc7A3bAFr&si7g_)6=M=Z(d$5UDON>4CvBDRMUp_A4FyLj-Ne+md%^N znq!y{2iorAOS=^E2?Da^zjOZ~va@q>IXDREvNVhxG88WLoLSW~r3$j_Z0tXB7~3~( z#o2(1G&Vba`ZR4FMUTSews^Ytk!{=2y=@zWEf@h!NmgmFr2e4bhj-rne{TIpu}|(m z#Bz#C%jSl}4&2zSp8v~Dv)Z^$U4wu_hcRmMBxGde(%B{_KOd(qp2Fb1gYf3{2=8 zQY#D@Fbc`17QjPZPIEnsT8TGrUc;?HL)58L2hq=?ar^!Q6jdl_DTGfisx=~{rO6N* z7Y{od8+7T|0pmxFhKwkvir5xP7Y-gqk1k!Hn^ufZOhQ~zDzY6))jk_HpqWQ=Odk6!?Cc#W z&YRTMi0CD4*{N1Tq0t~AApwEcu0l~-j6UAo=?v#+XOEs;x^Pz~5^_II4i0$w_#uo< zjnUZE8B(bp-SV&W^+9S@27a109d(`RVE&3zzm-Vx0`TH@x-8}$1)^$gfpSs?hd zKP)xnxV3Bo^dyRm&94>RuRpr|S!N#IKAQs(%PuUD&yPy$zjaW{U2k`-993`ZPojH4 zH!y3-656aytkyt}5hElb6pr=|=+L$kGG*zov8{&m7xz#R9gY%nYbZ<%FlPQr4DEOc zPR_2BaS?X!0ctgLM=w`5C~`AU9P=1HJNDuFyFyIrYztXlE(=-{i;cb?U{g!NXy8gDj5_2Cepw_Ump%NYocY7rnED&ys`p%q;p_$0`dy;=~7D)j^rQd zZ20_HG*wG&*18?c4GoZ(oP@&SVq6HgfZn}&VSbmNaOTnlY}m0AX66>?+_E*5w!0h{ zAc#;91^temt*~qTMj+uS!gj8J*t&Yu>RSn;AHGif*t?{Z;yznaMlTxF zAzX8C<5u&BQHDDfFU42=`(x4S)ksd0(Ev3)JsoMXbebVf%gThFV*~X4Jp#)AnLAbu z@Wh~>f5hFyJUmFwg{_GZW{n*S3;hy2x^xH$ITgraOwoG4H`sr34%A8wx0?}Dn$nEr z3o&Qn6c~ubxDg%(SzaET>o~)!Q&+Z2vxrqylgrB?lcgd0%`23Zm!WI>PKbPX52249 zK_Zc2?y42&)4n5B2(h-YLDOa)lyFESY9elj<3dmn`uFUOjXoQ2>3R^REnY~2VmG%Y zFf+42#O)|(R2o6GjgT&VmMz7%!-nJO0Usn@JE=@HtiE+~;LD|H8CmkrJ$CpfI1q0> zmu~ON?9fCu7I)9wSv=O*bG8qnE(c=DoH+;z52w2jvN)0Hf9HuKXxp?ICeK}f^i&x} z`T4=C;bVBY*rAI{Ei`Cg2mMAa(6eiZwnnCCOZt1L6nJocA0$#^3WoqM45cQCJ|))e z+De7U2lncVapT6**``8KiSm*n$`3OzFoKzx8H}U`bQZZ18jQso*HaNsB8t$|ttn0g zT%^IZck4EgrKQ5qzz7AUC0M_G6O8l?acs{4gx$J@>B|;T=OqgHwQJWwR#pyTV&2ih zDurZ#L8~TiICJnY3{`SmoiP~lj0AN;wMLT{9SS`3xyMS^{xJ?j?BMN}S5lfc^7yHh z{@&+nr*y8-btsN*+ltF!5m>olJrYvWA)#3`F&@5njt2|oz|pP-=FOW;wUqPal^A{O zEQU3HhhCm(s8y#f7>NOra|;o1{{cc@q+p$o54P^xC7>B;h{3RuDhj!RE-9xjo}&y= zebP5oYCvUQRE!#Oxf~h-x1cy?iO_?TEPJoszQpW_Q}F2VL(EvQ1a`L7k(ZZ)YF3t* z_5BYpH@CndpS3jZp~X`!qnMPC$e|}$P?5Ez1?EnjibpR38OJMOglu z4-(VUsZyJSZ*RqDStvwVj3ge1^zMyKYkVM8D-gAE5=vs8Kku665R&5~v4)4d1YUOA3H z-|wNXQKR$g<`$szvZwrnD9It0*b9r75k2!jQ2Y-^?JY(kA zb0m)WZNxiS77m|1gY%aIkylX2GVeJGkgh6emDxn-0H<{b@{WcsE-;iDP^U;pO@(6( zJ1XyDX>JY!eLW<~Qek6djd;=*UWdcS@Hl6IW~1|W-if)^2Bb{iw_8_?8#xMH+qZ}8 zeh6;N{TgKnFBN+B&R5PQl=vR^JNMu-+~&Vz{}m2IEFm+m=*OcsSM=%Nd2muA)3vGR zb`4KBzfaHJdl**Fo{2S!mf*~VbJ%h45MIZ`&@3}Qy$Db*o|FEb(ZLooXzJz$6MZT2 z@(U1`mIkMq_NY-^4Rd1yx?GYZVAl?v;InHRC+)|_Q5T~E%TT?#lXmXDcK?&#*blV-8VBMn==Q_ppxYQdq=Sdg zNO${*g|`AnhlQTEwQSY_ojUZv@N;MJJoX)~MT8^#_FY6jf5G-&1v~Qyka~gLqXmEw zT}BczlSaYSt5>H2pEl-ZNK8tBt8+bM&5-toci`ih#gV>;&$)X5Sdvv?TAqx9Wi_42#CzBaPQ$mJdA#d=ohc>GA0HY znOQoqi-uF@5aDV#3*r-T9jTL&lLV~vlUTL~Su|-B%&}#8Rt0fTD{~9lnyPsdH?(Nl z3?16GLv?c#WWT(R^t%^vb=we7L*gH|^t|%uRR_;X;_-`qdp_=h+40yLrKO>J;c3nIbbgo3;mt ze*FgT665I%lbM@?!jfXDl&0pym;?N+~XrFJc}XxbDW&6=W) zQ!N@q7beFb<7pIPcFeRZckkSJ^~vYGV}Gyx*E^7|MaRS! zN5{nPcCxRz&(%`Daobup-JSFEI!PnWcE|`iTwNtGgt1+1Sk!h!{n{>Q-nI!$2KI!J zl`RZR&1uU@!VVz`MTJ5k=sy!cnW3Q}t@slsQI-~?yf6=CS?MT|B_i+AJ|v|lpd|Gj zL={EQH;`0nOshT3G_DaD5hDwIRZw>8P27c##?AVi_P@%3cuSRKs8eNl5&Ami1pvPW zF7@;rCGtjH8<=&Er!$}>`Gxzwp`XRIo<)fAOjG5Lii z)oiL6Hfr2hO6nCNF`

WGL41;nCKiIH)M)T&nY!)LFvrPei4F>QG3BaR&<4D=u&$z$+9RFMF|D*$bvA@s0 zIM5gSAp7D#U+jbIivxYJ53(-~^u<2NzBteq`yl(`Kws>G?27|^u@AB@4)n!7$i6tx v7yBUl;y_>QgY1g~eX$R+FAns@KFIzb?#$VG`{9bV00000NkvXXu0mjf6?s7% literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d286a0a4e572527a0d5d626aab5458adc89335a5 GIT binary patch literal 48190 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 RMd1Lym$yyMmJJ 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
aB_w%vN0z%eOndt}NqYsThw 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

BA>O?ss7D;PSP}4RyLL19tJ|nSj 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 z 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 literal 0 HcmV?d00001 diff --git a/flutter_launcher_icons.yaml b/flutter_launcher_icons.yaml new file mode 100644 index 0000000..add0a56 --- /dev/null +++ b/flutter_launcher_icons.yaml @@ -0,0 +1,16 @@ +# flutter pub run flutter_launcher_icons +flutter_launcher_icons: + image_path: "assets/logos/final_logo.png" + + android: "launcher_icon" + min_sdk_android: 21 # android min sdk min:16, default 21 + # adaptive_icon_background: "assets/icon/background.png" + # adaptive_icon_foreground: "assets/icon/foreground.png" + # adaptive_icon_monochrome: "assets/icon/monochrome.png" + + ios: true + remove_alpha_channel_ios: true + # image_path_ios_dark_transparent: "assets/icon/icon_dark.png" + # image_path_ios_tinted_grayscale: "assets/icon/icon_tinted.png" + # desaturate_tinted_to_grayscale_ios: true + diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 504fdc3..b4221fe 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -368,7 +368,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp; + PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -384,7 +384,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -401,7 +401,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -416,7 +416,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -427,7 +427,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -484,7 +484,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -547,7 +547,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp; + PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -569,7 +569,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.hoshomandsazan.rasadyarApp; + PRODUCT_BUNDLE_IDENTIFIER = ir.mnpc.rasadyar; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..d0d98aa 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +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" : "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" - } -} +{"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"}} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index dc9ada4725e9b0ddb1deab583e5b5102493aa332..923275e3c037e473c08426fcb76efae6b4dbce17 100644 GIT binary patch literal 704065 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

A>ix^zU*i7#^&{O^ZB91 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

Y<7ZAI2$~ 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

%wDerFfM{v9Cnq^-()=E%&-;}r<-5ktg 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МFeOGuOUx-BGI?J61o00tRgO2mR7@IjFC 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%0ARFEQ;Ni%&Q4r?`wENuR##f< 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

W0a@w z;pSRPbW|0Kt;$i`1#jZ@QSdz#L?vDmm;cJtP7IAsV*I|xF>&AH7~g*c)rlP#JMsX6 z%8=X!5iQ+7SLBb{!U~`TU)3rw`V^!-^->v56hJ{bAcc`O>c$8rXHY%zAchYdmx{kQ zl2PQYOzptf;gi_D@*b+Qd%)Y<;O#nCsf<9ZZ1co`kZj%H$(9}EondY)^Gqb3U zO`|q84Y@MMLUhG8i%uKu2I|w?C|2Yt z)#I_D4BJ#(%|m~n#$J>r`<015$??dsFycoMCdS4wv1=at=I60*?_Rm3a(?%2d~oSQ zT)gxlKDu%RA78nGuvP-hDRQJ5OcG$2I7*M zn;Un~*j&Tr!pCSVTn1}wpa z_1}EwYnP9H_vu$V&HBzLzWrz*-IjQMCTS^I6=L;m#PyZT03bX7gaH7ldY}mKuDLnP z?%att-+EgruGeobV*U0e0yc!8T1l;{$eEL=qd53amYDNr@|{0&otJ5A8NGW8xKnj2 zpNyJc=9VK+9yc-g z4YgdOS#l+unMNcVzsOd$bzHiVI^NLQE9~fFU9lx&f(~b{7(f09hNgF8Xl4)6y}9TL@0V5s+n3+N z_T~4n{`QM#FJ8};)byNtu5}|<)`+wpqA#$Q(rn#m?(5?WK_b`iOa zuiZx6ZewEiJdPYXjAx#D3Sa-)*Kqj20lC`z%NKu*U%mKibhftf;n{bSEq%fOKs^DJ zZGs`&AH-9Gk|t+S1I{NIM3&nc^SrZ9(Ge&0*q$%_C2e?es&;IV)%dh_Y$kOty`vXLi zLEN2+)0K@RF_eN3wQ?Dql||fn_YI7VPosVCq_l8~Edt7tDh0?Oz~Ms&@$KiI!>?X> z1q(NC%41YwsT|~c*jxtaVkVx|qCGO?7WZeI-kQQlZvn#QQ>KWJpP6m9hG%;n<1~mA z&(2|tGp$ENa5#MAC=TsEi07YsRtf_%Gt&rF;IKGAxil{0FmyT{bUIPu5zuPM)&H&S zI<~gAu(`E`<&_mIudc|yD=RCwy|RL(m1S&fZewFh1pewGirdn_6Qtz_nkHj4AZj7#G{8g%5=AKQ&d{c%{6uELOqxYB8epH@rtB6Ih(ijjgUBpf-%4 zHj=g}#PII@n0f3Q*gX3(Hdk(dbvr;S&P+Bzx|Kk+Gca6bi(u@P5+fWh=mX;+L6iAS zKJIP0tV5O3UJ-+#TtRha2g30k;G666LR1HuTPRg4B0v`^dyk?ze-uOWhcG;U7@-Js z*^Uw2zKQzEBErcTlqP2+jSkBbz}_RMj83AnwTbQJMReC!5N)i=Z30=$9I|yzMg-6L zv5cS_C6Ri<)G%Vi5U@~W#68e(Uqp9JLPF@6tTr`RBrj4!4S06Cg$@rljQ06asdPl= zE7X+U>h#77uk}R53^BiTAc|RU&60GwVSHB%nX5j(0ZeR>5^|6XE)6pIX$(1r63@&Sn+sQP>#Y}2U%Vz=|3l^apHa(XS1zlLtcKN*m5Bq# zF3vyljrYc1y0GjAZjc7)?$f{kFi3r;iTy_x4?O$3ciPLh9=QGXE0c(aKn6tO#KlVx%EJc_f3d!tB!FP_*EwDFBXdjg*UFx}u@p#i{b22mpz)APoRw&vX=_ zT&~LN_>p7y?eBb7o;543rf~D`wA1L*97EMAhU6Z!VmMas+`*l-JGgrNI<8&6fp;%l zz`O6ghbvdFVSA%4R~|a87J^zCA!CpSfRzFbZU&d8@7Y3;$9>AM@7JmHl?Z0!(aPt@ z+`Kc@-UzxVSB`@qGXSXbbiK*QX9_$TkLQMvU^hE)XBXo>3{pcxfPnMlNHw0U#E6K_ zF&(PhRgRL+lrWRyi7NUzs@w`=FC~CkTWiRNu08Lm0iY{>3gy32L(r$nOI&$SX8Q*R<6supAP@8TE z5^kYPD3?5O)fYw<(HE5vsD=SL%U7_maSIdEGw2+?59P_72&Dlakn?6}_W`+2wY#!_ zt@E#lXpTUuDT6eMOS;FCcx!a8tT|F_1&Tx)cNw(ky=PByW~i~rydyDZ|I+tKAir+n z*;X#2Iy;ZygAbs6?GiejONfPWw6%fK@C?f1qZm8+2*#iOK8EKGV0hO-w61-O_O*`@ zZQMe8a|yLWCr}z4MmRKqaCj1xu}NUxQEV^Y!rJwZWI#y1aw}2(h4+=wHo+H!=Sbp# zPy@ORgmP<$XmdamJlE+rT45x(pi^D8aOcF6+8UN_7gL5HVN?pli8Nx>I#y939GkC+ zVZox~svkWBijhlumKt^GDF8H|CMs}OxrLi~%;smrhl5mN9Y?VRelwSA1~bkmC)V$O#=hKAoZQZUZNLXc%gl;bLYyT z-3MNdS8j#v)#m<$!o`7FS(Rr*3qez?5N)qvYvCi@I{yZy=MSN>_fS@zBHU9`Q#gXd zIC1nC9yoatOKWRbT3>c|AbkqL|+ zz8@2Z?~{9-g*Q<1`UhxT|3G>J1f6E$31Aj0)|$m?>dY)U8%yY}jwiH4xSFTC%#+Ni z0;femceRWt0@-VIj2E@s5Gc5fL)uQxjWMZclhfssP^EOtmE^H-U9i>$npe)^PRP-z zuVHB4F%0cLhLTk9M4PL?@HkMerhA@!^T!af6|IwS#wrvY#txj2eIkT=an(OMhx$kF zg2gQ$YDs01)i==j_+8wYoWbbHr!YD(li*!Mjv1W*!+wk$e-smID`+lWMRV~=Lhn<> zLQ~!{{L{I>vZofRyveQb=l5>f?oYYVj~aBc^Rw07bRm$(F=~5`ptk2Q#*RFU@uLr6 zV{`%=Vgv5lFuLnC3?F|KBgY;^IK2n$Mi-qkuVG{TZ-Aw1z|wWZaRYI;iEg}&?nn*Q z9S2Yyo|JVt8LG zF+M(ylP6Eg>#>I(k=N|(EH)cWT)uJzSFT*a?b}OOT3W`Q-MeHw0I_xNcfbFA%+AeW z&+gs0y>>@lJe7BJj+d|c%Tok89W+`kG+Rl`ILkmpf(PXCi|v6`$FK)VY}%d7U_ROe+6VlaoeG z$+z1pi`ZOR!1~n>&|18Pu-lY-|3ewzm1jqW#^OZQuoTy(cVDaRzwgzT-??z@&tH3? zd+O9FD?s-k4bmq`0|USy^_@rv?DZ9;T+IF+DYn6UUBA1Hjqy=W+AK4QUxI4ObH; z5hxd`d{tMi^*U|##8ZGOVy?9ePMEO1P(ha$P4j}PhS^NV)Ip8S+f@0dHf?25E(L)! z0E~@|VPbqjG8CcA&rZ)^Zh8k!9zTxzjvvRKU32nM>7z@R@OOXvxA^elMS1O>--F$I z=P@xkg~_QY%n8H6+%73V2qVIdnHjn7xKgQNY+HGnIQ#AeymRg> zwzulotT$2L+(s}Y3^a*Xhg?}O1a-Be-75+d?5FRQbP*X!Gt(_9Y6;2M-w0v=2#P!a zm~oj3h)3yku6L#Z!-TtED+2CB!1?ty&Ma@C5(KD(0Un*IVYF0}g7Z)*fwN1?=!p;i zGfnyTNvYm%O>FCdkktH)+YzExL#`Z`r)Dwz(9_ua{132k`2%cTxd;|D(7F0vZUC^h z03`K)BL4{_vEiE(t=n`m7*E0zC^#VgqH^zWcNH;=G7oEklPB$xFbvk z6FV?`@`%Grm; zILQqFYBdj8>B?;Tl-2g5d|gfvIo&J{qelXs)iJ zappBNU;R5&H*cZ3bqn2E3Gq-F-O(DlyXS%736ya_nX(cOiy$!oWN!S(2d!8M?zWn8 zUR7r1F#X6gnE$OGVB^vSY>Mlhm(aO&Em7p;DKClF95)qR>i$g)AO?Q&5H|+@%#?p7 z4Vh68q7#&Ht=YyqD-CQkyYjk!vWf>LtJqs(m?|X`CN>K)k_jfW21Xw#o#1wy78L`) zqxdr`x3g$Ye;DAoOn><}q#50GT)C6W7!jQo;zk4GQ!|*En84GIKY<_q@b__W?>^~f zE|mYRW(()udmpEN@e6$T{s;K*gAee~Ll4XAyWe^a-~a9JV$YsE*uQr#&VBF!-u>VM z8SFC_hDQZwN>fVWn96cVo+7X=wgj%;L8H-3wgEVC!!vos-Ahysu-nVX51T$@C%)!i zv%LQlAJ2`|gpT+U5x?BobPiW!yhvRC)2kDKZ`Uz<I{twcp zo(2YhLAvWSw)f!bo@c)O;Ue&1eR1LcXYW0K?8ve_vEL2zyiM;j$t0Of7HxHRb=j_- zc4Jn+tY)-;R?rtg!0b1D&|lE{0|YDt2n&n=t*|>gz%HPf*m;Ta;%~$ zl1XMVy?gn*j~5ZbJ>hPcmt@scYxE&+cNFuz7v{#b=lsq&zq1CtI}W`!!6h2k3TC^J z#bPlGswFg@e2Lb?EZWOgpu`e{e42h)1WQYc_~Ei-#U~Cpj8D^EN9V68!aL6!IZV&a z;>MLLxN+qb@&w@4`gAfy2Upz3M@Ny(q<#10vHeGfhvWfJt=6c%y>5pr{2YAAW;4iT zGst9e$Y%2>jEvGTS{$*Cu`!H|k0Y1OBAd%1nMz`6d<^WBRr+`3!a02ZyWhe3`crJI zKg0g<5e`a6(EB`{Sr1ILLO+-zh($KG_{VU|o>*S0iA7z(Cxr=09TO}{LP*JrY+<6s z#Pqg**DoYsD+pce2&5F!qDUyW`dF*?u~BJbtJ1c@DkO%aX^`drLRLjVRbeoT^T8)( zohldm6<5De%^S;p1<7wJVZwjI;y?V2>k3vpHI)G=o`jl6qj2FWim$we!ub`bsSGkR zi-@JOVD%D=+6k202()I6*wCFe6`zurT14^Y4=A2Gcl8b1&6s(O8KDmj^8yIL0m7gR z8~KH?GPFb?K~dj_fe7Y!EHEeJ!y@ZMG6R;(Ah~df^2Kvc97i!VD0QbTaKn#pMX4QP z%}Jpc48XEE#ImDEPR=4TJrBkK6xNc33~v*1p+*v$h2e2 z5|ax^PAwuaIz{IZ7s9J=L+>ja5>4(jFWP^7C+B^@lA2g~K5 zE?9aQ+Hn zd<~ypMm&>)%=t9h4QQ1kXw^fQJXC}quEy##%n(mE-xn{@dXlxbH#8H+0}anAZ9F`z zTOI(K0Yx96-`60GCNPssSTW5)sFDlDQsWOpfJ|=_5A~ku{T@|(6UB71U%b54KU^C` z4NbSIV&3}jb;BO(q@grmh3xT6A3QrmE|o@ZYz*JI`6^z$`5j!pc8!#O9wxMXaELGO z->2iN2M_S@!F>wft2b*{d-4^kV z_IwlfA3nhT!69X1lF9Qb;1wkpI)W)^!|&*IW7rhn-%EmR<}KBxXQVMrVGp;T&n&sq z;V_7-!%*xdFfN026gt)Uoq!a>q;QFNI)jyqEBNudKcrCBsKN=Gc{pc%=Q)nPxPxx# z05Kj;saoEXuzj>_7>Ikooyh6@VSfI?+SKJ&pJm2AE}zoGXXUJX<8lT7oRzO#vUBIk zv#!UnQ(%k9$A z61lu_<^R1{j0mwffgMvBB*l*X^=+`CV;2)FgU(XTe2czwVVIQ8+5k-_|7t)HpiM=x zEH#Wp#4<*dNCCjN-+482KmhLQX>_|7DHO1Bc@@9?PUVV?di04>ME9T_Xlri6K)MMYcGK#f2p-E}p{*cQssH#q8`15?Kxa zq>xXiN%_YstEe?ODPRkCKK>XVfBXqP`Rr4aODDuVzy(=3m9+AeGmm^PvSkA7-yx5Q zP{Rf8;8U`~dEP^MpeeX~2l{}8%|!^DA?5-Qp6VPdWHazr&l60zn>63_EBy}EDjjT8 z+t{wQ-IHU?iU%yH5>|3?=q?dJ5Y-UdLKN_ay+@QiA}q@?-~CQY#~{oyW~C+L%8Has zLr&*Vym%F}Z~Pds!Wb$3{J`uIDgT378D_hNL9<5glfl}UHUN;ET0(B1(VVbiBMs+; zhbSr0ih1<=zF@$eI=^4S;xz2Kkejnb2Fc&ipO^nzD`%eN389Y^b#$5zDV2eg%0jlc z6TW8lt7Y^`2k0H_fayIets-BjIrj}`7w79XCxp!8QMh;=bFcptDxX)GJmQ%=u&@lX z-K2Tddh$86qb<-vA}b*;88MR#V_!4Y-9bg{n14=W*ys+h(;nbiwS%vY8m>;>*9NF` zHOwSs7)aT>v=QztZ`(e#Kj95&VGVv6n8!q5^!e_AsBz^kBhI)VULoI_>c>(2*D-OF ziND%2iYx!*`rn7qZIkl9NQ8dx;17QP53IC*xg06~JBLU34DY=4)(hLoDIa|DDH5sAaBy&lL0=;`7=CY0fj>n_ ze@USJ^kq|A!@abwE@0$4JVHpya87P?D*VJTmdPFn?if z`tqymnX&0J>;GB#jg&J0;H-S@!efzs{_~&XJUZLw7BBu<+kc+ycbexpc*&r1b3Nre zCIN{HvjZKnuA#HPiKBbBG0t;MXFYdwM}0~rlNcEp!KI6r@YWk|;OXXbJl%Q@Da~NU zVwR?8bE~+i(cEp?4BX8w!5v4~s13u)$DK?kk;!D}`N>2|VBWV*<_LSWTCvF4bi?%o zI8`_Z2n4}8xK>Z*eWv!}vAOLIj*pJeZnx+;16@Z?(S>(AwKBK6ZP$d+T3LREHY6*s9z|bm)9SqQI9Aa%}4ZELwh|$?O zjLpnpY;p?YlT#R-oW$7FB;6~QNn`cWMdUMSEG^9A*7fTI*gSpq45exX$JL5Onx$BT zLRNfRR1*klOi&7Yfh6G*@T1NRYP&(*>lEYBi%MAF5u^U2>LS$EwA?)7iiCVpMO?8n zXOQ3`Bb`WKJexr>reI*eW6^d%h9O#zFYVdTii9feyC!O!MiMys2sypy^OSxpo&qaQ zKrT*@k|HNkzQ?H}6G$yzrF`=3$}u!w8bDFSv_2EJ1XN<6cdeIEp*_M~qFyB29DjcR zVA$k8RltoffYI8;ExvNhCeu?amvC-5YBix9A3*Q4VcJTeo4Mje2!z0R&XtRSX}ZLc z&MzFSNnj32x`5=w92i%2d7E=3HJP&r3Iza$>Lxpiutm~pa>dwGeEk;PeExPDrdox2 zmIZ$E|8n|JAKvppr(f|O55QyOPS4j%!;Q{o7U7+}tPwXtjIVVHq?vi*TagUQlLCnp zSRx5Im8C2JoZOLasr4|>dgQ)eee@-on~z~=9V??BZ%>K2V}P##QZfsSOhYbCM$W6) z$OJMMuc6OFX4W5Aa1Hkyfwj&D;TBh+@`2M4K#M8tQ9gy(T9N`z0E#TS7L`0cFgxY(9<0WV5@b-oilEJKoc03}?fTs${U50^TK952!kC>`L zRb!U?#yzNP@639mfkv}IvXG|rZNmW^l}jtQ zc;Nym|8Xv(x&c~Vi`0*HakBXo^__K?ttuE_Mq@Dwn znk_mk0HBI4Cya{AE=k{PI)>}%I2Q78EEW>bOamHBRO>BN8&#Yf9HQLqVW(r@q-!8E zGf&6z)tk6*?Iu=kTt{MJ92r$XE)hq5wUIS64E3sbT;*dPXRSEf2 z3<=d{&X%lx$|Mt*;GP$%ZVNqvFdA&97i&KOE7b7c*^rij2m%O}G2d%DVHJj@@JJ(* zP>SP-6~{w&W4u+OKd=i)nxqc_;K zdb_rfg$zfUJ2md3B-m!AW)BlR#>sh zuw92e#h;z(5d1Z9sTclsx)S)!N_7AE)6h!xxHPF%4FWoOZj^X(9&9Gs4OlFi)`Q+^ z5CCxW;a{U$K7cvs0$hRMd=K`6_&!QYKr#c2&JX|)D~tzf2B@Qx$Xo&%>-Wk1-vSB^ zKS;zxZFZQt<1a4)S7^K9JUy}n0t{^RCmD}nG$R54qWw4wp!uE?sB(Cj`vw47PF@GjC5T!>{w0<9$SQ_J&A%!oaiqFU&9E?Kj`TKm8~FEy*Q`c!HFFp8cVFvWxoK zXUJ7IaYbz-mz9u;XR+M{+Fi?_q3as!0fi2Si2Dw%92Kql4{@S@af6wW9c}-_$ladHWZ6uX(jamI<4ih( z!C*kvb!$=r+dDhtF{%%Abag&2nM1Sr66>+OiVX=NFrB*aejMnO{bX@w8t=UICN5pL zh?a!rdeF443f=Psco~4S%@2jym zj7ANe=WA#!Tte+&o8lL_8)Hxqo}Zh?8*jXU-Tgg0c=!+<80faz6p!Y{q(#Q?4k`BL z5=7t~*X(Ymi|R=kqs39AQ)zO|QtjvPYx=!DjDe2B!$TY#9T9?S+A+y2xRHhb^nDI( zFOJoTS*c){%3b-J*x%X4lc!Jd>HP)=i9!6tS{$iP(xawzsjq zy^X%sL%-P}<(9h=TI5>H?Tg5U!f;_=cW|?yYBX)+I^1Nqt6i^okDzUIx>zw zO2HmBmxguqOJF50E%?6(0Qfrh8&>~z=?IgH3#^CO5CMuygL(C-mHLwjcf?cELNJ)R1*jm)`KWY1k8 z0zpMcFUkV{9oE)=KZW!3@^uuq)6PBZHx9`3+6@Av`N1<&aI5}{t~LlzHqftCpw%mA zZ9hYMdmYuad+1dTVQ5`yQ)Z`NWA*}RrDRiSUg>;ZeXe4!U7~c1DV~xsm4lSZLyEb# z2`pxln2z%d0M0rValcT^g@<**`zV|e01<{1cbzg3b{&Yk^C@4Sf-f^4U>UyOFav;d zQ))+DBP%@T>A7{|7T$g5U9$Xh<)3?%7_M}k7logK2Jqa6)24(m` zzY8e5B~_u;FE>L^-P@z~CU@EQx0pd-!~iPKh?Iz9d}IW((=&+2EaGAZjBmD^Xz?%@ zO+%~MgvNPKY|od-kr%ZW`oc6spwzmDVQ1sugq-PA5}AAsmoBZ~ySHAY%nR`QG+J_F zhjV?eSdg^W;uJpPKHqdvekkeOv636x`S{W1(~W!oX6x6V-mAS-gP)bN z@(s%w0B}~maj^k_TIXQvQTg$gcg@NmW_B72l&hK<)*{S30Az)PnSQedty)HNX9M-a zZR9YIgbe_QWo~{B(=*d}@ZbTaCMI!EDWhI3BbG|p0DxG+JG8R|yM~7d11fCha>=xa z@~S+g%Rr|Tc|05-lgWA;^*|>~mjea+d;7NXFC$nY?Y~hW%Ym!_P8>QH0J%l2*=nM3 za$*4h4<6vVuUx^>^fWrH7WQ^`aQoM{ap(4JBvMI=(|1UGdRmW;0dIesaXv0HjB@}W zlR!EFWE5sIku$`V7~*LaMu)-Z0@cYG)F#g(f9+Kiu6+kz{Kx-*FFyGdo*F6+%@~&7 z`2jAx^8;La1t?66Bc4hkmr7!6bOhgh^%g1rtE*S=pWpi>s@M$une;nB`j|~?290I&EY;9ajedeMMA^>1m7L|g+ zkd3LxsWKJ|X~dX}n51Ad28_jc%%F+EK(``ZhLGO*YV4-Se0d8@G&}onxj(4{Y_LipP{e_Bnu-$>&KOU-apl+4{`Fzuh4H*&~H^S_0I1hHad-X zt_U@r8v0(}6ae_T=S4mHWq<#A{brrbm4D8apr+D@r8AI`gQO;3cr{sOwE;RO$7pS@ zqw>YCQT_7Q)TUai3Mm#N006#u#-rzC@E{nYRe@1IM7>?YVDmmkU;P1ORfak?hnNol z$ihgZ!MaUK>xdvryEtY9QofgNG`kSDglQlv%g82Vq{cE>%%!2}i~xYin2f2oLYxMM z9!@70+75+(S>QY86SIv8ERyA4ILp~f{VVj)SNhuXH(*R)rzyq(M=^1KqPcG9L=YFt zq*2IZaO>tR{NeBa*W~ukE&qlS#$d0D6H^nIPG12~1_rx0sWefpHX+6OD4CYqd#T-b z4I5uQeuPT7YKLGLC>2m;}*+j3?CIEmXEJ9x<|6{7P7bx^YAdm{YC@<><4kHIJf+B<)4Qhj*X0BZhFS@DrFLd0dSJ(gQEjiCV1Vn8emCuG97eB;Og@k4iAk(nTEX{jea8aod@pF-kSqT! zPJq2@0RVB?M4V?%a>F7$-vWM#lFlC~6Y~!~`P;is|MlPA-HskqXXUJXd*uuOI4j?{ zy!YOF`1#L&Zm#B&TdUXK{GjpV^L(RGTW01U$@D?W$qL|X#S%G6n&=*EqjdK}$k$&- zW@5@EQ-U3@$`^RPre3&k0YCZ4Pw>&lcX0Ue5iweG_bx{mpsm;Co(gWmu4&!dt;Be2 z`!^nEtdr|pABV?>c=F^i=I0m4vhHm3=}ZPQvvY);bIW_X*QJA8KV3AJ3BrM>%))1K zF;B6qFo!9ehdIa+Hn+F%%lF?$As)x-@-h~emhij3^E(tO!NH5egF_q~9#9y7l1xH2 zRe~jW_yV`Q@XaxsO(C61AQ4x=Wz1O2%16(=<5V89!I`Fu^Dr`bWS4J1<+-jWXXv;z zJA=&JI5u`F*w{UQapyLk9vq;5{~}74FJf|G36l$pDC7$$<_j1f8^bG?t+Ybt&MlGm z20sqVCpbJQ5d*%V$doorcC1rkr$tGIFQE-YIuSU^a1>{wZ5c8}M&Z-SDOzS!sx0r4 zXz`lYO*VAod6We23r_rl0piTG!U0XgC0`3+BtuE?qN^LKT!iraB9+_sdyw41^uCuk zGcy0ZQN^I$K>OJPR8kq_Aw!v1v@DV~7^o-`dV9}s(yF4pw}tw~8kBSf3eOh6UEO6l zEI9fEQNi9a6d*CfH#qf8PcK28d+0Tx{t4JI9dj&CgQyP(>>20=rBKv+9kjTY)W%cj z2hX4~-HN>@mvhM)&!+eck#HoS>eyB=+3xes_EQ`hzd&bu8O_aQD5(sTWZELn;+!D; z9vz+I19VCUXl<^cy}OP<-|_&c-2Vhxr-St593AAbMDFjRz%N+R1Ret4_e0w$*h?>I zrS-k~%RoYbvqV>L;XV{U&-Vw-VrSCD<)1A7ZZkQ9+51;^80>3h^xHMG3L}t{X=ETNz3xv#jcBh8f;mBEnhw22)2=VO~&{{>ei zFS};6${e|l!%+qu*7u-#8Cl`*GllD!&jliUui&Z?`I|Xx<@cZLJIh|v4LjX0_Y8ri zVR>N@uim_gD=U{Rp=_csuF_&Mhq9t=C@1^0{-C4CrG#_U_m?*uueApQE|E4yJX$ zBo$1KxfwnzZWZqOuk=hM-pfv(e^$Ku*00m|Pj-O2FWG`;<*a=3as~jLm2X_$fB$_t z{^vjXqwRP8=#T1Jqk5sb{^)gi&>4{j{S>*H+r(9b+S&uIduX|bXC|g$T>B0QxDt~+ zp`Kf>q2R*u1zKDWkB{)tM;}q_72h-|29w94>WEB3Bj$+p(oK2Fn7dT-0Qx`$zlEE} zF6tVwIP>RlL7Xf9GqW?UGS9sMI14XV{!534I4m6#Qcf)1T;+Ce?1TiE1a^edj0X$z zi_Ofrj<=a2V{2=R5PYuux4JznE}g?GtE(ii_q0BK{ozM=zOg~!3f!$sCQ>GetO`6J zGft`h(nxUtAi)6uhFIJK0Ahwthd#3aN#P}E;T={?ZowxDVfBPQd@dQ5m;tTBU z?!!=JOZic)G-PC<8YWmc3ZJcYiNY2$Bb1337UuiM+u={Si(_$e^OlSK#SrS=2&1~2 zWk7gQ$&zSM;IXqYi3Dk84xs4YtjP^a!AF+PpN z_zbyKbH&KdYVU=Pxb$8@Q%#_VYDO?&qcu%mJc5FXWklL)-xJ~Xi*Rq#^qf)oc;fxd zrOIBH#}}c~>!aJ((65)F)ypvUx9E`KGGcKV1_x4Q8HQ=A+MXumdn>o6#5&Xe4FX;{ z0MOWciq_V7)aRBFADu*Ebkg?FQZQ)n>~@hXMdx z*^m`z+`YKnM1A8i8XHfb#N(94mXFuu#59y_fl?yUy(I>N=La9?&{{1z`sHIfc)CTS zaYE-XTC7z_9F-jc7&$-@pHm7~Lh2{bx;3;?X|6Ot8k+<8AMkm_IU-~W0C4ze#I$Ip zFsFyE8-WI5{)H#-yEP7(ZXhEu@@kR@tN{ADP6VGc>X~SZ5APu`CLm`DBKbXPw#Rg`B>#G0pHvC|d>v7^#9uszcaS1>D(U0-U$|?%kTtN9Z zy?eznFk=d|8uT($rJzTWWoGhHWH zh8tIAXJ-ij;L3ly+e4fK0HY(AoS4Ma>;e(`c4`%iazyqvPUg(BVQl+i^F_3uGakf# zb$i`pE;%9r^oD_4CX4x*ITUjR0xNXgA_e3e0K6Ru0N7Zk^wG}lBzmfeq=F)>?#LF= zh1p5@Eal&@>%!ae{K6uB{O-G0K6jqhO@|&(U^}AH*x$z9=O0iQ6&rMkmx-^n#Gzt) zWmo_}yl2GIjpWSo`UD36Chi^$snl6HE8l840|3s--@APD>8IWQ^^gA;7p3;IOXD-Q z_3H68z1FpYOm&@E)(O*c%~Bam9vgMEhvw!QP9EPydVCIhEy%(j{D7S;2+nW&F<1ejC|zhTQj#N+lc}mx#beH|?#6NzhD&)&OWp3L4x> zg+3C!J_dFx_hF*PtSf@;X=KNS6I(6yJCb2wuM0oBn5rjUdjCp~XZ%i4=!tKPaFz3#LxtCH6ZruV0RUi*H;Tt1Zvg;+6i*T_f=+$UU^dENwPUF1 z6r@Y5q;zwlIcR-yZ#8YW)4P4p@5v0mCDl`+^CV_+yc2`k30ebG{Zj`LhBX0dS zId4a!2EAK{!TVL==z|JoGyS9ALFZr-15RdTUuU(IFmFr|1QEph$mS2vj~De()K?yj zg-B9)8UPSA9)u7VW_bWm27rNW$!}C4^Zpogp_>}IB?AM_>aE7f4d2;>Ox;ozOacNl z8uQ$B*wlG;7S;CeXI8AXo65`vLoHupdtMF5?U-?Lz+?ug={dynMIYeDY!P%$Owri6kjW4V~dQAfjJM}rZw zXyNLYL<&cjTL-GLj)l4nG)JM zLsL@F56r0oD-5aUVLKL$tlgy5ZG`aFI z=s_R!DQz6mIV6{_qOkfZQp-1xzHkGuc{{k!%M}$40Ps{zJX1Nhr0V?+5!G3OpW(Ut znoc?@e+~Sgo?sCS)HJAPybOtzV=;0+`!##vdkhULYgj!jcO zdC5^A8)ZoKW2m!Bh|Miw(Ct9)c3_l`flA54t$a@mkZOw0721K3Tety*nFIjzO8b_Q zY8dXi>3FPgFAaW}JoG?OJWnbP^7K3C?$^-VTC=Q*f|rKNLE-sb3#}GqksaP2{&^oL z5enpKqt>tB`Z`9q(6bym?O;0J+wG&oVsw}U2pAYNtLTuTu3K#>!Qp?wAUNL)K4LU8#7QulA ziN_I1vK?9%J>S_W`;f2UoM!SNuKodU*m>+lCEaKDca^;GK#law5$fk#I!))7s8xzZ zehQu!_5=Jn#Tm&wtVVK4Z7E}mY4`(Sf+1WUHs;2Xj~3>!a`6&YS5^rC2)2P!+fKWQ z((wWIzW5CLpL~F9^#r+E8IVjm4DJo7$S5i@E{tSgR68gS$O+JLHz&)#L|jHDG*bL| zIAOs709s8P93JBQ;sVYuE|Mo&cVOb+-~f8JXURwIa>IO_0Fl_x5a4tO?&G$L3n=Lp zH-e@7k6~hL9Ft=cR@y(^pb$eOBeR%-u<1=kM8`J#a{XFBGY># zOz)4ch{F%#9#7zYHmspabsKZ*73*&Yi=LfAk}CH4W>} zpF`(v`~ALUL6$9cc~jW!9ihTO?8RaR^+`dhX10rRwN@nsKOVPodz|ll)&Mqo5k-9qyoi zw1Y}zAC)gZ!+NucCy&>#ba@p^m#<)EassoHlN1(kjY6I^OiYa7-h=zN|KL7a?H1b2 z77?6r!P-X@C8Vq}eNrG3zWW+QJl_@6qwxN4v0_HWYl1gC<&mPY%AC82ijngSgx)Jk zX!5;=&zcsn_CGXbV>2x1MRbWC=7Ow&?!xbJ%BrE)$*rvKg+t^_LnXG5<{m;y zhP6-d#y)OJL6sH9s_!1|`GWB2xCV1&o9BqZKDXrJ1WaLG^(rS6+R;5efYE7LJOGO9X5w-86{l`PEw{ne6hGJl%1hkt z?Xx1cj%h#9Q4*sxy}*5g(>T1&1su2Bjt#)B!W!)YGVZC)KsN4 zX*I3%z}%ugFaoa@Q2x1L!n9n;`TXNqkKW1tya;lG)OV$>xLmS7@X{Lz>pgN8PhFrofpCh1e!quivyP*qL+tGCpxJH_IW&{Q#LT`*MD=at>CAS-u{;qt*bvL+$W!B| zzx5-E{f~MR!wyZT?L5cs#~+}zzr~xI3@wiGFS`D-ShB%liAG`R%9EMbe)3uV%l&=e zgQ0ajD`(}~E@uG1S^3sVZt23o+z)@J+$$emI=T1BRdh_owBD#8*)EQ@UH5j1P*PzC@waQwoZF$u%oCJgm zQPFn3U;^_v2LO1wx@xV4W}}Ib(GgPglgShT4Sds1rPG+0n7{%@$_E2NpUDlDE9;^a z(pL5uLi=YBqHycx7lata%5w>i0|2GtV|@444IG{v0~ogffJHhUJa~wFE{krjN5F_G z#i7O&^m-bajSlYhy4b2U(VxhmFpJw@NBnS`R^xskU#$ja%&e)$_LP%?c=k@Yxq3=OI-WWPjS7k zbh2jqc%@sIc$?@)MOFVa1AN45I(9TKi^UM>-C@3FK_&ld2)e=_p4Ei8mM*fu zaHZ6+(wfCH1t`TyWS1`^cVQLT<*UeExJnjnImYu>n{@C#<)WEZDWU%C5jscvWUb^x zW@gOt4zTz%0)Z9*gP|jcJ3V*mdqx5Pj!x_;sKXRV?<(&;qR`49d=P<@z=U^z9s1Xf z!Iknw$i*=fzxy^8{;U7qyM02Z^ui(1$_e^A%Xen8x4e~cmtcRxx0^Eqm^h$> z6$&Ci7qAe!w>$+65bxx>s{qWH4xr#;c?%a)^s2CXnmo)*FQs~Dc{rs-oc81QP-GRw z!U)BrA0HgR=xOA&)H5~T!r%>mdrh|YH4XxBuMnBVNv?VKogWaRymyrYxOpCNsZ<7u zR0iddam0(Gs65|9rP_d^#OTl&8Tg?~67sTa0RTMIhcR@B$kLvVHfeFA)uL=h+nbvN z%D?&MTXZP0r4F&TkPk^%|k@dgX zY>@l^(eV*>_IAl=Lk0v%8hUT$f>$0YWd`QAvmQEQjL$_LUK5KakxeAAdU+K;`>h`% zlg#)0kkZAy;<;DW7GL|x=Y?N< z(EdgZcUI2IH!NoWz*+g$%6sp<#|;?$^Mm@v^4#*Tx<^}buh&|nNC3l-d1^YB?Uh?Z zxU1u!kLJ!g4)1=1kqg%lzfcU|`X=Sb%_2wca=-P1cX99WW88oI#3IWh%P~9&*9>k+ zKGEM6P6BS#aD+H6+%gh?`vZ+)%hsMe!QA`;=F=G~mvg^QXgQCe<3xZQ0MPA)-||Qp zhC+w8(QrNeZkaqRftfruS0lxqqxE+_{sgaHzk#W-am(${bYkWPq?mDcRHBmSmPS6o zWeI&vN43$xW>Uo$sTi)MQkWP?Luz)QG`mo9IY^^pP?&*k=?Lw56RnO;-T?z{ZImRa zwyS5C{~MFRvI!_7Im9Q%P)wSb$r)&N4WQeC@$4S%^*d-he}?C4Yq)snA}(IMh*(U; zo<&g&OeUPe?A z#81JN7SWqQ^L@mfhVfrVjScH3LHP_KNr3@mMt<)JJyD978Onte7VdS5@iic4M-b2E z5FeXFVtfk8QGQG#J~Bo}tT+K#ja!6dwg{_mD^#aNsikV0k5PW`YxK$oP~tHn12lc4 zZ9%JJpp|@&zA;luRIkWbHRCgj^3k@1S4ahZ3_1R$c4=3sg8?g#)eZ>li;I!klU6u216J5V$wYU}p$`LEzuv z^+UvanBkM$lf_UB@zE>*V!WU@B8AP^pUUJ=$QO~z<`Iu4=}w()7n(i@UFZ@KIPR7Y&vZz{x)dALj?Gq-tTnK>$dIikr;C0<5+q9ZR~Tm@j)Mh zas^ts0z;C?E3!T?(CBMKj-2KmMUn{xy2UZ#g!Uj#it`treMYhl2X=4XyoKV(h?V(> zJOJ8caA z!b+Z%v+^yLGXUVMd~4>q9UFtV)Vjw`);1V5sSx(O`hjn<#}Ek%@)4=;vP&|i0!i_+r3ic(*p!c zftXL-46)cUdlTVhU}zW+0B}s#q|+HJE-ulgJTP=*b6I4v85|!SV=KE!@n`*Z+jSF# z_e2+Y4(cL)70W}U#q%wG0vU$h#h}~8_SP0Y{`eD2jgI3x*Kb%GB1fqW%TB`Z zT#aedmkG3J_cd&$Vvy5uOibr-eKZf5pVRIjkzr2gRogHceDW+JPxnvtd5ZJqe1}LGMqlE8Z2yD=JbSelS z5ItD}-HWUt-aUiW_P+W0))CRwU$m%&Zs%$BepBR2$hv-<#B|jgMgV|8q)Z8XtsHqqJmiU0r(&~XbGB>w>RH*YOmxF%)M%xz|c)R7y~j zX~dFg0sy9$ml4-AuyzBDM~~1bm&yH~hguo^J{ld3xI5B3wV$R#vAqxYR!#tbEaC9@ z82it+C`%AeA>8S7$lEbt%Tw)k8zr9ZxYO~)tuvv8!n4wALo*r$jqF#q-I)~%!vTO? zI)jDTIU@hdX0jyP5HAJ?2n^ulq=dDnYpA!|_FBX25KJa;hYS%Ee2)ygh1*|-HD|cT zR=0?YD91!Uf6*1n=MzKUnhH}UAn z8mgTRYMe|?DJA(V*O-QL8sTH6f^sW2N>PiK_-(yHk+Yz zTztbG86U;+rHk0!+D5C@f@#>feFK7uQ>mb#%Gvn5+A=}VG%ZUX7gpj{O0?rz4fnr# zgzML?p;D_M9*fyL1*4Q1fIqu*d}OixaY#xN-dkZd|{PR3bsg)hnw=#$%YA7^l=k z+lTvf@GuOSLIONeuCVxFw~}q~b6b!_n~|NdME_$}x-R~=&fVDs*U)fbLVq&Xy5uD$ zWHuXeP}A^Yi6fQt7o_PE{|@Ar@V!|SHsZ;)FSc~CfE>eo-&<{K*w#uN3_2(A?Dx^D zR$+E~&`ypBaH271TIr??r#*BFjB4y}p?R={=Eh?JsVK{ZLb;{v$!fc(y0M_)cZF{R zh+4kT9;WbP=y&E5+C1+NNAdL(en&Y7Ki>>|4%aiP&dz@vcVG&s;A5|PjJDRLRB+r2 zKx5S2!nzx5`#`&y@Q)?2odYdA6kcEs;OMW5lQ6-*ciS%h z%=FDkTBkTzX4y~PrwV!ii#?rz9-uT{Yn46gu8qnzv$?^c`wb0*wiuRK)DT@csm{N}? zi8Qsg{tVdNMxxz>l2FiK3=NnlX*!;D1~6k15VyQU5?rB`tn3UHCxjiYs47V3@)#)= zDaJlQAtN9|L6duHHR|XO`eZ<`-pwC2<=b9dH15UwjW}eS7BXxSMQ&N={6>>w~?7s(e2G)PKeh4FdqD*GrgR*M$dl<>( zFfucXYgez~J2zj&^whM_SKdm{?{;YJR=3x2^6*n=)ng=6al~T^6v+`t`CR6nB07{r z=0HkjcSaU3J(#)v#^c-v4@)oAXlLcDe9Pqw05~h(da(h3TIXo{apkMezC_(nS&st% zmcZxeQxe6^%jmQl=+FF6fdh!JK?%&6g%}q)T z$fP7xDdvf2hA7u~ik2nMh{A{?l9}#fs9xO7R+b0=Xf~VJKR7_XID)y^SxOCPi3W_a z0&t;=EB`y&+crYYtk_UTVHDgB9bN;|6ojb=bF?UHQ)Dy`bC6{m)oQ5Ko7mdfMWtRR zYkDe~#MtO4E?!tB<)0vOC;v8s%TK_;fO@x&TDwik|5woQhqspT%IpNsFn>LJX-ZQy7dy~WGWmo7tH{SNZ0--VI;Pmue4 z%*QvN>P>u5Jw|137hmk}VdK{y;}8Fve}d7;Da=hyU^Jh{wJWQ1mTY9;Y!c&a#L*vAdhEBweoPQ%~IdkW^ zvjI8Ci#S0-7cws!g7ZxT2w)0t#2l9RPy|76#f0no?YPS``#dpQfU|~5_MYkkeF6)b z=_uQFb`^(~&lH@=+$<B()xtq>3JK`ItBv7+CKPP>>W9YycoBNd$&;DLh`X_6+VJqN+#{q46|w z`2qm|T>0;4902H`-mDY3AqV3**=2BAd;1J?L3nYc34$zcuLp*K>3WzAkV&RUrkNNY z$K3P`aYpdW1!Uk+6x17aY;11e;P?>rR+F*_S*-sE+%$mxnSt1ah(e@)cKkn|TSmJ@ z%Kys66&C=AE*5attd&tC0N^tu(MKwsAkadQm~D{ZBXU3>fRczGvckw0Ba0UwEL?x{ zNq+LLUJf-mD`(|fE@uG1S^3t>d+)u6pa1;l=1N@OzI5@G4?CMr^6h5rBFCj=T~Ao7 z$ex1BU0Y+!ME77DM|VGj%7EO|tVPP_#=Ck#`SSVm`00;-4ED=kVta3oEX7WKSV>~` z9xzFH^dj*ii2H0a>o z1F~xg5Q_r__@5W}(-S3aso06>7(JkU4LYj&Y&ItCI$GM^=2fuq=Rw}rv( zI$HG-&}jkPCX9X;rW{9VauM+>uS1z$gp$fbnO}x{^ZUd@&_CS4(r5yyqKwZq70RHG zt-GJ#UpAX~{k7NV7%vtvK2pTF#YNx;ASEZ6NMe0^lMW(5R81l*BO%1?!ayGi-RkKM zBIpyL1yPuVlfLQ2`!93u$pIGUFqt4k4z+DX3f7hYYDUN=!nwh47WeCDYnJcApx_m{ zcfhCF44%VW9YK~D;;IZ*FQLEw0F8r9^qyoX-Izpi%#M4eVF}I7T@0N|81+B>BOwN3PZquJwnhA|K)#mHz>fzC>~J8OaXN8y2NVlK$}L%j-l^@0tlxU1g^qpnxw^N?UetJZcMGUDx8~EPZ4Ez-Ja;BfW&lEkD0=E_! z2G|RRk*g?(_ZSAa`T9SMK2Tejo_ggfi~{={3ypih0xzxukyS9mbI`d^WVrJ+-YI+w zp+(96yDUkF^EIw^g6{f57zaD(uHCbgd74v}2aQRjjD{Op;ds{c>lJriStMw(pMX)U zhuF3uutsPgGt^nWG0x0j>k1wX4oqSScQ>8u{OuHM5K*yryUF#UV=i}(2PA|$(0X^n zTZ>MeB&QVSJi!XD<0;%mieqFc=V^ckS|62@61v@v1@=qALSuR}#90S9=LZKv$Hpfy zJ28pH`2|w`)2XD-_1~#2=X+4IMI^^2k)4}EcW)ovN)@JVg(8^ToUdCk^SVjfH`*Ha zJ~W~7+x2zy(X)YA8@_S?VbhNBF$^T)2}%i=u$5>{>!aCfquptv+wBsskPovA^qIfy zeW-x-or5t6%_=}&_WEyq!{@?Cp@^lqd5jiDtUaGR9~gSQF6zx54vr46xwC^hXZ^SL zkzgf4W9)@PzzSKQezHMq?lBopr}4__75wZ+KgGoh7b9-w0I>$DI~&-2co+4pH7Hse zvTAv^T0BNJ<39$Rv#M)I@osizX)Sx{)(4+FdbahaAO76r^72_ZEB_GX3;;MQ-+Fof z{rBnkpZ@6|Y`^y3{b761s$U#zuh&&`kdyR5g0@JCi?a9t6lTSI_YSuyzCSlPi^28R zpm6dVN%jeyd|^L-{v2|-EGhpVeDo2yPY!gQ$YLmF-ZVnteNmPnCLD0S5v;tNWYAPV zjI+%~9mPVPyZ};AT1t<+zPzsg2LR_!R&CS0AC#Y9i0`8l69H0RT&j zbZ|k7x9MO0=fA<)6Fbj1vobx%ZrZabNaa-Z+jSW5^)+*ZkW&Oj=JXr0@G6nPms_$; z>4g#o3n)CEf?+8xo~vy54MdB0q~JRwy176uBT~4 zkVNgmoET$4p|_<*$<7`i#bS`To4acL>saW0tp0XoA}zS5gi0{M;^q@Jy%1c#k}r5( z_`wCwLkB*?sI7zqJPN{|6Vdg9JA%B}bcdjvyj$#rg1H?5is5Fe_db44sMD3$fPrl& zIOPAzuc(SK-JUm+&~Adh=uh4Ga_u2j#d#IMF~ScbFmbIGJbX-%W6cB7MDWI+ZqvKQ zMR`O^zI~2=eGp$P$`e7HIHvDYuw6sl#Y3|=tGOgWtDm5IvX2grIp#pNP4s8Y55Y6W z_J@~X&ns1>xy4i~jj9jO68e)x01r&wVz1HDHw)BKxF_h z6R{q#9j*DzT;*SK_=9{m@*YTSX4pq)-3^q0cNPnL@WuX*Pj~=8-v$8s9ola#0KglU zrrUQm`~P4-;Zoy;0@D!>F z3|T>6H_;iGME?`B0RWAA1&{$l5?FjFm=xeV3W5OEu(kkz^9$!t$Q7VSitG7NZ`M$$S+4(EyF0`k!}k#fcwvZ| zU*dicVT^I*E^px>&x=7HaaBb+nZcFSEBHsh{kzCzbHV_2-a@i`OiUBi-RIc4^F9Xq z&!A`>C`ufPl5qQ%5n96mfLPa1|NLM4>ld}?Svf1ev2q3g zoR!~Lxqa`e&j0qO|M$tInD%sKZ0ZhcR91~J3N(&u+@WnvakToT!6iYdAA61b+1@%Yw@bCVl zk2l_U1C8bzlqzs;Y7%p^GkE>A@1fW4(dPeba}(=Zn_zJ(-?p1qTQq8YjbesGEkt}1 z6yr_W>Sf!d)Uv}_e|aS!g!*nB9qS)tu8-2e{c>)E{frIMxT2Yv{X$Z-jn@&bgNiu` zjy%f+i&-wDM$A^Y7#tr8$D_f~#F(w9SmaYOfqw3tMdi`yObLDsIZA*J#O8;*Ap-B~ zc>xHDis_JS3N0TMyB)ll??I<%-#+j_WX}?%Qcrjd^^FSvidirOZOQ4mfK)AD2wuAi zl^Zr+hGPWG8>SIDmjmAn(J$?DMTO9G$CMZb1^;UdExvYeWBmmHNNCs7-`EeznJ&2S zf@iz;6~8yb=h=ltcCOI3_6KKPQEawhc$YZsB?ezJ7f!NbpE-cU6+K~Ig=-lozI`r= zAQJw55-;%)+6r@u1uquw=bNRzaSnGW6f+U{bu;Idrnqd1UJc%Ww8xm=vj;X29vn{v zPgnOkc zIit#r0ld$c!|v&L0T_rWD$=P8RMjH?>-T%)!N}i@{|)Z-r8*4!;`-tr0lu`O2oJsB zzUy=ySGc(hQpgu9PsZ^{6pN#Xt1&kvASYx#Djj2ea~&m4cxZchI>3Z@Qx<&auquhe z#q#qYAcD&_=ykDt?mV&nUs<_K%0CB6{CBc$&^X>l{df%TR? z42tOn>$1qwQz^_RD`&`Sr(NoDu(>m4DE31^}Fu-&nbQ|Emr^{)e}3 zKE3|VtvmWa%jxyX6~>8mOi#e)o1-Ktkh>j7-6~pJPjHaVkq1C=cF7ep93h7T0O?ek z(DZtZlks%$@Zm$twV0#X#GVgwiF222!K4vXwgfrF7QQV>z)CAClk(49>W_|&p=kqB z{^#cBVdw^lV#VSJWd`8NKX=b>wL9o{x^6w(hrG1L%6#~Mt7xez{e4)jpm+a1#S!+k zKDq1j(1h9983F(deG}D_G7$lBwA@f640tYDQy~DL5R);JRA~d=uC{PgYvZWi!KKkO zRz}l^ao0g(V8x~?s+De0QOU~C9rTe%W@Y6#GbE0I5^Q-#xyM|L4PxDUG6>PUE%f*9icapPi+HziTp)!hiakzrottGqM60 zs+B*PLL7pij?jOe{OcFfziDx>e%X%VlU#Z&!zZu~>t4}H1|Mi)Ul;JNWP#tK9EhV1Z|xU~`>WSe=Uz zcy9Whr802;2;D`r(7V_LGlga{L-%oQw=NzLrQ8RBmuNqHUw^u6<6=K~zcV-6x4-?p z>zzmq)BigQ-_EMIpV!(nBdh4%XgCRFFxx`JpkkgvA5x@*bNrx;S1$ z;?2$QIE#8~FSc8(Q^YMJVst{MX_&heKzbcC-Rh%70gc0;JY_(VPLu9#0OuS^f?-^ikV!Hu#$-Hcbg?$* zp$e0-_7DId3H{;#0Jaxn%mx5Bz~A5i2L}MOJ`_0)MN)&4@1=^^)xlnJzT@%}SGsel z6y~RAF*PxXk&#gfnc%Vi+z6qY100Yp*eU9q-L-aTRkV+ttO4>Xlwv1p} zY!uv>63>q8C8w7^`SdUEtpCfuyiC~((y$GwrK_~I`7oQ%e(9;5O2bJR!1QJq;rJe@^6lNB}->%TLzvv}=$ z-^2FqE*?F4jHcE{tJQ|0suY_~#fj||-KmG{Wuj0m%4%Ez<@e*Lc%@v%;lTm6wze=j zI!Xk5`~f_Em&f9-URlNF<`&vp+pY^C3uYe(6qgK3w17Bu6|w?w)SL4Qa0_{*-^cdO z4jw*wjM?dF%+AbUmbb@iuMt?WwYf=~ki<-M3=^e3pqVO8SPF-Rj4e$;r`$!S(nq(W zq1)9EODLGir;y<}-#HU8-@2G5pm5SgHJO0XZK1utiTcK4Bu6G;$SMpD6l`xGbFhiL z-a~Pu2sKfJo*aSM(O`5mEQ}BEBN9BS;6%mx)>HiA&;JbdqeFB$EiBE=Q4HYR%na~7 zP>y9T5^Zd4;`#O_%(zP40I)5~#xO5{hz<_PmS%)>66zSsK0xffdLPU=Y;eeQR5*vs zDk2}asIYir%42aiLkgDjnMHmrzJ+IjJzX;MlcO>J-(m}iF7g2q%b^X)qMTU6HTA}E z&;rQ33;=GQm~P{F@5VgEFPPfVnYO1WD`F}Y{5wV!gD7LiJAg<=-q>P-;2nH zEAq48Ej&rx^uK|3f~Oez6ypDvz4r>1B+0JCjz>gl@wBL?s$Pj#y5;oDU+b4b0gjY9FhKuJTHMl99NLTKvjZe zS!y4b_H!0GN^*2zL3^VLXQ&&)9yIZKASGx_P>lO1kpACjf`|Ya^5;kjJyn zh5R;$-}`?5Ce2fKUWB?Uq1r?oM(&&F4hhr=%_r`|UeZP43})kH`jf$|NLqi%9kbOVRF)Bow+E^5^(^iId;b&>l7$&c6ZCE?ljvNfbcC}LWq`#U*1k8+_T6o1hx z3d6xs75kMv?CkBK(P|0Sf0DzTlz(z)OL#6Pz0;%P?5>=SlfKad@9Bb=cx-+iS1w<{ zb61}efJD*^q13I0-bQuhF7~g#gWmooav2RNO?6)nPUa3FH*f>UWXUz4F?9OMy{WJL z=%b;Vhugq!K5tJB%Aov{mjM7UD8KbmSUgVvz@dJ0c&_s4htH};3yNtBb0v7W(kF`Z z)|3p|lpbq;2lbg#D4w~Dp~+d~ie)#VDp-g}>76-o0=Mtn#RqdAV0C*3ht(R8hYtWG z@*2tZ#E^U&SO{c6T@~B{icq{;%@%fccTp^r1Zmy$)Fc#gL**K#r>8|)J`xZJAb^_{ zKvAT)#lEcYZefWZMG^6as)8O7^|U$y0Jweko>;&g0ALQ^`1&`nwzBG9iWJqZ4Kyv_ zP$5nQ4eK_;sKId5Y>6#J!j2704d-#u0#wUFj+sLFx1E4f5mG_@z;Ze0-4=S3g6h#d zr1Qf-CJ$r^fB*p2P%fo0GBye$GXgU^3Oi%MN?Ta4ZCpqL8OD&Yb^LPe0sj7jPaJnj z3Q@o}9ROf1+;v_sd@hP5^3ymR21Lh)a}UOT<56w~1)_t-c1P{sZ7?q=L+@ zCpKc|7Dfmgt}j540G)FWZ1VJ@V-O100wF6df#Qw$d`W7!%U=+P!SRcE?T|%t9%vj9 zKV{E#l|=x6aD}|jcez?;hi3`thqQRH@$NGn0ssOWAo2ba6t~!M{^QI;-xJY;c+=u; zr9d(u5^Gn0+(lKQ0N7!!Dyzg!jW#H%==ka{m-oj&w^U(Q2c2!h-n}erhCA2_#Lpe$0$< zH8s>9p>|4v2+};_(#VHy&woH<)_l*^J&e+Y(kuGUR}_$u=7r~l7O|X1dyPqdm$7y8 zI`Vo81-(TH0inW1cXP)H4ROP%+>4;WEo_@MRyzh(TV0gXX$)o3I8s#faw%9{1E4g8 zJW&4q*+c*Ufg2>p2p4w;03d*)+vzy{4TJcL?OFx3)q6O&{w~rmk;|l@X^vbXJQM{_kUM9!bb}R!w}uw4-e36U zk3SyzyWg~)q{{|nP=4EG000ciZ@s+z#v3Mn{`2lRv$njnaP}?hV3YUuH|G=^iegy` zIaoWfz0Sf$q<|U93b4J3oe$pvd*&M`j88e1bYXgRQ~WSNBPdef{pg23#GCKDgYCUt z!8~pnhC~|Vu6h3Aa7^5)Oe*H>a{njNCZ1AJtJm=8(IXLxFgiLah=GVmhr$v_NhZ&P zN`-RPR&jJxg-VOIriBENkWdoS6N6aUV2{@pu{sKd{LTG6ynp?=NJn_}$`y=_kKy9Q z3s^jT8YgCE(J@SP+ifr{gH%d!5djrl%SNR`>DpA}Q(5FR1zAnSp2hL2-73yz8O~)D zlu``k6oY9Kjg50YSr{ncqGI=8?W~|dq&c}F(zzmX&0Ssuq8DM)2Z~X1wfpvAkI8TBS2~2Y{C-6Hjy@*z`E`*Ye z?G0>fZz7dRBb80N-N<}FR%QtIW#S}3TXrSw<0tJ{2OI@0H9U#Zsf#d&#$is*f~hGH zTH&ASd9m1Gt94MdWFPbVpZiKM@>J}1oLj$byYYqLIRYt!B$VYsp7Z{MN*2t0VOCNA z69uV|#V&Fo=`#y?A$Se(gnT6YS=fDU9BC7P(#=ND1FeTygW?S`im%`M8*cUs3>hLjQ-a;q_Pl`2aVY19*6R zUEel`-Z)V}O1>K=)f26o`JY3InY4p= zc8Hx_8<|9EbOKswSh&dt+Mc{nhQXY8!xKj#e1w}#Ad}9ZTpkiJ;8c~~>7sgc1YOtt z*njUV@3rp5{tK@t%GO{Qm>L_y)k~LL;=gz|YFZlEY!T(LY4lE>fw8fI)?o##RTG=p zY{9g;BG8UJ4Y@-rhYANCSRAVs$C_aa(4N8p3`K>Z04*=J3Oulud!0=gC~{ephlfPm zIu&C6C&FXOZs4zJQcGFL(Ow#F2^@%V$VmMohqRFGXKZ)`3nykVJ~ob2IwSZNXlt|^ zXto;I+S|s)_BNXBjv$Z?_>{r~4xy(Zx|Z|EGvtR=k$!H9Ob2ASPnAlza`7@=`Qa-# zcjj#J+;ID{w($r%w>}i9ZIxadN=kKzTLtE0`HH_y84eZA&W@c}&Mln3_THzr@Bbek z{9)^jH{LLgorHrjC|^<;004vXTQ9$U^G%DkfBBOiEWh~EAFxKRJKNdY`DV(tHHFzi zL+4(eUjYC(>1Vn-YiP9FLiwM#@{;2rfPi(Jlz+0W(+j&;Cw^G1B1UcYYYELR6pAR7%fcE@Sp)0` z4@G)FQ7>7~5f{`#B8;q{B`E*!;yzU;kMGu=0{~pTa#>iyi5PKWeB1#vy>oOOf7d=d zv2EK{t9taWB)e`fD%UjQtvYU|n} zUM@&Ey=Z5uoqPCm#hVr-W@}V6G*V~yuw59iZyC-`4DHS|3(zc7%n7U&2AU6QF0=Yq z^BEzbO&Ss6^lLmw3tFDx|Dj9|x*NjhQ3`}*6ppFC*~@Gp_UiRg z4SV6+!CymB`Jdj(7h1hrBZ!2oUH=&Oss&;+GPn z_C{0j^fgRwHv+7gg45*9Q&(cbM&6)S5^L4UW(x@-!Vn%oR<%8j3~U|< zG3Qf@&c*PzRi#)0P}&nb z7!*60G>z}=4urx5{y4>zt+=@1LqPu)}6s4>(L$~MeY^O-o;JLaR`a_QGM zmj^!K6A|Hkg^$kC4DW^TVCeMsfXfnCRbePrFK#h^Cw-iHWjz)mr&3tE?IFkP&5hUK ziBW3|9Lr$cEvs&4Y!})Y@Dp#2TN&hBsO~`Zvn7b04*Ip9|ILPd^W@U5v2ZCpnRB-2 z)0l)6I7+7jbX$E1$`S!(J#f@HsKD;avp@mHDxLLe*@nE?{>K8ThfnThe_uIfvs~L3 zvpw*?*%ySanl{k7kieEK!U(KL*zU8s3wxpUeWH`n0-oQMk>m<=`lF7qn%%Z3JKx70 zO}+d`5*8No_gutPA8t>UF|n$uQ$4?rXz6`vN!0p$;7uI4T zRQO~hJ-xkCVCrB>wnj()J~!9LxwBi_mn$0|^! zC>H55=kswwmMny=aB!rJZRx8Q9XZcmb1v!iiM)+(1|Nr`cUm&k_1qya=NbV1j{--H zS-iYUL#jpLebS2XFnau0jgWGNgz{1QAtI{B2CRZE!NLEY1XGb1o2OwuyVXukicItc zbBU)n$c}TIN1_t58_Zvp+BUX?(e+gAfIB|8U7(fO{L&{t)4{K3va?1*OA zALLgwQ0OD~0m1;emYD)&ycRk!db%=}q-VS@Biq95#fBVZ2F{V zmmfj3k4Qt;e!f#Tj4NO6cZYg155>L;d{TfAMA`|^pF+w9;=$9*WHGx`Xkau;@569c zyW-cx+~!?ny3c2^qP~h!>4Lzh6h@Y6@GG-6nEu&nKDygM{V zHWU@}G(dakhpW8j#ffImi}GlIv=il0ZIk$|F_B`=O90Y&T!cz1N^u>5*cJg$Tcu6f zRIoSNR>|A0`;|Aq_M}(-5pj2s31QX(TzO1P|F80Nd4KvJx6MEFT>J@n{fwtOzc6J# z(FX@;$mnWwCE8=T&2V?WpyFMTgrN*h>2L{GT00x_qPC{zV7$eM`(il zvbRs0QUaB4G7$TT~k zI2QYlqJhs4dW-#!f*vh;ZFUKcagIF5+%Hg*mb`l5L5(J+C04yN;DUsGrDc~1m3Ssr zt4X5d6k8XSX2>i;*Ha|5E=!FnZnG8OokFZE$iv?T;n|nM?S1MeDy?Vy z&45Y4TZVEjtO&p8`N2@2L(q@XNbkVW(3@|VKsSLUPWZ6`p%!CE)w)E+V~qp5oys8T z=s{nI9md8$sM;SeAse4D!xwC{0UF(=Sjnj(cEvdz!}sjX+{3_{p1@!(p(a`qGJR(= zHnG&IJfBUOr8Jo3RLrzQTmOpJ_6iLM25)@IZp1V$s4>oYWJ)`^{M?vC)|}PRM@#u7 zW#;3Ux2`5o+yCmdH&BB$9iy}Xg;!4xPGG6Sm1KT@^~g?8k~L4FGtpH@TS#;g0dNKa zcdB@JZf(3ide4uM*w)$NLH8-f`~Nj{djD(cO49z@e3W^y}bjC20(WPDd{<}5dpyRYWA$Hpue5+^JIZL)P{~qdgGRes37#d22 z7_18ziowe=z>K6#AOT4Fzmu7Xwl!m2Nt>Ia@BAe6nn$CtOkE)IcU)qpcs|jOM zQ^*V;TfhS~CZ-I`B2_IqwZhk-4P!kl*CUPykMeU6r?G{p<496ZoUl+;Cs7K z7Fd=&7b-NGU@*F?k8Oqkqqr(9J0QyK^*CWBcg;9u&2P^B54<~Z_lmp((IC577 z+9*3ztAEF^qZ6VjvnRI2${#3Q$DDfw6Fat|p1_OZf9S&k$;{JT@4cp*@og_Do1k45 z{{*Il(=dNhF69>=wPUL%#g~rF+)0m|fL4MuY~rnV7Xze^3O$UjQ4t5y$H%#&E>O(c zP|Dp3-Z@z~Z<&HxT;ArVo$LMIUU`C5g3Bb-2_co)uQ1kj8@F8bgT<@HxAdu3<-#2pQgL&sYENHS=S z76`CUnh&g8XN+Be;D61kv4xw0Z}<3w&;n~I#;oua&@DCA&`b)UX+*Wh)%_q~#FdCi z=VMqem&ugRjjT}6s*e)K9eK}vXj&y9PKE=&lJq8!OU02bI-YW5R#?ei&=rM0#Tyd` z=lZd6m06>)eS$ZG{115^m~iYa989bN&~mC+_mKZqF*$%YYl+0dA2j$0j7cH(cq4l>NQ%Lsb`)UjWuI*GQ@uel*sr zW3V%p!92e^|18UdVY7DU+n=V*uC~S(D@Rav*YzNg@@xn%eF!H2!0wMRId(pmE`79# zJcZ0(e*6y5S))TFu&{j4hebfkrrukEgqmn-GJjT~;J zM4?USoH4VN)5_iz_}s#m6n;4vN90-G5Z3pCo0*JtRy%Qmm)LOsy)?GP@)co`*j9*R z=M$JuC3@LV+fvJbkMQ@H8Ta5o3Lju7Nl8heR2S`-?mk)h_1kAfr5W<_B%aBOENG}n zMY=b0X5M_{pP`|bFXsR#rh$y;AvPc4o?$|BOc{Q-f^4MQ_lpiZ2n2m}T} zsShQ>BHJRTEF;s_>H5xWFIhi^-XxU9yAISZDY+ogjXZCTOK-Kn{Y;06Sr&iBi?PV< z`^R(##aU5L{%{KfDzw0J=Rv43GHZT^2!uR9)a9~|r<(1)znAemP0i)sY^R49VBaX3JW@B0;eC1N~L7cih zq(`i!F60Wazi1@CYXp^iLG95q&fmUuy~gY1zc9QQp#n~CAO13u2?3Z$`@0ZHY+wC} zfNnfTw2Tjr(F`=;4ngRNnC2V0-&*aEABb|l`P$g%>iOwye`JGbD9zk>1PUTq*(ny@ zc|c_AX?r97ssj6)Xkddl>kZ$w;gZegX*(WCc)$Wu&00~uMB=Q2v^IN50S~|@1bbi{ zN_v`77-3WU7lcI!m^=IblrZHrC5(L$Zq*;FImNLK9@um@JI%@dok|eI{Hj}OsxZ$E zA#W%7vS>*RN9<`W(A#ky&f;zKtxH*g63W#8z}jehSlg0!9HVF1iZmcqoFO?zT6axeE(z+7D34ZT(+0$g^E`f;vA$-jDMZ z(z)IzW}==KpQkSt|55otXCtj(vrYbqF#N3`_LJkzeL=P5!`8YnZfB|9*i@U#3UM{p z1yxF?GvMarx99t!V~i)K9xt+9^D$XV%77Yt?NnYj7hB&(a_jb=*JAiGZj6|&hL)h( zBn)IU6cbNRc&ffW@gSQ047C-_1SK<2esIWWfm7G6uowvv^M{|x_by3jydD@)K%y?F zVP5k;hxMk*jh_BY30O~WXAF_2p2urKAHyr?$or|rsa@pnRmSRyNNNSnnmv+wQtPmU zEJO+XxI6+p`6<{v96f4BHptmkGC;Hxt6Qn^%2CynX~Ab?BIzQCx_L3zeTaDBSNMTr z0&L}fqP57@9jMsRHpPP8&%|dl^n!nPbg`Zcf5QzlPM;htbp*hHKG;4mMPA-F@!o$Z zmPrkU#o$fs&TIQeK2`_Bq6xRKLhyeT@zR9|j=z;4&?VdcurfR z!@BGuM4%Xf$_J5rnBk=CPJr6Arp%q$>5Ym-x_r?B=|m2k4+ZVPCBPOmue5PHISaKF z0|9`Rc60aE{GFebCHOima^(oMmWKZ-R-AJsI4wd2SU5nER!N2b3=Oth4W44jnTTWt ziitm;$dr@tojnbWBbXRA8oCDc_7f^N@7I%#oj**RaeX_QdsH#%N*G*$+MD6qo8@yu za|a)JCS-P)N~lUViGNyX?NH@SjsTrwU7h2fnFqL~lD|Y=3^4#e7lcCUDek#}UazGF zn`6quCL4nQo&QhtPi~M_S)6oH{MTx{(9iwRZwnR$>;8>2&{Ypgpw+^4GpZuWJ~RTl z@&KIARb5)ug)SOB2NUTk9|Fa1Wojx^=>eCHYIQH;c*~$Zvv)c^%1`{^R#k!_+D1`- zKj2(PvxpkTan9CT;#XGut{jk}2ch9o3O%LK^*x;o~W`^@5L3F?GFlp8zaUvCrf7xu!ctE7H03354?sh zlyA9E#PVrtQxbr|6AhhjRK8X@Xa9mlysxP_ZOx;)zB<&m4+jYV2qX?XfXk)6u3;Zh zm$!T~1SXLG3B|C=R9F0S9LMesZRx8sf0JS5;7N-i}MWW zcNk4(s1y(F=fOk+Wc!rvblQKp@e4(-Q{f`GKd|H=0rrCXRuy}w=-!@Nud8Y2OqBs1 zt4H=BeQS^JXA3{UwGMZ=?nRyo0z(wAvsmE3BErFe+rt4~(s|pbt)hgr+SohwRPa?2 zf78uVsl2J67&TbG-60+rSw6RG-Lt9nftp6~9+jWYQ$bz#0bMuqcYSyf%z0IqT?u=y z6k|LDh#Gi+Y@=@5rjWRxSD6)swubqPt~sZYx6v58D%SCJ@Y0itJNcvOnxZnZB;E~B ztkRA&p-1cxRrfuMo7leE`1F0T_Wgp5U60-@)^zHg6u+gy1ErV?azS$mTg#fS%63m? z$^<#V4r;NL))Jq+2!J7?cYy?W^~~?KuF?Xg4OXxH70PBP>w|bGRd^Jz&U1rGw|K4d zt?sg$eFlpcXk!slgct>jzEG?5r8U4ul0zXdtYYn^$XfmNA8r5ELF*aY=-yak#D_lG zW&EC@P6K6v2H=Jog#z3CHP8pfbm<8Cmz3&^X7w6_pS1IOl>P6__FTPM1}HX3UbHs# zdInz|3+vp;ru2=!DVaMMch*zzYoSx=M-L(u&Du(Uk)+#eqYigaz&lzsn25C?Mvz*T zj|`UUK99=TeB6DUHTgTelIOhqtJKE*vGFrxBO6PEa|rdcY>G;9h0B;beoC(+<~?CU z@_7#iIj0r>SIXC+76VcFvh*HWZ-bz?nqZUa?y1PZORMf{F9${ z*($$cJl|?mR#xxEHEm!9kIgK*(&NTt=H%c&OHPV_+GUZNJKErAQo??!k|+ZyL8rvu z9SY>41BSv!)iPPl*;B@ic`^pVkewi4rR|VtYtfSAyM9I2z_DV`FghH;wkTtYJCL2_ zUoUf0^wa-9zWc*nV~G=8AmHqWHES%dZBn7T^liapa(%UT2kgpiP;+$}g8J>%uyU=@CRne`7RVNL1 z^&eW?z3JSRz&?&0T(^wY-rn76k#>Og9^(Y7bBphChFnB^<8PB6M6PqfZy{k1M=u3D zZcWGRKacZ6L+d0<-NG1P5U3?ZYf0v(OrLP|fTfdn@aVZF_Z4 z;2T*fHcGjZQ`U~}$7KG@#@-0ncVVc-Q-7ww9>hz`)04D3V4kWJ6IqIoBZpqk+lNMR zBD2W9pa_JN6~n0g_})h`^=FC41$meW`IS~8!xNHz4P9_pha&UI9wS|*c%+{oRW+0R z%D!IDx=D}n!{{#Smt42!@HP8_)ivvPRLo^`1*pCfik=q{A5&B;EcIclThsPor$SwZ_B{!(+d*Y)=pTA__MN2 z1vKXu)AvoWU1PWiGzUb=Z}qmaR&`V5amc97+#a0bs_<}3@fWrwN$&--+K&GOZ`Tv# zF9nz4n|#6O&@sdR(4oI-xkiGSuM235mVf^0_;}iq%A`lT`^6)<2&`IUgpm)LMAJs< z>y!mOoRFNUPpm4S_CW&hzbDPVv+dnBdq4jb_0#`DE8Ox?fDX&tLs%Wj3$_8zj)0~U zkD-#|MbbaP5rN4)kAO^kG%WFsEc&L&{4}ec0(m`QK@1o-YhaFoHWqN*nIf#~S9<-v zURPsW5G~`9C{Fel?<+H3)T>|tHMK$Rbu7a-^sIRRa3iO~-xZ4Y)svL069mDdrPaSv zwf~o$H^hXo9826$=jgjVzG3_^Ska~1&YLMJvl~Ry<$B-61_bAFs;uMQ z?xV|3!A zJL|_a`94|3h5Uvv8jx7-^cl~~U22HwiwW{ROoD=7u3Ni?Dksn_p2qIgS$p+()NX#`=XJ|-(>m+RI4Mgh@hEzcA&>pU+vI^^Nfk)pXcq+tRE-%|lQT@iBr7p3A;poyHP-|6oBF z{9zP@iAdXk`q|zkcm>oj7rZ5;MX+;ohk-?`+C8xuZvOC6EOBddHs)3fJ)|3f{#Ppa z=U54XXAg0?ye;+}~GcWzn zfR!kr!2YXi9_jgGIF<;deuc&Dp4BdmZ_h_g@FuTi;jaH81>{284SSP|&zN4*>?G$Y zuB4+!7^F=s@qEjQPfLyLFOF^|d7gh*&_)$F89iP_jWthI)@mQCg- zvWcqWSbsxQSD$V6J?5NyeT3o2A3nDIff^&Ei&JQmQIhbN8INl~H}=c1rY_;R1Duaf zTeHt2>qdt=N*OM0Hnw+}(zXv9i1g<@?8QbKoV=>ZQL6-EIfHm+p*xnNk#O0L+}D9L zu(81u$NB|DAIhC^z6q4#;MDn#sg|(q`snRg#!8%@wl-I56bNgwNuPnZ;SI!?slw84owiAMP+Mjqx#NUhUuFx6>VV9zJj{d|wbg zb~oQ4C%?7_TCsfv<2PkjH)CCJeT~=F_KLAk>u}UT%XpZAFhSwjs2Z8WJ_@mYUH%|K zaFRtZhefjZc1e=LOpVtbTg)$g7k`;A(DC&6)BL9CY{&ea+E8fv1LFJ6>9)rb$iDon zv{L*!jm@xHzRQqV)Z6lSF$`}IdpP&Kvftvf7Z_LiRfKP#X*gF>{b`2D)@2~hin^t7 zZp-DxHN=p@DxE?HxvHRLF4!LE3a7$5>GrD7PE!!V1_ljb0dawsY*H?Rm+s;Re^Pl* zGNAjF1(`g|uYrbpN%-VZi?izMg@IR!U zAL_eh?)T4wCWdCRZYS8juLHdy=ZakV!7big>a3DTCGT7uf6_f-_`bHVLE36LNwIb> z2=uPlJi$t2P~$ygM~AgB+#8=^YPrJIQY)t8Fv>5ppGM+L@k zPU9R+(!0NCVwuG5ma$T%j1+t&lrkL8Z)%F$_}~#8jE>!*pLJ5BnI#+eo4C(|i-Xmb z(lk8=2xW;i@wtsjj+>j-(Vth3hG6^6S&!ig@|&5N4Ih#$dLY`DFZ`k$3!+#9Aw0?Q zomz=UcMQ`@N672++bGaOsc>XqQAfs<5ibNl%9bnJtZuCKgzUrd@(N-fV&I<*i!<|R zO*eg(w+?w**!7=*Ms>j7^2V!Ep9T8{49<^fhu(mD$d>c|Et(R z3;5UseFn{+JbtVOcv&}O-OkHA=2}Tx$$g5W)V3QMCyvkKE4VCHcqG)sPcxhYm+;Tb z!J}iQ;WqG*A-kQM3&ux5H#ZW#F1xUeJUn48zbxvMLWBCWcClb(_L&{mQ(0s_{2dFn zHyWHw~2YL zO#-?29G4rRA{P%Xj?!t}v0t@VNhGcy^{PZYa zy`HGp@ZT^vYjJ|wC9ByO7dzd5;@qoJ&MrxZ23X(w>i=;>`Z#D8JdM;K7sRI1e! z^oF;zML%p1E;$iYY*VmfRv}6lLj%al~WCVaQx za|v6@xQxEVz-xeu?a9tjc)+5&WPbB33!tKZu#Q*vZ+3hktUIFtfa!;DE4R1$L<^1r zp`_OCBx z8{VB6QadFc!n}CQgcV$f=-T9!S|PKat=*$ddJsYYrr@p+8e(d%oX?tHZ-KaCge^$y z#vvRkhRUd08B#0UA2lu@lE>`PA$j;1Uy(2Gd%CiHDAAh^y_$tG)DWCefm)^ll#l!8 z3fXWj0gMQjS^l@#5l#I><|-qK0$Hxiqu-3DE&O`lgAWAE&H(_%xrzb^tkRie>1ivX z?)sa#i;3Fj1`+5L8y^e5LBVz&TUn17mZ64aYZD7T{^oY1D(MNhT4}xi*iMl#QyFR` zYRya#4nh_hr?n$9Ljrc@H^ls2bqt6PtLaO!g}n8|)sjP5GxvZKM4&HEL~X4z2IH5K zQ*YjS0ek#X2$mAceG3Tq?AJTr&PKA7vvhRCDHK<~bdrd%yH%Q+l38JP&AF~73joc{9X^*Lbv>bI|1Yh`OoRKIp~9xuUD zR6?@9I*aqdhb$l6#I`7-MHzHwE2(LmKWz;Tom4LdQJ@>=&Onvc(W6v=r%NnJccQko zrL}dO7_Ou@&u|{L@O5p@4qIns$rKjr8A@qUQP!CIb&~e?4WHo9Bd`llVb?I0$?+Oy zC#WOidO42h>1;Z!6`x z#NXwF`jN9)i=Ft3_#@lU!3RMs6}-TE#guSg;PiQ6mRyh(FQ)=dZ2K>A$xw8DwTe{h z1cdPRQd7p?TLV$S@J&lxzjV5uIUHCfb~^^7VpHWZ@d*Zx!Qam{*GZG_elWH~zo%vh zvFD>`Gzy7rhDwla&L_92#4Ea^!e%q1M zV8R}v&EGBjS0V3!k!0I|Fd0~0ojVWGlc6i;n|o3y;EqX<^CK#nMj5}a828~=xy$d% z5H!PZ{Nrjo6r{-;Wr0!Q;SlTjgeHx!(0+noeL@5tw1^aOOb$_MsDDbH#9|Qz{^1eS z(5n`fgUz02b2K>dk&+PCe<`n?Sm2N<5HaEGc4J9UFYPYdGr#?x#115C^g(F8P$$W> zEiWdN1tvZA%?^Kkyt=obT5Q3$f@aSPB^8dSqPmn6Sv6@K|=!+IczrPUH zxFuYpNeB~zP9tQW)A~9=NC7?jkKjh~^SU0pcpJ`S^n$7romVuRGBgER-48=@QFAg& z;xIJ~b-GejW*jLZy}jtJrUvbl&wb@_5<)G<$igrA#*e*km+iSH)pj@efaj*h5%NYotL* zWJ&tBci`I-a`?nosYbzQ4cg0QKd-&dU`~1@vZJdH5t;831?tK7ZB(|kxmkzIpx|yS zQC2@@jUG$_X7ye_MH5QW>eUNVGgtY@CH$c}EFg@O0(+iS=0F zjbE9XsdnH+P-oHkz9)_JaDI_hDJcFF+!xp?Qu0f-WHz{X(j1vju_tj98erF#+pb=) zZFYAhX~My5w|~F|L{;HbRlVCejIvHKvT)4`)k+K z+b{26yZP!|%gxYJAue(tTAcZQF*3%;uq4&A_UiJcL<}%xcGcmyHYJp}m#SuiP=1TT zw&*vg+&>Ikb^i+|^~4j;A_$pD{mnb!&tc|n(Tl~|ni-HD`tIyk!^XA!wlXPBVk`AG zpLCZx5dwG8g%~D(FEL%10{_ETK?N16eJqb5>aY!7g1F!s6&^xGd5a;@jlj!aCU2M8 zmonHRw8F^itY!~!&G~XR_v&KUH|?-aS)5SIH>6r{>f@EM)$c%?Ooirx6|HA$<8UzL z^bxOQxLuZ)C5npXnsY{A8m@Q!<9cS=n}X!5*(=K_ZfZ434Yh2x7b@^2L+3gQKOysm zJBgciUnbuto1^#*3B4NyhI+u`_@D0e=jT>t=+K#;UwU>7O?MpK3kZlAXi#F9wqWPa zJqg`4VGI=|*8i$5204eBsWlW-^y_y!mqR8f&x|IiMc(8;ZAy0|RM}zL7u!5=J zApvVM#{eTI8oqW}2wqnMTHx|4I%h8LC3bSyp!AT_!9QJOv;^67SMW^iLAEAQ;zIwD zjt^>3SRw1`FN=~Y#e=+}=uZv&%7IOngizX9{y}kA5NB?uZvij^; zxG=4H3jY6frmEE9UGWuLNdr^I5Dcs0KeKrM;%L~TpeRZytCJK`XZ0!kw*E%wT|q3$ zKoGSydBXRcNYb%spTn|ZrNSsFJ||Z7gTWj{LYAQyD)=Hu1)_t=l=v85z$i4AMa-6) zea>NPhT4l*hn?}%^ODRz$OJ|wJ5R#P4x7#Q90tsT-+C#_i<}EBwRkN6zARAlRrV>r z9wMM!s74<)GY~zPhegAfT_BAGy))vI;nI`V;-8c=lkx!J*xg&MzVWmS-OTk&QF_d+ zR8{E@+RP!ZzS;gHzcgKv(HFQt1ULT5E_|p)p9?6GHmTqS2&SElHw(vAIR43P^hs z!?Z9W0jALLunM#Zdn5N8cUgGXmz?_TMwHzqXa3^v;~m6Y{QR?Zi3^Gt&eS7HOV9GId%@= zps*G%jN4qd$NLTzu7{@X6_y&MF_UsSm%c2rf|@4Sc{>RvyzG0hn)h6{oB%gnUr6v| z+4>ZhUkFK^!I<%!EADH_V;k}*zrAE9lo?q;&o*_+KE@iM=8rqC_XyyN_!hy(?3V0e2Szj?iFG6f2Z7TsLo>gh8Xd#i`iMbAxdd^g;&=GSM5x3k^9j#FM>%-iU?ZTc+Ies7%rhBhkl z`+t*R1p_oN^e>zHBtwXqS4^unkx>#YObKEE2ofS>7OHUOPl#qaYNnMEecol)l?v15>lZF#`35MgO*ik8k6&9w{ zjY;wCdE@G%mL zS}?#>B!6FhcO_|aI>t5(a~dwLk6c;GU*=33l<`zpsx&xxy!@+D-i@0|h)$U>s)FPj zM}2<$B(&1M^jJ?jts00xpe&el8OXqXW06@zmtTU$Ug>OLi5q^4`(ffp($(2UlM2G? zd{zWwq}k}B0j%1ACindZ<0}OK3kY*BfBSo`2MH>0&`^i7xb#6d^T@Lk(4et zsO<8{+pFhmhD1Q^c^sJup8`U^waOPWLa>QSQ|{2mu)l+il${1?F1HLY7h^3p8O_w{ zb!PVWuN3Kh^e~7N!QA^YSOj!m(=bR%{JKCup6%g{I7q;5BcX3)_Wv;qvje-_Tu6!= zPsOo=8Qe`dL^r-!F8)K-CDU#5T@V^mcpzFptT2}$i7E7(NrAsY)u&%I(yaK7P)Jw> zVEyFN?E;&v&F*$UrQGA`(>2IOL|<|9bbaJ;Y$%HO83JH{Z1fS*NcaT_pjRAcVxF*FK%`5G zTQB#@87Nq>A438y2CQ=~)rmJ=nTNqZ(K+28B{uBf7PbPW#`}s z_wCsR$QMEDIfgx>Xj0!V!Aua(<~-ecI15TSwRRM&eNzm&Lp*2@CIq1LQ;;YkA|m+C z(bX0!txux7qQ2(CM>Jk=;$zdeIVI252GaXobdk!%0#c0g8*IjeQ8$>+k-)*n0iNC$ zm8ZcZ6zApD{sXH^Z~@Y;tTF{(i)2jly&p7npDW+!Fvr=IDQAB?%`S?3+y(f&@9KXU zCrTCb`Z)#w_^D-8*vdJEIsVV{O(%IDr8=+m+|@31#Y@sZ)|Tw(YU55@m7Whi)d;YF z$t5au3k%l_*tCbL+1VK?CUCVZXeirzyBsB-+{uWXY&}@72M`V z=jxRURal}qkC$bNKK&*g2-Q+*RmTVRt3ghaHzmr+?4JpXIa)SoJ|W7M4OJ9NFQVSt zLP<-U!bUL6#}-~jW^7<|*lY>O^0?R{LV7h#F6)PPb5T~PV z?t}SiQ&MTVEp4o`#X^Fg4G?d==(JgPN%m$4Z}br9Zt6>FWd&vSR+P;JO83oaG>9R- zY@KzUGA`e%Z{@I7jtbw!fn9sLAifeq$WgKXRJnw7z@N{=m_sLg(bWL!` zOKqQDlBgBr)A=@cCUq3H6}W0@0h%M*z}=u4EVZnn(cJ#l$xOkEpnM`V%6P0nvr*kS z%&}gQop0jPUh$F0Y%%g2wsC6_95D3goM!xr<;pv~g>OQYxir_%vi29Yd>QT|6_?54 zqNa!adgw2>fiw^mbVzaeg5f>LX=3TZpJ&Uc3fHiOZ!kw{N$w4!CiBXF()a{FWuytg zn+67RaeKMdC$}aKIna3f{IhRy+`kk!E~!N)OI`9DB*b$5Wa-ZqwncdSQHc1xSPu7i zTXz43-Mf!0=X}FEb@&zC9*uIA64qFXtjb)4zU8WavyWUlFXFPf_N&@a_x z*Z7ScST6_K^iB5fvcXo-p@u1zHpIfi5fcz#@SUUV@L4xF)pW7_-GS%X9L|JcM@RBW zZdu>1`B*Ld@TH9ysj&IS#%yZssWEJQuZJ^Vgs8Q+So60vTCa!#9$gBolGpXTL^V2A z_Dp|Okfk`B_RQ>msouS7ac!=z54B=7!Waz@GZ%`~|7eRNyt71!Ky%#Ms`Dt&ZcG}n zgqBG)e#iSk$NX0Xz6e9vDyu#&+vnn7E=I)D)x4zx(l>jp{J(Lr`M+_|>qPE)Zn*)A zt;^fmUGFvm?Lx5VD2_mCaSXT4&nMl}56dg3wD+jqc#g?huoY$x$vi~H#$^NVq8%po zW+(v}Ww*sD4`;#awqeof@di0)l>GaYTOug9g2bT3Nemq-SI9@}4u%2L<^9SMWP=6de^cn+Uo{sJ4L`z7G9^?x)b#by!KrY| zKgFNKVgD*?@++~&jRL7-QKEX0=0PF}F-lJ<)Svnnx($W_kG(VinAPy}pScsg9Dq&6 z=dj8O7zr}RVPmCHa3K(X2&O)}cE_+4*%I)@7d#xav+RoFI#dTf5jP6Rb*##P(j3W^Qy%a?3xYcSN z5ueKJ^@Stx%k7vpq_|og9e1syQkQj9J!L_LIft$b_rq|TVFnN%dPsr0GKP*zV}W<+ znJfiI9a$ecBt)xY$K3ZhEisd$ux3Chavlp6FDmBl9lO|=l!jXB4k$6!3q84+R|XY8o}+MYQd$p358JyW1%F`PY&>xVY5xIk>VHh0UdNVmN?W zBav91?6|rZFA}t3eob)DrB*0PpnP<=cQA69Ap8gEB#KAi=HhXsu$lF-_@BE^EBVlG z&EKYeMGe%lWrv!F__&h(UbB)M8AEq_sfirK;qOmb2JPaSZ~!A3xpP{ zI8#Qp+3;$2<3MYwqAk9fMyeid^iPUZ5GwCV|Hq{{Y4I4GtKKyw?%Gm73=)!{Gf^t1 zE;33Q2Pc2D8$V4f>bN@*9NcSgVuCs2(_lp4Z}RIeZe7WbP$jbe@Lcg3)7ZKB;+|7t zhKoNHibTmegB^}+!8F&9WH~V!HKFCAV3-ZqM4@BMW-hb*Dm1Rv57g3>hs%F&f?uCE z9>K5zH^=@nL2KEIO$?abwf=QryDy9P=}gF6gBJ)aMS!%(%KWg2HAD|A`=ppU=q{a} z+vWA*0h%?6YyWVj;z5A3Q28K8{SP};HuO6EMOT0g4nH-2)DxU&ds=>EPHQyoVh#J6yOxN+T3gNwC)JELSyiH!L~aU_EoHA)fW!wO1Nt#I9uiHeBvXUkb&PdZRh$61AK=caj> z-G=Yca7SxYN3B#x%bcgUou{Tb3OQoGA>JTLD5<`MwKiSD-`jSDatfnan367pWXV3R z$i_{I=llralC65xR}rr#!eh}8UYrg=to zwtX;86hA}lN>fvVNuajZ%imtyK7g`c;1J(hA+x{l-|KqU1U-^NbBXHzNVKROgN!s? zbsyel!dhS{6K2Xs-MfybZd%gnHRly51M?<}Fu?byDr&ZsQQR&yD8E2e1Sazem|Y_Y z(jwpTh0unZ=`+Bx&dQ(nc*Up$n_g&f{X5do?OF7!0 zv5|?MO$io4R;S1|g1#|KwZihcX1?3^uyhwJA)7Dg{Ii}K)8+bNa|r#{wf3CbXUYCS zWgl7dqV-Zf2F{CKCp^g4248&_3!foF^(LrIqm|LgxkQJE`$5 zym6;YDCeBqu#s+&@bfYyX;Y+>FAJwD&CFa$&`39iRPTpJrbH={F?;gyQ_QBvLn-dz zK3yHx#gU$UMN>C3%M@-4#mn_0WfOdbR8q)G+)%#?LK&MfArK;F+3Z~y>XLSShv3o) zM%Oi`aq2@5yb+IKDE(vpZ>|5W<835naih)o@gXnZDgrEx_AGkb`$GoqUcE>EuX}BO ze-MDR54d9UcRw5mxc=0!aT;Im@i}i?<*S!NS*Vz9C2{l;{XP+k-pe-W&sY6n<%uGv z6G*vCsYdp_Av-U5_LBV~{EqV+LqR>mfw)zVnz|0AuTTBbOaMSJ!XMon@%Bh1agZFj z8xvY}#h|3wtb&ck2v<%@0*0;Je2LZ7)$s{fOf20|b>n!UT6K&Jv0^&MLn;AI09|jH zWsXREIfSE6|qf=-*t$z&;y_tXFO6F5r98OLR5 zU;BG^zQ43yb0o8(85mnEx{wj?1~EuQ6T7czwU9(gy66P0>i&~2O2ejNF4K%;j8{$m z^o1avaWI!0cbP!=Qvs6%?x1zq^ZC)Dy_yeY`nEYw0Iku)Inx)6crJ2OUg7}d0j+v9OX8f@G5-dii;P@COXZqRao&3>h&_`$&b3?!qBwcj23<-x zIX7bXJxoc66&pb{A>Iky-CD2^hYZPDIx)jctZ51=`RO;dDt4#AT#4YF08$4wbTV@vx+Vz%f>g0o8?n z|3YHg;X?q7CHF`(i;3D_RaI*;6$}31w<=)hOV^ z80$prrZ5{!_Dq96!5=bRkX61=ElCIwOVZ!hVC@p-(;>i$t^s8uKO8+qmYJDv7e&~y!c~>9b8&?I zXyMD|6YT$(#&}5hr4osrSYnE38kt32{LhoJ?YBckv{S>ZqC_agTDvPz!0U=_v-dG& zZi^cN9Uku0`lT;iS|635j(=#QO~L%Jc!`29!~7q`o}fS5=@4@SL!=ZJsb7btoQ*NX zlEP7&rZIvd!Ra=HibyC&)^5z^cH#Boi93`#3x?rQ&zmDicKXDXns^0Jw8%&7iL7bH zHP<5z+A+1j|##0)kC%47jhzbBV(ws5?&1n9OA&_gm2)d5(DVfXn?89K?OXz(@;T-hJVE5=S)pl8w9yg6BH=152I* z(TZGC0qwCB{7HIYeP3W&?yD+ z^fXeZmyo~mBCO3d^tRT3ObW=@LS`V=oThD|W!X3|EL02&xfDk}ML~KTl*l(l?{H0X z)>ZDlC!~dilvs)pC>4sBnVA&?#8fED!T#Q^h|%wM+Ti5q-!^CMdD1-9PqznLnL3wJ+2eyL-FB!jQ@3 zFg|?(r9vLVL&G>Rdx&nc3G@Da?C$P4C_Ew2LYh^4PXJ%1l2fXMUe02CJh&{87(Beytg0RU(?JDx+u1pp}DFj*hS6>)fE1dV15 zy_W9k2~zG~=F6bTqG3odkNR2%0t$}`!6Bv5+u_=tl8m)HE(fvD0r3(g_zUKpBqrI8 z=L%Uk%%1KCiBjw(ZK+H~^e4>?ify&s<9n73L&S3$V)Lq_uoy*2J6-`wkYk(DKE*;) zj_D6ye-0fRVKP6C#l4?`;ho<{p^CTcicj( z@t!+*QXB*4{zMAy2rd~Jgv+p_#JC|u-X?(tzCsm4u2}plN4&@72^zBGdU?i~n}FP7 zP3J*gc0aPj^IT#6gk~|VTGjyiE71voDWQfQtMp3YJF=?CrB5v4s_xHcsayKA`WQ^; zF$#RN!bp~l&~U^I>roG!@Kr)-C2EW*42?_rMAw`7Bb3L(1FIZS3?o4hRIWIA$5gc#0uQ z`~Z|VNOb`K?pW=)f&c(ua9ILPl!^t+QiwvSEOwI&vcJEF8UX;^4m2f)R3;sN_e4BD zxc8SkAaki$#5}S7pP0ee_$1oRrm+5RZm#3j?HeN9pGceMrdagHCGmZoJa3|4gx?0@ z6e8n+t_$U#cz|Ab{sp}H%8!svr4#B=93X~s)Har}@!o4_tlfv%tU}G_pyl&!mKbky z)PIXo3YN#$v$IR@eDe42e)_-v;=PB7lVeZ@<)2X*004vX)R*CtXE#s%-j9ECc>V41 zqjvoSGdq*q=uQ&B9+)2lFO+PirNMhT?CL(6D|fN?$vY^|ox#xDSqX`UaDk@9D3{IR z%B4&A&wlnZy!*lXc=!GHg*93*|9WivvfvOA`l1q0k}wZZ#bygO+w5K%4gjUXHTTt?|Tn2lG z6@2p9r#N%!B+i~bjft^QOpJ};{P`vP>?c3LuikqP2SC%vd-!rJLkRx;((-tv*ibg4aED_V!YPJLc)BM6otgWx$sCFcj z5=HJPS;S8=SA}*)2HZzq0uxY@o&--Ql~cX-o8a-QIp@j3derAt%8Bj8^i!OtO{o-J zaJ8F5F#py@zJIg;u+TYON|_Ll5gU z9M$V$F6vDuRTQOH5N@2R!;&22gpaepM^nei0={p>cJGn-R{en0T~>Bu{d`=Wa$m^^ zEco*E`o~zybxS-Ck~Stk*NKrG3CRaSK!CCmZ*SFMUo=7&^#IsMn zPjJq4b6;CQ0CCu8PS)!Up3^i};StmH>c`mo$=6$0VFtiJJdT)S|7X3*T3^elJ(SaX zC>N6`6^~(d_5+>$Fp60OBT*>9Fo=F9LxrMCe3@4OY}Pb9ENV#WCNhSJBMnGsKt!TV z!g^UpLX%K7TJLktR3Lz&yN6>9azmm)4hLJCn=Eu_->2;3*^2r!7c`TvTa!fv>AMaN z4Pkt85}lnL(6u@ei31ijJ~-G%rCJrqzeW9b-py=X5B+Q4N%PAFU6_GDaU6jlp&%}t zTf{rBy}`DBl>E!GY(*K~^ItgHL;i3F$IFk9+g^cQ%CRE?(f(~vmUSH3yEq1#aVXoQ`k$I0XPs$3OYeGd;II{hi-P>gD`MYVG-?QAl4@s+B>y zi^voxvy!u@va^bBtpc-{MR98h23L-Q=oz1F+C*8jE((b0Mse}NdGyA6k;~_B@9td= zP8)Rt0aB|aAw9!q*JKUPuWbrtCY<5|55=m;lhq$p7xs2{QLR)Vt3kwvMi~I;>+k2} zKe4yVtpMe6SyW&Z#r5|7K*ru5v!w#VkEtTKKT4-?xVO*A|J>XxE-jv8)#Am41*Y&F zXVbWI?+Y{}1Dak3>HR5+!~qEf1_S_9~!dSLUhBLQxTfgpg!{ z7>*$ssLCd9gw_)P5TF}2i4#*Fo=YWNYgAcuslLC5!i&cUb#|lo%)IFDv%G@ImQW`E zfHsYK8%@Yz0sstdOK<}KBs!#P24vNp4m6MAN%VdHarM*mn}y2O;Mnwp8fFU!aAJkK zUB%Tj+w@*r-@{Qor%Jp4w5ZzOs8qP6B@hTQ06+|vndvFs#zsfE0z~=`)FNRgg*E^{ zlvkRM=}d-?-PYC?wzjvhvbKhm^);lcbrg$b7M3J!39?C|;MV~Fj5dr2+sC|}YL^w< zJFOX}pVlooz3y$#%*nZl^=BKXaj^^}_!0{Lh26gLEIGgbDlkqncy%YxlJjX&b3c6f zpy>v5DA1;JqYEExmipH8CI~>RAa3hWxwn?Yt0HQEEy$vg2*Qyt|2q^6A`}WW9}kCF z2P7N}Ash;ezXwCS-jOo6q6jZ^+ZDx50u5__bSrtUHyWJW*VzT6!NERVzoklrEyZX) zRjL(MQ>S&TY&~8zYA~tIgunn|nwSC#6wCpI*APjS9a}cZb{nwfSu-iMfgBGy_q7wl zo&0^J1mH=h+mqOOpVkJSY5{B8y^nX_nn{oc__81LF^H~5c-`{r!TFVh0Fm^Ed8 zmXmh60ZHp{5&%HgoT{R`tD6D!r~?34XVWm5re03$A+z!&YJ~)E=p6y#qX^a&1fx+X zAp!tGqLopXP$h+WNy1i5$DLvgIo(9g01^!o#|;A4fhZ*GHe@6;8C4T-nFm{48Wyl7 z%MAWfqHY5Kxoi$wn_CP7!1cVAz{WvUto4fGCrxJtV^?P<+y0GDPH}}_*BdxGI^fEG zhL{Dl8sCr9V9;}x+JT|1Gs4F_@ZdR;Xjju42&f9eY6ut4ox_jcdk+JB102_hmJ7o= zYt185INHVj<2wuh@y!~i0Kn<^CqHi8x~0GW{`*+y4zA8$d*kP|wWp}9RfZMlQAN|DWUFIXqGf{m zt}xYI%cf9VeS&Q7AVPh^2>0|O(%Vm%t|de#7W$5k4vdYA;M$cdNF(FuiJl|`qDrYbOl0jzCp;%7hqIo}c|$HzJFCqcq1moDQ+?;hdV z$_k#Xu0jf#Y-7lk4|XL``BPGIfI%0s%OU#VpltFc(s%=!b$sixg0dpxP!8Zw3ZPLZ zV5N?;0Rv|O2Je$>C5YnNQEz$xW-bY1;}LSPATvDjo69hZIhcBb?UM+UQK?t4R715^ z=O8f5iA@mUpv*mvy#vDt$2wVSfLI2GFYvX`g%gOls*9c!v9+}53I@H8d*W}&``i=f z$5-T&Z3}fy)nBMP+dcl26b|(Fqraz@lm7AX2~3QQV}cU?o*wk}bn|f`fvRvQ#7UqX zNZWxn0VnjHWDz-B9meR$2+o~5hwI4%Yh;jZ*f@qX}#`q^QJ32Zz z0ilhn`~gwj=l2Sz?A5Kh9#@s--xaGR#7VpX52f6llu-qcfB**&AkfsV_*1pNq47^* z0kBPIqv3!8{Igs}iMJBlkkQXVxr}0^%wnkJYK>LN>2=gLr5U1<=TsXY56fn zxO7R}OoNjaD$^x2>iuReeu6207Sm#SIP-{sN8Q6{kt`;e!eG9{8!R@EY1-F|A($uJ zgRVCLJ_|tN7CuX9-kBQSdVe#WKLNOC9uDup^E`)`FoupuG>Ujf7gPUUs~*)+_W1hXzfDI6mZ3sLtBcdVsN83%@hJwryuP*9`K zSAZM|)71?SS0E%wDCjb3rpyfn?z3cA%$#t50Kh0a|BQ@~_+SSbrinCxyu<*==OIyh zm~D0FyTdi7w!NN<^`W;n&WwV1{{Xj@9Vd=(oJ?S6cZaQw>so`8e|lff{B=IS#lUl0 zb^{vqa$L3V$Q8fMR)V_l;w7cX)0AB#p^>ueK#tL8GOcTi z5|FK`4p3{`{Yi9;6}6@-p?Yj|_C;*=+AlwUzOnLWxBsAa>((u;?Zt39PRBQFoB{x+ zxtQMsuu)6kjYR zIYFCK|8Ii~a3HUW{=2p9EgT&jVrpz0Z@lskN>{mUU5ss{6#oP!()QDwd=WO7${I`3BU8iJ1s{ z2SHXvXC&kFvH$?I{4objImtkQgqSi(pp@f2Mg)T_P)Ny)Db-P{HxQ6yu5K~_5K_?5 z)x`inB-SNF13g~Gk`n|=uE5fLxV|n#cOQCBlIIF=+7#59=imOf;}h=vV~aN33GYYA zRij>mOgajtiNU@BT)J=`H*eg)OE+#}d~}QffRl!1Q7CQkI8t&B$V$ueh^<0%;>FSu zmX??B%g;VVxlq6{wF^*7KrG4ur0|{=VwaNPs_MfN!@0h{FTia1rv7hiw)lTZQk&O! zGJ0<{(0;eJ6)5xM%3-_rH(j3c_I`N2lj;51O(4TcWUL@nRKhjCp*I3y8KFQ3J<$$k z==AsXp`SpWzJC50kN2W49!I>lmp1}#h~`VQT$_gctML{7{~fwTrma{2K&en*o3%_f z%iGcMF^*Cx93+l#kVxS8_?WkRp@4k7!PQ36v#=9?P{2<8#1b6Oa^X&4c-CiU*jcXR zOP<>ZE=r#H*dDy|A5-Uy`}Ht9zqIKU@!(Rv-hFFs`L7YldA1E8wWi&z!!IJx`e!eW z)sD&I`-FBEly~<%Ko?xqd`e82O`>TqX-(HfYl|&5O4VDHTUtb`ifjQ=f`MW(>!e{c zM1o7#i(yr3Nw}AoFeGND$PW1JwAnNzG@9-XZ5GycEk({*@M{Vf1|q=_;@v$QLl6Mh zwB!+k?q&7-A?geOJV3xO5Hd}KvMGeaQB-R{tp=#Y3IegPwQ!h7H%zQHfPF(j)=oeW)L+rggT;#cXnZr0D#dEu9#~kI7#2y+T`m@ z4g~r5%d*t$$Z?%_C*Co{u_2~qPrMIPXU?*tQ7{x@K;ij|XE-=GL?)MG9U;~da=npc z9XB^Xb^^c4yHK0fd6Yy80^PR^DhSkTn4O-&Z+!pzxODCk2KxtGqJO-n)@hbF`OoaG zA+`Jn$w#*lP-O-H6w5^lmgOHM|HMr+lwe&CMhlVA*%t#>-u{O_`*(l5|A+tnk58-r zr{h~QP62?^@r@a`?|xbRU;p?2BYQ4lK07yl<{ymI{*8L7+ASH7C0$np5FlGOYEeZn zRRgu;9#RiKfhtMN08m3wDB*}t(bvTA@G!37Dt32vu)n{D!%PZCnKS}K4+NZOTFKqf` z&u!8Zth7|NtcR^2NV2LT4MXRu8`&TJ^lyKLo7b-5=Cx}W9vZ^c%U7_zv4Q246{HGz zqzVNf7y^i%XlhWna4-7Ck4@mI7C>H+ut&6AL+50a0uy36C~^>r8Niwzz?z|=p{uAv zLDDc#(sW0}hyoWI0HA(-u22RQpqz%Z{~S`S0=ZsAz^K~sK7$N}nueo74dHwl;cS5% z3^CB%h2E}CbaZwg7!C>T1S@E0oea%MhhMlSQ8Fo(g%UYFBC% zuF%kC2j)~A4yplGi|&YZqCeip$tKxb5lBSs1L1IpnFNdT3wZMEDV{!mhJ)i{9Hvt2 zI6(l7u%(nZ>oYyc_z6{6=NayK{Z-FvcQD)k@gyL|{YcCEokV$d9+R9P+um=t-T|CT z-AiF6VKM5PCyf!J_1o0_u1Jh4`&2>f>Fi`NF`^SwGT*~nH#0b>>Q9w^dy7~U{~!n2 zA^uFF+EW`0eJ;6-P_jh24mFFW->5gZvM&1aHP#~$&JTv5_FC%K{$y0-KC(l*rbNNf z7Epw?05OSZ3xz~W0sjnzc;6^NuoJmxEXDu@(}xEJ*gL&gsi0UYqEITKSSq1ZDl>&R zYk>rmP-OFY-twgqKd)97nia4hKFM;akZl`F8w_x>f82?1YY$MHiE={ve^S}qr+?83 zGWpB+U->E4Ty!r4uA7Qm%(0FAodZJo1Y&&{=84}&YS~Yz<-#!iuXlcRC;WmbA`&cv zDf7H`b$6p98fDddn)|e_bar(iM)M;oD(Rw^TVi^-0|3-(+;+k(CDkhHlu#8rmCf>I zx1bnS!YGp+E?0TI%aDXNQ@{od+O>mukbVfzLD$%&hQ0@j&Pj61q)@_91iSkYotlSM zNTam9iR{i6BIP0?C_;w{gBWrIh$sd$0?`c?BtS$ru@I8c+Y`26aswsO6JQWPLQa>N zn5c8Rn2P~G$6h0*K!cC%)YLTk<8ed-3QE-qve_z<$0;1AQWi}=;Au0olV@W;E(B zYBfxZj_~%3ILprZ_K!J?|zlGfA!w4J-`0m zuSu0gt-Er3bU9#{YCzHzgG65}n3yW%vSJ`0nW!aqQOYFP6`*To5s{vL1S2u-H8fl| z3<3Z~hDWfszmJ2XL)^W854*eDoT!_TkPybA3Mbucjplx}Rxq1^q$dtEy*-G6;wUo! zKvq0-(`;xuuHU$ch4U9MGJb??@))&-hQv`q&~gLTCF_@i_Kjx6qUp^osS+#kH_BDi zDmAtRY}D!;h!X%XGBnKF%E}6!KYxyA%gaa{9*OTA2|_Ul05Blw3g0M?bqPoHAa+$1 z&s91m8e~I5Sd|e`WrU3&!e$WLn#>z?vNcq3Y&6&|kj_m&wj>sK9|-^u7K}CGu-*HW1S`rh~evjrQd1VvDjawf{suxdpgs(`{BFqVqtC$ zi*s|%TXXWC&0=k11MBM>*xlR3?*1M>p3Y@ZtyNL2S4Gb)43V@2!x$MH;ca1VffIcK z80iZ0~SKs?!R<*P`L7{J5H>Te61cHQ_yeCl3d^k=ohv zc}xDSJ;c7_?{5>ZesfoXop+Gjy695#oJq|}lRH5(UF!=a|CD&6UI*$8sG%^wjsSq6 zfdRJVq>b8gCdVf*G&snh9BVdMeY@>Ojgov#Lq3;dkf%@-39{(DFCkwjB3~#mTZ0m7 zqTAEsRqolZT6BHQ>g^XBi}Tq-maMf;XspI3cLIJ*xf(C=JpOYcXq7b_mOGnDA!72p22`j`UOGZ zRv~O(t#%3nO_9pBmGD+uN4rw#Ji}drKfwjUn>@8X{wtwcrquHK=Kg&3OW~e>?#gY; zb6o#+i#&QBhcmyuhpl-ayzB$Xd0i7&x5Of8UTFHI;bC4=s9kA< z@4v&`vP6z9q)$PuN;0d*%T2eEYL!KLnITdrV0(9u+mn`8SFyadhJ&Lc6mtdG25w3? zBy4@HYt?jtLT=`TI)bXoVykpLNWSVn4JAbDq5^Gd0j44$ThfqR z+Ca2g=8cLGv^8{@b#w>-s4 zI%_`b1_J;+9bK57nqh&$Xi!BaTSdZR+0Zp61y%0R=WE6VU`oF4O~;=AfX>b?OioQ< zY;qi<<70UI@FA9$USMZun=Ou2))EQ1CXy>2YME*N8QD57omMr=p3|WFU%7;d;UT>F z`fIp({RS?bztr-+wz?1{|FvQUnf2#5xbp#wYLVM4xaEoFg~cF|_!t_{B+1kz*^KlK zZFbC@|LEage(?DJ{L2sbTXynvoQ`k!I0XPs$2V@=Ti!?lA3VFz6_~j&I6jI}c3LlG zXQ*$E81i`8|KX3ga*)ku zk*ijaFO|7+LE>t#sCc$rj3?N$9y6WX#4D2I?wNFgGpcZ?3R@8FY^`&k%%5YJm_L6B zEe`p z(D#4uM?d0f-qGO^YBEr(Q~`ym1VO%8%BE%ot1?I~iD-$6DMKNuqCqys25MRrdbI|F ztN>|)j!-~C2U88{`E*`%_A#a;gN6MdKpf3U$}RPCPW}xtG(fthAyYT8nXO_iRl#6K z6@&2_>eLSkaMh8j9@Ga-z0RhkHZEI|W zt|WDI#LyXw;oRaPAM4(DA2Sh18(`~TPXv>pkVV9iot}1IUfw+3Cjc*wC0?6j)_k&0 zmH)(QXB)XU&*!?C7)@t~R*iyo`v6Z8WrH@tm7(FREmW>2T;G;iu}qW-0j_Mzi`a=9^1BTM}!ONC;(1EK7DY0|FKx&}0CF znp>E_fe3#WQQ3|1-030)gO%X1W}Ob*rtd{=2Li9voqHcWALs|0ecw`Y{n38ElPmz+{VKT!IZa{HwqIR@s zG{SSg`6O2lI<=w6Aq0EIAj@GyGgX9YK;p?`q<0>nzf;0MCoxw7kV#P2(!`7@3I-(= zQBy*c8fhehrx7Xt2PG2z6G(umdjj;Y@zMk2)}KKq%V8MI zrWCY)EBU9Mf6)C`GCJ&^ zYj_fk+1Xi6c(VB%);HF%y0wX9Dh-fQZ!o|CFyAb7p?vP#HchWbHzl%dY2jwG(n){j zAXS!7EaZ@*mIE~eU6*ifVFBmQU&3+X7~5;>$QARbmI@pUiTvLR&OIQ6JM4oK=D{8I zS*`#S6s7hL@Ziw|3k1FX$}0>2%+JoUC?e7M?tXC>X;$zqLk>$Ysluxpmhw9>3QROi z8C6OiP1+;`4NDx%sH1L*+C&Hnx%M%!NsCG{wwI)EKG~aOtVEI0wcE>kq zw)>&uRM)Yc*RYwXVLe@e8LuK%sWUi2gVfD?I=dVIfT~aA24GsCklCi<*Q`|hYD9GB zD4VTEyZL_JikY|4=%yZ6lx1fcnVx{gw5$IbRsPF}c6MWUa2T(@`Wk-kzx`eGc6W2z z2qpitJzrYF#~*);2M_P#;iCtrl**`-E7oMQR(;w63Z#J2tfUiwLR;Mg>do&uGjo== zx88aiZ%Z;}CMP*~Keu>}H>wDQ!x4P&(MMP#@kpAVmY+0zFT+-?_kDZ&cz;#s-8_0$ zCDMJ^(1IVdz5$vxekRaLoM~68^_5Hg4hC&zk4wX z=I3$t%o*OsM@KO+I@^P zqPMFXz1=l3XegM$MY8XUmj;2>{(y*=pb?d9a(U01EM(4da(ogM7#?&8tYr+EDA z8J1VqP|lZ7Ch@>(6-p=oB^=~-B)5i3b5~v0txL||N$w=~;jqLqJ;%v62i(WY|M*u; zJIDRPKeO!QwE26Bou0MdZ7|FxX5o6=J^lTzG0pvI^{{L*U0nAUv-v#9(s^Lui)=!a@RoVj+;8_?f?0nA0F+ATo0!1) zbLa5NORwPFcfRKV7wkDLS@w&DR!4qo1^b`=J&K3h(8~p=#0Uw8n*|)J`Y+rk30B}0Kv7={tZhQJWzwyh|m!E{w#X_&7 zRR^F|1|>yz(Z*z952yy&9?&>GKwQ=RRpQxFX?EIu%7}%REcei zM!9#=L|rmbBzA!*@unFPG+jc_WN4;o!$W6LGSSdYRxjSnRB`XHg8hQfl1YGcvuY}+!M!*YuE7VE3e_k)vKKRlMoisULQSrgolqF;l=ak+`@5~N}!@Q z&z;hAm7sR#;-sS`!5?1xk3L+{W}Cme3$2o`3hE;y_(6!4 z;kv#ISEbCYBMO8xebDt3qKe8x4dhJPfVgb(7L|ag zEMZRv_B9Dd4HK1yXqU0>#sY}3)*-r&cZMU}Rxvd-iSC|mUZ+y&6joN2xfP7Rzq?o8 z1qsU}_tOQY+wYUx+eCJI8Of#lDDH1StCgWzqJPeO<~AXn zrAp;sD1}fs-8X;j?%?%b`{3c`;o6^k_`ZJY)~%B(0jJ}1e1pd+0B}0Kv7={terx(W z?;UEzLhtd)^D(oKIxkhrgA|TSvJO)g0&qn6Bdb8IT7h23pt$~wD_@EdMA!JNgLd0D z60WdI3eGJoVtj0zlmADL9wW`_)dffq8G%p}>E@7IZwAn9fNf{ArCnNm-&Ca{;31by zBb`i$f}DlRLNZG1AST@Y~)z*yA2l6Qpw0NF&JUc4I{!{^(q<-yL#uZQo1U<_OJe)SQiLz!Vz{o4v$B*JwK$Dr`hi>{=zEf zM4P4Kt2J%?ocC*p-q~=RlEyyVxON@C`_Fy{{qbI|{8RFOcyz>7|3Clp|BPfJfn*{{ zhzk%QVLsIo=hGlbI=52rCJ8#Mt((!HK3m;N{%IGj&!sk)>`@w<>+4ME-`V*!?lGsN z-wgr~4SREQ6Hk|ycz@)W1c|Q`iRB%*Qq^+kthN+)rP7o9ORb07=ez+=`0APVzGTjy z$hc~Ko^0P&|8sx>|FCOL;z?ZjY-lj+b?&|G8XUyb#3Z+BymaFR7Ut)%xUgWkEi@}` zX^YanzO{|@%`J9XSXy4@HjbU`ZB&bS)QV00DXLzPFlkRb&Pv>!B&OEg4Mh#IohVs! zlKrL5jvPV_TxUjt=<_dH>sYl?LA6?88$#37^Dn%^T?+G7f-jgxruXZ6j;HB+*luAF z)iny@Nw}|65~}aaHqrGagFqI{1kpYa=ISsdbp)Q!c4m4SXQ!tzGc$uI3CDGJV`OlE zlYbg?45>xn?w9v*_x^p{dvG7AWD0t%hI*|EH5%q>t?j;Hw@n!~{oYw0C3i`?*;8$S zghuNMelj-bAyD|AWcq&d&R&1=?@rY1_j5BBJfGlM=-XUCCyf)B4Sr^VxSv?y7gy?a z7_}lB7VF?v0$LkqrY87vUMv#; zu!?{9#YZUR3rHL%Q7BbNvV=i!2K@c&x*H&D(;gt%ppap5<)1}o9RR>u7p#ghvf$>e-Dni2wtk`oV^&BGv$muo(H0N0jD*8~A<)qiR!(W@0s z{>Mf}+2Q6V@BNtdN8nk7CD)1$U;TqW_yd<1%IP>A->z{A0Gy6*?6`I77D2bQx$e;N{44ML zU2WyDUR!xGsF;nYs%bG(wdiKnjhvDls6jNcDdbn4Ak@`|Kvx{$z9B^VhCS3s3Qh>s zreNagrOPP%efhp$1=}wLS-kavn|CW?yZ%eB9}{J zZS@68L&Ip)E2!3Mh{mEU+@{xEZZs}$^42oHKdy20w@RWXlB&-dOsQiL195Ca{_OoLV-9`>`Ni^$`Tsf+pogZ z6f_KSATU`xN%Y(q+`m|Xj*2OvGYoWwWSk2GF%VPurc9zdij}w@RWxiB>sZZcI4qke zHYAIMAbF~gsv;vCP!LpPc770o;D)Cb(PT=xY#m*dH|H$5%R|3H9l&N7m@bRKrVykM zB;#bC6rZgMJNH(Gqlm?$tR_uL`w{M+4zmyz0VfpT4Gs=rXmAKGzjTuWTzcE%bQ*W= z+`-46e2j+=9w3=apsY6_cgI+8%2Xv0j{Zh>iKuK5G7M~NuEG4dXwRU192*^F8avV1fAIb9v#8_d_BJP?LQml3*hl&}jZ7-d2~oaW zLLjK%?ED$gGvCp{Z5E+Ogc(hgESu~LCJQ$QU1Rla0tu^iVUI~Pd5xV1tOVQ&=*fPR zL>#qx16sp!f#5*cKE@WA+YbQP|8^KI?w{6r;zD9P>?3XmQ7oZP0Vc4eh@JeKf+@g% zC$QEuk*}0c(>0VTWgH$IU}JL~U-tB1cz6WEBct4gGT7h80*XTegIw_>R>1kidHzX# z;n%NT#p>D`R@Tz*ed25yFd z-)7YJPX1Zxng6EiaW@mpwZAU1hj0JAyJy0Ek7>3h8QfZ>IrrDeiE)e%3}Jp@o`pis zOiiKJNwgKsu33wBQ-CPL5>=oROHz|=Ynt%};tGO9aEFzKFW>PV!rNTxFg?rmTu zs$eh_KqMT1N(s8Eu%6CN&A?Hufkds2Qcyu6BqJV>5D%Eh=qB3$mUOdOZIEp6*%Irk zH_$uQi`kj87#6_X2t(pCS$!`b~)F0*NtX7oBQzjfv@IWS**F1MKfzjXi#Md;b@EjrMF*y0~gO< z;N+jJAvum{zMl4?czlRb>Ilgf50HNG0FCT16mlV9_K#!B{ZaB9Fg~jJ&G_q-wlZTxAE1f;)o4<-!-$*k#wr$aZK~BJ~ zUcSsK=%k?i;Qm8s1nQF*pUTj?sKPjmb<-#QhBg%#?`Q(y;$JfN=*!6EGDxS6(Wq6p z9964V*+PrJiK+zv`15_UCCs#uZr=ym9`uq7Ll!sDC8G0XavV&*{_3l2$wb0IS1w&b zHj{x)J>E-8q9PwsnU*g};-)HdHHWG?5(5ASa+s5UQZ*)ee_fN2(}28A7DfijhK`zP zpk|t=Xa=gfiOGnB$*6*X7!cGItLN0R_>xQFw=dYBM~YVmtocfb0F5+gII4bre>xvJu{87XJ>iq z?v0~69_O`(G%eCuY8lAmFhN=XN2nhiqMS(!b@XBZ^?D7Bdfid=H*9f2OYl$h1h^7# z{@rT*@bvZjO3{*~9l*)FOG`kO98py_Bg3w^xm`FsYo1$e-BMvE#zMYahF&b-@W@h- zw?iF!aI$b>1kX(e*u>-T*R4)af}WPqPM#X7Zw+g&RpSR^x;RpKsXr2>4(#xz(^2TegvB)F2gq$=a%cZ>| z8bK@^=H#D_AzA#9Rb?uZMkCmTcqyp{CkIhJhj&Fb0L8ydGm%+1X+0MHQ* za@$QZokk*gjKjnc-#C^qHcO*{!50@UW z@Ly)>A+t3DbbPHA1tAWoLm~jcBNTTCs7!F{O|NKo%J_2oWUUcu9q6-XiQO@#wmS5ocnA^ggk zk0%&xCa4}JfCLna1?=u@v1K0x^bNhie{1!UZc{c=6q{}oRTmHTr077%PX7c(WK=5 z8PD_|PCmM}~MCjQ3(N9!Hpj*(mVU zMcYB8R78d7xQRpV<=;FI+iog@-E@}O1g2~qN6EnY<{JL~?|#Nw3)J6E*A!K%N!5Pt z%o*&E?cm-Xj9>tIC}6o92#Y{i=Sz0LGJnajeL~_F@oSSewYkWet{k3}>7*ArZ|a2u zJWr=wxuG+YgOdJ^ev$YSTju=yJkBr7v#1><{N$u@ba=?3b=y1J*xlL1-p&pO;{@V_ zLP1=A~SX9zK06 zXy8**Y$-Q6HjZ#8h(S^_gulMGaC?CoH4ZwF?8)+tw_-KN{*#5w3Xc0TR# z_H(&i!M}w?&}@f+-J)Q6bp+b&Qw!i=`V)Tls^4x0tbh7H$6*dw6@O-skg~tVTNi0F z3=ZJTj1aTDuy_s^7teF`osxfI#Izw4`1T9jibU(OY=J0JFv!|165@zPqTJFoF*=5e zix=?r>u+LXZJoD+#3A;RhYYMzrMg@#<2ZASM^7H&IB|rX?F~GC@tj3%X$upe9}eNt zg$w+1cxVu@Xbk(uN$e++EbuGYnkDvuZ9|DLo67^ACt90BRu8=UtVraV6O6$OccBsO zMJ}<1+}0Y(H4R!#LqMZ;9))}ViLFTUn%akA&@mAN2IL?rVTHl$a8PmF3-)U!_8Sdo zbY04>n87+}0dhVHhB#)qaPcAwYSN%J{ps`PI5^nnRvflRRIGK`Z5?D)?n&2x3J!sA z2*q-V85yKcLY04i&%f!a_B)fuzdk$by8C)@KTCkW%vRFHJzF(_3-b%OapfwmU%AT3 zKiwZ0*mkZpaUIsFRjQOnYWWe4zW4~`!yTSSqJ=?#9Q2-S-$=(=mKwSoXv9V)o<%2S zzkINHbpOvD{L#^;pMP0ucd49?)A4N^rvSj|_{NVrU)-zF_OE{XH=f@3?f0ssMlDuJ z?4Ju7T2wJLZWJ@E3|+GNp6Si4VGH9UI!lmlyxTme{>*Xp5@+&4OZ*wC)}*tAHqM-$B#0erEP=RjBZZ>vIOT~(US zQT|G(|NVT&%h^Rs)!McdEEX#$lrjteP*6qzoDBfbM#=w^Cr{ZKA$61x!FxDp>Gspj zRpLB5FDb}SP^SxuT|_ex)tKdpeiH~2GNX{{5m_1X9GH@h}(wl~|H zXTHz3^V={1%9y5Z>6vg)z5(D&*H#ZXGdFjDp{{3S&!c!v0PJiG+u`UA zV??n6-0%_a%y&hE|6Er~)N#_$IW!*@PsWIIeFQwUtY_y(J7_+yY3Fq?C|WsRT_>ep zY!)Bn*?s%*3deKed-t$>qucvJ0t*DPU|nHnVu$yqnxT^L4dwi3>(Hmj;TGXd6e1%K zW+51Ui8=B%U5+0XZ`J4f;fm8ClFRTSo7&5>YM;p2hh709CBF47e1x+3`jrzlYPUhW zh^kcb-U@N&BG;#KX->ixPTdY4k1R+{ni5xG&niH0bV{@t#mT(YKr%yLm>x2)Tuq4< zkx*po50zRawnczal9V5)w8q*vCjbLx*LKMzDq-VjTc-;TkRWEs*(+f~tq1*0Z35=N z72hsV0Y(|9jtzbZ@9Ms}t@64{(ab<+;bb2h2gO!t;+YW=;SFpDJVS7Daf+!h$l^$m zW62XC_&gmr%}`m=|5m%%#E)aZzhi@xTLyYz2K-JR-E%|PP3}E5m9TEI;NIp|%xb=cWy8ZH#g9Kxks0|+-DgqGbQWL#z1{qJfF?v^W z^t|`!_x_6N53b4$LVauyxV-GaY+2P%O(m}z`UYK0F-fWX+LX=SztXW>gNiM@m3uOS zR8f~)9&`f$#5Ig1eisbyjUAHg@2p0rgM!F{=h9~(j1={v^id;;mmr{$g%Macb@tB@Cbtd6mko%Q@K{*4YmKeMmM65j7qng%98n1t z`mp@*1_z#VToG6~l0W<-4Dh%~8%2;VIzdFb5R`F1>#Nw|GG)JPP_52;TyOIZaGW;r zfl_=fZ~cY_c;uqeZMTAltDuC_q!<*%BOn=AiB$SdqZzvWIUax0AJLXDZZ<~-1CqfG zGJ>a9r)9iy8kT9U_+2`|T8NGx~&-gVdl~Co9U( zqF>IZcQ20)Uz8zcNP+c`f!2Zs*9L^Y2oS+81P-V}{BUZ<2PD;8+dgou3r7oXJV<)d zsHc437$tRrR@Jp}Zj$>KiEh79|0a*pP_CEbFTZnj)k@F7^j`@H(R(N}`jzy!zi+yG z;135E0Y|%dru5^-*9wT*zaGi%YTTj2Z1Y;&Y_T!R zwflb`2=(|+PEJfMAb#afRLbLIC`SI%hTr{~PqP;FrJuHqynfHel19S=)q8)-HH?0T zx@tU`t#7pV9glgleR_Fp=zwy|_fFo;^C`bKAh4pe*k8Y5S*ap%LCqaQy z&veqx^v2&tey*4qlH2-eR^2)}Zk!4s0btYFZ&c@%jA2D$gCH`~DC7OiA?*8eu9GiA; z?QDq~XRbe-`fWm3^tWdQ$=?VvWzUE_Hl>O^0{ao_n(BzpptMWE^qB}Io5^7wz$LVb zrlxcP;(qegz}z3Bd%$1sp6>1+r--kYwts%Z;iqbZ`N<8@C3sEc*T|ijR7CE68vBB3 zu1tJ<5jDRVjNIWeU+)cnfeSSW{GQJ$YX)>B?tMOFUQyq#G#4HFjsEdrCmHFvZO#d} zKxqJ=#9`WLkGl@I)5_1==^s%6r{U}M60@c(9&^H%{)~;WzfvNExj~$CL*a$-IYxh7 zc%vJqdfWKz;KHDnMsEDAkeqfL-Z`&R3o$t}t~)bMZqP`QTxvid%|6Op!s_|;r{`n+ z;qlNj-bi=^TC9YUJ-Zg;X-FDQa7-)xo>r`655$xC%MV}vL%RJEsvc1Jy7a4e4~;B8p+s+5fliye;F%P zsTRdeuBj3UykiYtP>sPhP*UMAAGD9Byk{j@6Exbv?uVQeeC{5hdj2*1#{W^ZI77-* z((AF73)Wyv|0~HZ{bV+*HnVz5+XmL`m$=s1a)`z+G*x_wHXEZ4>cQF&c2+VC+kiAG z>}rehy-ipL@KRf%Uz|wN{_Vd9{ktHNE1^K=l=-Y$BoKH%9M#g*J$jA}E#W>X7W!+2 zd6Xjt(E>@VxHzKTjsB9sXq9Ad!y%7-{HQ+P8m8t6v;M$%8!9O@Y)l^&azR`w1?C1o zF4r~nVSLGqjdi&NUGGwu$-w-Qfk6i-i&!s4TntJq8HN{=;UJrqQv@^g^Y)NdQ|MJu z=;4kF^1xLu%2h81&d}4xRYDXa0LmAPWC$FYZ;`vkmX#OPYd=+QX9T7jS3E^t=*AGB z^#FnL{ampYhufYkc8?t=0$ZHOi+5t%F*^c+Q&{u?4iG5AJ~jPK z_Cs6JlRI=gj@AHNXYn-f$5+*?GkrZp#$|UIP#O?|j}-fX4i1%v-VY41(185rX!8Y! z);vUtP3d6_kZZf_9qjg!;{``%g#;b8+JnX`=-k}g3j&PLD2hxKU^48={w_!~w#DRh z^B12IM5lDATvj$1?8PwbvyKXu9ZnS?agxrqP^b@!vZN=%@@wx z6+R^+ByUb9>UMhHHbJmCi7X8Hs<(MkCD$i3d3(&DJ?52;kY7_je16ZZu7|KSS>lm( zI9(FWgvD9?1NBk&jbKGxQZ%b4tTW#tr5~a<1LcZTW&%hsg+XF)oL=`nr9TS~G zEB@-en4aF(B?W#2aFvrQdIVF7ND)G5maw{X5V^eYpMu}#^!CnWqk?G0zd7G(8b%a2AR=^b)u5oDppz;>gb^X`c~Px<_anoPoK|YW*WL% z5a@7V?1Z+DAa`8d4+&$-Bdg+K>s+y3(#IlyPLr|n4vz;|xx>U>xLd6fK^<0Nhr(6w z>(9%%O|be_cYi{(%s#^n>w1s%j| zbrGuJoUeY-t3nQ%2fDykaIgrv!d`tGFKdUsOy1+i#IHh|gf>P_jt6xA67{&CdlY!V zZ#Gc?4~#}*IMq<_LIJ`VGs4LU`=56tmM34p>8A&pr_bX$LG8By9(~2pljo6mRlp8d zb4e^8tQOsH1zfXy)SEKu*C7>TXR*+~NIOH#G2YOx78bzfE0t7f2pikN{O}YQn%z?e z_hH7O^HT>7*<`uc8~K26JM_4lc*)uY-{i-?Y&)I9Z`kGi0)_}*5wGZHIBHz#Hb6+G zPhJF_`2az>Zz;1EYO{8tQKeg2g^zXij=NX>pRT3zs(nKyd^tHp_sW3*ZRpGinIN(6bexbNF_!m+Khy6d5ZjkhGQ5tu3%B;>ir| zVo$P*NNULVye(o*i;7lkD-bm5PGcC1W(W!yrRAZ=;SLD-9rX6oY4^*Kx+oc)98+cb(=_VN9x>K_nQH`@B&kUzZ!;|$yWL9){3Ju@`CoHKBeKBRd!X=793da+ZcePxmkGpJ}cN4B?xol=C6IvnDcM;adHyrO;6QC7zyK%KVG~8k}ygF z@0xr~uv4rYLgBLmxnk<6LGq3deiPsVnLlF>d%LH;xAvV8P&y82gbZO(5Gj^{aUw-& z(t;Ps34IwsJt8YflV6pVT$h&n5*i6n zd#CKJ^F=XR3Z}0Hfb;q1k{sBX)vn4U%E{i7Iz2VjBmia2h6dvc^dtnYs!nu$snS z`{o;V(SP1QHRW$?yz~8=nKt>H)b=n<$lZ*&^RtJ4teUJ$B0#OY&IwSOyo2Qk4i3BmXIfZ)P_U85_k(8(m zfU(-@lz7q?GUo=jwN}n#08Y(scM_S@&Hdz3JQ0gqa)h>t-c!l^km;Q9qHVd%6r3!f zL3e3N)xVTCR!wB}D&KKA$gDHDtIxQLQ*m@HlyR30TP?^{x$0H967ABVJGs|&qjMyQB z?o6~6*qjug(Z;i13#1)|M4tO2j6y$OWa{-$lE(c)NY{r%5)b);b zvPe^o+qmITo*)}&qKgo7+Uo?#THyA02?N~gym=w?l&tM>uRGi7hqxXWbou;GAx-_y zrCN%u9dC-jbo|&EtJVxhgj@GpOQbs+ey4QzmQg@gYo(W>Kae1f)(|xYhC!*FPQ~PD z2NL`w%ZFv64&2>Xla^0!W#807MY+B{Q9ZvR1T>!n&&rCsP!fpF;>!~G$=f`XRNHpUwzuz zKDDey_z{(K6`D6&aGGs-gvn^rZU^)3+T{A&kLn*-F=zZ=icE3*!ZOb<9P~{335EE= z7yZIV1FGx!1d}x0?7Kdue?-16%n>i%sYPF4B3Mxvw>Ves#Kvp8*VfgQ`4e9oSDmH( zF~_;bszn#S;w$~IUhwu`i^@0t&aL&ZjsYTfX0p*FlSEV@1WzlcJP;{p__alBuGO1< z7dEJ_t)K3HUBaBF^vF1&lr@Z)kauY7aWZXDZkUs_=JI{&?p7+kNyvbc9c#4dbLLEIj#}R^J+*rb_86*E5aac3>+Wx_iBNC(#*rbq?2>K5ZaJqGi zn-KRM%Ax>-bWfktwbiS1b-5KR$s{S~5RJ4Pnl9f0&luOvf{KKpxM)pu>_qX2p$3rv zQa^OdClH|k5ULU?$xiuME7fN!QL_GRF~6T@=`7x z%IQdWXyDJ!;eOWs69ay9RI5bL9oVkx>Ia6oahoBujRET_h#@&ky@lEff8VHc~- zD^=(s?uAc7&=O15ayo(g1-HD`aD9&?8d%3-ImML)-!AvDl&pTEvD~#YjH%2o&BTI9 z#Myd5?Qosnvle+q`KMH5Xe#Y$!V7x*k@7A^vmCpE+O~X?F~w!xCyI-Gvxjc~u!5_g z^{v0d9~L=?h)H*8Q-lgs#N_`L!1)eXJ}TgW&9mUI!XMMH$~;WpX?XY6Gav=@xBCz0 z{N3VE$h0QO+v|!drN&N?#bCqHiHTl(r~xhR(54B&=wx^U&qmA!xrC#;$`~_Cg?2ZR zgxY@>r+8^xJ+B0XEZL){wSK(~N~0S@iVL?BgoctpewX$E`e-rb#ZB!E@Z~bs?F`?t zf*D8kuJxm%zXps~Pqm+hf;`4v9=sclbgo%=i>VVAIttHiM+?ofrZHh2^8S&kx4!-E z{Lb-xdOW~VQZABJz%M#p@C6!`lyB!Cz``Pv;f2ewCp3$B(@e+V7sDeWT-Q_wLT&BS z)65Iq=YUx_QPgJBCy%=s(AB?? z9?8wn8qOz(dH34xw|`lsQ`0u8Aom90^A;Kf$S0gk#No=ue7 zF^bZcqQ{6Up+YCH%kj}`I@hfTX>cVhGCd*xZ7q1@lmZuVd_*x2!$X6=Wvj_mT^Tmo zfuxc{?Qu=@&j*AG8@qAdY#akfJ+J)xFH9I;C6|kVaqE_SbSUWxy1fUmLYvK8Z=_3i z=MR5DSWQee)O*Z>I_qv2V>OE`GEAmN)B6va27}<(OBlFQy3EI+=ai>a2Oee}v+EJM zeepYZ;xty1Q5wIDUqKF3eSlm4I7t|o`$-gMzIV5LiMsiG84=HkvIIIH-Qogs)*jr` zuKvr9{`p^ibn`!glGoeEHt1t2?>#141?^JO7RILa)^!QtX8KjZNk=Elm>~=$!EDRAHPTOtmfO^4Yz^M2{qg&CH&)YKSiy`Ji5vt1oRkjKbnZ|`H?LicR9mK0hW5Bc#m8w zS~21mx=uol94Lq%fI=HRmSP&F74zN9r8#y!q2GFBa2Op4Wy<-ZrqN}Tst<=wZQbA^#`vVX1d zAi*LmN|7K~9z3z0R(SiCY4SqvrFt!3{P%4#>xsVSDzhsC5It3*flBE=qNs))$o}-{ zeHAe6+2cz8@6(z1-Bw726AEJIkf?cBF-ZE7|*v z0Jywsc<&50*)-rlKzO{s2Q;t~SiO~C7KOlZDy#0=R+Xz7JRPyf^qM&nO15AxB99d) zd``#F-9y7!Bcb?P2fa)z;qsE?Uhh~;QIaqOJG1!T^ExRAFR`1y_8s#Xv zy(!k+LwQqTE!K0AqzxJN{-Qp^Jer_g-OlO(vv0be4cpk$GtEEB9w8YH9s~+L)2wsG zPJ)L*|NUL3`;$OlTE_W`*H@JYfjw|h}HcowJ zck^TdCaE(VIRYZ_c&GaADGPU8;M>ca7{JZlz2Rpzyh7f3NVVFYzqS6Z5n5q+3isL3 zQL{$SjB4R=QE8IzpYD8(6Zh2H!{$*oP?pOc9M=3ye}(7~#tV_(yugv{5QF8akM#M2t0!WynZ zA2<2RdrL@&Hve7WoI3%AXrj-pH8M|}O{WDcDfQg8?HYCG?AivTw@5e{=&A6v$)OPX z?&Q_FH7BUZ{{vL&iWmzRe)x40%)x79^83AF0TbbSajhu(#^172lM1tpPSIm6kwX${ zy0=b4)tPQ+7Tz=c1udCsGXP2)1v}gv(KYW52tI-Vecm5C2_B!PhzO2avC?{U{HF zlR!`7{#G|I1I=ulMvXF07&@H~!m5bOQg!UAnxcmt zA!ZQ4(2|*e_pK5eS6m$uEs{!`5&w7hQwZtK{@c@PbxpOJ(w{W7C;Ke*A~~*5IdfG)D3&DK({GD|qWAQ+(CDA?C!A%FT}4Up=6FS~KkR zNwHL_%G~G%e;d(pQ`73(-;>Nopoy$hhq}YXGT{-c&8o$@OygYUxt46)^D5c=dr^^d zHP~C&3p&&{j}yD{Af!ryH^D90%X5MT(**}(?9Ip$RV^*=sJRQ{b5fF<@VbKj(YRv` z$d7w=F%+#|m|6C&w|Y}J;&tbAi}nIge%f<=iFQ&06)qC-q{Tf)sUBe2OSt{H)YfsU z7$PKi*sCb7Xli4DIAP16w<*Vffp%LV4U<5|YeyuyIJ*<%9|h9dTK72fBXwp}P)#vl$$lh0h{7 zrGw7n;?61TpW*)(1S^=8u1`oh3YOCv8XEOLufUu^DB5D*M71VX;VS4a7UJTuZm=T{ zIlgdX&^5`x=>CI<<$ZIN%I{cWROphtd8#2Mcvk5ogTB&>5z_chyrFfV@Doe-kPg*f zFu^ZRl{x|YbsRI^I$@xn>UyrkMYed}DN1_fgD4TpRgVUqZYJPb1Q@u0^ok(&O88E* zb%@*c{Ns=|eHypMZxa}-LUBwW2wwUF4-iw-1na1lbCBgR3!|x=_kZVR4{d32udb^x zbv1>`^M6OE#zEiycw8rfNcT;w);M88TotqW7rqeO9G&;^o|drn3CpXa|U4; z$^e+V%~9OHuyVgAVtLpAiJv}gBNC;gE0n}!!Q=#k zj2&=y5jI)djy$n%Z3K2Z#L7N-H0%(&xbDT@Q)SlBbFdl+T72;GaSrJv2<;pwhI#mi zc=r$Gxgoh#71an$=nbUWR*3nD}> zrfS;N2G;?Nrhl+}p3J8a$_Cs#e++a3pNg9_PhPl54L_U}0NL?%=l@AIdUnto=rZ1L z>*FYZi04;y!Tr|1gp%|yar&3`dK(i9S^C{PYhAT%?cLEbxn(Y3|0v1LTrKTaRN|af${4NUvKnnf3 zjnp@Ac-4DLFDZ28U$ZNAa9^)8q2;??78au|K!-#2Y~c8rRxx4%rfi}{gWMcn5gbWv z8jWudr4;%$=wh@sJH$$7rjgpv(;fRUXzEdf8Wy}^X^+`VKuHYLu5j3yg!}6z1amhc z>PfW}7vsPf89k&n#Blii`?B>=fVzuu7J>3v1hm<`xih%jvB7!|o=>RCQAA%Q zlU`IHGO~ZliTD3n4Bl4>yW5e3^9dBemm!ZP4|1)Tq>imMf`?>)H!w#m2Medn-{A@C z;g5lEQDz$arE2&d-1XgUAyb?Bv?^g`4n4(jLI16D>7Abl zYfAo@S^7r}PFXiZ4E?!9obZa0+VR)3b*Gt5sr(&3P$kr3Qpt(vqb_3za_^I70SSY? z*wZs$Y<$DT#3PB90VG&cJR~IBeHaDg^@D8ddgBPW92V3*A2f}Hc=V-xWm0NN_Z%Vd z>c}DP(`3k^;X68p#ozCb1V<+)87(X<7t_VF!ukb=y{T2KDOK=m8<{6(?ph}Q>T62<0!>riuPshSv`lPkQJ3eDEEG9IkRNSRkO@)@A$m0!lfnb%-4H;xB|-%lxtS zs-mKIRTQRgiMjD+|4w{ySk(t=aOClek4ye!KA1O$;(bq{x#@B4uH`ACnQ{Jj2}`vp zz!bA+1eEbD9ii)p80AJ7~(J7S_55ajeSShhy3XKu{l z0UthvR+NEXbIROxzuoauyLbi03%ue9e!TTc+UgRvWurAnqo5Sc55=N3pe)oSs?0L&+Ta|LR@X4GqHGfRlO_`bzzObKQV2G43B}#c3snLD! zpuUq)iQee)h~1~hHLPWcLS{;oEQc6>g&AJ>iE89$57qm*$nU1b#@E@+3GK_N#VQ6c zQ&Ogs@*o^7|7+#K!&0cVqXtML&mX2QT(l9MB`34OzGl=F5zq`*S85-QD}svs20cs$ z7<<23Yq6CBaMQvjCYgZCQnEpp!Z^`?4!1zbw;-L(Un-tC6=eaZ{h$-u0)L>%?09B= zEO>wMj@0JLXmEbL&2aE(`z80Jg)TEbSVrn}xoxta^RY}|aQB^UNYg@FUScso*%5gU z=m!(5@u6vV8NBy6%)gm-q~qB0G12?n7SIZ!0j=j@_v{q%lOF9ea7`lw-rb~-qUH)P z?Y$whw z^_WMNuc4f!PI{%b9?YDJR|_?Q{_3_CnvJ zXt5^r7O4YiBY#s865to2lV_LMg$d$`NP40|?pmzqkH3e(m8~sPp1aE}h+HrI_v!GgK|BX*NP2VlDB3@X_6ODE=LOU& zqEk903u4gMFBR9{^KFd7SeHsz&x0WasgSgWE3GpMLY2meU?*OE_C1iR8g3Y4gi6(n zNJANU25I(IR<}lGXUUGD=iho3Hp95Ky@)xhV3U_ErZ_2#AIwKqm^ZS0d~}f9_7rm+glm!u!1KBKf5UW zO=g`v2B-eoMf2F%S{tj5uZF=)GBM_B(b=9*6t1n?!ItXq0yN{Xv9Y8|FxoJVkEBU) z6uv2q|9SnrUlrHokHC{0!4JiMre})`&!%0UP70z_V&lK2i`T#V-7=cQ(ZSJTLdV|1 z$;lgV5gU8@(!m$`DcgN~b-{+kP$z(BXi8)T6-*X(m_DlDzM-eis#V%rB>?XzF7FTT>%1WpFMMG82(lAS@PF7)d0t z_#i}`x@KK~^;7E}?~APL^YN$Uxg@La3oGy1y3^f=yWPd5v5gOGQoez!`&E=pW%cW7 ze)&-2B@Yx?%9Qcb4jw*TkQ5a}16!nqE?Nqr_t^^B7gkE~J=Yy9ECpKxEk>vD9qDOO z16GJ%3|h>8v=~ww^k^wcW3XX39)cGLscfWOfID9}8#D)>Qy8*cgrA0yRm6O65n5YY zS7!RIr_gO?2FE$vU{~O5$a%1nQ^%jj*}loP^cn88NQo74p$*k!wO!XZc7^RugpBy4 zVL#{;5x`gGo%)`my{tgQ;pXmookB#9zEvB1O`)PmwmK38TPZjNlrgQ1W!=D~dB2z8 z$)%g7-uM5$OxNRP|0b%p?wkdB==ZY$U`+*HC0UKZmw* zZMqwig-Nwq&+*VY$GP+@nkrXGMlqt7UwWX|46BxjMJHC+Fq}elyX~aWm6LB=`n_4@ z^rti>w#`n1vJrnM-o%N|XXxABeWz#|vu*dp6p^;XVg%~vy9G`UsYa4W z++ZO-{?*oUh%2WgHd!)Ib}){>&4pp!6iSBST z1ia}gQRYpN0sas`Vt@E45a~reFn-}y1>H9Wuc?Zg zildbw+PFXHx5zeh*x1x;NCoK8T1<~)mWTX!?ehNM^?y&!tCtkxOA-2(b;wB-CNKH0 zfWihrMgSM1V_7aQTuA}o{;iZI@r64qmVcO0jl}`iT~O!CsqG>mueOE8BtZB=o`#M0Rw@6@Xd$e`^Y4rurp;?&dI((gCrs#oXsuEf zlSMrBKp!S|?cG{{g93djSwe+XL2#@Iew8=^!$AwVRYQ6qL4)j0Z}vpd*Ok!R>2Dzb zrDqaq@SHIC=6pqHr9h7bD0Ms8%pBuW_R)bD(|<+2*3nyh)t}<6<$zXWXHiV<3n)=C zy562!n}+Tq{k+zXLoM;3%^-fON(s0~p4<`q%^O0C4wy%M(fhj<^MrbSQRG7dPt>gy zWY>^l-pO=!d7NvDAMi2Q`-)0h{mBg44H*mgllh-Ks^b2CdDMa*Z;6`>Is@H#>K6Hr zCeOvB=^q|{dhrn8mp!^E*RDiD&kB=m`aGACYbpPfK+6KcRt-<5SX+`IS>`KuSDZ|* zChXp{&#nEPl<>wnHi4UUZ?!vK& z-OJfJv7~QY54OUKAbM&*d()<;P2BZnxk?SO)w5OUMJ{OhENuB`aqq!wD}P-q<`mX| z(a6>nYFH$33Zi1II*;KLUEYk|i}xk?E>}8XF+GbK+lrjiaVumzas%LrkJ7O*>f(S{E8 zoDNXy(;(y*JB3+aPl-7RHOHdlilo2ii#a7YLOs})snGeKi}dvE)U2^mIA@oTP(7N% zsk{AX@pY;U7Vv!yU57k|M{_ndW{%NuRp5ZdsBV#5Si6P&61%pbfQ+Bux?x|_~AE^4Jy9=iPe=JEKn5^o7~#LX~C z)SZwrw~Py{-e%4&5vk7A#!fAAs98cvwvhp$6ThEX6uR*j?90-3ceWXhrX-@nf{G6k zTiONua^?eu)sRZuh(=?WomgJz8sBs?D^=`Q)jDLR45dCkqRFGNCCjbnwiYy8Ap{McL2KqhA|zF@2Ak(&lEJ-Tecm#Z%`_kI*`T~k)4|DnOlq-poEaubN%7y}Q` zh6Aio?nu9M46Ud=Bs}Rfqy_6Ahu$4@#o2xDA=;#`tfDE$D6pOhN%l8H!n-H zg1mq+Z9&h(<)3*Zlf-`{IE0D>JcI$KJ$P6I(S*>=&tcSqml+wljgc94-^axAMZP};)3M9;H#kO zJ6))!?E@=)Q zS(`dKqAKR{2_HO5)x7H3>j{%z+ttwG+1L&Xb~qDj*6EM7*m5l(b`5KYvjiXhLhkj} z^5P}pnTEYR$U27wkjd>Kk! zeq+oFp=5Z1dzuS6|C;@JG#}mbaHX@fZfAz69p4fT&TO!NH1GDo7d$5`*MWG2OC=RKS47M6G8|h@)OjOfj8M!~` zABqwxNBBpQN^*&HhziwcB|hH;-~5#<@vQwzUVk5QOIDcaEvsE`$2#`BAp71;wK)}Z zW8(7i#!4!k3gDO3%`z9kD9Kr)k%tImHfRM0fwr~;Jf5EBfF~Hi{b-Q=WS#ez5#p46 zk4w}jDC9_=hQJGs_eDdJTX(Pw!~=?!L-(<0XmZ^=@0$7^b#CvTJ^tOpXk*Z(GnqdO z*Gp}84=q%!NXzZ|nv}tg`2>AWhm){}5(OYr3GC7+7Ll%DU$4T4w}Y027AgSaR44uj z5{RKhh<-hH(5ZLN9?@VAxe&vtF@aHN7-*;v(@L2r4o&*18yKy=Q?AI%+j)rS5o11i z@F!h5O=%X=y+#hucdb?6B~&&TRuClY`vlzH_maK6$>)|=$^8yd-wW5dKBZbQcwV-t ztx$u$;K%Qsvk1~>xvUamdbWfNyj(3I&qns={G@=~iQn=|Lm*W_Kz~kir`JsWoF~re z3vltoo+~-x_IgdslrmArlujQi048}Dl4A(rC@DkBj+59J+#3?Sj#lLPb3XNg?)%r$ zwAzpMeSN9^_X6j!e=_lKoag_XRf67oF(;*)CM!KEc_8N-8k!VL-ZY|s&Lm+zHsIZb z7@f#O)cuSlQZc4Irr`+SG@Mm}C~x3o{V}U5@qE_i=#sa8KR{H9d&J#X6WU0k{*C~N(SZcj zy6x|aI&KD8L{WrCNWA+8r3I$T;|wQ2U&kk^B#pVjwLU&41ill!tcjf^6sI)k`l`5M@3T|9w3_;J~-edIagldZU5=o6o zL_@Wf^M2sc5DHsIXk7ON%Aa)PgM@v;Txw1gN<1bVrbxd8 zn8O#+tMK?xRCYujM*-AYUmZLjLHVsqFo%!g(o9;TP3H_hz6=;Y3pp+XW4!wU=ukWK z)QGcMDmh!UDChD0IrEl7`U@ubfXolODvqQZ4!DjZ_}w>00beGM5oN>*)`aCXf^ z?F+ax=0vtb;WBY^0x-idoBCg~?%mMtMbWxMQN~SRkoZ61YhG0NMZ7wkbUo_-4n?ui zZ|5zLaB!(>e;qrp6wb3o9sS{xIBfwYM~hb1);6vS23^Otxcg7KG=R6zh!Ks!cq-4U zp7D{~7Pyz@n@%WM6@r$wAbzgepK;D9$x_Ix#&9jJ%8TH~KeLu2zx)6pd(w7~m?@no zJh>88Bmo|8p^5KYaLsB6I(LE^xYB-}?@_N^J*^7Xi<-aYNeW)MU*|Q{b!F6t&6hkE z8Ktft5`@(%CTqAiD)(FpJKJ#iFLLlmNd9>@bVh)^dF{f>YTr+7?pS}`vz!H#hlg>- z8JfNs>YpfZKxQ{jgPm3q^5t@75Emg~b)hq_{+hcIjPI}r!iih>)SE9dG9JZvC#0Ob zLemX#&e=z|=upvUH68^Bt9NE5PhPvZvgyDqA0$@c-?%FPGn=! zq;6drT&>SN1D`G_(XcjEBaLn!f_%LHJYWfSOIcte;2Juc#z*Or7))EK>d?C1BVT z1`49fpl6s>_YZ3sUM-?pc-E`VIA-8g{cq{t%EOwTKEGq!V`TuPerd`)yi|lrptz2R zg`vrL1&LZXkh@4&&jawZ}pRwqx(f={^ zPQj5jY}ajLA&>AE{O=;KC0(B}!f znW@Vf8D{s+hxIR^I6uA&o9FPZ(VZ_}Vk|5GTuA|t9;-Z=DnE(}rc6tgF>|+|;_))t zYUlmD6%@POJ0yBID8iqE$*p(9OhUF7&N@?X&#f4d08JL0}n>$I>uox z@p4A3LAZ~Wc}k&Z9#p_bQKb{i$=+{+cfBDYARb*EkJdGL=5c-l$8*x;^uU;Uv&afT ze%w?OB=F%D^uGb1kO&)#X3A66j8R~kl0e=;clbRMSXV z1)TQRhcz5)tAe)AS@q$+e{R>n<<64W>V?KzGsY%ND>~*CxrrL$5jk8|^MuguroBJk zo_)S|th%9PG8^t&8)jpI6f@P30KA#MzCEr-@LJ&&)K<<8ric(FL*8$PS@HnPxCT9k z%^#90$^KRG;yR&{E}^B?#fzA74qhqr=oo-BH8ofma9kq7!xb)e!FZZkqlUf&-I3*K zMHBBy^JYFm;vBeOYD8odlk*X`48XYjPyR_UYxlvE7BZ%kKSl$FMWLSxaG?@=+M6xv zV$!KD`m|)ajBcxlXxr}f%`u^GeChP4R9SlC<1M%EJ72;C6>Y7Y94{iVV~F6SEOHv) z{eO;fRw}M`iVMCL(i!BJ1hlKRJ!ff&3-OC;zI|0;mFe%#X0Pn^FU_-kWL^WwbaV7T z&;Lg0M7*!AIwL4$An3^%p|R{FTJQym@;3?{Rx~z2`!BJ${iSyx9#BohO2Tj}&Eq1}W=xK3LUs7Ay=ADq*-H;sXu+h`$EdMv*ylkIA&z#>@a?CO&qQ!C{f@gC zPK0h))xu%^Xyw8_UAerlG5gEPs15SpH@jaycxy^Ur&sVnqj%1)8VyMB&EY{mNK8_S zY{k9#LypoWJOzEcvEfx-t=TSqfh7b3o3m>XM`ez{XYNX;4TbkZK7@zm;Z0HrLg@~H*M{F?J(TrJCy06Ng~zp(+K1s0 zY$2PGCh^ujkf?T#723DUq$E6Slypg-l<3-(AXJnNafES18<2sn!^2TYp2dJi7zqy6 zg7~;Uy=I1iT#x1P7@lmtSt%q}kMIbJFb&=8?Id2$F3Vfdy^P!A3;5P?;bdTMeaY=(-y ztZ0>$rNn4nhtNt@xQCr$Y+*GlnQQ-o7r7+gQsgKDf}G9M-%BQ%gX#Y)0&i{(lvo2T zFb}jw7tf1a7OPM6s=8(tyZP_OF48$;@Gt88w*>^M)k^(P`1;s z2alV*$>+1XGZkT1zrONOs|yjcfP;x#_4;JOxDEuNZM0E7BLsMl{8WSb}NP&Rw$Aii})~Pga0E`%49Z(1-`qrWU04-X7?eWIFpWfjpNz$N zSH(*q4+)A;{EBUgPi3T#vGts!Dfjy&m9WQ{NvUn#UoEQ9^6+>7N@PX^o;7RHVzGf@ z7iE+Rj6F^AjVgXs{Uhz&C#3TTVq@CHm`vs%9{ot;KhYtKWtyaB%6@l> zx%_?5xtfKXxo49$lln4_v*j8t&s=h0RX6o(5r~ilnao6Llg@} zMn-XLdVjYz+uPvK?GhuS%at$XsC!$4=T@E_450uTUn#{1srQohhg+R1D~TW5?qXJYIx zc{ZucI3yS*{6cQmMvp?v2RyBm9K4IFlbSlq3R-A5(Z5FQw#CEX>#{wsZv-!+1YWz( z-l%g;TLZ6GaEXgK+4;kZe<+vRxf^}%)VZfMD8Q+@2hc~V_4*VNvJXj2A~afx z%VA}&rm=LW0Czs-ZZ^COP`q(;t?;TT#tyb&yA2SURzzUV%hGj*!M_$!0eP3T_W9WG zka(#6F9#$CLoiCXA2NUWS~xq<5V;C}PM3Ih!weinjDW`OVAl{0%$9j_92eJfYChh_ zDDPLyKQuLOTr-yc!dIxNw~TY>W)hxR{)$Vh zWv=H>)u?JU^`{24)djX0fI@hmkoXC7I8e^1bl5i*=%d*QYv4lwL%3L zl^47{tRN@0s?{@@Gs;27)|$8;cGLH_(fL`tn?4 zg;IB0;>=0n!n2T~`ROKBhwi60yX@iZSH9gZFK?sGCW&$zsi#+G z{w;hkRCDlMI4W&a9TmnV-I1e5SN)SE1`O}(p68B$s6|;w;MXzB7r5qLfr-6&#}mJo zuEYc0=Z%NpMa;DXACY#!qIST{!D3(eZ;493pX!rTfjbX)6jT~kdIFB|O1m>4bKTWH zFI?k)u0grQxO}xa?~61an?dy?9?2gQAHCb<@sB!fn8#6n z%;@vc=s>Fvh$UVmo&Wg>fs2c~`_czWHY)5XfgmCx+Pt4Z_rI$}UGl3QnWXal@w}i* z4IVr`rA`i3KNSHT1#zYxJN@!7`z;qXICF|ukl$1TfCgBck&zD`H3q11j@BxfpH`y- z$kUceE!Q`aNK?MMQ8J-nmG+-qTo^;F9cUw_l<@i?n_n<1?;OXRzDDl z3fq|fPE>Kh^Ifm%v7%$y{H3MYLABI*(+H1SEPTOqBxBFy1LwLo>Iz{?0Wcm5%vVu+ zrMWSZB_?lUPw0W^6OFlQEd!S%D5K+3@WaN7bOYA_Zf!?%ZSt@2y5HN(=3EOSe)y{L zAC!S=jf?Pq&5nyO;H#`Cq0Xt#i-r5KA3cxWXGFDEit$7bmopVTxIZs{L*ar$Zavng zw324pRKog(zAH#CmpK|)D*=LeYnwJTG5!y2ejGi*w|{op>)KKF5R^;{nP4^2kt>w~ z8EHIr0gKNp1R~}0kNl@x^ipp-T-P94cEx$MEjCq=Lhz5xz7hIWHjxm=(Tc?@=d}c_ zLVA+tjVbLl?E^&w4FaRO`lk8Ch?(!4(4nwu?uN9{A-#rI7$nA`?NNC>2KJ6lCU$-Z zG82@E=y2+?f4|WKY9cCBs92l9j{gqhbw^wYE2OBZ%Q-qaNPM#+fX_n2U~eJ&HoAY> z<&E}whxC~SD5pPKBb`s4blHw_d`7;$o zNILvELMQ0lCNLfe%sj+oRCumJlAaE?XJmU!1RQ5m41Y4hBppM`qXP}SK=2WI8(PkJ4B3&O^bstyt4!3L- zEc^vbm)<5mVk@}`PqLVt9vguk99Mm8K@KEGHx01M!Gb|{p!gP!U&c76Mea;JI@<8N zH!-8tgR#EW)W-oS!Zaj=9wbj{sqD4g2x2nvByU6Vu6TKklf6fv0AW z;$->h-n$R44IRHD`#v^MoZsKLG>suExyHY~Y6-Um!+&!ql~U=LCadQs>RgWy>-TwL zrSt?yK0Wi*v7{)F8qpRik2iqYEFda9In*HS(mvc~3RBUK#WA`qRuZ4F9CuCXO z{2M=$_&uK}j|dT{QKHa!weZrFM%<~7?NfUh+3VXa?Coz@!u}mHBAcD`_H`FKGMI!y zYm|*W5DLf7_vM7TKx7Q0`z)uSSyM<2CI$PxHLSvBu<g#HY)C$)9F*4e%O-^Qos`81;SzVm?*YZQEISTZuWlr>rwy}kDKF(1}nw<1C?5jm+L$T|4( zGXS#N5VBj?y`}x&ycO=xpFg`VH-JuYym8e(O!Xj@hPj}s)>mV0P%xdvr$l5EP!tAUo`RMTsH^@*hc9n{LT#8uTJ2BLvr*d9T z>gyMGR_zm85plH+!6dAqseXit_RI~7+a)-@^u^=2ZFzI;WX+10{{JmS|WF%@qf-Taw65AsevVp7j-+*$4E-Pa@V{Vzzf zJrirf2fFY3=VAar-vD4-SkBf?ppy|jc7V*kscBPw_-}MOShSapI3I2M0jR7#xu6`ew-#+omZ{PfrBb>Tmx@+ae6@w2h_%PPi@1JclZg)K5Uu^~=LEsdj0m$+pfi{xJ$U4YxYeO*h%-mfK z(FdOr>Xp~?XzletNCUdHLTgmku>g?FF$iQK9h3v4Y zwvo;VLA#L|-RV^3H*G`1!R84oZ{b%$i_Z8a@_}>L{$tl_8*oX0GkAy#Cg-dv0;VFE zGP8U#FNKm{nR;H6ZVKIx2Kp;Nvfe`x#5`Y66hC%6ILkPL)D7p zV3h%49$#Y&Z9B(7nS57Cz1)%bbGWvqAj!sB;#L-pcAig2xibc47ffhvp)c)WYBIcz zw!wEzGg#Lw21aPGx%Gq}&Mf$TQ9lulZ)X1nZ54_s=e=1>yNS`4q)!z(`v>m>snaDP z#qR*M8Hjb9KBzJLtQ6G&)rX!2mFX#@;Jc@&|270}d^W9beB(VN76g}hxEp&rV+ua+ zGG#~hd3pII*>l3CFEuyRl@-TWZ*p9gjltbKCehUh5=^&c37pdYbTVoOcE%R~A1Y1> z@FlH(O>qz_pT{j6J@iWS{A4-fQ z;e;eOOTNh1PS6e5>wkaws zKdIUQl3c*>C0`kNSP=Mosp;FYo|6l;|7?Wg!h2-^Sm@bT!M$zoZeP&$Z1pp8>@%gZ z;`4~zN}cP@=i(wJwNZEf;bG~z{NMH1#uzsL=e+CP5@H=Um=!82$MWKfPD#d@ZI4GN3s5)3iseLc1JCVUGBIK8|+S<(9o z8;k-3(s*|^#n>g!6sWe>dE9-YDVaeJ{3$|`y&$3mWMEI@ z;7$O5Hd=!upEm~Fm!%$63`Et$61M+2kN65q!HrLv3rbK0#MyEzNg%2}v@(LTZ%NP= z#i1a9Od;i4H#e6Pz1JTreINHEpR~^-1(H3D{-G$s1S*(j!FS-u!kl-N#Ywp*p5YA3I0yA0bJ5 zYtO{h0%y*UqM$_XGvTh8oW?N0N_|ml86E}(#_H+Ix$^3} z1>q>Va^=1*9Yv~aNd;eY{twc2GRSV?Z9?56^2tufQt$Ax*TXp{7jI)1U$WJ_3$X#A zckGzp;c+o;IAsm*0FnDo89C1akLv*@1iq%cwLj6ec3^IA_LQ3(yJ}qOH zjy-tpq4{+vD;beZVBvZgUFA76)<-n`o~UiAJEAIo;-CuTh*|bKEwNN`0tp$8z@Ri^ z+>$l)t$TI^m%0+g$!Tn1A!+7~=^Io|U`ki}kgZ0Dm>a^0-$KEo99B=<)|U7CG|wx? z)5EKqV8AV5j6!w~6>VUeZ{VXuNqw9z>4Si?y)Kugr3T!mAR55aH{iR#lT9r#@h)#( zh<%y&1Uh_bsMSK+c;+20F>e3O(bPqPSen7yZ0cz~@Xv?Fmhn_|1=M5r!bwPVN<~ZW z&!}uMqb9|OHwmOAY)4f+MV!BIl(;ZV)Itn`fe<4EjR=^n#KhsCU~BAnl)sI8rID8>Nr8Jhc;?J=V6qxDZ8vM{ETei*E+_Og zROf#3-%fdFZ=iI*2UgUfd3|4}htxB(N(|?lzOF3VK|@JR1%ZJ>Er{N7{1msHABPD1 zL;`ZKLx1-%sKh*xRXz$j$`oKi%X7dya#Ag)a^lo^^zR}%+Ma)-H0Xc%JD~xq8}gvG0R5=(#n_ zxwez=?3h@x(*cxy>he&f+}O#9#B8wlZC(Rck3+}KHbtDQSEc`Hl-5${*>jn3fO}ef zgMTOKwSKQ{MRDJhLRS8~>L1N(%C^u^eny8p+pBcJ)WUbYTWX0 zezWoO{%LOSisGp?M_$2qG`|VDfAiqR6%bC`KL8m)(%uV9JOhcNHvE+B$z?`Wg1VQ^ zj8#V~ch6x4TioV(?lfz%d3M&fL-ytwKs9l2boqxgAYGe1kWgUsd=%g5nASG>@B%v% zLbF|s!iq7OPT;q)sTzeY1acfsV0#iz4rHRFs(3W_Y2)yke@G81FLN>g8P5X^OjPJm z0dVNztu02GKl-qY=J?>XZ`l~XeGJIOhQjWIm0_zI(OLs|K|p#z*aKNFfUJ!9fL%E8 zh9Ocw3x)&uhb~@Blr#YH6Bcp^5xAk7Lq?sHtVBGt?=g6MFE&xWDyN?;Z;MsM$hO`aMH5Qg=fxiyWkUn- zQO54(8-RbceDK*SGaronp`~U9sRVPf1`jtm>ynh5yQT=*9m#f40EYf#;G!hz1`KW)YNk@qBRwt;lwh9G zRzTvh`%ZmO^G>qmEy(^aG}K>sb~N+N7<354Z^0EsIMWMnCi!|$Q6hx*_^PvRx@-~? zB_tx+e|b@+;FNTq^C)SKE4z>cpuW%)z{X;Kf{NO!cKD!){>8tMmq)wR^{vqglq)me zJ3h;DL)MOBuEjaj;Dt*|Q94-hX*)GU&{gV3{-bAjwtvied8(RbvQEDRyhGKeN)dGY z`9FpE;(Ke=$lv#?qvaMllK!f(Y}nXdA8qdJgu`Jm9G-dN#sEM94IFv4 zUxClwsWh;yR`ZB5NxQCoFZrM$DxKj>KOYVN+W!d{z(R-qqAWb&6BHCB6|IFL3l}G& zX0IGGT1h!eamAtr{9TPBWUZ17+h#$FGi)D=28MZ}6v_pBl?Dn#OS1CtB*i%pefUY@ zcYGQO`aFbRH{#v-PvD5Q1BxgMb7zb6$E!5Iu%H|(h=h}(mN;>k_2>2(Sj?QAli`TD z`&!m;KgQDJ1hf1TQNC_T8rpgj9}|!??R8=nD{Xd$V%(g|$))%XycEd$--=E>0Af@C zdi<9PzeDFBk?r@-pxC0Ru>agUA1QzEaP?oUz^Rg6M#DLrasVOJ{6_MP5q{RC_obi6`~BDJ&gF+v&|Ssrj)}?tZ^u=AumJM@e%*dP z-}oQ zX1T|fta*e!Bjs<6d0eon6e4-*|83+5nzXyN;Az};q-v?~5G(=J9UwGlw)~bfXIN(z zzQpFXeulVKMZ437gheMXkWhMbFN(nSi9|b_VT^H&?5otpJJ*+LhG_9Lh0@C^+ww-? zXOglvU|d#H{^W+MvWFKCAfP>J2D!l`JF4&$_bfg4QD7wO)uk+L7M(6y_~w>K z4|4N0aGgd`6?=tr*%9(Efw!&WHUw)pZr5L!ihU~xeJe0g(=$S|rl^)0AR&-s5R61$ zlVOt^ZJE%ZBMuc_jy8)HvkN138Y-lElND4 zu<`K3jU|yZZukTRiPRHSE2Iqxpb3)%yunQksYM8?z6wH!)NI)X^Omd_y@xN(f%C8O ztXu!t0&T#x-_P3GJoURgi87kPw`v`Lj9A~GxaJ3{0|Tj`E}Y1Yq90<6Edvwt&bnCK z**i#M*d{VM>0kN6R$3`R0ovqwGu7sR$FQj;6%8174u$!jEz4CIqt$ZnaGTBik?VG+ z{N8J$NnCQ(8SL~&@`{2Lj8oJ~Xc(mXn1~D&unl-QW%9VEwd!xzO%sKTC7?(B zLUB8$wUJTmMwh3*l zc1HmZn69F>MSsw2`BBcQD^A9JSNixJx*Q@PKsP+U8sOt`^rdk?$sksW5@KWv6Eg}b z!D&jeOk)~v$H&-pr>b0e^oI|fW@WG%g{{kJZygFc6f>vyVg*x#c;Akzf`G{u&vte- z|1lc=Tp+5QNY12|2AKqg)Qdfwt2}&Ywvc<3Uz@@&Qe(xw>Bfbhha$jp(5tfTxCv@qc z}`q^I= zBKCu*TvxY|S0wJ`7EOdl16In{K{F1l5L1V35wMhC_?V$=$ik@U;Rc0wrhs2189yNM znY(oqF?1=#iz%&Uh9R)DaPjX-%t#4kokhR@WyubAeaA}fI7}u96bor4iTu2VD1VtX zm)~lsRu9Z#K*z!pE-0WHRsfVPfS6AMcY}vS^%G3K4}{G!BX#>V$z0SssA2U_dALgi5>aYzPl-PIp=!W@ipErNdGu{$EX99iJT1qtj4|*+j zzHJ(PJUqb^t-G-_Bw&Pvc%-4Tci_4_YZ}De199E=G_hj0>}(v5xpPvA$e{5sHQIkS zCmcxTifCyLl-~<6Mzca#-rr%J_ov@lG3`$#$8&(qjY9U%9CM3cg6Wm%t23->-i;>X zwKzFBncDf_aUi(eyg`5n;6uZ!So%G#5j7i!oIrZ;{?o@3?^^h0NfMb71>5;jO$>0w zH#-Y2H}DTl2BqqCcG-h^+on*7v}X+GW;-UhP-PAIIjh{Jzi=J%Zg=S*gklep7>u&5 zV0Of`P*vIZ=n8w6i?_vem}C&)-BEIjwH!IX9U#r_kTf#`nAYcxsP%BYW^oOo9Kk_~A=lklZ|v)f`}`C-oG{31`cd^((|CW5EK%v0 zf%I(8p;DxYb;i56nywOIKu?|pI#vB4%ZoSlvO}7RbJI7lwT2zsLEV)HXh5h%5Qa`q z%chALfX*|4oJy5|mT5u_4!jp-i=}@Sbiz{XDpXk^!Ik(p8ePzm9%d4Ck4Nkb7}?@t z@rVh=?$(ev>jMATGLVRQWT4lpkVMt(m_sM>e!lPHbyowHskL`ob@!UR=Z;&8h8#w$ zWhjuLe>*#4a!}r?dlXN=NBM&hq~PvXF=BI5SW`%ec7Pd}i0FzNwm=3DdP!eToj>%; zo2Qk5i_wCyOFdfvWFU5LAh2m5YwqKv$eV3N!!)DbbR;kwymxktqp)Ddp8V=s?7HG2>KGg8+=u$N7#RSDh zlKqxpE4EQ1mLamc3UO}a#^XJ^YlNr*71?DkibYN$(FoaxnH+FoJlTY&LXtT^tBk*ER=d zu9(RiDe_~t;MW`vW?_OfIUmLFu*_X;e*Nl^q{bT?9mUV@_Ktk|q1n>f)^Lm4%87bv zy(=q#qhx@tWS0#P_(Tk#DhLmS1|s19)MPlPs;kT7Y;JHDPJ#?GX)TioLMg^>w^{n& za?eQdbwER;3US$*<36T0+1-up+s1KR;l6rUn(W2J9?BGF70xUbO*Uy>#l_?&q7N?g zgochTLr=|;C{?v7{fp-rLt{4P!Opa)JvO>b{kM~mk{!>DPlroRL3#Ghk@I~$K@5MuslsQ!f1d)5z%~H&t8$jV`kBlAC|qz2c8)6g{0^wtmu21MDi08 z$&9_^jRL*fEGmpRA?C5yLS?F1H3tw9VVnQH2ZNv?7#n&yh}AL51bys@jSLv$M{X~N zX-SQ*Uro=3TPe9~t-Fa2#M^#GfXTvcsx`*np0;hezyIcOp>X_5w5-*!%ReTm{2Klf z_GWk{Y}lz;qqjB9%&lXda)e+JTpju>N*(;LE&Yf8BrZB$fl{_D<=EuTIY1Ij);#i+ zd|%-GqWSq4nnbG@n3k{`NE;nyEE_yt#vWXT`}RJi*$gh*Y`YxvMpzWv@^gVY%{ryz zKsu4e4=4nZVhsxN#v?mH5Hj;*udjP|$?+V3dh?FJ188a*8dknQapiZW(3mt?>Q~;m zXw`j^BntE-HdxWIfUjMEK$k!?6^23{4VjVW9^3x4Mq3Bg1IFjnty?KLMrDVX{1H@C zsfR?mcb)2;QpT5DD+uN-5;uhpTtE*>a6sEK6mz$OgJB_|XzL6$WglIayLc-R%7oKa zR__u?QxBd{b#L+LarJnd7TSRq_I|v$*18r6zytPB`wN}le%)6>03Iu4G&Z}QD`gM9 z-i&~zdzW92EJH=A6Pd6VirTSfns#(!(zi|Oj*%<$L}mWauKbBFlL)0HWOefB82zSh zO#wOOfi)?@Z~#&^R(W}Avb%}A*~YdedTXb}lRA2&xJ^}!86i{aI_6&t?xnU`o|9Z; zjZno){ljwN%sHdSqx2ts0v-O3{M6;&UGJ1QM{$~yRQ{N|;0hWuP@Z2~{QzeYRF9K% zpkh4ZOE-}suOj!QUXn(`@6iPS=I!zKoZ-5pmUxud@11#toOyc~LpeElhd+a-Dc>-W zhHTvmMLGYes)!&jz1wOs+(818BebpU(y9te-)2w#P688q&2b2%_ZW4cT9E$&7=z%O87rd)h*2?$$s6xqSdWg1F+@5u0C|FSSLbw+* ztztAiBYZ**y&;Kg=xrSm`o%!7p}n;^;7b~A%{Z~BR=t{k>M&yN#8CdO=iSoEU8HCe zsz%o@=jB>_&9E3$011y)xCk#t57s7Kx0{)y;8T91RJpHY8oF4w?~c$VzCP%$OSv&4 zO*=!~zW~o0a1lIE{S`r}5J7ntVnNxC-O$b&wH4v>>vc%`UZ$ZSrLjN-HIqqpToY4~ zJN*yx)sQFZ)WBu<)Is>PW#qIYc0gY0sZ<3Tq715fu)3j1h_vF2Xj8UvQ#Ky09NIW4 z{K0J+jXs^Dt%F&Ski2F&O$F=R%Ge*U;y4;t9m+dCS;@DCpPfgdC9gpmUv{s*=j)m$ zankBw5{R0bH+RM^4x(_tsJVbkdUT7{Z&H77!`1>I#4YHCqv8+cDM;&yG6Q2RnC zT;}5vnEg<8(!!x(K0I?MdR6!hQGH6Ofvl%DnFyQCYo#N}GEG4oM+Q( zY}Q#a32mq1auy3d8s-UYRpfB{xHSQZk(uRgbqB@xi?n|ig+vXU7#5HWD*b#Z&bpAv zWLXY~$gcZArOz+_2FHJ<*aBB+uZ(o;Sgd+t%YQRxU~n9~iDd?jR%~oBYyFxMXx1Q%Q($LO(iz`jlBgv&l^UBy264(=VN$UkiDvWB#}} z>FclX>J2V-tXMjUm_D&!Le9oW|Gel`lP~ZF3@} zgc98e$Wa;6tN_8s^g0f2+1bvh@E|o1Mvh+2>e{;GZ0G%-ax%c~Ll&O@)0zWz3}tZe zvDmk79HTU&Dc(P%t!-lTVmf+cVH~mYK*z)*D<-f=!7naU1+?J$a{1X={${vWd*}%J zA0a8AtNC{z8z*?hM#OO&H)mT*1M6PIJNz0O4|JfA{qNGmJmn&uegn|xm>SJVFIs$2y^W{ zg@yP6Cv|vN`3rV-_*v+h4Cpfm%}H7Avqc#ZSFy+KBU0sxoEyT%_tgv+Igu5MZLDK4 zzL!5SSSSK~XOJGA_Z0PUFx_=VHT#n;KZ9jkF1Z6t5Og}wM9cmX(|u@(G$0vaIlB9%>E~`b<9+7MX5xOjqn;v_Li;>x#qQdiRrs8? zb>g7Y1vwAUl5T|2q0)hx8<=nM>L$gMJih+c_SgN7-?VP7+8s^Zy~ERj2#6?jm`QZk ztz7*{BVk&7tv^d$v%p9vY#&44Ycv3|%y-2THnT&A69fCMC7rccTLzau^Kr#@Nu&Es zlGgw!*17Ff+O&fX&HWDTg~lHJ1>9sfEaXfUyG*OQOlzX}8qC@z8RJ&jqA+Hj3@hW} z)rmP1;HYZBy0De&8p;>}T{x-JQ@Rj^fj92BW#+IGpNfI75Bf_bdMu?e;<@`cg(8Y^bKY$Py^ZyyE z_Q+^z6=uum4p5U=i_?02KhevBxG8S01a7!qex85tX-ntq@i>46dA?ZNJNlWBn#eO* z01_hYKTa7UAuq=_#ihiwzXaq{18=sji)(5#44An;0xchsxkc&HpekXu$o08s2ljlv zx5ZgPb(;Q2+t8;@*xeJx#xW`>s)~u2%GP)ns{aO1mTaT}4Q9)lS?(;r)_6jV#Fk%!J~DCE+IUzNlWvCu*q9= zN7|}v->GU(y0p;?^v3VolKb`f^GpgutMi9v$V{581xFo_+^^PvEQHdm_|ml4dz$#o zTXpTSa`bUwV)WL}QV~h*sVp(eFf|dkl4-v}tL{`#HB=@!{UOk;&3(1Hwb@hw)fg2N zvZ?B~W+OMX<=J(t*4m3}@}FU0xS$K&%L^nmHFY@n$8NG?kWQKA?HCf2|8$Br)#FTB z0{P=>nlojHB?pbtofR??@@e{~BzJ;2cYDwEWxm$snh!rh#%=;8?h2cj%#TCgg1 ze=Dr9_QFrn%bZX|BRdFu-OA}AJjDbiXI_18;69)3`ug1ZcYLlWZ9SdHv7`Rhsm$Ba zrGMV{>qrBtr2l#{?_VAkHV}1t-nYB_87F4gu@f5EMW{9rJ*$^2FV$6A3+kBOCO2x= znJ4kJjqS_W+rs8@TeNv&jP&*Uhx5B6q zh6I2%tGk0EcGk9+qFzQKTE*B#GXwvgj4dK6r`QhHdMji-1-o%^OsZeZanI^)Rg0K% zA4b6>SVR`L?F>mXV->0pFUIzE*3_r^s8gJklS=9NHG7Vid%2p$yYg_>(w$3H;V2JO z42RJGfY#!Y&I}GHz8o1d8JJP%Hc8 zNYk-M35UNG9MRL2F_MdaBI;>yDLYO)N|p!`}?n`De6r;NiWB*Re$kcR48BMcnr zKw?`qUMAhh>iWy-;P2X8N7R?#5D9Iao}P)RxgqFv@X?ug@N4|;$VdyUTXrQ#AYUbM zk9YGSEs){$j+Uj3Ua7Iu);1VAc-87IM1~m}r~J#h#>C3^D_KskPWdq0+{XrL8=53e z`pLtixV9_;ELeel#QhG(%}tpRTWAjhxFjz{ZKR`A6HsZ}BVLn^{@B`CMpO`R3-$CY zF>Z-KTiTqQ>zU6Y=w!XF`w~>`<%9el1$Oc7^~hr>;-oR%T~!6=z$DI4qKJh+F%7Ww zB3%cq2*Qjjy*KSEq=&YREl_uJBFSp`n!5UwisdkmiWw;~Sy+wJ)ERzq*4sdKK2n7X zEx+8Dv5-Q~4^G4)Wm}YMM3cX2pTZpD-Y8VN{CNnf*{D+Q5&ed1vD}&7c_cewY4V)3TGy7 z2oyfq`8i?xnxt2qvbzJ)5E%9aCPYL)UEPxq;F(1IxaZ*bGyb*=Qq_rk{hLjuKgPpN z92U?0p!ufbLX;UET~T*Z)GBL(R|yY$FQg6Of*|#n%b*O;zHkIH8pSHe9=SKq*6sa( zIZGlmwD`c8y^)QE3!s9qjoNq7qx<8lOZ)P^GK@&&y7t4v!{!>N4-Y3fTkl%IR z7y!`OipmiQ`6?SEYSwrb&m{*1(6<1HsywoEZ2eJw<$<1s1#hawwj`W?zb+790RVC` zHhgAs`NBBV7CwIQXaeb8`@UYl{)^ox*y;?k=ME$6bXmP*oRcriFC59~5I3BzWZT!_ z>H>ST2tGF`a_B1+azbL^YIDG?2fMU1P9@F6WY)a7FH#bD+^zpp>MnX!cNKX8D2KzsI<};p~%Xr&;S-`0u@!^EY-G`SDSV(30{xxJEPo! z?x&&<`c59|WQ5L(q=^8PGD5x7#J#$S`y@bz1NFFry{Z&BJGw&=HCQN11^8dbsuSfu zF=^>BL{;d*;8lPNa+u(H(Y^T*Yvy7SU$`JH1=9INF?^{|Jk0pi$MhY9pWjZ>WiW|m zRKgnIgT1-@PEV&~@y&y;H}tGJMwMmMVeM2EyE}`)6^rUlz6YP*_JXjS4*n7-Er*eag|#LGo|ZDtVUBVx5z4LukCJ zWgLu)vWU!?(+#}1mr1=ZbT}^RU#2RZ=XQ5{f1Oc$dpt>VcIicAZTiRw{tCDI!c4L7 z|NcimY0}ngkS}h8#3>`~jd}jhK71@Es*DZ6i94>%J`t;mV@(j{QjJiP<3bZ57g-?p zdzT@cH5@BQ`y**)jirrNUAPf>`{H-mAKn-|6W70f{I;tj&&TqI{trNW7e z5Dx`$8N*O}H;G0cW4CwX`t{g~|e4RsN+6T607hD((uTF;%O0AT_< z{p``F-tR8|O1hJB;`8hU;L z8_+W>j19@Uk#ETeQ2E#R!KJvy)pr&u7DH7`JsPpqnsOz9M%A>cQ;0~aQhlyx)Bid*&?%*S;#8u{mQSV@N zbr=Z!XP8fE=5+F5;lsJ-TId+=s~4O6#m^^dv%&$ho~GPe#A!=!ilJyjjMQ+E)s>~s z{dR#5RIOTlrK-Ot2J6S$!l9N@ME$3$u)gA}pS}yNNPbb%yJbTM6sY0>7K@Y1Q>5#X zaTMUdqcCgEg^S@{GHUJz6@z_~zlBEHW7k0w5p5xUJUl)ZwfB**oE+cWjR;l}MA9BY zcHl}8f+;@s-Qh1|E+#oYCxy?{|7B>Dp|4hb&Ffe(QlzEpys&mK^Z06oZHQ-Xv)GfowMSN-YEbcJ9JAzq)Hycnlnp(cW1dKJn@mRWf4n zeS2e_+erF)WdWiq6^INq_o z7Glya>l)ugm&y~t06$Z{TY+-YqQfNq;=|s3CSFNUyA~&7d14mYSy%*M)%>gRemO)V z7WVl=9z-cnxq9&@A5B-lB3OLWEk2v;XssHTG!rpzY)QFXmT zNhjH+@~gMp!_MsfZZq(0;NxSclV++5#)xO-zlO&@;Qv}4yZ!l^Biw|q0~nrKEtai# zO02b1B$%;Z^79TFAYbZ6kqx*Qd1nQb2VI^d8?p2sb7^L@qx88AA=;k+%HXnbEX>Y< zkiad!pV&CVkpGXQbAGG5ZP)n9wlQgPO|HrIWZSkT+n6TX#>!2$ZQHh8dp-O83p&;h z-QVLn@i{fL_0X`C^6ScF08+AQ4-MhjxwywZ3o`SOrZxv%|02Pa!zox9kIPbg+`KTn z)-uRmnpT*&c|&XCm>aLoE-!n|)bDgW_z=I5C56}j^3R7Sb7UzgMG&(6{`Vg>wW*(e zpL|2kotou2z?V3|{YuMT{RY}}hCz!>5h%=%V(7@#h!J0S`&Jr4Q~MVKPC?%pf+6NU zcgQ>}@mDDpZCD{@-Q-^+5iRd22kHn6fmvbT_OcE_vx(PMnJasZ zLLBYl+@HS_-<6@{fwO212Ck=T6#Y9gv66GW3$W%fFiL0C-0c%J9@?q1r|-}lt`adB zt>0D|%7z9l>$-PboNu>ITywkXAxfwy9okN~;3*N*)RWQp5qoXwYmjtmRRo#!yGL)) zor=&ITkUn)LOGleEbRBhT+Ou!knjXJXZ#v2fu@VBQTu^7ZHn96o!kp;Gre+RJaO5OmuH_VO|12Hhm)t(3Oj9^ZV-h|&zImjHS---v zCo;E7!W3-Loye)AM3UxmBUHJI64VCG<7&Zo*TQS#N;Qs5=gHIR7)gjdnLV)LY@j;z0w&rwQ2?Dt%P&vUmYE3FRh_-Czze1_{W(yAN}@@&fy2IYVPR`3 z5&qMD9rg5cp1@ahV~YvO+V^!y1VT8ZYyH+RtP&hBUA|2&Di!qlqOGNMZQu2dMa1h( zzAE9w)&BMQ=Kd9g!o<%X`LyK$la-ZK!;|HHeN805`tME>kRir$W{WfK#ad%~@2rq3 z?WDIAUDe5u+2KxvQ>E84093yQA+kU*E?h-u0J5gBAPv^_Px<%Am(FI!+-p5j6y z$Dg*R%blyw$18{3e#p5CM!oiMpnA3Q?bq%C0(~`uvAGukcALSn146pz8|j4*G+=d2 zV=6H4G0lbb_C?2o=-8mG*T`QX=NshoT>BL0YrF4;3ZDmTz}m32tx z1S9rwLWs$k+#Q+Il-&2QcMFf?1WSJnVA*^r`rbq*b_Ag!eRZn;m)Dg-#8JOI-B9&T z(zv2@-mmz6hQ@_M=^yF@ zU%u4&QGtYdnRp{>3oW-NP@gCRgg&9_^5y+%z~~@)C>{D4$qi5dy(xX}?af4=e!h<* zw`G)XAIcry)hMueHN#=#rC8izR4gB+gwr538S_^=YX3AJvnyFK3 zP5&^=w*`1rk{Se4HF3%$QPPw>S|e)-9PwWikJOtRYlEAYjaqThaLjaN{V1*pz6KPo8pwb5VAurey<>@fx!(RsdyR!wTQPQSrqr)2SI^Is?A?1BaHTqEEJa{YAQ?p!VS{(ZQ*qTA0sx7AIB9~^68OM9+csT|nisivMC65)=xwzeiouAG{aF;q5J z;_!NJdD(Gwe%zflS28_6?VmPB)e_lSUqA2|95w@sY>Z}BjLFJ1qiu&CXte$5+OS(W zTbRafGQ%MW0K|(IC6n7Bk#ch>Ue&)4($ip2xpSE5rQ(s~E+QBKVzWccP%Jn!G)^lJ zqk9S>TrIKOHimRdALrDSY|WtoNUe*J2RUdWB-NC>iO^ezEBVmkqjN&!;ik542X(P(`|ETf1jMk8xaY~*xe%hXlV8p-3;_E zeR56@{EUf-*;#EkbKi^pnF{BG%iX>Hj4~}0<`MLeo;SXw)dFcxv2*& zNL~8c)z%c{&O%cqo1o$$prEkG=*4E}xJ0kS)ucuj z&5hwda2ni=O%OuE0{*EB`RK~|QW7%p+)wWL3bXV0I=%MOe{sQ-&AnYiS67?`A0r9; z_Pn82(6TD-Jp}=MNWGzO^!}weMYS8BHYb5^XdyVHV;m2_baD=^JE0-_nA$=r<-h`n z4f^pL;F04QYwKVAjS}I(fxxRAi1BqQy}=w&3F^hI#GO{OEoKv^Z2MuMDnh7`ly_x@ zWO55K*M%8ThAL4aYahX-uKzfIl>NdjHtOEJ?%lQU{{Z#zIu}=ywYHX41s*aJj>#y> zuUYVVzM;g^lNWoYGtVydj3;&|Ag=N7R3vrt?Yh!2E*He%a&U0ew$?)3O#@c7(?MkB zz}gwbXA~60Q5+2y={L5@UF&zf8SGUhJT?})PPMqGpOKcSPkq3{GcHXjXGG&H!tB+kw5Kshj5k z1V|K-@Q?xrFJ9h1M_M_R;%I^&IG`9BEsjjILy^*6D?cr&)DsDMnTiu0NkYij*GJ*Z8m_!)$!ULP@)V4 z!1q8zLEa8}+8n6%yCcBH>F|4ExZG+Bo807gd3>lZ+K48wcOby!yVINOGBA^qa`6FH z0*dQMNNP3UX(5D@|68QL7UYOVxXQD1O5u0$}Kffc00T_%a*S zt1f`&u+o&N+c5y3=^zXRczk@swcrH@sK}7r$QvGLpt}}xfdLc_a^k-v=>v!4bGB26 zKj7(rKn+dpkd=$jl|3}UKP~hsG?qu5WFpmeFwDGT4f|^rs+P@abn#zWF~mOVh&kQg z@LB5B=xMpEt!xneUN^3cBW-BpWs)vfk=7{k&Z`oZ*Sa_NrqDcJAmav(m=dn(R6kox zr|CtV7xuR*Ucc2_msdNkZLoTS0Q$Ed*>qce+aC{mvp>_XLH0Obr{e!k6}LZBz_qaF z<4d4&WmWRr#&=2zv}{`P-nsaS)F09#z3G5y^~*0#1{e$I!nKQ!81UK$wNhou2BeWdaQ^zIKVWdN!h?SbGLFaMV2 z#QM^k)J`cq@qetR$X@;8@V|4GPlMMSKAK*h9;Q98{g&06v3_85aQo5cL&R0b^WBS~ z9w0or&{-ZCN~)Pe+o{}z@0WWOnx~YPfm=4D>t(O05WIrGmvL|<^)CP9vACH`Gessb ziep0VEEYWL(VQif$|C6NhxHP#FjdJVj{csUm4Wfi-&)Iyc8${H<+6vmbl3*efWr)X}y88I{RCYIQEI|8_bqD8#j;a1XhC zY*^N5#l9E~uW;O*E@UA;I~(9+4ff}P`LrVnBPZSprusXKzQ(7{7zB zL+7T%q^qDP2~0}q*}b9t4xF}=0b5IthUbw1PI;U4+<(!mJ~Cwum#WL8UEvFB20+#`KF-u)(}}`na9Ni zOF6t_2>aRHS(PNnjYj@YVw;)*NT9uD(?J8!fs#{IE}S{q6Y_mjuhtWBR%R6!AKDh+ z6y3f?y_?D=t?7uCDf6els3*^>Z%XNbs(UHeBT2B1dZoVgSikmIompB4>bwL^DI+^R z;KB_nqD*ObF7{nw$T+7!A-GXjAx9*DvvN$PY59e=;huM2C>(1jHo)JkC zvZAbb8oYYgGYkGq8%6ntmG!(-4|LPd+l$?_AEpOe!~x+kzdn;#aEHc|@*QeO&C^b9 z9A#qUw+9b^neP}1proGr_v1>EmZpe8Ka8-ctM9j`aJO*~8p8|2Mydhs$3}kW(lQ?@ z&9__4)^{A2jWT+#bqDheYxQ(qXMT4x`YCo>ogWjZ)&IHCThyljK~Uy~XYl;gHFnU? z<0`wd{cD;XjR1KE)6va44jTe3JzCN>h&uwD6471;zGtENi}x*SIadfmS6qBs=A$$ zr5`oJ&J84U7RFfK5DK90zxBvW%@p^7iKzIUUsQyI6fJvveB9rAmNIP465ek-ysso2 zB&W?LrPQ*ouSz>d=NFo<1r?w-CRM(4$b|1qKmx{{O^zsGWYR+DC*NpLfzFT;fNmQn zQvuadN|HuLnmAJMLj;t~sjnYCf6GHWG<5O+D?yIlin%;f0)CRULv^+n7Tg>pi^N_L|8ot z0PG0>G4z{C0f03Qe99~a->}=n*~9F@8E>FP19Dha57aBKG&#qTT5U`1;E3N@5KOc8 z4SJPMYjB!!2@`0D@$aLW8KlAhTgI5Np(9$jZGl>WGThcdPxnG&s%C%-s9YsN46uj4UMHkZG6+MNN{qpN-rA%E%Wk@SBw}0f=0JM z1Ma{BtaYz@R8XWi)r)HgKx4y^$7sN^V8FFK{7_JvM_zQAZQ@;Natu`st{9?W1m?sr z_GDkD`R$ar|KV4P_V6s94Ap-h)uVGwoMsRX=aJt^1j3UU5 zM##@lG&=Y{t{ylrAyO3{G=QnN(gTd;zLhGvIiU!T!{gQD91&e44PW^dIrUQLHt}#J zlych=TVDaA8fm4{pI8s4jOrj)2!%Iq^vhUOZ-Ql7h$9ryVAfMmS3PyU(@!cMFSgc$ zz;$CI2t~V?!Dq$!;VtK5Lc&k?{U*jw=VQ7IQ%C?kWY0^7Mm5zhY{`xCA za`cR)e8!pv+BsgESzLrJiRw>iO|?1&4OpR^8#0oVCKTRI#CMiU<`zDD(j);1eR$Yz z1P2suV#{%KRK><4)xw<~g0S<-Od?kRW=UXzN&3c6N;L_x>u#MGBio;&U^<6te|~$C z9^BTLu~NUJ#7!0(T3Un^JK)(Byk! zfFk@Rd6>@mr{ekME13H__%EWkEhe}{I`Bm{`0)$SWo0mpgAB_Vt%lYXd;2+nvRn8% zHLN<#G_B{J*cxH_qzEIBIkW4Ksm7Nb_mX*lm zh;yg)LObv$?!5ngeC( z`$Xug7>u2rzoGoVW_!V(-oLAL4qmW1FrQibxwZ3{k_B={;^83O+zftm8~o;4z6l^? z#LvLrzO<6?(-(k#g<;C|r2v!m+~o6l#LV$wPbag~swaO9gMRsJ z{nz@ZLswvtW3i^Qc5(^sTV>P{<8~XdHvtHwmx{~N^Or*(-_`uCiTC9~9gfPV%ugw1{=L7B%VnLP z_xgBdO+rn*um+YF4leq6qXHX3gxCmFpHx(G+pk4*nePaL(!US33a2&-{SZdFDUtQo z_x1%aR&msN@V%r0FTD#?KTbO6iMFaH_SUSkTfIvj_8X>hDxlOp5BItlHamUVvfq~q zh`x{&VF0I!F$r^pIH9gFfod}yeBw}L3{s+A@h@xp3ja5z6LrccPPN2$guJ3# z^IC0yYA`*zYXKgw2G{m}m!z6!8g)e)wKm-0lN;zd32U$gEG`mh(3Fu-SVk$!wvG?k z7z_*&^#P`lpVh$t4V!Wruui-3aDLo_i7z0Ah!S^CMS>Aopb4kH2{}NMMTA3h`;s86 z#0U2A63*R=@_z67VGTyaNaKusVH~XN^eP5|TV?dWX@FQEW=DS|7h>28LHMigMEJf$ zIAHcVi#HLE&c}v@y?w~kkr;2>c4TV}32QC>$BrRt**^e4l633r1|BFH1qB5Q?O&6^ z+X~YlA5p08-Y{Sv1`nvHu8K&(Ala|^E)wBMK0NYuXI^h%VR<0rQ_m(R8!@vo`=_cF z?PG7a{BQ7@OuonF{izat)a6QLf8zo^b57q0J!u3FApoNnJoP@{b3$hJ8M}v z`D>L$t~Q=inanO$(e4#pyvoBB?cb$1FIg@OMJ_^9|GzT{=n$&Z*uhtA@ch$UH_PY8 zC&!|G`ox10L;bngm$i<~gviB}<{*~m9aKe?y@9PQ)|CF_-T=_!^XYY!wuuVsjw?0O zH8sl>EH<{I@F4Z`Vz1XC($0k5qDXU(=$Daz)V=~KvJ*pz%;|9dtKId1#Q(XE ztu(?Gvr6_JtkVDTp8>%YlUE@`b_F1@-k1pcvJk zuSBbrnMK$J)3EHRIvs;G#jt_VAGqel#W&`Dx1>$LKgiL9W$(W{5A-1^z5+_zP}9Bo z0e~h>R6y>k$7zyZ(&N+>DNT(h{$pmAPYf*JxaFoV=Ig%)VPy?Gu+!UCh$Kr7|Dpwp!ETv{CmHd4 zc$e&0tck5Gf-2_8q{9-J#~P9?cjHohY-;+c$;F!_m)}+o!>7yFE3&$046@gEmGs}bOP|=uBNiL?i`o%PVq9Q|uJFmzSi(#c%m?_B{ zO0?*3fg0SnedIi>h{b^2K2V z=U!V)LlTsO;?I$%j?MUSe0j0=@m=-Jf}T>GrH9SPX(P9vTzuSLB~X(?Y8G!t^!t<` zc&($xchO{P#&>JXSGveR_A05$CY`f_BhgUd=6lAfON?Oa@YoP%-l#p z#6MAd{F%+g(8fpCs@EnC_B+0yzfc3gMFE8Rt%d?d&QR1sG&DzLp6P3079+!wZ&^Uy_pVa`XPltFi;_$2zz5 z4o@>tb({1&PtbpS){y*?uu99_la{{Evp~$?Y0G!AuXPy6i2s=U>-vcwF?enCi8Z%w zZl2R~;*>wI6i#=p8M>aF0#6M{7JGFdIY&u%CzVJ8NpH!MUz~gqp~4KAOD!JuhZUBy#U2a(?dkHa4X} z9RsKd>IQ4V`h$qF_rBtch(2?Ca&cf6mx6#$;dq@{{^dMX+u9kb!acTBzG9{9^+f7_ z8$WJPvS4HA5YhjAMAJXsuYM(1h9N3?0%_gPftbh3E8nxyT2c}Vkt@2qc|q~9+@9Q0S9L4y#p%3X}vjd-K>%C}sZt}^zpa!nu50`LQEj{%xLG~CBX z2s%$_^9E67c4qGhhB7Y-^-IYjjToaWF5TDeTd*GjTvzEk@g$%4qQXncIR2izBJhi% zRy+V4*c9OT3G!$dHY~GS?_cH~f)2i3NAz((qKYog2T+3V^IHKjh%`auXTYnwb~E=3 zM5)SP)a6W>x~iZa5Ve_>DQ}b>p+8gGqfN?A5M+e_goq*6r^}zMj$DS zKmxeixMwyN22>6g7qQ>p3u0>O8Yd&<;)n_hQ|&0MSR=rNWozaIs!E^B42LTz`o4Fh zW8{A6G)S;&QdBunD#3~N85Sx@onO5<9?m01Q7KXko;^6;ZY|G)S2ux0M@MUD>k4xu ziE?L{YIUZ?8v_?=d{h%fA=m|J?Ilgc3dJo(H&!3vnF|811=NCvTG9g09laX}Gqu=c z)L3^%=zH@Bvn#k-((gW1UjqCw6mDFI@Xa%xHgzt)|t3; z5aCnL8Hh-F1c5;bD6)VE{$I1UBuG)xiC)E~4NB5d%&JcZHu%yU6E41Km;=t1k}qt9 zM#z-WxBBDXGvr7zXu~7a`=Yo`Ea1)zV88g`q-eS;Fi}y6jjY{J z9_3&N?Qm@VLN{k*4t8&xL>E4*sHq)+F$j`BwHD%C9~tgl8m(KSL^FKc{`l*7fn@(&9?gTmols z-s&gC+xMU#8`9;unLgTcr;@zUn8qb4g2e2t?y9kSX1Jx*{anRG~dRj~jE@1LgXt^hh5 z#+}omG4Bdd>!q2g#J^s5TQrDIk_`(X;@>Y=yGOpFT2h1)8Pj?vn(Vf-n(U6X?||Al z+joptWvdKO?H+sho2`z~34Zp*-|HFPdmx_cJw!3QmZ!{Xi1`Fb2>W+eX|=T1rdL-d zjRM)WBFbiFr~RGhO0GcwO2gBBHcgLYxjSJy64q=esr`jK0{~EnK-?ot zY^jPv3q#&Z=yNUaO!(|E3cDy0waDU2c|h=lUD>onDQ8g9EdJ}$D#G7Al@mZ6=+a~N z(20kBDtB!j4=4E%Ob-E!CSqim%pA!18VNf#tsT^Rs7TzBoz>p#pQ3)*Dj5BGHzw+B zT&DE*tuLl1WO~qt{fgiqm;MBaGBMh6dL46Kdtpt~FJJ#DGS8t2UH=77uJHcn7=Ir) zA6>kZzaHqD`yqFh_O}x~J}yFu)=5|iGeL?W%|r=ik@|{$odO#XRDnLv{xjVU6QYA1 z9fVF$=Lu#lSylE!RY2FZvh11*glg>F(`XvI4H zO<|Y3t^agkKEc`$yKBHSKp?rlZ{QnAju2b2s9yobhpgPPtSe{xL2!2a3IzoWg*-wg zeQdO2gD$fsDMmsNE`SoDOF;QwLw^q43_id>iJ44FKJoX~ozY*q_rz`G{2om6^82H@ z_bVNaC>@RxHUGIx6SI2DgfVPz{&iSA=f+Y1D-}cE%sLq6od4=;_mDJ8*;--Ebz0w!2^hz*s|DBo z9n?-316-S=&lhG8WpGb{-i+-zEmhH=^)OCk1)reLsr`mK1d<*xk9$Q`HLEONlC(p9 zfuvOmECmMkj)+{;sR>!6V41%+WkB~O^kL~xM-f)^#Ds;FmEo83t#nCw=Fr8V8Z>Bm zX#kvFji;5{b9#C?awh<-*jITBqCvpK-6SnrHraT-KsGn4FpxwdUe5T@P!#YFC~c2` zs(;cv%YI>F6FPUYJIeadsC+A>YSvaxCa*8${`awO&$VabZ8vc3BzWu~aBOE+esy)l zRGRxjgfh#FBW^wXn3y~j=PyGb~b6{e9bQZ3t%?h+w{l2ZbshOMsWf2&htUlxbV-nf1Fe9Hn6z;znfUat#?y;0iQyu9C= zIDTGlVe1!k01>|F>Pk{zG&_B=B=gBSGJeUt$Y zMpRzN+7TBtf(&yX6yyK)3i0}`uVK?Ow08tJyMaZf6?PTOB>&p~{Yg5YAcRK2(^>52 zd%+u9B@^rXLRGM9;Bhc|hvY%f>F`WS@H5(0r~m{1w+#md~%|_ zO%vnJg68G|oz2Z0vIoaCsqo!ifwl)O4?IBpT}fgsEYhDsw3#WK&1Yw@hYff-&@CyThLMVE+O{+ng35o=C;-ji9NqIk6IT) zD>BVsBibS(V>2=6-@4YPE3178OWTwfkt4W~GpK@?Gq%|9C8GzRNv~YI3-z-XQj^YCus=Sdo zWBJ>H@W1#fbR^!a`t+{$D5 zmDpJolr>aZAomF1G=P~E=DJ#rQ0R#g)b$<1hiE!)T%Kah|wfAYc zQlCwwwPFyw6G)rPZEGXIC@45zcYM9adq3RUBFh@>=~5OX^B5kXJ;#<*V^uFVZGa+6 z3n#@xBCV+>rKAR9<r=95x*L|;iO=#97Mc=`;@vd^;^N|) zh5Z#K|E(R0@`j}X0fc3;LcY9I*OF}Cgx)R3tT5?zrHau7Gink*ON0!IX7Ppg#IA;ub%+>@^}Y@=%fnWEbnZAv8*0`o$q?IgUE-)ESV3QmQI$iM zu;U8-nD4^vG_7R=2RPx$eS)yD4hQd0-p?IZ1zjaL5PSz`6)cY2uhjx})SkAsNX2{o)>50+olz;$M2Ym*g8L67CX!-`U7MXY&Lu!`4? zN9I@8URcx`u>2Zt`u#M;!~5o$&DlsG4#N(k@ALP696y19ehqYA>9W?|_TPA7`1jPr z@v+t3n&6TN6u(q+HB>%-WxmfD=I?K9u+r0hE%{w%h)%% zZzavuZBJ&&UqnhgG-~9S33I?C`Ii~?T7VQzGMO|tFg`&{+X81MMAO%R14$m#!&V|6 z#*zU@uSi?i+3at&H&y9|ZGcJ=OV!uA4|H+>r!q)-N`!GUx_?AwmFDW|d*WCF3(Xn} zYTqMOzSC6bl*Km3Xx0fQWA4Ly*j(B;CMA_~*FKX_f$jgiaBWS6n_l_}04_jx`QZ>% zquhvQ0u$EdWuhP_D00nIW+47h#KUul8~__mTRD--w^%4nq3}9%b&tgZ+m>qyfX4J-u$19kcj4IwvV?OcAg&g|FajhKe5+3g8^OsJ_nB{#p?sC{&mT~AfQ zoQe}*4PjyB#$g%CN?s7=yR}h!Z;x1#<`@gLn8TYBm6B8ZHEYA#$2&i6-N{EzkbL%I)MfY&FR3Vo<$e?ebmxBiu~dnbvxGX#IuYrq7}gC_Lj`%l zdZ3Y!XZb>I<`-5T?%xDo$^NZ&&j)xEVgVsHbDVmBq@s^SF7Z|8#}7m##N&vmMn4pu z06y%gaq?OEO_=Bq!L@ulz2qxC@yn^1?+QK_1b)a^|5${QDb)6@?#mV zng2otjYBh8V_GzxVI(s z26Y>wR&xGqoqz+cE#z8|2xjCLOHp~3i)L`_w&jukeBMC_WqVddgro( z(eY|iw^_2LwoSXbP+6Fdk9~k-y7!hWS#8+V0BUVbTe3tcmCG6WYSTMx1MvC=+6HZA z=6NCn5h_5i-k#M%e6^;<7rmFk1_FBTU)A66@dvN3ncyk#azMGk$}C%(i}P!*x$7$! zTvP*vlxoX_%j=%pT=;(;Qgr=iJ^K+fGTEtzYT(i!Ua|JGWOZdiTQ`1ZyB~4=)KLvF ze2-1jS^7_`r4FS%nM5Ck-wxBM_rFe^H8}YFfMXA@J_FC0K#E1>7mG#Wg~2A^EKF(p z8eO1b@|5G6o`^PG8;uUH8<@F#&d&bUi3^dXTC9p$NdjwyK{nD4O{_nSdTSXpNv zTy80LfS|JS_oz^=a}Gq5`@Yv|GnUCoBY#M|$=}6sYEX*`;m8hdS=n6XmhzmgkWu_MVMnH1#`Zc;Uf z6cB=1+WnbqOa=rf5@lDDz5`1~uUy1~po0aMsRHR{#qNK*>`aWM)Yi5BU1&f$KST&O z?~{4^hYE-taTad%z#Y(Kon8a|B_N8=1kwFZubG)`A@c$py%Y?+COBjQxGYTr)?YP> zXF<@A)cN97r5&?c#9R~u_pH+4rQEWCT5RYq;PEfu!YA~-X@r3hY=I+)WFu^3BZ&DC z6X=We@qO-?n6GT}@Q12IF*d+}cQJId3m+1Y7*9&# z3rpjf`&O6|0SOMtWa(2R94`DO=MRV+U$6v+x}}IKEvdsJkH>^;}ExYnfZaIqq43;yCY$sVJe5fFt%E;Tc?s6~=-t7gvIuwGgx{bwOtrJx? zb2?EP-ie$ym9FN1(h#4XR*m-b@lT?P(iqA{21{9@h3<&yi#OVyh@ZSw%=RNyeT{B` z_3#1akpy}rVa1u?h#!AR4uSkHI?q-w2Uj!bBQrAx*F*ZK;?37*Y<@X!#I}LKZh25g znf8{wEYr&}BK-y`K0r(MO=a}pzi_<$Py?O%jlf4qmtetC7$x6JHDVce*_#_IH>FD^ z1PqLZ=GML!-2?>p&-q)yRs_C|kK>b*foOuIo0zZb7|?Vs5fPv7INO)NM?LXPD*tcv z>_O=D&u8px0gvFD8%Jn>oPN7MD+mR0ywz9I^@8N>3bSV4`8L`1yc6a(x?ogiRk)vn z`RVs?roXd9{1I76aPleOeD}@!nTohqB)^7;F?*b^FX6@9-QkLXXtOO$MY?9VO0WIT z*^=G%>VkE}Xf<=u<$7Bf&(r1J%(-#ZE7dMD`L5%JZrCBAYPRXay491~^g3 zQxox0)kb&I))xmv7x`pq7FHe3`$Y-y-epjj`>T=M^P)0A$jCIf$$a69G-oj)?um3CH00&Zz_Fy{}-$?Z|L)kLo9=5dAf&Tn`1d`B&8j@{qE=k_9gVkt_r@Jj3kqMdRP7UsRGMHzt7kDt9#u2@NN8LHKmE9*_)&hOOUjh_lcZ}8e=p2!>L2GX*2)bU3akw3Vk3-r zsm4^(0pXYU3dPejID=in8^CnxKya%6K6xIr-YO_3w9w7`h|B{W6rr>bO}ACc*7)a7jf4lihH*ofbD*;UeER1FWDEqUG53X%u8l|;MPH7QVr)zY>dJ3_hL#uCTCOzX z)TO6BXUaWi%5rk~g4^qL1dPmJaKb`69!;h+Cw!ux==^<)J7KMGRa_|vF{sED{A+?b zf?10u({~o$efF=%vccijzA1f0AdMcpGO=Bfo?YQGR^4mQ6bq6%KC6Jt87iavb6z={ z4l|AhJMKqv^J-3^?Z{!=B$kWS55@j45I016S7V|Qmyob~dz<7Hy5GXWPTl@yVMHSO zw1h~4?hF3mLwU-cGE&%vxY&hIsWzALl`^O;V?1&#B!7H?yWC)I7})4~qC=FX0|sZr zWa1QV4zh6(!u#ipm`dY>QblnSG*d6+{`}!EaW6#3Qa_1xW^y~B#o=4FlSv~)$-(3T-G^O*U z|GNCZv#kH_x5o`T$I=oi|21oysf7coNRSBPe3k%DP~)OmCYKNV84yU1EFNgV77yuf z!s0JpUc^;R`xl`Sww{xq&LG|*XWW)tw4NP~+dd$egtec9RQ0h?Ze=RL46>n_sclfu zjOje;FkO+0t}qh#hlkE3R&-ZXXT%g0o|uI~M``qG&@#0Aqk9}1+&40xJwS`sLT{L! z+6wEy%71ah>MB9cO$baothe&7N5z&3nRY@FC3>F-RZh}df)bCyxOK~(jB&7Nx*Lx0o zcwI8kTJTPC&vNAjEytj0{?^Jh2Sn7^T|U<~oE`OdwUohS@OTZI&hB=aa5!cx=6F9t zEE<#k{^&D6{ra%~!bVO(aBV^W#j6Z)Akxk0tgT@OjNL!q@m!bGnYq~fPa+&MGgA%J z{D<~-tlp_|d;=dUf7{sDI>bL;PGsQXd2Zeh0<~_o27718Vmdy2$XRJHOB*Kb7RsLL%0KcjgU=xN zc*3#feli7rUh2un${SjF;_nsgfiN>!$aV>us=CmZ{LNFwKWk7%tbQPTr4^Qoz8>Qx z%pd(dTUUm87Ykx83?qSsLKPaH=|H=+qG-gYW zjh62VO_P+2a(|)kB6VmfjUli#9W`Vk#p3=fcNl=jy6ZFNh%9zNCLMJMLcnjb=e|bVh8U(AxF$*hhjFE2RvYoNZWg|u# zDz80dTBKo{0vMi{8)*w`(PID{aIfpN+^EqFtw?G767ZW%eu6s9rK>*d4Q$39j$mb? znX0M3=Er_jqL|I8+Xpuidv-LoLoT6{L|2kPZp??sFrYM5!|6`ga&mD*G*xx>_}nG3 zVa{pNPjrcr;DRFmp$jL$3zkc&Z^lq~J2u!(G!v1tX0u4!hKE~e zqD$mg(fO|%KoY??=odE(1pjUnB6zBqFGjDc74j7iJ-F-){(2cRk1N|0>lo0{$18}s zADCF0g)||ZIdg7hrk1zCcn3o+b}li{@4FnHwy`s45vX(?k1hsI0>%aiM4H_z8q(Yr_nP7*6qy(`A@wxZ;}fnB2KKxT8;6EUIXb%SQU~1NZpK zY>qje7zHuf(7+v$iKl;lXaqhY!L6qD)}90qX_+{Sh8Y1ErZiBK#gHv8Ofu_K*?r0! ziO6(~1Qz;km~cm#P)0cf&Le0(7f3Ph;XzsqD!~rU4&z8uqfRStv<-!MGV`v7rRaMi zGj`pRrLTHTuWycR6AwW4f-x?tsX>9o(m7sL4^YB^cbf^bj&u(VO)t~K0?I$DtE;~g zMjX$m=PUg#M6dENJf74UjkBsL2eov)T&Ic`Q=*ZQS-m>mme)51qNW6l%U_*Hn`Hs4zLKgs&Dw^GT`c@Xfvk0~OJ>A)Z9(*vtyJNjY zx){#%I>lsKYnIo@dKvD=Z&}1MwC|9@2_wO=3)VD%K{fz2G?@sy2rHbr_g_qk+@cIa zE6!iuf$`~q!v1m$i5u^>3^+C%JSF6y%XEAF{{OWf(6r+pMC6mJhe0ahy*+sWP^QN> za_y&m84(n_Or6r&f}%2qafrGX>p?3JkP5j?Sf$0*!bhL>+4uFBlb5Fld?yx|Dl|S? zv}frQOe;d3n2+aWuu+TqC&=u~V2(6IMf7a$xOb@g=MSQxiwW);0dRR!BWTPlXw0tf zfKGnz1xMe6#md+if>_57N5Joj+iWsxV7$fI{qU5X*XshW{qFL2yYmMhc@D2pSLElW z9VI}|XGg64@nI>J;`^+3_5|gY_n9o=^P{6f^Hj&1C_qM5#@N#cy6w$t`R;P(F>8tw zI#vrYe};N@hZ8-HGd)8K5{!vGWK3Sa=e!r4Xo_(!VJ&BOZY_rl^Z$rC%b>WTC0Y-z z!QF$qy9alIyK8WF7#sq@-95OwyF-BB?h@P`=FPqL)q7Q^>inBOXR3F1@3q!+-}q!xb$hisdgcU#bk~_5v|*B zp(|T&A(&9YY92o%&hn0D8Fm$ovx|FrAbp zeA)B*3P<@?tNB@3#NX4ULItQO;{W_P8d4oHc(vKLpMhgF{cowJFj+|fi{mH4Sk!P8 zR<*iGK`21hU_su-O@%Hk9OI^*2EY`U6;3_N$vGa489k_zfFep6GYo9<04r{t&YDesQP-8*nFbmL*&DBjZb**5WWg@q3GeTVi4Qf(Nup4xKEb9Q7id zQNg)QU363B+#u595iC!p5J^*Wvs1XIuP@x10RP+)`QCzHj3VT-eCkAw>)yVKBmj9* zz8tbDxd8zyDF90iT`0INeY%fynhb54JbCJd(jAh|veAV+O>6TeEHfzi%c>wg9++#1 zL@_8>?n*_tK_YNUnAxr>^>R((Ni6u_jz>T+Fgr^YEb)@>#IZx9u5@PfzPY~?3Wc{b)LzKBT zrI|*7mViC!I5hroi}H73NLie5)h!2XmB6)H*_0@vhwVaaIm_Ni#9Khrb2fCoJ~J=f z>%xUp<9Y}pUsp7-lG;zECeGdcdqrBW7e`f@1ka@`ybQu+p-zV44pPz&2 zYf}r!p{ONIw^NX;W=ve(u|k0SmdZ8nppHNglDcNE>FjZdEmjFdJTQ2Y3Lb?(i1>n6 zK&U^NqC6d}ol`N=3z1hgIM@P#L(OQEE%BQ?-8~CRThqn^!AQ*>Ew3lk6@efuCb+lG zDw~3n)&3r^K1#{d(k3c}tCH|cTRVI7eL#@3_aNl<{&3PRlCSvja?}i=>*G=Y>|P!| zT|*>g!TpnMl~}lSF>;aB>U_3jHFj{Pt*;-x_{r?yA8>x@3)UPQrZzZn{t_%PLXvaU5a{=KAy`=|H8Q3UHQ}bEIh|}qG`FM% zp)%Qp+TrbKI?4ph(__3YOCQ`}_j*at<+I>>5u4*EUE{!vyCL3KC-;MDJV}q0@+^uN zRhbq#ZQ3ei8+2`8tbf=KuAQ>W-;3{}Wl3kKk25cX`IdyP!hbd+TH!y)V_zv7tk9Z% z-QJ#$u&OoKKX-oZ_F|09$uUR)L>7|CXJaeoh2{RF%+~*TZ0Ct7Pok)aejz<#PbF)L z@1vrk&icDuu+oT-!3Q=~vXas{8ukS`zDXm&q$H9n8lQMN=ETln=y?_}5&`F?R@D*i zvB1-^|4bwF1MeG%MGZPz0zjD%_xhb2GB9>LJG~R`+mr)ry$9ats|n^G34dVW{xRr-VPENRg18KqYHDgR zw$4ZG)A{_Ez96=wkQkR%>TUH z*Hz)ehKHw~Eg&89B{pZqh*DN-;vkc<_|Ha#87twUY=bJ0Z*=AaJm_&kD(1Z z!T`p@(tkTe7Em;#$M3<6uP3Sy^)m(5$oIwK*B6w+g01Rhxk=y)sPq(6838+0b{H=B z1;sDG?&`9zzCMBGsl~I2WBl*J#?;R1;~x1RaE6wvhX>A_Hng&3p0R~D4Dfjy~wL; z)x?Q_3Tcn_Y-Ff6%p&{>&m;T^-!mwlJ8-d0cNuroU^?t|n5sThlVhc@)8K7ePUJ4X zMR9Ra@mh+|Z;V!8j5h3tzN#L6wQLcv2LIR$qQ`z>{SYqvm`Jcqsd3__HG1o)VNHx{`v_?*``HgAK=5$vi5S|#!FXHm>b5&i zAd8e$?5Di>s4TwX>FhM=ZL!@^x?4Dm6Q~V13jv)C_JV&DeNlyY@unn}9^yOrEkJf%h*{;kcuO zAGzFGOmacJvs+f>BkIJozw*wa@T!w*)buJT!cbpR;AL-p|X;8s7cE zUB-ev-AI239N`#Oa;R}I&N^qecvpNVhJK+K1J>N2rP!2)P_@CZZ;_V^KX6alG)wAb zPuNrh>3&&!jitI=PFZP-@$vWpoIC#AqtE`Os(D?-s?{00tDpy^dYZ|)$PgH7VG}qy zAJ`ENyOPr!UR_(y+gp|Cg@NFN^_*;iJWPO*&rCT;D^Y%$8<@>NMnWM*18HkdJYu;v zn@(#?rnA5RDqb6F;LBnqOq7*e?dSG0x(=jseXA;bnG8F72 z)HSYO2DDQ~-2fC;Srt~{-@$m2^{s)m%dZ|G2t#*NUn}w@J58mmlv)0WxMx%j-Cv03 zq1qDKu27pzm}4}IS80WOfs5?G=adziI1Vz8U!#YG3GB!@Jv*ISTnyX1ApXq!#lwWm z%cNhhv9={jodTv3QeSTNPX2(%Atq)tq0s;k<9_&empSwC36T-~bV*?sZGYNjCFi6t zk-&5wN6^kD0?rXUxyi=_B=%eDbK$5VuRe6ppR~z|K_WAW zOZP0L0M;_V&Oi{oHaSL&DD+Ekd}Tn)V35yZ=+yjdVEBksQ)|;Tr8{O0lmrn*MpGv+ zFswx5(xkM#yKzu7Jy4`s<9igq+cR0cQ8p$&KH$e`h$-N{;!K1ADCe}?zFU6hr2KZW zLzYQE(6ht$Sst;{ll-n4=c6fx_98KnDs%-guuHqd-O}E%we>f2s|Mv6?rmptz5n!9 zFf&t+m0LJA_7Npp$T#(=Upe3w*77$sn-JH}ty~gtE+5Ib1d(I+3w3Fm-yPxh5E#3y zY$Ncz`rrvhB2FA*+m|{9>=WXV5dFti#?R01{f5~t>S}9?)Dr@wgxL0akNx3&67}Ha zfFtncD^r{_rgmPw_^VJ~fd2HDu0Mg`M`WDEsS{dJ3-swDg>9AqX>waT7IHbmN08vZp3>CkqD~i>O z9Jz;~MU8!lOTFf9CTae;o?qHipvNKZb3+|G^ zm5kAfjP`6iD}$}LwzUANg3KdGi~p&*O*I~AYp3&W2Gi9kg2==u+qFQ zKH^MiyAe0qGL+!&*KiL8owE^&C%^}414`@=U3wyA1jC?!(DotrC-?-Tfp*`N>Tf@p z>UNEC6}Oruu$voa57PM|K^}zX9s-zjN*?sBjbCv!{OCN8mI(Uf4#HDtfm=A2%s1pf+ds;lHC}JNF#z2cCT{`R2Rs=}qKT_->>QK>WL3g)gByh4aI+FI z=GwPjeD&#@%H!XucDig%9>&4y;mUX+aeiAJ@xwMMA54t+1ZsICn9 ze#&NSmz97VXvBAl{e3m7R(=m#ytenomZCqu3>G~zsh!gN!#GKS;~a-!lt2|rM_vu{ zI36?q;`Btq(Ua%Z$7gnNEB5jc<)b@ZLMT(lc=>Et@ZqOOz|b2H7D|JSjJgw*3LAA& zTUUI9yv;U9ma^}rqc=#8l1jcHvLloK-tEb>u9g&>u8e)WA{(RHyXpM?a+3LNSsoH} z&;)YwKzTDH&FWR9+)t6m1;*+SX3fnqJfjyx}F^P_lP2N!A$>PFqZL#V*GP8 zQz>!Cef;q62i?$7>OI_{3`~s93UuZtVu}%dGUVDa4Ka4q?o&n+^}eExeFAL?>&kjWTAnwK7K>4T^Q6{8@BW2u zEUrrTry}y_-3^(TJZk;hc&7}Ep9~CY#zs>`3NWevV!Iei=hG1*mm+F@zD;eL!>`if z^&g?VGVpE$_`1Uqy*L4MS0B}~Qbz#$!eh5@yz1&npSR$&dFPKFvoDC#qU-z2nQ^j{ z%~x$wqq#F&e<{u?K*~zd=_pLqWZlvgb05`fG1ei9;^%}{_n>ooCe1>~49I40Hfa1H zmE|zDxbHgcDBjv7H>gVS6 zO)fJJUN+qoW^HEkb;OBkL%=LzRg>X*?@9`Fm=la7TIz%kGrF{|7RQok@G3h8c|`yG zR@B%6%hmj)tlCzhI`!#~fA?BMvI@dUkP+(p{y~mApP z;Kz_Df*l;j$~E=(d8+|!S13748abTOy5#Sa8ZZS;Q&dQc<$FruLGD>e9KE64z2(YsTtuGi?sBG=9^ zd4LF6E(Q+0NHkVwcQ&IbGawKy!yHohN*H{1J*IQYS?(hvM=bY+Y}unwIa60Ro%Nrc zP&BzT8PQ^QSkc6IiS}#(!y5^CAFDfK)5i;l zcJd#7khbg7+Gs30^{c7>Rk|i<0Aw~dg8`J?|{o+6NJCWD(h|%zEtx^FIOqe4hioKp0e+njl z_*>2i9^&ExF+vbMSCqTwHRF{ zW4c>Xb3WcWz#w=2kz#`K@mF6TZ_w=Bg>M)-GZkKyO6R~UzsRfjS8fbW`BP_k#O5SC zvYbIxOiy)5+|4AJ0;yB1j)?e;-fD0Hgq52Jd^n0Wn1zK1{aJoHQ%zGreq1b6LG-3{ zi0ZERcg}42x(pr4&jB+->%B3XAtIld4?_z-aXCpVrhkp{hhmFMYc(O__T| zrkggO!82Y?B{blng1hWvaG|KZsVUMw1>m&Qxm#6k!J0B@uCl!LE2u_^8qo8xk=KUN@%41f}7L_ERPox_K2L?<*y3Es*(%ZCxS|V_JEXSB&KAe z&YGLufFDKcC~b{U3}4K5^l5k(QQWjHJxD<|(*{SV?Cd*siHqlR1Y^*8lZWXU4N%4k-E1a;psI*kwv{IPPO+7_#W+u$bh5-C{EoMhBCgXD78*~!>XBFqONv0YM z5AZbDbZnmlQC{@datvMRw1tfg$YEq^t_v29V_j~vM|XN&?Jm}K|EleMMf{U161Q9L z+;xKrj3Wh|kQ%q@Ivw33(?Dlu@`jOq?!Z0oq6S1t#Stogap?MdJ$qg{t34aN_=rFS zTR%SFHw|)5E-%el(yrb=JwyLhnwwrLC)Je5%geXf&Zp^&QnZ` zJFjn7CJAOAnt0zcHTH$b;bNHY#YD;XaNB1@(#)=v?Zrx!^M*N;jfOM+&1bVx)UaZJ zci&s%^7~sKzHLQH!lbIQn)n&zlF|>9a}vVXQYqM3Iz*%dKaN~@`FvW_)XfJ6PtH%p zth9KxMY`S$l^}KWwMB)~_TiNr+*Q6vGbD4UUQHDSkuw^9Fnqc zF8(_prwGj+oNwB@B<`5w^!|6ZG`Zd7`t)iv0esK`YQTWNlaf*W|MtW^#m+!?foI^} zeo2N$tCgjB2W5nxT6>-2L}=nBW7_#SZS6_x50!6ZjT{|TliubYTDwViV-ct-a-$}W zm!U=FYGrT>y#>OeL331>JijZxXy}$rwAHnQhdpS(R<7Em5??W8W~5b}$bbX96q)@b z)N7=1%f;D6ovN*UBpR$$Ii|21Gcn@jOdTB~()bgslNmspIhz9pn-{w92?O%mA?u-#hdSW*j7>)A8!W|TALw}Cck3G5}Jo_prF^)@ss7S7~6X0 zl~%`xSI2+zH2dO{X;Vt)sOw`E}sBJ+iyTyPlhEMZpUV}j@#eG5?o?W8k~Uj7bYWb;MB=k!@=tvE7$vy z@BZoOj^WDA(Zs|VLVj`*UV5Ka))Y8UylO|Bwx!89ve<$*yrYX60x5b{TPk<|y2P#3 zRF0cTZ?^#K>b@FoS&qhlxX5OWiu&?krpAkDHT_IY9zSq}|Avebm) zv~YIi6lFu3 z6oe5n;6yoOgYQsUFrG^)8>&tvNsA{&i)EgImOxnSMVq*>Lf(JWgrJdtK>OF@NZ8gS zc5Q7ds^w8rvs%Io%RshQ4J!aJq6AZMe%o$y&q!M-&KY>uq$MKUEHv@MwW})<-gM-#TYzI$AV7Zr;!5M`88XsPa;pO9W zf=}nJct==qCe+1_TRp=E(`&B;IH{?1ZB3C*jIhzu^caSbWAg_m9qpv(rIJ0CNvdVO z#%P=N7kDHj{j+1V;c&358zPa9Egn6YM6XZ^q3GA8IE{;o*j3dvrrW?sbLMDr_rh{) zyT_99?;+Ok1RZo`QtBLmJQ=$VZmvKPZ<^U+tkCe^mXsKDfadJ7w`aPn&TkeXB_l!g_RAk6@ zST-pp80<$LH8x?!wv3w~FOji8ea$lE)f_{4rUar+QjecX4c^>rlezmT;_vCOdr7=( z=hl0)*?Aj7$P#b|6ldD@N zU<@tjVJ-7~$rUvXS2E;bz(pp0&A{XuwImQ$UsTZ*SAN;z(m>t7dr{8MS6Uz|4*i)F zpI|_F%bU>Gkj1o|QgxN{97UFK>{m2&JI0titjHVUwPRnJg-iZ>_btD?>z$T*A*2G} z`#DJv=%Jb^JBM%3xS+8+2~2AH91n~(Ps{b;N!7#w69(HmvgpiBQtcpD{?)n_|0>jE z`bkSB>tXLNL|C_2k)VT44&ZJ@iy77lW^ODJ(d#~g?)wn~;9Z%8=shS4`uXd5EG1_Q zP|aS^Lz1RmE@z7I_fdjAMu9&htlj$^tb4GQ!eJU4;NSRpxywwuikEDv`z*Rb#9AOr z1&Gyr0A?I)!`H=qo}Uz{@6w5i_NL2|<35rf8ieuX1@h$`m_;Uj;eHHhyD`Ql21{zs z&mu~GqbF8E)Xj32aj3sg4emRBCrv3&%#)-$mo%{=QDvV{bLJ~p;H@W)+?%I4(_Ryn zpv}azh#?FdyWX6C;YR;umGJ>L;WQ?FFW4 zjc~5~{H1Y9h`?qXK;p-??{y@_M=tPE=l=e_5NtLe4Y+4}^b3FmEy#({11cv`#>McD zEI8`zm_sDkQF=Y&sQwHbZcpTuxBQu|4`O1fJ~=)8=IM#r!7nhoxf*0?lkxR>d$teT z?XK2aoP`#V)=y6jfTe+vFZSg-eJiZB_{GKIIc*Yo zu`eZ#I2oR~Q3zD(4I#aI~BRt;pFfAK$9 zDHE^W!|qnrHu{&AP#Ws7Tn@~>YT-~k-~e=lRSqaou)tYS#4))()Q}U>Ga|#!ir5fx z!;AUd%`iFk;La1M7WPoz}FyfDc_-T3~ zN)j^E?eBxC2JDUZcg84AsLBjIx082@BJoTG+N|mHth~{U0l`O4&$`~u$ELli-vVo&1!c7bdEPox7?goAlmbW(+ha7Yt6Knd;{$ut-d!C$4`md|0siwI-{1P{gD2wc=-$!zZ$9H+DPjZAll^!*EBU~$ zx?H`i#0^lRq@o_D%bdUAnlv$Bh5Cf%=Y~|GfCEnK`_p2`yZ*Ki79tDB9(WB$re$?H z?)SOIWirAk5*^{{x&f6bTk7qsjD$O0ESk7TU$%skPtZw6BTJ<+vKfW0PbVGF&q~Qe z1u&)(qtDs1rt>*JyEL=1^6ABDl{5!DV9Xow5i>8^O+?#$ok4_6O{`Eg+6_eM<_g?@ zX!H3IH0U61ACtt8%<1w%wD%L*s>Zch3LRY!CmJ8666V2!fuJhTpa9WKg)zA7RSuh+ zy@7Xa-mF`elF~M{B9RtvN1Nmm`r2=l(!mCPl7nyu?H~ z>?<7QSO%84G9jfhp~4@ZbbW`LOzI+r7C&>}TnT_*Jw_k|s)nB{UGnXZ1B|Z+Nnevq z1GEwGv1GY(C(Zn4X71)PaSPlaFsG;6ygU$d?3untHAG5QmEDtW&-5ZQI{(5=K&=-~ zE{vds@%&0t#HyCEdAFO0M0igIY2t#Ya)4atYc{g8plk1FkfYep>5 zwP3DWwMg)XbwmA5jve_u-!%a~PG6~s;NW&6SoGLR$zFu)S~>tjcZx8f8qKhR|_G&2==GZR=m=4TEXwiS3Fj>AKcE2hYx30h252K_Blc)_(Y<< z$}}``@$Y$p?9`>DbL-oq9~W4wJa5nFZ|v{mz3-Sc=gNvo4T$^Fj-R0vTs*DZ-ksgg z14!8X2gS>c9&?5HPCt1oiw9ncG~(!xq4&(ANuqM?wh(f8@^V=#$~ zRDgbp-#;_ha8h-DecdoOURhZg+UZraUo2=_vt|q@%Ww`Ku$yXcZ5*5cH~H6v453Qw zcq*~mP$peQB;7!g`s!JDS)GTASp{@kTm3RyhoOw}d7>n5k5}X?R8(n=iBlu`(M!zL z>#yu4y@oGwj$%jW-~Ksjfw6LZd*AOKyBKZEo7pzl zd;*2Tx%{_yApF1L@%dLO{iyfjxL2#~_M!AKDSF9`8ppQf2%`?mrP=(PCILAU146+R zW(r$|`x=rx!dJ$-b(OC@Suy|Ro}=u?)tqaByKD)fpCAd((-y{aUT&t?v|h7agJihu zoD<$70j|JDgR4+=SX6^H^Q47r)sm)@>fAt^SHiDtPLyew3;^`_)3jwO{V}_Dm1B*G zzu6Z!C^+OT>JcU9BOY|XV=A{MN8nlh(o!6Y=iBVAw3^&O~WCE%nVpMeJj?4D=s-<;O<#Fg zY~zNN_(|LZ+T`oibHUHMbyAng|0HfSOve?GE0T#AQ@~xBU#S@Z>+ac{?0hTJQkle~m1>|1qEd+aL_oCqg9~QBNnLiJV{BV1pUV(!G%CjP)zG_uD&ZxOW=OIBb&zYwkwA?bkRO-` zsZb&ebO*L@HygXSL_HmIXw?*Um!y<(!@pm>p*Wp^bAQH5^T6aln8`{8a+KtEXgh9g z8~wvGuGmsNJh)8?ixhA;dEcR!tu5ix>pbN+P|cMii&%;r9US&vzx<66!vu!V*WZaV z*Gp))FQ3?d6;U!9C$HT1BQ3@K^-bvZDXJpfxHn%6#f5u%r?<6|aK^AbY8!Oay1M^+ zZazN*G;vlh3zUNe*(&b<-H<*bTHCP8)yI(j4q5VabxDzrRT(E%9d#WzQ4-r5C=-NJ z2XH?f43>bdA9D_keCjl%|8ps1`M*n{+OamCPAr&!F0T3c0N0}dr24%-e^<}{+~TXz zZJRS6W~Dzwe1`6%K)2B*s!y%)$bq0lDKjklWPY* z`VNtB`4TVt_odrF&tJvrX`ieT`$-^dHhH5JAT8YaOyZe8rM?8vG{IQU^e=MBblj&G zRxT}R#mkoN2neEW0f;xd0`0C&zSU?4Pw$$K{zz*2nhaDzc6DR|5c>(W21ylN_=al&ua8AX0A(^~qIJU}r-~|Yq6)s+rO1H@( zTQ%4S$cLa(Os!$LU4W?~8Ljz^Mq2`@wR+%(g2+Ok7Vr84>#s8wI~x`U0$H9UZ^Dkv z((5I}lBd5{Lra{7BeXp+v0VcXmvCfiIDZ?FW~x!vLdEw(L!sBJBDf$(zP#|nnS8vb zA_*1XF4S0g+saWh7q3k5?w#b#_y&$}#`@4}fQ#P^lX*(iy?>Fq$CP@c__Rjs!$L&} z`#tZ@=)@}39Akaq7UrJF_w)4xE5CeK*4Gd5W5e4=g^b3WqXT$JspR|;TA;P1MX7J^mRU<#Cb%wtkxjbWwKAg~& zgNLs=N{p4&)!m7=y#aC@T-^HZ*68phoTjITqM};TkPwQK%d=g7znx99YuzzRzJW{I z+O8=ne-Ym^MXWoRuKT@cu=+EE1#Kwl#Tyzj+07Y{w)v;8tNP_>R)jV1Gw54r5nGr4 z2R}|4Zhc$B(8p(TRpOL+dR4HbKH+Ma64ZKCVPb}PO}TSHO98@%KNNUx+BdYqs}z&B z_aWPths9)mDQyUK--R?OudQ!rYB4x60=wO+K>1YqVar`kk6To~onV{fBa*D40Z&YL zpzBW@IIk@Ik%aP}qGdGuP*GBa~kyMMj98YI1Lq+=qU!6D~)*2a+-{5jqx{aj+i zr({#9=I=k@90}9J&7EKE41YY6I|_68lxKXc{N!08MrBDEYC-AWDMNDUJViR)~|m&-2$ z#ytKZfdwflR_iCo5AVZEh%vHoXM{m-TT2<6LUBkwKgp_wK_qLgVlFBz@_d7Vurn)7 zHl{n&d4x~010=w7>kbD%G_`RdU9-&J(RonomOU+){D)FTBIMs4iFU1=jK+L`{_`k- zMY0}Ow$PldsIdfvNfp8UksK{fd>orB;`FP)1}oRoz`|doq)r%WH6%(UEGPB*8>Bi_ zjA-tZp?pLJD3Cs^i*Sf4{huE6VRNh!bL0{+*b=c+Ov;lhIzxw1(vj)aFB^VMzXq)l zKdlLh)aJeZwNIuKkc!!w37PZ%KG?_B*k^NMN661iJyfGD5u=4}Rk?PA`bQZr+kfuX zr>YeVWrX#_jdDHyj2#xzQF$vD!Qk7ZwIQ%40xI|r9Kq7> z*%R^!wlonC4ll|p*H4U)BJXZ}z_o#PAW~D)cr6N(CyUbm{QKZYBp|g`4Qe+}bi?>F zl&_(nL**R_Afxy;QCUifI^A{7i+emUNyPAQ5Ii9e<7xJ;#OHPyto)Fza%Ymhbs)3kvWY^c6M=Hy5=i(Fip8PuCYphVbP}$q{7LmJff; zJ3d27!0V0aw~12y8H0veu0@=~4{=Q>6vueSCXHSWw*}?rbEme^<&6nu3~L+cNUBK_ zW(usaxqlMqH+1FQp9_|vE}-TVY|S_8 zAtZdCzg7z=R@jK->Kh1g=tokYbJuTw6Y`)EYYYlq3uTyC4-(=h3#&~cG2MC|2jrhe zDz|5a_?md9CZ0_GGQ5lr598+N<%Z%sK9%@;ze4V=kGddcN);g>W zu4V^Q$L~aPfY196pbu$MhxZXUhyTt<<^Oj^8XoC}i)#Sg_=5P@=hr{2k4i+wu$M@T z{?v;6kssEtR3B@`K+|Y~sZhU^rp5)1+XQF-qUi374P1=X7ew^j#@qNPs^hgWc3vv$ z0hpqTTFR?G6w&YAmm^%p(cqitxiWb8!>!yAf8QjOltphJ&&D8227LDg#_b_@TY5=Q z8S5+WkIgWE3>nuH=wC#!z^A7#g(6tyNp!e}-%ydAyVlp%5R03!!P*u2 z91Ev{EGW6eH5Q#c7(orHXv!48jvN09-W)D+v}ER5mLk%+LQSAuPo&`R3wn_8Zy9=s z;QU>2_g%2PtKNxgtnjf_^{B%<)mTFT4@~g3D;VQMGF>G%P2e@1<1O^Ymt%~J)B1=k zzT;i|*DsL<7lVRCkb}eR*K~j>YOX~KDfSRpNrHi|n?MlwDA4@XdPfP$w1SU-sbTzU zrYP39ojl{sR5_c54&^*PB|H8z1>18Go89?a{l5n@GnT%cys48lflg;jON`?`xl)y* zVSdchv5(YxUnrwMgDN^r&b3iyF*5KreDQQTWLaWtBs+986!Et@^#J#_I?Pxz$Ia+< zB)zuox|lDH@a%6q=_YI$VEEmzbAnc_!SEf6U`Wpv$)#-RGaEaRp0@VRhdhRH<217Z zTl3%p($=ml(hY@}vwIf(*zv6lWupG>?{89mrPS0r6qq9H?a{+^y^SG8e$QWn`vKw7 zQmpKP!QtUj4h9*Sf?+MG)Y&4Q1Q9_1KRDrMKREIc7A%avFXm#NH))Gr$|{STXUs>3 z!e$yD1=OCjr*8|}En8;}$(Zt|ppqzLw~vlO2)GbavAHq+$5z_O6zpMrSfR|u_5u^5 zUM2jBdj99|$Q89@as~m)hjfcXRW7=+X1<+@O6kTx5_TJtu3Da`2s}Nuuj@#gUxQ{J8M&nub|e-LJA& zA$|yB#qsKZ-k5@na8>=1C)U7+X(n^kADmnW9Nn26{0mEqr%VKE5DFKVoMtz8dpB*Y z^1niNo?doE?i(SEt$ZWms0cJWiIqHsIy%80aSw~MH%uR5t6Fj6^#m52Ab&Hu{lPq{ z^k;^J3|-j?I~)0Ggoc_`fG0xPAz*;obsiIQ0NTlg;DH47C^fZSsTzjxEIli0c;g)N z88Se{pQloX%(7AH<;FcJSw`aY`|#$T6PQ{K=T9tzhfg|q@{HGNAD1PP$yk*Y3uj(D zhOYjTS$II1S$v9}5?({t@OOI}J`EA}S||EJz%;En|3zZ`=uw}t#Z zfzKg_k*nFtq~{B|f9L3Ig(nr`sVi#I+X$5n6p&t+HBOPnp9yxveg?C@19tjTpVouNqr*taQ<#@IAC6&O0gWaIWrlif`G+q$H$g`4uAO%Fs{|q02rG|ViDJQp?gAXKsy2dR7t|(jp z3Qdb2FwXwL-}fM-qf3x`H|y-teq-mRymr)(!@IH@5(UzPfSN@y*4feIkI)#*(dBW` z6ydJD7y_+EI^&t;@EmJHCJzJEmj38=e-bvh%I)a1FGp3Dq~WycXf$qlOQ3 zwfZiD*eIG+34tTfOunK_2KXhAcBUyxH<<{+ko`0ZIG_l?A`eJEB(G#FvluYePiVk8syt&>3wDl`57z+==zv%-4PN5PxZ2^_nHh* zRLvzte(@TbYrn9?F1{roYZ$9HX@2kRy#DnaA#e#tK|#s*@<#lVA3g4l5)`GEw>?r) znm2M-TD$YFl)0d{7qyy6(J5DGTE!2XVlrB$f_gVGfoQdHb#6z26I~#BirhXnnlMgJ z?`n=WX3x9`Cs4GH3w83 zPxgoyozsDPOfAc#WU5IB{aIMB^$i(&pgI~igI4}HaxC%=nE%ku;%8$+z@#{By=%?E z2LE1bceV4lIpg%UWwoNKJG69*F-&rO*~ki!pGlcm3Tq&Oy($X8a@R;~A$E61LI-4U z`UL?nA;8TKB0Mz?JMT3d>)Qd_Ov3J0uzlNkQqk86j-go}B_b6e+L(1L$^5g^w{vA} zYv}P2M=S_Unwq2;wx0jo$@_F}UK|?Cn-(U|M#%s?KW}>8)Pl}uuEBK&H@k_ymW0ty(klQn^fj^|k4gK4t z6`j3TebIwZETYskZpsbXCiVPo!*XG83d1+$B%T#}gT+T%Y6A+&T0AtK_m2++zkjDv zn9}8hBhx)~8-jN`1D;NS;(4{_DFwp0&^yWtBC-~L6>QxF__02oIkH=I4|~-QKK(dK zAu?FmSp#wNykWI+I|kGUZxbeZX;IVh-Y16{O$8>ew?KHiDc%yA$KG!Va*AjK1Ci>_ z3CRoAdKp(w)SVP2<&L~gPjTBnM0_tcd%NF0azGc30bOtFytw}@L!KfP(4zlY@wjcY z`*#KcL09u>uWLul-JhGPb~lD(Jzgx)`W#g!JZN4dj}??mdMz4cfvd&nq_PSHp&zH5hAZ*>=W%bDSfQO+7+u zr^-dyj6GHg5XQ^}jYe^N|2CSSX=nI5LmkyDDcFfKG$jS5n1c>FIDoUIsqkk7PfkwT z`?;&OpO$U1;CTG+ZmOB`Z~Jk@n=|?Iq2e?xTn%K0tw6G=F-f1J^Aj$%ss? z?&kW1i;-Y1adYvAM_%rZcOJlZf40#S@IU&Mq@oCIE5WS8mCdz*?zgAe)wyx!Y`3Yz zay-6=xVYH-_VNVMqB+_S(0AUcq>8u%>vZ47q8r}7$x8{-WJa`PdE=){9EUTdC6Y20 zVYBGQ#aSfmC#-Aa1l)gAeujR&9VX4o&|AO!!?poP@>bd&Kq9ND{FI0E#iG$xyZRQh z3E^o#tjum;Yv*u;=#Ar`|+^_{R?!M zBZ56@&k`WDh;I5)8`Ni>(A}<}+&qR2&Ls{~j zK!f>2d{W+)>>ghLL}a^Oof=;E;PvgI!C=yHk|1g5db>|5i$#?`X3+c>JHt{-O*tTX zWcMd@^l(YEOzE4*d%rzgj=sU%;=jlfcN-4(50Xf~R|20IQJ?5S@Y|6*Etb#DK_-XS zDNe5Zv}jPgP^)t>un4_AaF3^3yW9Vrba0O&1;8Fiv`{g#%Z@X=^?rTT9uYys3vs+K zV#4(zq*4NDC@YX#elktAMU;M>pP|2Tv~~X0H#^H785zaF%Ng3ZqweA5b#p|Mo+*~U zMEi)WSh5VX@x~YJL1#>T#nw}N6o{kfFN)hq)H}=!bhg|P5Z7|UZ%#^~8d(@k1y4Vq zB}O%`l19^GD{*QX3>Rs`L6OiIvHBy3*;rw0b>j z2g6zah+Ms1xTmM`WL0&Ng3wOKNyCnNq^+}`na%$=L|@fWw%sA@qzmj*QSN{SE}YAM zeTf^@)oYOVxYRe~3Cf+owH5X}blt1sQoXFboDKqu1p$wiy678Cd>bHHVaSy7`adE1 zxXu67E5-WOc5%sy~;&>!5w-!<3+?hF28bln(*x%s4#GCK1*JX zs8k%zZx1gsbNkpD&;7|ubXYw^@i^lCYGw&7%RzJ3^DBQy2kh94s_*IEo`ny;7#r2a zWEmh?jXB!BhXT-lT-Aj9cq%CYYqU$PSdCOFeF6Ig(YFS$#-f6Kn&&mzj-}ev4wGv* z_*LhVppY>87%a>H2k&NFr1>ar2#Mw7g&apKu|#e~#*wK5OXR=P*#p<2n!Xq~8_a}h zXp#(O5(vDQx7NDJUe;D-%re5UrMR~x0?Umydn`h!dz1@95kiDEJ7N#dA7FoYlQ@43 zlP}|xFKhCHP3Z-%E@1n7w10j&Kp@k!9ms+C z_Z@EE5(TRneV?o2ceZ};0<5Xm83wtiVgGtL{%x+YR}t^p1=Wo*D<_oN5y&*a9*eE# zg~`y`Wyx1NqrH|oe~c!PM+*iH8%j2QZB#&4A{;xPs+yh}?Bjh&$oK;giFmqltkPDQzZ zMuG;v-@mmvp;>fOX`oY%s8~ocK*!s=rS*P==VtJll&mCctR(9TvQ7Y%5zW1zI3Pac z=RbGn`FY0QKEJ*c>BEu3nZ&2TOm+wuXAg3TgMYCF|7=!-r~vvh>e_*fzYA-^)2Ga3 zx;A2#%B>;b-#GsEO=A=^6qg4fUl9*a&yy>f3?=G}FIn}Wbda)lt3l!_oQ<>T}Sw(IxGM?G4AhorPJE#RjTfaK{tnlAO{ zWS54`s4N}sd4OE=R_&raM<`7Xy8WL$55{*EepnQ7n-@duMU0@5% zg*J}^q=LXhJ?_ON4k-4=ZK$B@_pASC%|1KnI$3}s+cDGLq(6ll!-Ina#;=DCPbV`$ zvEEz0@b}I4Svh&b+}MDl>m^lSWNXj^*Uvg;b0<#)LoQ`HT_>*@EfzGwq6f zw`z#Xx5hI)nTLD%p;PbLkE{&Y0^fqL;xB{>_ZD*bvMqIujh4iypZ&7(R75h=w=z1s zWe#Tj-{WMyS-1!oR@T?ZIjgco!bPr}6w+a~$>>>MtBxaG1WZ^pjoP?3to&Tx{Lz!b zwmTklQ0bVajxrK@s7N(UZ~vZ>4WP&bwob%YC&6dVBZ#b0e%bo zR!k*Nj6tq@!>Ap^N7fxV8LGf{bj7(Juf;3#VU>BYk9e9f z#@LovKMinL=+rXzurQ1IUnI$@YPEcjVJ#y&M`Z^p?Jjl^aR*~#3;wO4A%61~d6^A6 zsxv;=JdnF>@)72Xvemd_Xu|4cdbw-<4q(Z-7%YhrOnlTKCzSmZ61#;zK?GO$TVhn2 z4Qp_GURbB7(k7iwVa$fraNi3mHmKCtNq-QNy%F;E4TsLk&mA%~;nNvDaYwsHFRHI0 zCatZNPe+nJa4SLWGwYY&jQNxM>atcvz8X5M|5?!C%&gd0d)hU48uJgeUlyq+P)$z z$*?VyZN!?LOxFNP>i{&p43R$KTdogM6BF{6RKj0l@xoeQT$g4}lkX{%5V0bpPg6Kw zf;mN!J4G^&b9I3*Ba4sMZ+3ZOie`2-TLFT)ibyGz;030RF|ZS3%f-nIN~M&2{Y`}P zd?b8J$k5LH`24vY=ljpB@&LSYNjzA$FgBbibA5ymrocG? zx%CVFc*>V=2SC^sUJgQ;_J=-61V|ZopTSjU*g}QM&fOp*%H8AM!4Xu&R6nM9u8@IY zN=AC8{bGjA-|?kkqWMOG7QQ8y$4yd?-_0N#GALBr?bT7O#eZ<b_of!BT z^w=|0YX2Mip4O5UAwsOwU?6iAshPgH%x{?2Xsl^45{t%3{v+thuleSx&f6WmBTZP; zkOyHT4PiJVoQR6#kjy=GH_bAC@(cPWQMenBZn*LsKirSX-UE-m12;1d9~^4xQlFO_ z+DWCE>j!0;y)1*Q0UK|zk@v7Ef&Hq*~N@>>~Cp$kZR+S`g-z;3Y+Wm zzcu{A!h=acPoK)LTn+ztrPoKT{aJ(P>W~i#EH3+Rd-*>RHMX@xjwF$pdHO=7=!OUK zazh74W9?kBVc|Xzd>(UIUhZ3%8$ycj?uN>v@&?bj!fnI6*%=I`DQs*2?K~rn4k6iS zK0b_i8K{~eQwMWqFk0x<|B3PB`` zbP`N?<`M*=ZU==*#_6TwJpWny>Y*e;p5vSRxK5umhEzSNYNbEOBZPB^*KIG)4lEw; z7VVS@a!jwUT>Y7 z)wIU*YSn(@bqf3Fid!`g{5IF(eDD0R+>^Ne^rU_GBvUN-AGXWk|Ep1=qA$m#SW`Vu zaXq>(?_%$T%Po!%wp9D7IO$yu5tb!WUsMK@Sz;9o`ZdKG0O2&~nO|V#hoCjqK1Vy% zQ{kgh7b=u`o-!`BctMJV=g@18f6zsgP7tj_Y%>}j$Ii`Q55cg%_dGCY?+tAvo$S<% z%xpCLwBmyYb%K0Q?err5j3s<@5OFW* zg?~57AfV_V;f2h$58$f*0=dHct;#t*rZ0KA=hoxuU!8l7g#{6M8-A%T8ML*wQu4tXe6FGd4I%H=;tu{+r@D14waf;J>O@~i-25(2{?v5*xqO{|6{Y6t_bK3` z;^h33Q`P{7f_6)5@>NG!+sb;7IOXcfHwd0}I-!W|I8?4~XO0UO((XZ96`5mfRqfEN z4O!Re`RP*7iqfMPvUL$W!`OF3bIsQGLmsX{4JDyx@a5)ao7&rf|r28&$mQ;j`491OX-hfj+P#R#jPM0o+0nLIX_pHjUnNX(Q zk8Q05W9mSgO?XW5(U>VCna%3@X$))pFVm-W#jk)Yf|12R{s0^sJo^z4Nm+aIG)B%D}H*{3>9|pP+xBFuEd^q$BJ3l3P9nFH3R--M;94eAOZ$I7Pti8S}tyVw-IAR|j z&>?GbgRsc(ICQA&PcuiZK5pZ^8Ax_c#k?7{3~UU5S(N0LE7jS*GV1vw_*bp_9fXd7!B4r>4FG)&@@}U5o7Au>aD3hH}ZTJW~ zAh|l1ILcD6n$JV0kWOsgk8T@i_XR6{OM&QV~jW>L5&=|&!vQM^cZm? z5S+(A5E4ii2c$bW|Fqy=dI`MMqRa@ho+!Oz~VH+bm>YzJ~2!e z=8pL9-+*gPhR`=joACb;}%;FSnRC^?99n-P|Bmf2Y#Gm0{oVBcuS36 zYjwu{Sy%3*?WHMH)2#UJG^AL{g~*bY#b%Xu8(SxkZa+jT425HMXLIaGyE^83Asx#a zk%U>ZDO0PvuPou>g3=eFKKlLr%tb#JX><03$dHx(A2d{_hZU4lAApR7Wp{2K3$4F` zAEmHF_RiZL;QBKYC0l9P_H!jqSPYkJDbTdExacb|-VAQ`+VpZ#fOaCD4L8Z$p*=Q$ zE=HF*6hbEY*rB{sbA4#jKTv@CCS7Q(XE1=C3V9l{uhJm$Xv^PwhnZM5+SAaQY=b=Ld|@w@-#-{0I~&AFutwkZz=`oZNx_bn0{RLUS-fytH6~B~zH2p4HK}Sf5gB z|3;=#?Nqg|G?wwv{4%M`X`UOicFXZTtR;iX@o!!^sXqtyG%&8=Fs`55J}daGG^Usp z;MDSRiNqANP%u@6%ac)7e^e9!(@g`|J zI=cBcYa)?+(&LMBX$ZIx;*>P_dqn4e3LIo{2#o>P7iVg}hM-TitExeu03HF-x18N< z9Ge2*jW51)*O85lYmirD^JMF{&iLS&xR^!`$8S!i4(^&B1e%CYUun&l<#sNO?=Y_j6}!NJY_U5JYrgC36%jvb=% zj#a>uAT?7NqBvBo3fE{Kb*Pez0B9YYg~mbUSbHc<`H0mP+d@-QsbyG(rBf1H+oC}= zv`t)vrcsaPp&TOm_~ofwe&pVH#p>M>ESz}!dS>9j^Fl{|@?20NCcV{7MIuy?F17T- zx2Y9Xp6@)06R7o<74(g;|ka_1c2b`*pk;MNi-Mx()SDm~2v2MKT4qEuYnE%f!eCn=WWyb;qM< z>guT9s7iM*EGp^xAYTaO=GEVyAllp8yK#)16yM#OL=Ng2S1Eho)S+zC?L4c6?rJ*pzZUR1a?bScC-=9p`Nc zT;>|0cXXC?sqjpG?nt})5zI9isYN6_?vN7W#PA^=zE|aTLwkG3o-GV6lTwPP(L;)V z>Fg_?k8Ym&=t8_IE44!C-CIZzd>7;pIl&agdJlXL_<2&06)*eTM1h5;54MzK2k=XT zD}(mwYQcIr;EtK#u9NyTv5}loj@+Q67=@0Vn|iHhG4+JpRE%MGILNuKh3PK9Gqqh< zN33pNwN-Tr)Rv-j3zvkzh7#!I9YtjhU5JOi=B>iK5vmsEVyJ)(ua_O@u9rQAs@jG8 z9@a@kUX9#!dd>^}ybP6YEI2`f;jkNd^h~ zdC5n3GISxl{EHSv{I@#3IUhm0Rduc&P@mw@Z?)f{$ro3$M#9RL7lJXJe>K!z^DQrL z(A6)ew`*j^1q|YX{FkLP<3{aqzmEAdR1@}U%PF*yli$`@bD8_N?hKuI_w9KWSJdQJ z9W|w;W##AXLYm#5-AP1bO`B2`rIhK_r=-=UWLHL2b&%CMX&E+=JVd7BlyCs!liZY= zU*M&S74`>~)fjP;$MG722!?Nh2vofiuPq-5ssger?o|*>H7rZQZ1*@vD{|@LqnSWk zR^_tfSLdc))=4 zp($TbD>ld@weOQtxkU`k$Ex!i1n5qoSagLHdiN!akumGSvO7p&vAz`>c4) zl<+So$0NMT$p%^;y7a(2B@R%6L178KZ>G+r3zf5KyrgbpKHBdby32!We53-kOSqp4 z@+0fk!Kn1q?5s=~`9{t}>uO6B7H~SKIcUHQ!F0TgoiL)Ip}V?xglqDeA(tl4l!{Nk z%90Qk(wr7)Ms`|0A$|31dt+ryPOf?T%xBy;!PXN`%(m5lgaJu71^GUHe%rnZ3Qp4{ zp$EapMGJO`)*xscfr)3RSA&aSmMXRapOX8;P*w0<+W#w(8KPHxYE08i%Qz2-b^oD( zm;?b?LGCQK?oIr_Z)ooBO;jgkU8ThU3gQTO&P+!ezK^-cJsnFrIapO~?Q2Ub++P;N z&*r#ChpgK-Lvd~FTnWfcT>Uh^^oMp!qn@^U9_a&&p@YcljJiU%z+GEb*I;k47tFlW z#6C!CZW4-_qd5xrdJp}2pywTZ^x#XUs6uF&22?Me#0d(_V4%)&yr&c#9d1!s|Hb`{ zpP_DBXsa<0S%;PFnp@~Va<>fRN<)Zx@;0_1hMPn!QvkmX@&>sxqNxtReim8gsP~`D ziulY)T2_KLl$rY7+RY8gz3HeeYw7PQ?UE7i#84U}gF-@1y1V}*|MOixVVTeKjpbHp zBZ$1gb@`4e7p02x#?b2+V8q`KG|kz`F%~0fR$vAD;bN(SNm)_RbpCGq?IF$K zf7IJ*<`X0B23^_!Z#J%$Hi6)Glfj6R|K?RtjBE{HmZ%n_C`jf^Dhs|N@6qoTUdQbW z*zuEzBQ2~SOq`kEnfmNdow?EF>rK%VQZOo#u?m%I0s3W!^T3Bm+vUR)GP{EEZ=`(Z z8h+=xm1iZuu4BiWZH#~zvurcmm`gbmk3SDoh1%6r<|`Xa&2nG zSQn!KCN1F)!z4e|ZQBJ;7q?K=o~P81 zJxH<_Y{W_7|9q-Nlg9Yd$=Slme`MSY-o{=ic@)3F&1D?tY-$hTWv!FI_V!mn;h`TD z{Mep^s0jogX6{NK+w)j!R!1M*z6rpIEn+&LOz)u7iVbE1_RY47qC4bQ5%z}nj8M!(IeW(VKe`mf!9_8wxdK+ zYeMZa?qHL^1AcTFXEYrbf9#P9$qZHAICb7QrBSuGcgO4oem}tTBz~n6y*z+e{{B0aU?h6r+YKX0JC1Cuvy11qmg96xd?S!qaA;c^ z+ha=iq*RdQEji__xlmrRBNa`vgWFT==zr7$`7$ zYvjbEsCgyyJ@c{%_L~< zdJ%muW;RMdG)cV_6iSU_mL5Yoe{+$g$J6txdCK11C@3F5C{UlM+Q9 z(-xj>_?I2`r*_031;(JbH~Gw5qk4Qof?I3h;r1*=mkw&!49)RQE1@_oOdt1AM0 z%T|(Am^<*+?tXlJ-rF285#U?|E>NhrK40bH&3?U0Q^iC=ocR<>{i8o-0n&tf@N1HI zssx3U%Y0sqqYTmw=gRzD@t7vEx2Cl%T0leqv1euiHeD`>d~dE)PIqf%zem-rphgF8 zc5XF7wfhMR9{!c2M?g?86x4`W#>x10VDb)225~_Ry9c`wlt4DOqC-9+p<2U}L|V3s zCtQ7up9zQxdtIEx%57|Xrj=COmvinOJYZyUWRU(N@zb^p{$pB#m^?s_=&!s3aFxHd zMj-2`Qg+APh0ly;0is#3rtTN>uhdmz*P{rLV>U%iadEc$I}J^LCc2ThOB)%Q6d4dD zpTwedWyd%dMb5H`Pwc!jax8D_=3F0a@YGc2X5+u(@jlmRKk45$!#;mVR3YfF8us@O zO^~STf^)sFB!EtRB+l6?iRwSYSi+o zD;!KWHbmM$+#?U*=pF~Bedd@cm* zAKW7^tGYRS5hzqZX&a~Iuf}C_m|n#fZ#0aeVTj}d6diIh&{&{+XbL$H1U#d*Aq+mC z4IDW0?e@jjA<3Y9k%Tmt0CHeHW@aY0!_dW~slFI>63nlXtV4;N9nqH7D9WnMDqn-& z;Hu5I9q4lZFe~2xKrNONJ9*7XFoIYzmn5m8|7J)pf{#tr;jw>`Z$tNj`Y6M|H8>UA z!r^l%X6tQU2_az*ePX7bR-`!~u@VfS4OUh_I5wdpiQH;H(#DHW=rJ1XEH=_Mzs@eS zIAsl0#&Sa&aaaMHxX^MOhYoq(fpFe4%qzUSC6#<{71C3n6AB!{n~ArNz~SfIX?Cp) z!QxO(|8YO963L?*nSEs18Vu7M;}kh)C}8UvV$#T%W5TqW5L|~K$I4%;p=wN{tPXQD zL=;D+XALHZaAIxR?n5o*~GTBfIQ;cu2uFIB@-D04%Y=+RDmi z--f@p>(z&dqmwgb{ue3Dn%Sz{i(9w4_I(VH_1_${W({i!rA?xr;38BJX&s0I;LjHT zL((bATB4@Tx=1EjS!y(RJXZ$v_CiSOYN7D{(M86$aAl{_7%rHYQNFd{hkiyzZgaB=iKG0A!vP-xyn(oi zBjh`!s-lu~s^yum{36C}mAB4ZHcgi3Z`}zc!6+$&svFMqc1v9H(gV7yx&s60Hf_8> zs3z>RW1&k4RULZmB{IyMm`zHrM2eG%l}u zNuc*DVBtG1+zb2)45$#idF48nW-Xd;+A@7Sit(+>3mXUmzWYOl7#KG(QRTV2q)mi5 zAz3L+Y_Ba#HkC$iE>?zrgUmP%8ynl_;76wGZF;WoyD=N|rr#HY5HJgqUjU`xM_GGC zI5K8arOSSW$+)naR_K={Cu)Y4!nM*x_+MVA+Mc-T(c%b^p5pFoE>4j9KLR{RAAO{;y4g52 zf;c8>bGf2VM`H;1)fpJAnEexu>9n83HdsTJRS;p*SNqgTLHF7=WM9figgsGRc|$6lJZLaF4ZzEQ>(wj+Os+} zg&&Ku%OJ?E!$4WUdL3VW3(4;@eDyr;MvI?8HN6Xsl0a34mRv-<*q%0Qg@j@#0)oWe zf_i@7dJEBbJm;?%8c0QH%GFg<8}MMw;Y47gYMh`rc$wkkMt6T+6O7W%+^UP6b^3{Q z>uSryqzAU0uU!eU{-WU%c5zQ(Flh#cOh4cUTvx=uH4ZL;KDcB{ z1UVVhab7V2f&P;*4y;w?-FD{jvNg6E=yQkR$U-;5?_VN<#$>Oq% zEE0rIz8Tr@HMOLBT9)O z5!DZr19Ifmb-C@p$XD!-lD`(-egR^m}m%>yj6 zW@={k%pO#nRnf`ep~2s!#Uo=rf1c3QGwM6BBXB>O-Z|~Zy?jGQN4M~HE==QQz-p1Ua|5TCuYl@Nf%(1*>!9_lxduQkhVaA^pbq#C)j>Vze|EPw22xGw*?89psvQyvWVT zGXK~gmA{Ef*;^1Ec#sHYM-q|2dFq9>U8zF_lW1?d;d@4v9$ygaf$q`S*hqg|vWmQ) z?1nYxFW{3uLq^fkQ%AfuR1rjw&kRt53O)orvH`_jFB4k%%wumi422I}_qmcMhEyb; zVMhjHv@2HjKf?hiE+GF%sxA;tRlcVOt;PD-Ma~}-pm%*EV;Thgs0q!Wtv~~lY#=a~ z2XuR-_Az8#HwlOz2$Pz2&|YVSE2c6r;6nLx7O6ag9^-xpYI^&W`+L2kSr5Bs2B4b} zQJ#4RmX;}3Nh&s3!c~W@I^pzwDEwBpcYK`H2cA4<_WL8qA;K|Dx{y7l@OC^<=u*Lp z6+>k(2~dF=Y(v;iPGQtZ9?wJp6yF}M?mU9ZmvFBsGFY~0^rTyK`;GY{ypLWnZy1i5 zt#-yCEDg$0$d~RVKi^3_c!@uF_8y@2ojKSXx%g~&Zt#0bv|}?_L$Z2N8S(!nEyRxq z;B@zu#O?d=k;EGT>G6x4jEjrV{-|ovlml1jBU09PG37f*)|7`p(e%@DcuoP2|Fb z0Gk)0qPp^rJx=X2Pxgc=#62be_}5T7zd&?EAz`DZStnF{c;4$nnYQp$)J zFm;@@&`RGDT6m8My}G$}_(Aeo+zn;e;ewgTW;iGiX09rOW-gHx)(4)$>~8aqYT94s zU2be??}NoL*Pa!bIdT1K@(2U#ifA|V@K}1 zQ-jn%)Va!geULiV>uXA5{|lbZ0$>6m5=?T8$o;f|GbI-GVc?qVrZ7jPc}$zkeP%)# zEK~Bc@V7g!NA_)UQc|n-Pcp}zE#A6UxxHYW$IG3xB{eJc;GljyR|r7Nl8X zd`W!9z)#NIAUZfdnY!L*Ot$O_%S?TCw+zJ9-EUsVt?^Ir zCjWlFu~}2ePo;+p|A|_(r5!)~*-V75G4<*VRAn>n@I!@^q$_v6PV?=!#_?8?@Ua@RVe`N%&1#{*b1i7&ExQW$e zehKqy=O5*iGs=|t68z2MF`gCw#5DWRKxW5>e5X40i(rJgaI83(0s5UPwR`G-5s zV$gh~rZ))k2!HdmwT))17lMah5m-M`F<~sUSr9ET$e}QqcZvWg`ZLS!(VfB;c+u$! zDf-*FUuQV=^v>Aep|0Tf#{4pt`js`XF%(sKN>pdu5$%x43W@}p2cTSa-J&KY{M+0Z zf~+r74Z6q=)n&VH6)ic$n{J{B zhEK_Ru%t=@Ew%WGVP98*69HltRDNo+jTf3~kh{7m}&mN6siQ}7^q@d>4Q>HZPev)m~ z#B-$BXp`lBnkiW*&!f|7g(w?2Sf0KiHGs7BgX{%8_>|c(>yZO>l}u zUhm)R6ZJxWNKvXFbezARmch{DWkH`t(XikWP_`(HFf~B<5dif=5>u;Vzp_^{YWctt zPQ6NhAT8bM?SAVG^;_2+=l3%2=x?Tp9-x4LZ7{s} z)yCO7a|otrS|HzIEV(?H9FR?rN?EpbWPt}CvI6OJWo8kP;3hiYA061UV71gRdl1@s zM#GmI4S}dP{A2^ueP|gvnV5)$6xqtuzX%30AFnI|9f)I;psa2R?_TtlsHhZCsa2Uq z8;(NZ3myPM&#Li>p!b5^lhKXBUa^hWv7+nf;KwnJC0@S9?)H${T9$%Aq*CN;J()K% zOOLl79j$|_eE#aE=H-!f28Ur#58c-mwze<>1EuG8swh-~cye-bvQXPuJ@j+{j*erZ zbfuQKRYGT~XKrJVm@~J=+@wZGes2+>3?1h#^$d)))$KPZDZB9VxX5MM^iL5#}7V0vOB~KgDTm5v`fDE3Y3)}9uY(`5ReaiRQ^9P0SET~eKOULwY^^36&wP=QNXN^X=kvGYNBC* z&xc1(HEju-T|_{SRJn&qw%v8kIXlWsctO@Aq*%P-Z?f2`+>32eACNU5{^N7&Hlk-Q zR4l~}0qbC7U7_Hn5|1~?I+-p6d=i8B_VgeZEju8u`4B)k<7W`d!c{t`SBN^-T(?kn z);sVI=X8d;-mgi;zRV+6Y>&;{opH_VhX`b=muhPK04er>>QXo;{NOK7nFixiSJ0%g zs=2j!Y#abGX?gJqSuIXhISW`J`)cDzD*a}8(*2d`OblE`27`=tTCg2VzfVinXe2=G zDU4q+W^|HQX0{dhlUm2$XS;%w7?}bJu*wXHe(4v-LeZ>3v8=%U_LM;M>YrOe9K#Qm zjsQfgz^h20S0wh(mCWKy@uLkthT@77KOw1J@`KKPx*axsb3~b{OP)qS_j|Wmw6|KS zz&fL@KV_&C7p|vD(MhRi8eJZ3oBh;26?dsd99oR=@86nlOVq#cs%$od`uYn2uC5o` zOPAtCfVl6)j#T9{$`5vZ8C0?WL(DD|vKQ}4a^Ww-0kv?V5A+WWrD5|^Pu$73c4ZF^83qZhT-pLE02(yL;(^S}svcY^jCM7nu{T^g}^XM#O6|;g5U=kHvXXO{Z^eZcrIA3xChxvM} zXesYOr_LP7Ih%;hLll!~hM**K?6IwI>t>A*{i@xu8zcxLF)JO?I}+JckgrG7gT=B2|J;LH<8{N@r($ z`hk^ePYO-IEo6ZYf{Ziwb3&-=2wJ1w@g zcES~U3Hud50gN<9By$e71G5=*C3Sm}ghCKz|i6u-85!uus=UMmxxl841WBu974AD3in;STj$k-z=AM2^&EO(!NNVu~Y zLo!GVa^l86ZU({QAF*xEzrn6`;Kj$ifEw{-LnNu(Fa3F*ik~$qOz_9QV(MUFvna5= z4XhBGm9SPt`Vc1REo_OiCD)E|*84Do`_!lv77kHo*ESL$q#!N;wPu%1&1YR>0~z6T zS*m<9I;dQ%xmyk+gFWtgIHI~$+TXlk<-Q@HzyY|aNH8(4X+r*bq&~DMe-LrKL5jd- ztj9Wf2AR9?>W|yoHen!{1$8L_F{v3>b41*c0GI#Hyf2LgBX3K|Woj13N6zGtZ^mDy z@#hkWCT*Wjhc^s)rTOYw%%nppjOpxLD9+W6h$X49X?F4MZY;k*0cfaw+-!Q<3osHo@Rqpt`&vi-4e=wtxCDhJtVySDgJb- zt&76opm)aNf8>O3=AdY$sZlz3`H{wk-5;__nW&^~tcrZ&&%4CWi))h2M=Ux_tvpN{ zm3>G?Ag9WoqR^p*4VygEpdOJ{wqfy*vw_bA&lOeja4M9lFgZQZ@;iRL#qUHZjbLN1 z57he0)8#kt^2>Al2i<$H^?U@Zry+eyBr~-M3nhur&@MLV&NX62Mxm*TEll8s(J?)o z48&0r5)|mKW0{3Z+KNlrk$?#cf~>~wn){KRD8ZfN$?H&H3+A*NX3%F}9uO|3tFy;H zjpLqDEu&nQfju9>RcmPMSb|eF^R^R=!TwBr9Wi@x*x)Nnt5lt|^qYf3ur-yM-wNbR4k9WRlAyM*dWy?8B@# z($5g_=CEIZ8&fW!6D1E#3ajKTue%QF&FRX3PjJd(eKgB0z$e`3bxfup28UJ3e%Gr+ z60@uw`cg#SQgaZ}8DYBfCi7&-x^&d@dim$=etSFEMlio0o;)D<_3^3+MC+TFY)6^R zhvg7VgZ*0(eXzx+AD2i2NoQ?<(aCfHP%Sb&0a6lP8^8&y9J-0Kw%N9 zVr~V*uAe~JA5et_d?@jtYEX)PBDgy%$&$KS+d(eie-Bxxd(OP{oaqU;>Knd%>3J=^ z$`5kAQoo#>_#fB1d+GmDIynh5q91KvuzQ)5k8+Xe>zU)p(pAy7J|DSMwz=;Eu#U5Mcf_7$Br`5d?O+4HB1`?0 z`O{?4fr>Y&noPQ@_IsSq(>@0ot7!l5gVs4Y$xiLEv6PNCpHNj&0*W4Rfx8d;`!aUe zO-D>^SD@q7MNhtP3=Y?s}{`E>$Aoq7`VZ z22o!>OE8reRsCkH@9PJpG60g1JNPid7cQ(dxf*vCS*!s+(Rx5+7p^}0PO|L_UtuVa z_(}OH;@YNyC*a%OTz=p85}rmZZy`qYVE-CG9XffY|2b&#UDm;?ZP0=C+9dXzig;6w zN)k4h*-Z9UVS{79XdLxMcg3dfLreJNXsVE~Q?tt)(ZHfD7O=#!pcz>D~H}i0`F~FY4LW-Jz z{v>=W>Y;!&er1U$L8Cp^?MJLMXNV0m9Gb6u}yxcmD zq+`(vj7UihpG>#^(Uz=@!WLSRs$|}_YnkI=w0b?ZPjq(DA;rPV!8<fAx923mAn;#TXc3 z?EFJ_$3f54H=I0NYKNz|kIC?bl?fM9&YqK%AM0zz>2kNW$x-SzJn&Cgv#JXx{O~@B zN`IV1Uz!;+U=5x8w#nb>*}qtKZiGgA7AO$*^^`a00#Z$?riRnWe5f3T@goQjJ^>^f z+tA7reo3ABNHv&P@*Eqr6jZrW&CD{b!Co|BjDjHj?v`+knj z*haa*adwY(lR&7_V%JT4foT@f?$uh*=xP{rL-J*e0b1n!`Vrwv-QbQNUB32gP*t3a z-od`)#u8rt?FV^UKTK zbEnfUDSZaQ*}Lsse@5KF*BJ2dawuv{I48rT8e{C#-!WBf8anl?x*nJM7~v$zP+I)w zE;HsXQ+7NBx2gT;r47jg(@&Jk7Lqj>e?JG>-oDBx6;DJ|&z<0s!OME9Vjfz3=TOa+ zFydgi+aKG$0kE=ddq`0Q*SA4M!T(xAUnMoA3qE%tR5xul!C2udt;Pq|6PHKYvqsp9 zMrfP^4pyLc=QPjdu%oSSMl}|TFWEbyC0is{H#IfWCZUT`RDP`Z=9?dya>`CNIeT=N z1m7F40GoRL!8yK}m&DY@e8X8feiEX%dq&HbkPyx61MQIARKZZm!RrRKgcn?rL8|jg zYPv`_Xetok=I{_=pSn#kSTo_jdrhJJ`fH$i+BHhQIB~b=D^{ zM20xo4Y_ej73=mdJ)kWu@jX3`b@epW5JR33aCCHZ&ko#lB&So7s6#<@wRN%32+s-x zlayS01vIdwrPL&Z@=YR((|$lE3JeCirq$KoJ&Cp=i1f&ATP==<- zXf$l7$sBz=YhcGPR(wGsnv$}L86?ogwFoNA**&7aR+X9Yp$h4O(Df^r>uW8n0#RRS zG-G7cD!&)|h*0r_)awwhn%H;p8oS70fcYi~+bj34uU}~+VT>L<1jxzA%)r|ijk@s* zILA+}BorI;0xVM1n(rpZ49LXm_4p4&&F^d-4l9F-BzTn5X~T3GTCCMRd1y-UQ)cEq z1et8c{rwRWkkwj<&`?O~1s@x^%RRJu$aQ{KxVdGS30!(}u5FkQvm8r)l+Tcs$a>F7 zts|n5f%J<@xkm`1trt&+O}E#03mw*N=&dJxds~AnC2V#F8oU$2|M;Ky?&1Hx7$nL0 z?`Yr6LmL%TFgl$wQPvbDMa{={SP9F&Fc8@TS-;_bQk1dHKCz)s(abx) zGPC-BES+^wTuqe42X}XO39iB2U4y&34lua8hX8@#?h+ulYj6wh?(Vwt?QYepsrmcW zyWM^Jp7T5IBwbUhEx%+^zI5TS)a~8}Z6@Z_IJLlK{mj7hzMF5QLjQ1a#X!SLzxqp; zOX2AkV^AL>&ob;|QM%};T55UW5J9EpK+*=%;9Xmc-u_@g_IzPqA`tbOj=cCv=NB_D z7fom|tvYIejWaH^v#F7ihZ%JW@ zzA5XlCG*R7)KrAl7`8ua3eO>w6<^%gne4^)m0gf+#69d_E610i^m2wxl zv$*Dz$X4s#-m+9YBJxRZg+!^&0k))@2nh=fy7G=o2kZsAxcS6kwK*rs=j6A24>z5wean_a&YouV_VLVC4QQ+?6pJI_NSmfe}V-bFLy6OUwL`g z2Di6!Jih#dAz}d}&E!(FQqsNK6+3t&l>=Ok-(WgCPrr41oY;>a6%>?$M-wUATZhK} z;b6@r@u|K(amwgFZ8>~uH;5jtoW|fw{xm11)3505io`Vtt(f(4BWsCEsMN)5i?sE^ zsHmtJ8DhXdGYt*F-_h-QUbLcD~ScB0m z|NkY9L-4rhiTOE(7SQJHZ8p+yHM$zTvb`X6Z}S?W$^0nWB+n`ZRnLtpWt{P5mA$hC zj3699bCKmPOO~K+M6_$=x|uPDejP?9#t-d35AQ!OSAaq`=li?Fi(z?NY|rY7`?fa# zz3`{GzN<5y*WPE2GBbMjFSX}n^A4mVu|m6ysJnJ;Yv{Zn;c@0yx+mJ9=6jQv7pgB| zMTM#iCZ8r~;SQN3HDs(Jmgk<@*6FEZ6Z1NWcu;#<%B`3Ao?s;zPQEChVGaxPcH~qRB zDN*AWzR$Fr)veXYr5^44)Z1x!@3Lk5iVWU)AhI28gw7r|_`_s;#b9!h!B9@8;4^#^ zwi~3>_$v`Au_pJ6n#Us-FT)SDbX&v0+1a)ECj^Cu%CE0?2MV*l(nfSOH}L#k*EqZ{ zj*h+_`ZeTPy%TAjWz@h6H9C=VHI)=3O;Nh(?cN0~9b^3A2@%I5<7m1%uSzcE-lx&_ zbYJ(LsA-E7qY8GtSx$&Boz1@YV7$WaPA<*qQ?istc^gkeG;KS z_F2G}T8F*z;R%&(Am6csCKO~SJ9=6UOH^Rqur76;7+6+W# zQ{ax8(4j?Or>jevuLNhzz%%|L8$cPB2EPmX{IMaUz{ zwwP_#Fzr3Py?!pf@B-%?`PvU)e%VGc<)AWSpGn>n>Dm5^!3l7CM*bA8YLs$yI?9pA zcKeQ#uV?OZetEQ2lyY6~I+-sb!ZU30t49RKHD(`E;~W8)^26TSBmDkjwOv5gVq|d; z!t{c5?VUN#kM>D8RJc$9g)Xd%N;=vsC@`})MixJBNhOooBY#&))0csNq-4nWxAB&G z|J={bqlrQ0S8hkIhsJ6u1!+rn_-T}B6(f|rE0qs~^Imd(SUBF`?X@*NgDjCL_dMqw zKhIU;X0ZUnrO$oy(vjhQS*Kdc)`p?=PqQ;yfP`bH)Dks>=r~1U-lf{@*h@4skW4sD0xQn7ZEG^(*gr^J6hE z33PiPpwfVrwaG+h{#{)**Q>19NO!@TQ!Ug5b1_O=frR8_i_ZchQL1fd1mZhgJH4bz z($eNY&%ed3E4VGk(~!B{TIYBm6?2a)Q64V?hZE&h;OP*`+ufW>OZzR*5{FJ^SapO~ z`JuP20wA`mU)cFb{)m!1R=XA(9Z9C%gLrV%2s&0k?Z@A;@#Bb!G}SL@_-`q& zARjkK4f8_e56)*nWhzq^0Jdf-$plPlyJ`M>dLr;3&?kUPM47*koSeHxWL+JZM@X?2 zirs9j?oN7<*^xik0x~vS5pgC{i&g#l*{kpL-qjDkx)t2qK}F$C@V}tWPDd`4&CcU$ zSP(0fY-pGUaX&k;khU74#%^Ad3D`xL$pGFMIFY0JjG5A&Hmy1g6N(VSA&H*qgRS_( zv6Z0q=;q|8Ilox^y<`7{qiOdIhtSIG0R6S!^a-UU+d!wBGjROF7Am8iLVJUdH7|f` zO~4|QpCuMDNY6KF^L_GiEBkT7{3@_R1|!s0R@yuX(kP8=qy&R~VQr zfGLoWj9^e99q($k53+=omW_wApZpq+5A9$~SdedUMsA7ian*!vlD1NMveR2M3RY!~ z7k%L}E)S&(w% zHUY(lvPNUBlSsovF#9Y)qQGf{YGP`2F530+P`K93eA$nY=pVfz#jJj}6U|rWUfq^# zUOt2$dh51%A8(o0c<%LBk_&0*hHa5YDZXiAA~?}s__3{9-o~UML}_^pOB<-Yp}rV@ zj_f8xx1wpMi}*YYlWiEoUgUPxf&C?VyV`Dzh=Bk0U9;Vd{^A|7?bm4i2CPJ*_w&GH zg=#@w*=oV4{2yd#qv57-en{@TxbZIW?c<)VO#UrP3^!qURc78{&3_gk)LM~%3B zO_qjAN7r`<0g}tNji2w)e|r`tVWgc+B$9~LaQHfTq+GcuWsR8{s!zUtga|mgzF;Ya z!UKWs{`K!*r+RorCDRwWHaFdB3ZrS&^|&22jiJF0bQaXG>5JRE{>$L1SYqdD)nKhr zv1;7BeJmGhDwlx-iq^NJD3~oE=X8mafQrx5U4RmUGZxIk$*&B}r3iN_vrV0DgX*h! z21^?|0=?oMlkPMH(J?x;acZ^EVhp*MXW${WikC_q*4Xch?mlGLRDq?7uRI4+Q@iJ2 z^7Y<4wFp^8AqD`PnkfA>H`Hn*5e3+?qlQCu1%E6t+^`$n~e(1XIa0{7Lu52yEW z=y2#G9D+dua7Z5tk-dG(=M{!;z+3O-r@No)A!=94Ee<9D2c06P=$wwP(+@!$1k{2R z1+#bQ0@EKz-WGFmRgP7rE+$E_1-+s{oupAxk`ZaYuZ=3d&6Hc0NS22g2oKu=_FBlI zrKGz2xk79>fc!B5#X6@6y0n-~C6P4?ypu^5L`I2dR9Mu^1ZKNEt*!1qiF14Q z28yPaprWR4B@35U)_Wf|ShTdYb^o{keGqX9*ox`7E$aOo!%A(XO)1J9o zunElP=J3hz2l|S~TKuj#O6cea-ZW;VIFbGukyoX~3c7DgSg4>Slc#h~SdYjg{834O}T8tA=>BFHQC!kx6X!}cVT@>VO9?Ereyu}>36PliO52$AlwVBQE|c^ zLfw@m22@Q%TTOM0fgMvxE!-LZW7yGRNFOU!cZeX)F7H?~4u}C-SzsMFz3^=4o^g@j zO(iaVcb8T85Wg84B19a61(KCCQtBLs9pWXUYL>s7P-&Hs=GrqYfl@O;JKTv@1w&|H=~!&DaUfEwA4Y8#kc2Y@tHte@a%$HFnr<7ORLE$c za9BY{-&n%ioTSMO#!k&rNswME8GP7dyDHS(t@7nauB>k*dS*eN5SkPf>o?_(cx`9z z5Sp9vzBz;wKSFJxu>H2dq&0fiLOAaSX(tW>@Q%RstimoY!Va#&4&sHJA&Fl%L$L5r z|COk*p}bM~{TN3>^z=Ka8xWZ};=PC>?@;}7w@-pQR}8G+WKI`n&JEET7iG0ntI+Z$ z4Kvpfj@kWKp&+dyDPRy#`axBF4Pag{m0^7ELKQ#t!zBp_g)&bw4D~`a1EE&Z9?iW`~ z+F*V?u33N45r!=-174e-gwqtM z!M@R$k!=L7T(}rxt8OTMnE8CqHsY+we7gdGiw~%0QJ`}(VUi_h-kMEk2ixMcqJQ!YWj9^B{s zX`dkLRH&!kZR5w0ND>{4H@oI&#UQkK-KnZWw#(|=vIX(PVTbMw6}QLT#LB=j8SD3N z0GzRzq(47mm=GvJm2V=ShwN*27rlEfYTKE<_1QB2`pJCoy&=Zvoh&^135Pe5iFlHtw1ZN9~MaiZIC_gZ10n{Y2LzEkH`WxhSz>Jafy zJY`j<<9oBE0wa??6HK%}6t<>X|Ij4tygb6p5yC?v8Zyt7+J_+rbP6uZ^&%Mi%IPoE zNA#wl43(F`n4ZLnqgKA4YGp2FI9?H9r-V~;6Zbd}(NdzFT>Y;Oh$&N&G`wO9r=={w zwzfU28c7zA4i%8NdU92u9;`VgO2r!NfXH16$3Xzo*5QCF8wZew&8u>ea}}pcfutI4 zhkzs^QXi$axN?T<%mnz)-lCT2)l z&P$-*m%Ky)b%K`{OqrZc;5}mKr+RtNeKv1SP1V-+u1r;^r?-C#^md&4F>=U?9TV0*YiAdgMFJ)4`*x6x8=X z)fw6HAK^xu3(x8M{L|K3H2(+y_lx?0)eE1%Uk}SySY;V0N@sRuwmXdLWKmsHa@ZYO zag%lE@jS#-vDYSZcRVD&8_-&cPi+FGMT!|6{!9|(D!Pp%384~a6Yo^A3d^K##s=q* z-re2rJa*j*fUcg{BVb`&Tzo>_uf714q{3rB5f;4#z75^cbM&vW27-zuJIH{P84Wdj z?y@_Mb%_dYmO9nPT$?A#bBZaT9}8wOa!60NSr)7Qa4wKw;DsVyB!gOg+uFnr9?G!u zC;4Suxt!-?DIXhK4_L1^!r33x0X+h8wRA)oJG%%3ha?Zp5{6UqfVH{0X*nW+6Wj|C zOR}r}ZP7LPs{t97D%{r@{Y+7rR(}ZzwZk?5FGT5~PJy~8&twyW!G{5cfs@=}kvdb< z3YFK?t>1>P$V-lSl~uO;)&yB{ehpu3)m?ktAE*>X9FEf!f?a{KWDb-K-QnXKupF)y-Ut+v&M&-!*F?N^C5KaD>H-qPLy--bU0av+- z&Jc|f;Tzh&@f^k=iPGq1t1$o^s#x5WpIU>8#r#ualQ1Ko>wK$vN`JqSv2mpa(%BsYnD1qsyzGxIXJD*ARbZP>f@C zp7LTXYtjMZ;Gb~kl?k5S0U_G`GHYIE@&g@z@YdtKltv(GQ@dX&U&B3i&xs%ArfLAb|a-cMAHA z7SfxLcdUu58-}VclD$k|aW_oz=?0_RO-5Ragtd#6HRQIt4<=TP@gRc(p-%lVpG1U( zdeglww^CSztrLTrs+B4Ml`d{kizVUCZHZrT;;MWrQzy-=*M0&F?S32)r85(}CV$3y zpeV#6ha7afTX{UTns#gNh9^3IG#n%sPw_Fxhv?u{jBW*bTESj+Jma>%J$gJA)Rs1H zvvPZWoSy1p1I(f>s>s`bca zwI}j$`|aTF`mL&h(09GFWUlPsLK*}%9`1QH>N(mI7CZhuaoE&C=7Ib|VgV@^3qr9Q z*rT(3-ACAIq7I0tG({hsn7o480a#uhfynH4A&1M$2B#LVvSx`ja;`v@sC^^iv4E(j zwu{+`koAZ-oA2&07|NureX+fl_79bdq9n}vzFFxbh&K9PljRQuDTfOOQ#-#9>p*8# zSf5v&M}>ykW;mn7*zWIq_>Lpxj9^J>i~?8ooQg_6Z!xIx9V&-GE&P_d7dEdy|7dz0 z5p$4oLB))|0>?on1^*P)v{4`|CkRbQjP;EL2BH*>r4$-ZMmXentjah|agH%2yb_;0 zC#ZB*HaqnMPOgw!3iW{QJ>J06L`vT2l4gXuQT%8mHkD{EwjT8=YvPLlNaJ44xp z#fKIP#nM8ANuUUeQQH9c-g*)LZBBzMCua+sHwZQ*Ox4%dM`zZf(iAT%pI7~HeeZZ* zqq%AzHNnlz{3v;UZLmXVgQ<#dvJCNzHB~ou_t8ksf2QFsAy|s%aJ+2!h>Vj&b$`zd z4j7kOy9%?$1~B#fTk8${kY`^;nEqu?^@qn+VkfOczhcaj@VnqIH1XTp3(jK0cps2Pn{ z3PD#~TVD{$q2QdZJPtyXgQn<%<`cuWJxm5pbukeN1svq1WjUzXccsnaMR4Q|jYNFl zWM&qZ!%bt1NeC?GddsinkWo;;WGgW_$i1pSpc@n5^8i-C_K%n6)BTuo={|&d_a8!3 z<@c=R9;g1%--C@`*A%NCSAgqWRqOmFX(#gNtDW!9A$?QEI0q_sLwL5nKUII)FbSA& zj#eO+u0jR&Bwpw1#-X8X_q};%<>p#H69xxztohY17>ie{Tg@#x?7=TzVeEiekT#a;%u?+y zX}Jz0!u~HO+j9^5Z(74>q~CNcj8nv}CU`de8pi1W;0q-lCl&3li8`;&G69E22l2JS ztRk(iO>TcgLloI+w9ZlL+!Ts>zwHzGF`L;y;>SvmW=#op!~sT#^L<(p=TA$I+CWh2 zO^7~|29gTe-Q<2H2&UhEr2Cu6Ke`{XUU@qCz`8RYUWckU7aA~`IR}zum_hXFjKhne z9L1_Di6kK7GAZs4S$@YDIhD3%w(;$?WpSN=isj2b@W!DE%Loqi%+mZC-yiA^9%WPF zCv5ed!59bzVrc8MyI}N7gm!dj2R5oCA|}Nh8fuJ&V-O(xu4{=JES7rPT3{x2sFA4t zp~{$w9v6WTBQ2_naHa}4MyxD1>N!!%)YjtVo(}yRY&4Gic>Q&0CL~`H`8*%6s0WW3 z!-fRNV-go-WgcvV()l7IWD<%$dO9S&dZnmN71`cvmk+n}H`L?>!{gg-D!f}fq1z9W zX3e1uR~W|jFI5+`^|_-rC4@`i;s0)SH5mn)(}DxFGS9}0U(i3F76VB-4YQ9!4kJCu80}kCZwbxBqHT%~h`|MrNfAK&E3l-mBk$$1NDdO+?DMNG z4Uz5%N^DzsMMt=VTH~-D2qf~F-74sXpv__^4o(p9X=|^x-?fCk^=8TQ1{*t-%Y^)1 z!qTlQR-ojUR3DoqMazem;0F>%u;gwBI>=avm5Z$<0w&`S#P>JdckZ)dhI!esd-$9G zkvtB}>tgD12jWUcrn81JiN9FpC~-;WzYjmho#VvIO~0XI?B^{HNMfH`(gWp^e*D z+1d_iD-Y6`67l?sns<{Q&5c~n^iA?_8IQ)%k}>l3JLJM#*W~QN@1f7yoBB_MWP*Co zq}hI*UC#%V^|@Q$NnT-}jC}8>~qKp5g<)Pp}9XPB06t+G2B3*|7`A zi}uHqgnMHLQ5;x8nHL-qME14eNmb{KH$gCz6@RBEJ-O559|13((y5_ulzA-X}sF$IsE>FV~mwLM!LP*t}&;y^YL%?f1;43;tUMK$-mKy zug@fn;?%XINNU?7uUE4JnLuw0`gU(S`El7vFXbajsc1dV)VWu?FNLZ4!@)q|k$x;ScDg}@MJ=|@*G*yDxsl6vJuv$D{>)P8x*EmDDy6`DcUU z!3h3!e)Ln}lMw8G(L#RXybsh$a0P>4eP4YImIFQfNh-&8ySrjK`z30)`zmbMCU8r1 zMWc4eONoO;=J6FMCk(Iu@E-ggL5$u+;uP;{p2$&QkLkY-f6l*MZVZHk#_M)5HbrzH zJo%`?jD7wG=5j~)_^=5Hg&t=RC@SR~6dS(2z7+HAKz|;1r79w(o?-l6wI2Zkkvr?d z&W12gGO$Ag({qn#^t`2@Qch>aUh9YUoaohT$QOQ-#WkOKsTlhG6XJfnnT!oz^y+%= z41cZFR^KSx`vtC@g*89O9`L^7j!y;9A$mXj6cl(T`rLb7seU;36ZR^jZQiI%S1>fy zlZpD;mnnT$=7MjpTc}B_2840bs)_qrLGN7al3Zx!hL^F9f;_%1S=NM-yntGh=G=C1 z9t9u`n;cW~@bWM>^MfSwFWUigSV31u6ajvh!U>6U2IMtbn+bqOR#)OOS4j34&+J%Ig<{1dt+W^&tSX7-Er%)#4AAFPt2=|5mc$t(=~o@5Tp5 zcI6nwA)}i8;L$3vhmTG`1;Ro`g^NcGi`&@R_C77)!+nzZA4|L)$%yQnAKxCzl99T( z1$+Mr!4RSpy@c&`%?}IR?f6%_paWf9Pw%s$KeIYxhXEN4!jDdaH_Hc@Z39%0;D0As znpba5(>rs=Lr}!Hb@uAltcZ54Y~{bTR>T+-kLuT}Z&&M;-@Hl@`RH;~t1TYNRu91- z>{1vOU9Gh?fG#^9UEYUK)>>Rc54#$UFkwINw6(9669c0z{T^#onY2MjVf|T(zlB_s zr>)j0Fv$7c&axZ&$0W`HsX31;ynp&{kK>Ib`+Bx@ahf0m$64%UgbwRH{3y?NMGr3u zV@Nn_je&Lia$s-g);tPGF|j6v%QfIKp%%SX;Vp+hhrcC;ZK87`q=**%*v>%j(UA8ap06yy|j%#-*H?=z29Z>gRNMVQTG#2JQ)mc83$aLH(YTdYzG{QQq0(YSz6yqc=U6-akDJ4h zmw`Rei)lKsK#SYvaGlzNw=dR-Ny`R3y$!Fj!rh6Z*Ax}U5;><+TtHA*I40N4>;0#q zQmu$RN`b19TG{OEAH0(j-&x=7p;Bw%m!Z4hbTc1iW z2gcnDL4HTU8SFP~M9Gz29ii51^O;#$x7QNqnN+T(;nl}#2%mjA!e`a^x4s^lacs*} zQ)BAtfg_WFoWNlV5q69NRpqA_44;QN0@7%uU#6lDp}uzaCgT}lU(5(Qe9bg-`e8$l z?VgtzBhC`Pw}JX~F>PjJAwseMD?6IygC`bRwy`O{p&F%gef{YCVnzgv3*jrtm|loD z&S+?PnDnSw>1=8U1)ETT!o&8}4g6<`;NF)XECAqM- znDNQsVX*Z{jF?!ZAyTCPY{gDgka-pA^Mu$qxEV9ks%ocYH#aWd=Iy_gHSrTRwUJh+ zU@HsP5ubpm7#sh^Hwp(Jrlgd*__$$qzP}sXnpj)IwF|6*UUv9$y8MC%i)pY&ag@c` z^7=+CY$Loh=YIr2zYrf#Ms!S!Ejp0S$FL+XLm<(u8i~G|&lEcDrD;Go>Am@*rYI3Rw!17}c~nK{Ir`qbT#9;}fO5DqlG z`-5F&yKEj|h4UD{bxA@)ZAC{>P5ZvG+vnsCmDiLdM^xM9D> zH!^4mt7|{dI&T*s5QA}Bn$=!iS!dryd<>7sfT6tl3_oD!CNCzbJ=8{OR z9)aI>aTHtHL|zR^hzH7}T@@2lw$A2}7Yj_2wUOT%erMkB4RV$-g_mndZ=1jk?xFrZ zMH;D@x;<*vdqHp1+HU<|QcozY&sdZzr@wBGlVX$!KBfeYpKocaG-8I^Yb*FQsqK`0A-pZm@ZT_V1_-j?@+>5Tt4 zWWT_v*LvK#NOi$+FU$?8Co_{mLDcnWpGB6WsT5}Mi(b2+0YAR9O&ZI16~}dP9?s0J zTL)PTmZ9hAA~6|#s35pN1~p}r6A)X^w%iwzQ4mJ&JiiG(pnY%qOt16Mh>EPeInp!2 z8#Ca~qz-Zo9=JApJ2wg$-OyU076;gie%iu}@b2P#6g5x>=CHGC;a)4xHz6gTu@X^Rb zhIU2~ol&@Bzv~_B#2ajhFF-P1s${f99^ZYqbWI^Ysrn^P0e7e*%g<1 zTEk_Y>w%`qX#QQI4OjNd@^7D@RFP2HmKqw^hQKQ#5UY^RvOBv!=EESVfP^UMmKRf; ziUal|;CWqa_OHJ_0!!&%rx>vhzEJz%K-p=g*A;ysDRh2k1cm*2nRbkZJJom9mjQLb zs~QF^!Txy3x_U6^J8P0+0zp|_^Jl%gD(#e*j8|8%j@#^bNV_s_`!bMd1NZm=*}vNA zF5)tvoCC@TFa*Ud(P}rA)Wk7^>7<00jzu<#m%^ZY0w^L}S69_Z$lpWJ4uL1i?8+{MMRB10boj2n*bK^8|N5KOh@MM!UFD}Kh1Sb<;|K5;q$JDgYpP8 zS`R7vF_ql*aRoE<1@-v+0+>gN)SyA^G)hkXg2*Q{6jU>i%gD+G7wkvIV(vF=@8=ip z3*nZ;cC<^XRDMYYj{#D0a_kUH#FPDZ@`JnnXCrbz8E-eS&IY-qq;mLAv+@bp4ep~p z9#6u=_blGa_U;s9aav|B=~ai_98jXl z!~A$`PFmKJdhLN2-n6 zcfqcgrQ1nH=hs`Ao>_^wxNy1y-s`NujhinouEy5n7zK3yc|=S4TU75fPi3rUwBz__ zLY8TUsB+QN#1u-0&QR#GC`Ygi6#8|B6(lnQM&Sger5NIgEc~Hv}7{6 z=eg=49yF}VS)Qz7$F@(@Y3CD)tDhB=+4hSRXXl_&9s=L?zn+8_K5U`$b)SeLy&Gk; zzy>TIo4}4#Zz=YlDWh)*7?wW98F1;*P~!PZ%d11{z8)4FUzn5eDL!|EjL)Jv83~=);8D>G)*c@u$%Q#^Xgm(+cW7!Bttk#+XVUwFzzk} zFDz&&#~go?kk3-&lv>$;Oo_ebh=N4k%@qzLvoA8HC zL6%<@5X_4cU^G~}2_iGtBZkHhHFb*N`=E2tJ~;epEcWay9a{Oi*aD)Y(k@^=$0s5k zTAD_u)7CY&1$Q+K@J!9!o1_%Dd_C&zG3652i76xJRg~SG5pN5Ki296WhY5T$QZ3D! z#Lm0g(V49uFV}qa1dejBh4mI=(*vgq+tJUF3PiP}{*Skdj;yF?D_yUAogSxYXdnJy zfmH7D|MeNZjJ|hv?87Tp&y}y;k3^q$y+hTXEqdeoo_3L|WEK1BUOy|~ZS7jb6v?^@ z(z`iu6~|-AOlWopt6=>JimPcfwGR27602BDo@SNkx9RoTeK4YzTPyjWcm#LJqXr8E zu~VXft3RMY$?UDcFh~C#GSOWC272>ZZ1b`|57e z@Jp{T^ogL_fC-qd#((*PakzsTnn>y;&bg}-z`i*33`#HqT<8dCsG`}~1pXaL0(5xu zt;2nvp~jduv0MX-*u|g?1YxPgU#GV#ZedSEq+_5vG&{=S`S9pHhKD#!Z;z9+IF7d> zFF{{U|J23I&aD$-QNS4gS$<@TB8fmD+ZPonVPpHRGjBaR8=r_^@M(mej+s_P$;<-u zljl}(eAO5%ZrIG}_OrDWW^<;2;_j7&?zI_ERa>MI1Uot`wyc6|RZL!R$84ShPRUjt zM_HV$0{2Pqks->Lc4>#lR!OznM?==gbTuc`j)UMI`;oA`{V9xdo;oG`rU`USAT__} z_x5*Cl4WfeaT124-&;`spiKR^6|8%`;2oQh+r5Ep7(qvv_AyFGLhKnc4l%P1gj=;| z{Ap|?zH>ohV21d1$m*6PQV9*t9*nL@@NDF~5)qsS{?N>U%+n?H8YE}?MW9_-x-|pC zw3eHGtFPO4tIc}7bFV;5!ajSYN{64}LVo))Y%Yx$L+QP8?g~tM1=eXjFg8(fSIMGA z>pOl(j@+gABE75)wOeATUI5^Yr{JqsOX%K>LXnZsj?$Pl$b9=F4tc-Fn0-`8Z?_Z+Ah<~8BZY%$ zF9$2&V+73N3#|N{jo1Htyj4l)dd|Hl3KAft+WoIzewfQp0X%{4oq+ty{t6#vcrwXIla&s%7RH?@R9;L@V$VZyU!8o?((NBLsFgq|vR z^ua%iD0Oawc3zlrgfA4okOR^9fO-W}w^MehTx|zoz{Hl^lc7=iwBl^$fE|l;tD|Gk z^RNx^N4F`65Nn;`NL+zwI2GOcs8|XXlvjXd9tm@0$?R9|Yiz22qC@oyVp(!!*gzAh zb=oQnQ2$;?e`CjfeD2@YL%WSZz6=pQcimSr15x;Q)AiKU(Rx-6X(B6f82{Fg~3W05Q| ztW}nxQoTp;$2sv;<4G#Yia?T$^I{VUzreH5l7Ot6OD=dBBb5hl-otK==Gne)8FoIY zU(sWR@8r>>p@XE0(XUf_I%GcTyr%>kMxrCHa`%)I_^v$(NkV(OCq>Jb%Q?Ctll_21;y`_yJm=<(dqrwOeD2R(5R9Uc~= z?qS(MC7nPUA|o=C;hLtds!K&WDL4L`%~EMEJq?0Ec%R zk{YUCg{?MXoeU1-O@STk&o@Ozj=!=2EKKGK#VTv*<~76ZhC(fXIWBPoFdWOsaHz+- z<`xNw$>w3AERkmQ0}|1EuIfC|K@rIsO7}lvfmNEh{f;Z$h{Jq0BAd5GaH0BS0LZmx?)YLug4 zDi@60hx)4qFZq%npUgp;U`R|kJsh*OrUPzp_auU7!N;9Y83jR= zH%I@gHU?_GmbTho>m(%-)9vCImkyY15F;!c(9FpJ1a015h)+Ve_f5FXyD5c5vOrC; zfL-A>EI2^A`9z3-7xnr+6C(r9ym| zpvyCjUIr`st+@BFPlUU=_ITP&QW0eM#-TT%ZUTYPTwQJ=Yx)9=`l`3lZok#Eun~&9 zrz&dMFoTei)5hSNnkYyU%wO)PoeVl-h!$&h*S(y`F{9m-2(A_9aY#&ae*}Myf51NE ztPcxoJZ`RvTLzBNpNQr`hrmnrN!LPOO?7<0LiFrla?xm(=G(B(F2A-}nw-f%Eef}Z zJZy_}eg0if{1C;EVR^rE%BQ^K19B@89vA zx!8=sQoKet(;_vN1k7odBs){oaUFPJ3_GKK*c6C9yD6SL5+{mEt$fSGq)lB3{ZINu z*eDMmWzG?1THGW^BL|NZ-UJBx;alwc`qIj~G5SKt>fhuGjO#2kzmTd-wf`f7>?s-4 z)kT*RtIvM7Ja-8Sfls|(2)4;^`6U4iC^c>}i{laV&nMB{e}v@sVLxwIycC zAEi}{+U3vU3By-IpjER-g`)Yct&ga&^@X7~@7e%19|mW>i9caZrtF)7Z0UC$V?$|~ z0;qEmgdFopJ!;~8@*g4^aR9avxztn0d9^Rvs^yxh^th_@*vQo>f*h^H9M8my_hn_= zTt9!nL*M->$op!W)sEX2%8w3 z!$TdhzYFkg=lcmUVt*`KO;GdEi z`E<0s?p%YF88*hUmq5SI96QOC|7KWS?*{*OPtu(Gmvo%xL3e)+nQWoOcsO z5}#+>z{Fg3cz_h-#LM>>)(-To(WNRw-oRkrex2%5xJ0t;k2&j+eWVf2DbHeL8sd_IkQ5jD-O8EWvY!Hn!s+_PJG8NbD%9-~63+C%EO$w8W=ji`>Y%=M+n8_s0HR z2hU?3lHh6ks($-}om(>Y?}&bVV5xWQ#w2uN7qaRXjA-ogT$>#T>rIzg29xR<(35cW zF0Xsoyy<$`L+`hZV06ZFa5BaaI)W5Bf=pavX5PI(FZM|WJvr5(T@wQxgbpHrP_eeq z)YkcE<0FVvtOuUg&dUG{>iI&WVKDpFhde(WIT*|AB1~s=@`9@5cRYk{nic&P4i`#8 z1_t9b$z$_(@r2#!c&jT(6lzHn>dg$w%KgLwXtNj%_+D-dyk2fd76|n+GV(rp#U;c7 z%5Z-38u>@RA9^M0>F>msanqxu>7h&V691ONYoJ8f|J~wKBl6GvU008|;JR^kqiL3( z{atrzeC>P?Z*$|N@N#n#@}hls?SB_X=l}1U=vanUWk>qgPA$OSq5L zSBSso;e{bb#J}(MQr9LRa@#vD;vPK!cXUeVDIeW=9EpG{L5_*Qv0`z;N?fmEbhyTe zKD~j>5|>Za%45PF$IzTSo#!O`^ccpwU;i%|7)<(;Uws_H-Mo?-;{W)4ql^ITn7ak5e zsBiFG&bRihM9Lp2-RR~+fyvDtfeMC!Am5M)Rc9GiVo`lc18B&}*nzs?8UNffl70KH z%`^$-Iv5ZoAo?sg_X(BTrGcQT-XP&z#e(EyXeOZ;yEk1+@^1A?-ciTCD;xKHA1cby zUi$gGi+`{vONVN4BMflke^{g8bG#pvF)HGJq5&|Bl)m@J!h*2&X{J<&?z*4hcajIX z2Um+zT<7u0B-T{E<#TIR3fiJ6RLcTQ%p8z+cXxjZ`xDNkShI0(^!18>16^yCOM-1A z!b`YSg@yN+yBiYvCiyvjjg2@l=Vwllj}$pUF%>g8*#7vrJEXByr5ZR|F{@dQSr)#6 zsbBwRz;owrFg=&#mQO{rE2jJbzL3YLivk#(uIfSeWAW$(yuhd^9U{%+hc@o4dv` zFO)1Bh;U_tJXT1*h=&&u%o{X;kaI|@OMGB>wc}jn;*22RYx=F$*Wn?qP5d?fbvL{q ziYjK~%byGWKcupbsbg3#a{K27?%(*6fwl`DbX$RD=)j4Z&#(lZ=G;CH6~T?x%hJ$E z*K-?xd&9c-4gr!GB}&LDw838oI0sHafjOw6RXFKNxahHfE%9H{OCn8=TwEe1z8wS$ zXfS7&mLUVw#6_DJ?i)wzG!e8xoRB?`p93r%1#-4Hv~s&`6Oi6ilZ+Vu!_!x=wY9YE z26uO-K!F0q-QC@bQ{15x4G`S5l;T#3dnv^U?poZfxVt8t?EUWVFy;kX~^KqvRCxVS-J-rnO{4|ss>0f<(+ zXv;Y4OSN&yv6&0OaT?Na9r)1 zh_BicGHb?zTrLG)R;5NaNsUkjr{+cair_=HI77Fh5s^>&8L!=a3aA=p?53yZLuN`D zJx;HPs@$qP<{razV+HhSvJ?>O?1L?a09~;YI=+AVTC34wdD64hqQmzrhOqoh)>%C8 zTq$L?c9cGE7Lppl$x4MKm>2&@CuQ4DQKPw<+KEo-r9nT`0!YyhZXlDl+S3`6Iwc?{ z0W|#(gGYM5I?3}&7VFETCA_J0noy)fj?XB_M>~nZ`{~R!>lMQ08LfJ;%wV^;IzWl> zE_|K*Q+LDJvMD784=e|p-20r_Uxz9=dig#qJ@fM^3pYCcVqsrk1k?OnL*NqKI~%zd zk+$7->=r9(p%wNkIYyqcW5mQ!kAC(k+cI_A4?otju29b?K@eW;7U>omI^p8&CUw9; zfXTaBZwIP~=4)QSjFq+B=7^LVT~SO%89D4*!TY-G_3uwJ&@3SLA(fnDX$ zVO~&cD)JukYd;NZrQZWj;H!$8FdE@KS4aF%l+EB9_jR3}4qMb9&LjyErn%4X1z~!m zWaK>uL#P^XR@ASV!!s{p2(PLIHw;N&zjft1(zI2sD_}PBi3=ULG4^Gie54#+};Ygh#^NFIf^|<8}drB_*oN(ukU)NM%b_luSO!0gtHfcXZmZ@<1rvz7*f9Pf;U^ zutDXj0M0Z!{ZJ?GJvM_Gbvqtdo~!toct9}IWWI;oORN+C@w*lxq5e09`ux+gcZB0kSOmEBs|TR*hlg6ecY3zwvZ!!@41wz1`{*yOEAWf=abTY>o^;9T3z zR(-A*^i6coma;7a+p=|cEWmm_TFYCtUhF0LctC{yJ>@{33=KanTh27J?`SwrV+30U-Cmq>jO@$vJV#Q_d)_%;{e|-2Wtsw!6;4j#J zlq)(dSpu~y(iy84oXQL;=iLlG`r?){X>4^+oL`B)&g>8f@&t`^)|60#QthX~tozzS z&egP!C*ogJ*Cbk^Mz*L)yfMQ=P1Ym`;||jcyPhC#2*0(0r71Mgo(-nqr+){&oqn#k z9qXsLHEW0N^zVb(Ullgm8gN#Hw#@!F+6RpPtLALVuOxFExLqCCwsrMX>fjd3?C{?) z;Qs|l7#@J`Sr-|d=~Wh+NjFMr7QxkES;!+w)(0bEG+@sb+}^qZmWmp@gi{nm&yqjN0TY(s{ZmlDQY@x9;YPsBx|vEYjAVNtj$sxhAk=N zw^mY+%eZ$W?*l%C3>8C+dq9f@-NMI?big+S5);)wXw>?b-*W#(^G&|a1bdxZwc0AA z2KE7c{=|c_uVZ)AO!F6MGA5%vDV%WQU2^J{6I*fPxU&c%qTi8h(=HDmeWT40n}GM& zY*v`yk)a(Po9q*X+FHjqcUZNK%<+l}yWS>|zcttuViJ#1iyx6u{-Jcxu4|R?S1SrI z`hhq#FIA&u0UQDo*BQ08ate!%t=!CF+LqWpY_Lt{LrUU2Rey-|)z=VRmwmfpX7te% zU6pfnifG#I#;zz2w7=yJP2s%1hN_uw znqVMw7h<52z45e1bH3qsQ{}$B`M;GwmGK{JZ15i&t~L*i(rKVD2i_ax5$A6Jn+z-3 zSB9u_opeX2s&p-I6C}eN5Dc5wOe*l$l?RD_@^y^qoIU{3*06NF=iL|oB-VHuOb4E^ z_?NKLWgW-^{FNAItc6(R0i3s|6R^cFnLDU;gsL$3ZnXu3<3qE$!*|#KgHUvjJ}lZz zF;5p`%#p=ejgMv@AOTz?I74(Su&Ix&u5~;*)cX4QD4DlpacYZH0zCWOKfIe5M@x|( z4isHUJ)AQ(Y#Ez({o0Ie6{L=cg+M@=i-=raf50ymDti}mS;7UNz#-_%I6g8satt)qIOUk0GtlQ{0$6zA(+$d30_8>QLVJM&Z2Dx^eTvGe#T zYt4uRSG+sAJ*}hYu}Y9#20!t02*WCL-=v4sY8I?NoDHF8QaAjy=fkAFpc6+4012`bK|E|8m#vQ#Uy2pYpX6zV8 zZ@0R*4TD}Ltl4izc=9?wH?#jS^TSrws?RcXqwh=r;q|ddjKN$?_G%Y_(9i)~tydXf zPD?7yNxlWnY;O&_U9t6rCg6kS-OQM^8R~zB8Ey=P%@ z+{7Opg!uo3TETk%jUnf=XJYs``OH}R+AYx_frz4uuM(rnYGSKLxp z(gPp4Za#bMT=fgxeD>LSX}NB0X&fG%cX4*TiVp5oMK-EN*PFR{(a59Mh$n=TNi)CW z75-E$R=7B6z5Q`LW+Q&LCY@ptgER-R!)CJmq@K{6Ek$@b@Vv1WjXj6_6x)~9k7gID zB@;gGW#AIk*;07lNE)1z<;Kv>BVg#pE!`v5B$_Y#wA}Y9{WtWW`nFT@zMKtPs!w}8 zePI>m;7Y9~+jREcEZKbtzxEeHldx=BpTfB82>ffiU+`yRy!5Lv4HL${b{f_f@4 zuY@pea4J{P!rC3TC@f6S^NH7uZ6iNT`1JIQ&!0&lUr<4@TEAePg_-)S(Dzr;$sM^{ z1O$ulp1+Xz6DlH>3;uV5@cOHl7UpoR{*ahwJa${-Qe{P~0pt77`gus=Fa}1|n%~vu z%QN$!*2O#PLwX1IMKbISo|C8AOm=KQ^ ze-{tVe@U`;rqnMCG-GX^Ct~=-6e8i8ly#teE&S!Q+;e!&xNEH!d?cEORHr6sGXvKr z*=;7ZiS5?R2_-h)Qj9D;gJk(9XD5;2bzz-nAxc+AqoiYk)1y|r+%196b8td^E^O)b zZD8(XCvUlV-(iMeD~{`$W`4nLG!9%&*$34e9Q@jygGNr^f0Oh=c5hu08YI_0K0$(@sYON;^&9mSTv*&3rh zp1bo*yy_R*W-)O5qsALN|AB8klTjqyhX?c?i3MW$(YKE9J_!oA4rKzmWw)(cmu~JC z5>pFN#|E{qQ(wT{@=la}B5(iD5FHP+@J2KC<2SG?=8M6V!;g70`o|}(KdiMWW|=6} zdcpokQjEbPyef*pz!x+P*)SqJKtn9njX?#X9yz)}=&7mGbYAyhhXMGr&)+a}@bh`T zvo-iJck)x09ktK!zaR^V(|?np^lA6D(G$+=cCEn%n0w)2Qvl>90>1O-2lIn!w1zMR zVwc`jI8;x~>h~k&^qG7?%n+4I~Sos!hSUr+`wb!0XY&`TwMP9ewYsakAoRsffgSfyrC{U z$ql1xvSjgvJI*Q#Fx-@MG6d5ighyebH9ngSrzqijc9>+dMMV5)&I*uH1$i1fsqKW= zCybPgGg@+>0l8zdQ6NN=$aDFf_3V)#ct<12C~%%KHMrpZ&UJGaH5|8ZLseRZJ$~=h z@}AaTwAJ&c4-~8K58CD*A%C@}#j0aBPyZOvi|_sF!gT@mcz;HZt|qXMxV!$^$+8dP zw}19ptk1ty;Nj@3OA?CY_9foHO`2?92Tq`eSYNY6y&JP)nWU!^J2#t*PWOW(D-Gfe z4J+3E~}wOZ`_+Pbt`hh9!=-Q3<8b>&OrlHtjx zLq@fm$!}Sd%NdjhqhO;Q7##C5A&f3^TxP3-YVSqcHNaYxenTI5hsnn><^EIVHJcpF z8Df7D-Do(u>0f1M0qMS)cnLF3+Fvn17ddUpvzCC|%p57n`~&4a-o^3$$2t_=S$Mqf zHF|C2aCx0@gFqo2G?3D`1pmO|fI7bpvr5DagUH!A{f~elWG$GM&1+3%kl1+@g9hIG z#34--eGo-)QbNAYjj*s&>n5iobluZnN=P`yUZHf9$NC{Z-UqSXknqwlC+t;)WY69A zb9C=4-am3EAP&vu((yw37s<4=wn|+|I=mVoT-w+-;)+J)H{l+86AU*v029}GuJ0OK2YXouGle~rQlH;qqIj9% z^3`4N4VLsZGI_bM zO$r`bvD|Cqk*x15R}HQk4?V|De(P zjM%Zt)BeyF@>ba2mW4>Z4+OX}lHsDhDYMrMB`hPBg2DK}HOW(Vik3n&N}OEjcDrB& zMA;Sm=-*87NIy*Yy4a^FlLn_S#Ka0W|qC2;4V4UG$~{?VKrB zMSGOrXZ3Fd#NC`+WS(KmO*}SMA-Fav3?%=vRSX(?+gUgd z131r4IZBh72f#64vplk7_Tuf4#7EYld)p zz5f24py~81KX}+;K$YrQdoBiSxgFeiYB&{{B>w5iTrY>aq45(omHZq7GxEO18|kRSFsB{;sNp3+5Zl>bUv_)1QIu1i?-nMm+W0V2^^ zqa}uJqkgE-7+w0RR4jZwl&cSUU^?)Q+ke7T>Z5ND9U%Ib2_H#TA1%OWyPERFJhQE@ z2rg0k-9Nhddm4#<)HBJWwwn4*WyIH#;U0uqv_s)PLWR3{($3VChrM&-kN%cPgr@> z?!!EXw+XjG4){4|aH!e$Pgr}4AKY_Ciw-^T(|1<13f5N>6h(aRhml|ThkjFn6Zd5W zGnU|@Di?}U-P&C>f_B4~K3~hf3w(tRoWgVfT$#z)}`p2_dPiI}bVj z2}y9jx3YHJr23)@@)tdEd-C_rzlw}^2}$(nB94eb$!Gns9IG9_(!I5Jqv-2V$nC)V)iuT(5(}1n zO-TmxhwlBv@}6^%aZ{7xB;5|qfNZ`?6P^8w{4;^20wsG0J8{R?p0Ykq3U=34K>SRK zq0&Fiv~vB!39-%*E`7rMZ%;@A4^Q*sgqO3M3#^zZY=`hJDM_ogvMe0~Ko1ws9g2=- z2yfFTdy37G6+g22(P^(@c{I++uMCSL=kyIjjZ3x+2Hv9LRA|_ z(WN6eMw4KLlc+$-288kU6}7>`zT@K*JA!Cx|4`5QnessV5n`$A zXDd&dNdTtcd0VPDUK8IRswx(AwY`i0D%p!=6@%?1l1EPk$q-DWj#`6Gg)jthE3TgqNnY5RlloQmX&Q4J_n`MtOu{RrFm| z^hbybA@=WE%GWh7-Ne)>bTZuPL`{aVnTF;;^J#k0n<^@iS#u49qLZf9l6Qsv%!FIz>$A{#9Yvrm5y>TX4Rc+J-~VEg$qUDp3@>)@{gsDOC@Tf@A^ z(MhG72}E1Nacg+ovGIjE_A%~PiUzY0{TM1h?P8_NaO84R6Zv=M!l2j5*Tn7!*ptl5+_K8zEVsr&a9cyBu0(`kj^toy~!!v`vS0`wB zoxX|6E%B;iQQ9pqD=Uu~+t!6;MQwf&;h^+{*&kH78aiQL?r#PJVBZJ8UoFmXA?4p?~hMe{$1 z^|q_;djTmGSUmTaHKUV!WUG9?)rxil)hRjVqrOK*mfM~SNAjM>>_DR-1m~%c4#o85 zxT&Su?U(C4yPUym;lvjzzZrh&ANj{zO+j{)pFiq(ho4Z;)P_;2p|QPO%-Zbz$O7XL6Uv8qYCL19K@B)`T%%o}4zoG>_IZ+& zEYL^?v~d>BaZm{nJ|2KAiH2M#+vA-@O5zluMxi4%Nh3c4za@;-AFHe|sr{qv+;XF_ zR-E*8#7*MmUgNjt>!8osUPxP>)xWm5JGuYlBb~T+j|~gOpxfbm>NM?VjS&Tu^2$^h z6@yatc3qzGdU<|6_2WkNYO{03ufvG^gd;Nu(Qxo55$~@7NWQXwE_ju+PuRC%d_O3N zzT)sFQ)fxC&Y&KgDPSa_9&BQ1m%aND9c<4Vs{VO*Sh{SkhWpR0F zz>FmVGRqaai>|E7J9V*st*xW#M_wW@k{~S?Z3%Ho`$_-~p}6Ds*aniPZAE#A3-v9* zJ#Ve9<9$-KPOruYh<;qLM;8;VDOJMBa&a~79K;?^+={f)R%{{**@B1hBPs1`gu09ug)G$TAY@EDzRnI?=gFfQ0doCU zFOG8dn&I}}iK{MFA|L17?AG*9zXr1h5C4vma}=U~&zm;qv+(e{b-R^Q-R-7W`8pTZ zfG|c>C)a1@Irn6!v`1jxN9_k(I{>!PU1IWPE}2OonoYVjScEn0jz_;lFykI6rh0tw zpLj!f&QL!@&!Ve2&1)5OaTUnIQAvUpF*UOimp6eJ8KvM$K}FTSctCo8*T5WHGr@jr zcr_<1^RjfUqaXx~hk^f({|YvS&Rs9`l}?LNltRmh!aoQ}^zKaV7k?m5J{p0dH%35t z;ngC(BW+hJbQ`{u6@#4l<|TeVUEE&v^criB2+vox#jI#}{&UZtgZv|D=4k(){rE1T zZZdx|{R2WW`~@$+DDm{maecDc=nOQLwrF;}YMofPB7pt9^cIMX=_emoe) zn_(ec{kLE*NppQ87#%64TPGS@?YrF`zP}xNp_M&m%5UuS)?Zp(BSsbSMOuB|J+PsZ z<73|qS-$JCZ|xo%_zJzECz*>5?vQZQrK{4Vj~d!5phYAc!6Cxwi%Duz`9$Sn6s)o; zm>Yhj$Y0!Q{mY>ESNJPEe9u$3aMLFMMoVR$0!W8U`jG%9sbWg%NQ-;wIQWxe>ut;5 zH+=NOvYV?X57-xOZb91je&r4Rjkf7Z7K#iOaT)c(JDlg$-wmmK85znE$Sx+w{pe6a z?d202vA>e*hli6{;K$-3hThG&_ed6L9<$6EjSJ(BrrK^Mq|5UBqBe9Y!!pZXi`AUE zIo6bB8(wiJ%f+Y z6r1L6<{^AYgnHE>kwyp^-$9MBicS?dcYmXLNf+X7M_YY#ro8l} zg!x$lw%S@c62^1ipPbUb;<9ND1K=_P@>oAM1bpD33kI4ibNE$`*HvF+kd@6K`27erW7mw5KGJTce$pA0ctKIz&2q+-8xT z1A-ag!SSJt0bTcuq~Q!Er;Y#V_z*5O)Xz_)=Qx)~y4;YZ(2%`Im*u!16Aw<7>3vxV z@P)pRv!@%^$k@o&>g`NVH|@fAO+BJR6XHW>Vl4g*a`ODrEk(jW`l5sLQ#nCGc?L@P zFKHd3!qVdT3Z2Od^eFIfpBsG&_^1^a@TGY1r5Gr;Kz2XLtUrAq9Py{|`XzS*a5WQD z1J^+RDFkImeovUpO6(A?7 zJS^#m2Hjz@Qcw)pHIyxU)^qL=E!sj2MU_U&I$Ge?p&tPgTd{gisPIK>Wst~y zj;EY&;0knIyvCIp4G9k`VrsLCM)X%6oaLy_Fj`4)UN0r8`%ilbzu=BAhS(NS+}Yl& z+iQH*mwY?`)%$8v?!LK?)667QRk|!N*38h*OrAeA!qNAtsE~7enz@8g<2viurTV?S zn@j(U-Q>m1qo=dJlOhogZlXMHto-!c`h-eDV^d>MM+XAc>FL42LDvZE`!DF%0o{WG z_)G6O2xnuk80+M3=QrkHSrsMqzZ+wg=NVa4u{sOMsU5mU&kG0KCVVcb+gwZO|MY$+ zmIg74N(=v0vJYBAbYJO)d_mbz0i+CZp)*O~%oEQ#`2)r9sAa>uiE)!q-#}183?W{+ zmz?Wu^bXMkF9`N^%mfM2l?#%`eEcDPaa^Wf6V*)wVU9wQiJk2Tp)u2po$KPTxXP@x z!bF2-Wf)m*6lL`O4X7^SW&l5t*qpZU27YdbVe-<>EMRSiMpBUSubxF$k$(LCP*wZK z5D?@Qf%t4A_>U&t<&QtpjjP=Lds2gavtgZ{0{Tz3ZdCzSy)X{sZd@X0r{n4$sO0~T z*5>wBEMqjFmwNrh4@$&7`i(d>rtbnTjLpr*Yr%OVwH@L*9M(~WGBPfD1owo2>#K$Z#Rt~s`RuiG0xTTBe3i_1bR_A+KEbJOc(+rU)5lIzsic9vpCh# zY%5t)Tbd5`{^ez{H-`D!+sAhW7R0d*6~~5I+%wdR^eeyXvyqya$xUYJ!$;mvphY;_ z6&m7D5odk!BdJywl36?Li2}HkuTmW36k)Kg+2(0N8a6e2i)z@>@?7T5~W+>MX!IM+~feiiT51+$j{E& z>tanGf0I7`J!7({u%emQ2hY=!WZG|^{r-jL96CLXhy3*9%g&E6qfSM28F1?EgP6Xz z=YDpA+4%}Nrw`1Kg@ygV%FMZV#QIl8M$q-s(>eY8@x|6mGuqs#7ivwr%{MwDdRG)I zh}QKQCpvoBS|j`d6_6v{cb56ufwxov=Wap43Ds(*2Eh*S7k=u9fOGZM^kG)XiSc{J zu&fkCv%v->N{YQv+&tmedOCO$f8r|>fO@;Q6V#Y0eGiQLZR7J<><1Jk#A93@^g+|! z$p-^cDrG^T{xgEMe999Ff1I^=fTK&lq#K8u6}^?etAx%q4XLELxdh6qv#XPKR5a&E z3Ez<(?-AeEnRmL}3Zh_e#;V+<1w}u^MfZ~KUtxs=7JhmJG2h~?W0}2G3d~e zHVh!r>q#MWx`e6I$~rvT0=HL{pUXX2eey&%ATJUDcBRGp4z0!aA~*BZ#^dsf|KfTW zZvVsZ0}D@KLbb1afT*h5jfbb@^Orji$=d5n+dkj2p!w>Ce`!etdighG#iDiFNI*k0 zKy8|&DF-o_`sY~hS*GJJkATLUs4R&+JUFZby4ATP#d|<&$=(#7Sky#}L-@+FkV6+- ztL4uq6)xE_Qn;?=rE)T;(De~DCFAAGoJzazZLAaWY-MdqjlSQa04vqdC`x1xYNQvE z^Y6{#SuA*KyFvs^<00LY9{V5VD6v;eA2ov zH&BLT@%kY0w&Tacxt9t54OT_mYdwykp*X@c80rKbk$T$Ce;Gfe)6Mz4n{z^4V}}OP z3yKE%oNujn0Ed3?3|aqtNUIG(+IUa^mxR6keS;$Rs7f5x0m%>p68B4o5CE!Pj2Q5D zZQg6-lkac7o+SnK^)FATs%;(3jW&CqqH7N$RMoP%Ljy#``Y7#lwvgC8j%AO7~CN=cG831m_(ZF|wI-fPhIGYmwM zo{t+lemf#em24k+*G99RI;N(*By=si{wKg>JeHQpG-=`5W=vpmP*ODUt;M@jXBUMx z&{!_`f{Ad5qh5i&3@znef?POkg4{{dWH)b*hMCaU$55GPc$Khvl6O+u`nzFuMhf0O zSci>BlpNr{)p<&Vd1{CL@8Ejq>!eqAG(IOuaO|KQ6WK1Kxdh9Fl%JU6Pkq&7P%;uG z-U%zh5sn(L+$$mE?f zha2&41D131wof-ux7VY9pxyq%)sfK|M=ps)=3SKX`DlXbY519)aXR>THm#N7%DCEk zb7lMj)SpPjMsoDP=+zNV-6Wi3WAja$(rqzFv=0u06oFuqPcNmSg7Gws z!mYwNwKCb;yU}*Z?hV^gRj8>hzi|+!aHJJDc+HYoa5ut7Qe`N=p zAX$XRh4Mw7_2x$JA=9nk%M$>(y9W#FY@s9%?7Q+MW%?$1U7muvtDN_yY5U#a8uyCGveWvt-&_&$NT3hY~O|v&GYKk*Aa^IrBkDi>NzxNd`$4g%Gw+VQ@h^ zq^eBcs~fSzV(@Mlgr_znf;&Ut;<1u0<~J6SLZIR>Z?yYGt$QHG($4u0>dZOTx9cN^ z^j}*BK_sv^2W1oy=C@5+YBbWLrIO@C*bjbum^De?<8+K*$p_e%2F!eYQfP_{-`*A~ z!hWxMGRNaZXBvsNDRB?it?MWa@3WW3)7)>**@xe{SH^bE!$AL#9TF7(Cu2xkgLQz} zV095YAqarHpgy2yu-jTEWS@k!e;ej*Ja;tJ3;UserbpgL%;Riel?OT#rh`vzm|Ga{ z{}e_5ko&8RqDeuxH6gw(tdTFXfB4~ZUY0y3F+wT;6VU~Sl<23uoRzeT3v4bsINm?c zoT8|tu4`@&FW!CI?)wPOVb;;NH-W9pmeXb?(_w}pZHY@vgo}Cg3n>G`nIb_D;UHr5 zC{^^x%r@-pRtKwOu=E$&I`g;bt!ny$9}wtDS$%JI)HX)*n>!NK5-s3+33^Jh6Vh2D zrB!)2yNl~R*wY8+C)l+!F^f+Z#Yec`e`JtuY5F z;H27l))itvGh1FUU)-maQ9d&p*DKy*YI)vnO6SDzZw-QAV-Ha~*$&*X!dn6U8Jy5AkcIsk5DI88R<$DCiN z0JAYkCIIOJ4LMo=$%$V(=$cVOZwf8AHILYGPKGca>kn_NDRNgI7e~xB8a@2MZR_q& zbnuDLJ#D@-zBFxRyW$Um3I)N5jc^{?p3AjFsO@#LA7bcI*_;+rrgQ>ID*5;L1fv9j z30ke#-}aPiE~gopq6rN%IyqC8F23%lyF~?_zh?4I-!*_1|C~M!-b_gep zEyI&PV*Zkj1U`qY!e&KU%2~*BUsK2k?3Ae;~{Kvg=x_9)jjjHAmGRKQa2b zY1^-Rs9O-k#`5%57WTYrG$FPB8W%S8t67@jeM!FB4j$Z|v>75LIy~EYevC%_*MP6mb=J4Nnhfr1ghm6wZXW48;neOSIS=G4UQVQI6Uzg;GVOW0}6d$gEH7jEg z($v(*KB{f(6Co%gsRFNL>9Wx0bhLz)G)@(=^a;CBw?A1?Az1~!HSv|;5mhXiYEDOr z)WIs$Px^Bjh+qsQR0`(QyScmHxtS&V?B!L|))qy8lE2XrwGfA~C?YCZZnj_iLQyV`6MKyrivxw|tKY3tHxi-* zX$L2m-_-~~K_LoeEB^bqF4HTsxV+MxN;2vDL)ug)ze#LbqAJTcNLW%7#jogsd_nvDsbA{A_iBrbEL4HS^D%NlCHF@ z9q&=POKNzMYdZjsJTOs`K?pLtf&1AvCd>1xODWX!&p1MS{pD(#k@Nf>3gLF+bZlki zYJ~kS%OCD4Vl;Z4c&X+XpONO9KEil`xyjeDQ384Ss81#C~@p`=RvUb-&1D%U-Y;o68dCRddC$Cv<03_0LsfTj| zWR+uCqyQr20ZHgnNgMXF1-q=wKX6(`Ky`c}7RK;YJ30p$8PeOc9~j`#w@*z`6?SUm zgwvP--!#U*u4Xc?EDn`5u2B=9i7pOSJ}&q+awa|Yzhz^4zr~y@&t=XzyZ1rt4i}yc zF&&Rcwv2-#M+@Zx-N+~Q+3`S8y*@emK7?UZYIg&ddq#F0*1IgjIH1Ab;K8(^z4%)9 z?#>bsJWF~5GVh~5{%*@fd;9eO)<$d(B zLdZ5YhD~zhj7&^|brKV{T7|-J1!=JbyX4yC^x|Okgv1N-v;N7Ef6||HD=tTnPA`dn z`S@&&jq!>)H;4DJ)(ojZj)i zMHy{$GUdOHd=w(&?|wC8Wr7gE2kDQNc2@NKA7zS?DKaynb2G>ieiVFAYmYp2HRLC^ z{{@1yzc)`4KOgAuo6(y)Mt-Zz5Dvs`YGC1E4HTPw?7YsMR4CMqw9GKf$n8B$WxAYw z#Ax>2f}h9{g5d=d-@BGyh|sOl;}VfK*vmNwG^>!{q`M=r&+}(*exabA zTF%}|>-df;&GCK#%fzs=?i|rH-Rj6Phaq_8hl{)PF86|_HvEZJA7_3~ z>;Xc2uGay27CtA{%o7RyXhmE+z&7>?%eI(>`*YD!hkJNFfi4RXn`MefM?=+-4oTkj zpUd%6mvw&^H&7A~>2s^;XMeHg8jQ)`J6IQE)X!SuNogsQY(k|Ov}qb7rPmD{ineQ7 z3eur3#Gd)oqZLeCh|-=;Nm&4OeE8)0$DNwf!_KP{S8ZYk0$p0G2T9 zoymD{&jq1S)&*@cS13+H;+9YVv;Ar>yZLF}*caA2RPX5yXfW9ezbr4!lRohCb>C-~ zu+w9v`rNyT?7=p*+hFS)q}!W&G=q~Kpc+6e(Q~!RlZ!~T4dnErh(e+s@LWs6CS=(7 z=DQ~o{rV#?HHAk9TSWcK4{1>))Nv=V+G&VW@$y03O_VP~Td=t0x@rdwCMZ=eGA!SofDpYjfnQV(Vu>G-2;(v;^em6arKQm6>8cpu zg1c}YJO_-he{!dGT^Eos^2+sE*-dU`o4+D^<6wUQbY-8nk0Zd_7KifKO>8@v`w^da z-V)R3=wPYxl|0@@+hnNq%1Q}rKDqu~XNT9qTOuH{z8u>{;Cp-ucK!|87NfXE6%0Ss z@K^cH{iXL?(%OBB;bMk&c=8LvH&PsR{R+_+v8})}g<6I0Id~h!>d+6IOczCfMAG^= zP_;?-bibV0!X&cig~aQFpDVr)kC>Q$q*Wti$r+?xxCy+-fkOsT9JsA3T$}0cND#sS zj)VYh_iQt@ayBZl7plXyFAeV@Ul;%45azkxGRYSzjouPjZ5=d@Y}Y%fm_IyK)0@8x zoPvFUHV@C-I~;G`yy3#*2GG8Fa~U%*$^kxkIXj2C`qX(JPgtDl-?wlCdYrbL2Rs|S zLZ3^Y?l&Y(v4C;VIxy-+ZO^?EdXrP!EWl$wm=}Wrf@{m|_O0B&cPjX8kl556HrwPt zkR1&qEt`4#y<8Dj6dlE_17T@NA*Ww+P0}<<*6gT)L?_t?YX(P4S8Al*zMEOXJl_*8 z=kv3VQH{i_YyGgmtJ!l1?J3>nGrP$GvL4;{L7*M$cMv~NjAbGJ>t<4tgLI-qDLpOy z(&tdsc|KNU>NVFrIaOGuX^g_A*1Oe|u!;R#hZ4AMX3Mc0Ra^dC$<2XQLWUl^EYgj) zZ{W31CV5KR*RrBknp}4v#|s{p!=>(*<#D34U7~QyHDSM<5USq(DEV}SqdqUgzRR9o z$*eJXp~_ylVFt4jxPc*z;xC(lzF}~)(rB`CTAXULj(n;DC7cpG7B7}$pg-Jk$wbu;KTq8T^=;9GQ<66;|Y)OU{$`Q8-w0 zT9OD$y8Zoc#vf}8U+Vv4H0#g=Iibu$8J}=mKSeoO`G+J8lrv2ULJ-NBCZ+h)Nc*{Y z*Tyc^9+-SHhT6#tTi{Y7d34zMNgwSj-mkSnsHv;OqrbulxNZ(a3DmWABD<~iblq+) z^Ou!)4EoGhXzC>lIma=-TO#S7Nr@9vLOm|?Shh3~>BMfKI~i-;V)zoTiWT&U(yAwH zT1?D(q8UMytekZSol2gdqKG0#mc-#sZ9>+)C-P%dKt0<#h~n579f>z%hn+U$9CZF{ z5*m23pSbzATu1Q!!K%5TGchc|%M4ypkB*%o=IIxZn(1|rIKA%I=kRnm&MO$M4I;S+ zP(Q)ai_&IbCRCku;u}+yg9~2ErP8!zBzsuJOtg87>&MSJ9fE-8P5?pC{YygY*STIy z&3@PXHLn+@?VwXrNu9@xngx%u8wbh{hJCsni3CjQ1-dMsbXr=L{3u1d<56e~0hy2f#>s9_RazaGk7X6i| zl_a}P&S+2l3r%XoR_#2`EJ{qk+~Ej+FoTuWZD$3cPu_10@ivY=!a)rVMC-VC781G5gp+)ai9Ioz}K&NSF8!e0DV92J-FPc?Z;4bkpYtz>K z^6In%)U)d=>zHg>6Q|w{FYY(oAO=^ci9%l~A)HokvVG^rZ{A8?N8Xmu1Cip#qI34Z ztz)00fJ+LW*O%(FO^KKBO1O(7g=RQ>*eBn42oM||9xjXg-3jniDPVwH*@SEk`Lo{y zemZsQ*l4@&&V)j6CLY4h+BeSGlWEJQY0E0VwjhKnXGH5LZ6Bzo#_Gx5-j8K)Fyfs7 zel;cp9rUbhY?>ls?|swE`5@_Gix=^P8LPv?IbuVarYx;sv_k!7o47R_K)UB>9#2r79IJ3Rg3EaG92x>s1)&hY2kY zL`!8)iQJTQv`+m1_|0uHU58K}UX@9LUQE z(VH(Gb{<}4@*^v7KW9BNlc=fR8Rq&F8^Z7IGNPL-^tLUm?^GkeDE**sO~fXq#`}Xk ziPhTGpEjal!Y^vck8sr*AgHI{>)%vC&m&$~m0SJvp@p|MGD$v^x1@xkOn|&SE@Z#? zVGC!Ye>_`&^WdKAqBT7bbN(V{%muUNv8VR~5-XB`9 zM6cF+o?ZoSh+#>-&3S2NYmt8M>Z+*i{+^$h#ONJQ|KQkX1fB%s$(x3sbPVAj(VTP~ zAHdf%d_?gaDH2yOLSQKgT*hJNgfT&Lr2EqCqimP0Y+^8$F`|v?GDZh7icyLa7 zZi+QcktO@llG?Td{^PK43_M`0Dz0Uaenzff&b4sPVQYOPaMipe$=K(7^KMPVaARG% z&ZX$Qtxk-ITi81Mt4-{O-|XyoL&-$=tav{WoqrGu`3e2u5Hrnr`iq(rt7PiKKh zuZQd>%21SV9X-sPJ*kY1UD+4p>uXUZNEb*dm_I{ER8kn12yny)FxLYl17j)Rt^i$8 zY=8@F@#jp99oW?N0W*qN-1j{2i2F=T7eHB6>9f7dz zkbDA`Y&aPJz4kp>70M9`%xZh874&AHm+&WK(#ZR}bCRw%!HHpB1#Uu11pZ zx^%dC3d|Aq3(emj2_w2Qm6`mx*-T9+v%kwxPDxK3o@5KXCVQQ3gLQpM09n6#2YE0C z_EaaNGqp`9UvkykzSiw0!4tq6krgQ`D=_n4Nd@ESNbHf|eM*at3N9B82TJJR)KB2D z&49av6?4S<(@2x@MWO~L#UkldQfBkxb&r#xsHK5FG)O)4y#zgLl?%Gj7V83N{Lxl99^Eg z9~aA;90xTz#DJHNK+k-C=z4yqM?Q4jyx}S6!@ncsWsx*80CsRQP{Zr1JZ;BuV51y2 z8ALhxL{0`>dS*{Tk2p+@C7S&{U2OIebQb`_v3%EgZ`;X`bl>o5_A)%vG?sqnQXsb0 z*$PDbfC5LvGP?Qh%_i2?SYI_A1#OpDgLGE+BaQkm4ZuJfUk-q;y*7C0!?#BT3~bm7MJDb~7iJD|y9VTQumg3B!V*C&R zph}YjA)-mTDjdc!0CPX|oi|im3qQ=*O-Ko-o}8Rq{dU^VZ;$>|9jjbDFi!CQc>1cS zxVEO-rg3+7*8~p)cMt9^!5xCTyF;LHcbDMqK^m9f65QRneCM41KGgFbW9_v{=A2ap zii6B}A4tOWkPJJ2--LDG#~pOSH>(S0_Ivzb@s4qLn(cZK`OfgCG)uR}FEKlaf)jd7 zhGVaV;!Sv0d%N{(Ov?59t5)tEyc}>D8SfompE#ic!anvO5D7X0yYI5j9oWv?Nopwl zj^4ZxmJzb$59c??xLZ}ABsEhmiX;W%?isx@qKj9ItWDl1*GaR-g&wPH_QThOs z6Tc1Z6_IA4iQs|mmHI`bzfKG&#PHEduaYCwQiI;O$H3a0PP2T-DOUVthvufZADigC zS+2TUYW+cFbYtLTN*mRdNV;R{#IFGKgWo=wmRN@0IiGEo)^IZI5Q7#zhgR`x!t&Op z^VaHk)#^OM!SI)M5x(lNh)E}4&_^VvJq)koVg+6}e}nWx&UaUx=bNvrjrMEc=Ik_* zo3Kfa6L76@x~Xfg>3%(1`1}6SoKci|-Y9eJCkyfv`v7o6w$EYyL2%;T;n*Vm)xPX? zT_HZ%dp{c-dujMNSShH;BfBjKTA$i^;{?5ZJ%Z&7foa2m1*E}~fmdc9%OKoKDvu2LG7b31k}^yAO}))$uW4a1Uo8$o5AXCLe8Z^1Yuqlo)#TS~&#} zLMy`AEM2BdW!EVhvjc+0NUSOgl!Hq0Jz*hKuw0&ue<-4YxR040Wy9^QXYfzuOAs`` zY|r88#AGT4=<0f}$fV}5H5x^hKE%E$$6w#s9wyQnc&(r}FhNMVc{I7&gR_ zb>9P-Pu1D1c6jA9FPk{MNi>Bvlz=Z1o z(iT;Br!Q{St(QgBnyB?FNryb9elv7PlVc${s)begLwmgAwL%SZh=>Ywf(WEQJ^&z| zOF%OJLzZ5l>i8D4(u7&EQI^I1dUo?@u3iilyxtVlZG znQtL8z%k#toE>tmHwy3chp6e1fE?3tRbpMIns_?H+$DafXNa~lz~mXjAGdu)i}5@T z{^&Vx-~8+iUo(m^CLW>x8tmKDV6f&uIc!kW9olixhmNMmn@Tu z4|A9Csl#mt2IUUb;k5IZ!Vps;fQCBJggx+A8$nad>T#ox93<&#SIGN~!5iZ5zibRe z7;Uc*p05xelC$X}SF{I#Qlrg&FE{kJ4++O2vc6d#JSBNV6z>WtB46iw?=v3v7utt5 ztxcLFCbT<46Udw2rXBZhE^}kpmDTo!&Tgx?A-!JJ&x?`fB`JZ2LyXLje8Sij>>IpXy-VEHbh;{c-u)TfTKFw)ecW3jRpT5Rs;UC4DTeYTFV2IAkpV8PC|;m4 zgk#k-nXf@|AgHx?!@A=3=7x|^zE>J_Xu;4YE9rBGUiCT35er5QMKqK$5kV-$_Ry*4 z5rkv{dDu{+k|A0F0CGMRU4~@tN3b!=i3tml14dg@XV5bvW6S#{ggRb;uFeiMWVUJV zweDwyFcwFXT~!rj%3kk@FVa5mA1FI`YENvnRqld&>vwu_LWlj6C=m>azGyZ{#0ZpN zBJ$ps)Yl*Ke|v%`Bl~1O^SnY-`jWbK#~Ig!e~hvn+@G%wHDxp_ zR;emhse81-s$kXD0~cb1xRCIQ15nS`2V+*6J=D`pORimxKsatxKQA#4LVz04wLg<8 zG6*$SRyRLEKrUhiKqa*=Gyo*D83hwB6~?!RYV2Hx@_GZKt>4|z{G<7N!s6d6DGUR# zLZUm<8ryAj5UCi5afD13K~GAlFmws9u-Acxp}w+Fh#f`ShbkowdpGo%e7-~_u{k}f z<4k*I`$Nf$TK8`(CMURD%Y?TW5sP=kQAzLXdkCb&376)|e(kM6@l7bVnRHTR;eUKN z*^+ld^R~TrhDy;$$fIwZC9w!D7Nz~=IGNIlAZ@MoikH(`r`U!_}aI9`{pG4WHZG#tQe*X$|Rh z)mEUr4kFwu0(>As(wlX3a)X>8DuO>FBzLI={IIW5MS?I9rE>I5K(nti`j0!78z!hV zexwDvJQmI<5fhw{vaeW#&Me2s)hJVAY6mF{@4b`t!v%+9+}tcyfMQFY-$iVx$*Ho~ zr{LB%i??-5J7F!%G-St^;Q1Vkuo+AO zC>zG^)|+3Hg}TiB04PkrKT( zL9RVAWztt1I^~|CcbnhZNHZ;s!L_Ue{P;%uj#&PJD;$Y6QBU?~#x-+AjOSXNc88^dy7YG%pcfp5yW;W}P#ay@se&!gSZwD*K7jRkq6Q7qsg?@2crR|u^bA<4GpNW zuQb%ag5#)FHfqWf?)TC06(nBoB@|jH2nlP{C7nfQG#=L*cx(qCs(kz}gJ`$IFbGmH zI^wkRKp77CTzp3fA}RDEbos_IvJ6m<=vk%|kLkPko=tK_U7b(s9ZRAUV?L31<6lI} zc&G>qqO3?R+3R~+iZ@GmIIz?309S$^qwXmhjITBuo2MU2H{~`58yFS8!9Mc$Rs@bO-{`^EhB62(q!1- z<$*Pm#}Qbfkhy6VWmCHlBL~kCDTf-LAP-OFV@4y^fcJP`N%G`%d|+3T*W`(NI^T|W zW@psW95QuA*$CV5LxNn2kE*4^fE@!I_wXzu);`b}V*uFm7V!X(iIvj9MaV=Lxu!U| zh-T<@=%?$n3EYo^H`2WJQte(2n@%Us4W9ZxU%d6(r~P|VkpH_WsQzR2ohGl(8_z+- zZnYj`{7Y5>_kWqId~R2|pZa@)bcUZRxZ=Ws*5z1ECi?D+mlWwam!#@jgQ=>ZOaev3 ziTVFlJ#xqwiVDlY0nyw5ZhnwkwTR|^h*@4-hHRWYH$;&t4Row2LM{kqwg{eeP@SrK z<$y2BB1GqL5}bQ@3gzV=OXZt}CPpGdC^X6eL%+mvmX_l@)C7>V(Wx`A(4$MXcmgtJPoZ{tkhJB7N> z$W7WDRf`_dFqH31Xt*;D+no8*-`*`s!zg|bKV(DNPyOxRb9p7!%<|DZh0MNe)*R}d z-39sjEro6Cykvm+@q@#Ipd(b#EtI#1hyqU}mET!L->$8T=mKgEAf{uAjnh6gD6h;g zHk}?tTvyn1xZYM(Eq31zsUN=H`96BtyXtG}yOOv({}Xn6JN^qhegIwHXW|TGvqsd- zyM&y_yQYnoyLbKd)~g_PvYY76=G&Ie=2xi7UV1214RoQR0CaQhot&jSvUkT@U#5)x z-++9Y0e{)%HS!K4Tvs%)-#|LW3SP%R0uJ`DdYRk|>g?qxbo0+z3#qcB zmin<1a6Ifu6(4V`1n|JV`-D}3ocPDk26h} zIsZg|V>@8%i<1c}28etJi*}UEe7UQXUm*~%ym0E6bI*ignnBf_R=9gRg$5kOrJ7pZ zlZ?c!UqjfghEJM1zH}s7$QICGOCa}M{tN@!kpb_=1BAQ_#khND10w1^!CmES$lH98 zbOv2q-p-g1AOquB@!u>sdyR5Ooze~1Ns-gZpz%JTOM%(C&U9OaEQ&*@zG=JD3Qp&&a;RqbJmmG=owEOCcsO1n<1hJ_Sm*f1s z+@fV(O`xG_x`(BT1)pTMyl_^9ar@U?knX=st!oNl~ch^^)FD%z)p1*V=Sr zxHxY@a8tTm#zhEh701y(#_c)BK!Tr!7w0v`$)=DrJ}tT`R&8+Zr><9xlRj?En0Nd7 z9XfBcyzkprwRhila_MbOgstj*q_OZ3ep3IU^#g*ykHiBsN%(r(ejF6z1?e}naufD? z-{t;xGtDgEb7?X4l^f$nx}^7TIVCP0EnSX6$wx>B{UUDActa#8q?jz zPBEYN5MXog7bcuk4|i>j*xEx#Z!Y%O2RK_14DxvK2Z=PHG-!wEmkTkfx$|%BtKL@@Y(F$r$ z3CJkY4lvPld5XF9i_yG?BY7z^u^5?rH3%O!oiP24x^_@7fjR5>>`sfS>8T%9Wt18>3btD*`U=5QE&`gaIW9AX_`VC`0p<@Mv+>1g1k2a# z#ZEDIOq=NX!RzdpBivJ1M9R%VPJh{!F_F=0&m)f=>d%oqYulA1HtZxnzsY-%%I^bQ zn+MeZ>kfe5GW;T>p~aDt0JNr8M``I7AE^l6xi;pi%l&sJ13&?)8lgqVc9#_ns!W5V zTg-An``~gBY|)3+bY3ppS^GWycD+54sHne*9BV7(JNYd8K@Up3^o#zBI=-Ph9L`Y3 zA)D2r8uDiw_?&F7g85&IJgiUG|7XyDtaDJGvJf4z#DmFE0T$@kTUP#>_(Ec6WPt~) zle>>Hy3NGs8Dxe&1Ge02kVt7kyei0a1dTGpo<)=Gu&Ow*`M$eQN0RdS9PR!ys}xAJ zWd8WJ{GtMhe@s3Hkyx@1bwIjzdze|Nk7ad_nB*^><}Dr@<#@mm5gD2|V`kXc*gL-i zzT}iad2Ru^PJ0l60>)ZjG!V$Fc#9FP!0pHbpKl7NtT-t70t-isgKOmXjH$T3{)k!P z6iD*O(Ij@jTL#NKI7j+-EM>%Be%hyg`pzLJP)|zqwCpV*DEmaaw?;a6D~aO2J5SX5 zO6nAII6{)NlD@t%ZJqHeP;P%Z!A1G29~Knc&KaQ*8i(Yvl`6-FpIq8{w|DTOe``ay@ATf%59v3gmVPt1OLxVm;Ua-G6)>t}X0u z7tpO-%uDAp^0F79q?ceBQHmk+U-56sXU(zrIHge`#?wK5D|5kj;Rbh@R;r?kMd(oqkpna4tJ zGJUf8Mq`j=J;@cPKIw#29%%OQV`ELLq)_*UWXYm<$)afUFc8}3M~It{0v%N7&%v-A zZtvQkE;cNfyn7$*g-u_-%3GyM8~>DSaC&(d5&!ZvBSD_q>I_O!Uy!0V=LlKKOkSTM z2a_?H@z$40 z7Zi)}?!zKSBLMc1v5h;eGv* zDUaz|0^RHd(D?qoX2Duz3H37eJ+d7X|7_%8MYO2TSv!BLJsb~ z?w#mA_pX4ZQL{l%4`GPf6H~D9kb~HLo3%l2qxbe!hj!Dlvg#X+tl8g?$H|B2&Q1j< zQ~6}@x85jG1x5^Q#$G;9?F~|2&DheJ1KAsve2l~u)sQvS>C$82o6x64!%3zKB|W~_ zKQoT1|6?8Ij_Hn=qDpD4AiqBln#Nv&s)5pe?g^IP6A$yXw%HD(@&4d2t%#J&3YW|d zest7nK--+38ksX+VK1$1h*r$+(FAqoqB7T_dy;VBL{qPxbili@Xaq-nMGvM`kyKEI zHYb4zz<9l`>T2Ag0dApDVhR-@B4q0-l*+sZ7y73FQheDcL2GVWlrjRTIdN;NVC3H8?P#{NZv3lwTXU$voMT(tU8~ zj5&|T69nxPM%bR27^|%^nb`XbD&`;Ad3f0;U@JBZbTzSNp~vO8SlIa|bWH0vh0eOZ z$Ad4zTE|j<&0rD>4hax986tTT+I2&>uk{%+|GshK(wJV+jv9Z_eum335_=H;=J)f! zS*2T(KIw!@^hJCs*!-S;V(!U2S+aa9SfZ{%)vBUU+kk$YX^mmx^P2X{33%0fhk1P& z?``_ZOLVgn-uz#la~A4fwEls<@9L`l{R1!k^AX0|Kg`weHX~rZ`*j>wp!p_cU!dK> zwwkD^nS==Ww3ovrls#{M9=K71DT5pWlVB#O4vChi0zI{)h^q9-S&HJ`O(OndopKGK zKQ|=Qgzb_#uCO(3f78koqY6u!f{-nOnGXVVHBwrjR`pe0icCiXAW4!PlQo1+>o=&d zs!S1XV5EtZDwq(dzU$zGTPqCWr;?tw=D^_=;I$VmXbTXu#i9&%^DII?CF+Ov={)K$ zWHnZ;(F)EvU(X9vONkJggzaIX4d3Ye(eUJcIJ{o*yl&U`R~Cv)!JNyJS5Y7wh~n9s zg-mBC{uc|?558=cSZ{c!2|KRC#Q26CLc#8c02m$|L_Ab?BAik*@SorwxKV@9m#twZ zAM(`wVC}~FC`j%ItwKfb+I{I+)q~K{F%_g)e>;NA-G=?>ucxV6zq(ZS3e?N;hlm~+ z)v{0bK`+V?<_{oXu5v{3$0DMD#dG%5w`t|HIz-&|+x-`EHd>OW3q9C?;~v7hO)a06 zSCmy>T$Hh!s4Z9Ci>FT{NQPr+7(H%GbOHU+f zbqXo*i!ZiC7T-4-Kl&p(Z{6S!rf&F}A753R+Z+#0Kz6ErE!EYtRKrOP8yg#2ACUc! zqkVAQDzN|m4iw3zdVc}bq5#_gXSI*c;8&;9#jZ!Nb(Na|{|fNyapOI>HS2YlE_ArR zM_Khq1DhZnP4Iv+u;}7vK!+_EMI1m09w}d}=|+|6(&U_vhO77tt!qBW3(XMinsEY( z1JlzMLBbXx<&kn#Fqg*sL=XT|;{mSh9m#9*SEFnp4CN;b z=cX%6BG?&c3~N4~tN7N>mP21}CCH?cDK%gc)b7oJANz+npNw=1NS&nlk;Q0oGH#*E zaDy>Yx@!}$vkp4+yOpaxdL#1GYpzdTKNRFRX8R9mmU7n~F`mRRWo2}9il495Gqj4v z=!_eLc$|b28AsTk@tfZgWC=p$nzsAhU>u(GknWpV_?ATcypUhBTyET&KLUR2$XhP# z0}5KpYOR7&$_OT<>-nOKW2^M%+{Q zi82BY*xE^82t}hYxiXxCw3Djyx9ez-LOn#FG~d_XCk%9TPgZEj2;yfS)9kwalZL|* zfc}rrNMRk+M)p(tzCbxv79t4}pi)^t3^^%^&0@#|A2c5>3E{X#&-K=`fHw|@AxvcS zk5CE+Ar;Jars;1gwU5#EC)L^8XfXVFcY-;JwBf|SSY0yJTN_=MmC4)J!`gx)O_j3-||7^s*%G5$%beNtf6h*Z9NnD`~jHw?9AF>uAY&!h&_ z@b2J0MIds?cMv_=urrffm_>yy%$SJ07;er^^G-FrKG4e`@sL7BW>tFN8D}A(@d*pH zQRGr6=WD(7ILY!Sj=f)zF|Ab^H64x@M{YGlY4&y;hz%O)HF{k({4c^u|D(|!EdP}T zN_it)9R008Aq2DmNCvJ6bDoY)n0*cj8~RgFC$&)pxc6N%;@a01Fda?`@=P+U4hR{L z8@VA#S?`?(8<&nK(rR?rg|m zx9M|nnjpRDkPn$m!MvqO_k5plMT~1nzYd10m)?(OexxTzBv?@rs@hXBE3boRxFCQp zUM!JL=tI;ON9p#yv{F;+Gt9tD+8CE@jh$R(8%fo>n{;QFwJ$xe#X4NqKS4lxA3jR2w*)e{70< zhyTk_$Dlsv=%zvhea3L0=xSk&_Fob#=>GBSGqJ*^XQLT>vXWh?)$38Q)Hgf`7jzgD zz6!+VjUCQsS1;0_S6hK6FJ5nl2*2)$c`lm)d{6NR-REW19gy!QEAcdU>%#k_T|O=g zk+%ZNG${HdJ_T~4Tq^;Dzs1UxHWn(g%^w=K=5q7wE*;+Mo6bMm5m|p`BGv>uo#NiY z&h_(pQo?jU{gdUzVgARLnnaJCcX7Q4zQaB1dof?|dOd^rum84#{f>F<|L~&zJjsHU z479WUeDGzTZ_)ChdL>s_5#=?vPwbVUNSk3o0UN?7mcAIIlRfcw$T%N4r##{@ScS&@ z3vf^D3<;gZx%U+Nhb$+a9JyjyU+G+~#`3XeA&MbGfHA&j9a4;`9-=s1s3II3reOHb zu&?3Ga=uwa8^J=ts?fsjKhyA=Ky3jsWxx{FiFx2p6XzWN@ZA+%2*cJdOv8buTD75N zVg3{CC@s^QS+JV0K&~qs2M`4LHQq%ldR|5;4Ddl1?VEUNU`r>F3g!SMIoRk#HK%Q% zBnw_3a8E!(nN>SkFtIP&Voy?;8W6z7}mvZJ+9A z#_46AWc71p70K9MgApD}D`fX5uSD%)@n^Q@;*pc<6W`=5W;_^FgfwGqIxz^~FS`H* zT3#?``vc0l`G~aqE_x5OBBrT!h%xK_%}7WFVAfi6Z%OApnrzQ{YEId7dDMXg_h zu{b*VECX$k7!jM0s4DS*H_hRKS;#kP&X1b&1c%o1tKdt}FKlRl<}v^gp%w#(gLi=X z)aTAZptKx7T`cl-Q!F6Jotw`P4H`LrCQt|pVf*d}1sPg#^{t}=nNI)fl%Y_Ew;X}P zlKGG=@yUx>IH*gGfI3Y0P2YDy+t(4I3i+UpK@mSlnxiMwyr+S6Q zuCa*jSc zIS>FMlO0kCoVv-tZ9bM|f6FU9q)m7a%MT7H_bODh%2Qldw~A@^ta7aJ+$JK8!NmPi zq9D+ETVlU@@AnRC{}|U1|35V&2C3KoVRqz9%*i^jg=2sZT#!CH*HQS{ZY?-nr1nA=1T3POZ`;+;G>7fIRYmwzvSg}ntoE(t!1BTD8tXMUA7QiuqjX- z$q+KyfkKH$-7Rn1(vv(lwDZ(h5tat32qGbputs7VAGvfy@oic0J@&__-Erd*mZqf{ z!lKDjuzPjX>0W+2qL z4MCh%h`f79GGvO{!3ivZ1$QyK>CdbRa6}X8h)sbIHuK$to!)o92=JN2ydH*xRZ=7y zpW7?h^VaICfz$F3yE19*N*}q~xp$;7!2F)syGSo<|_t(yGy|M~ZRg*V`M9fiN<@^1+k>~{#dM)b9|pR_*(L&tIs z!tiyA_;kzk=Zf{$j=Lv)OuH*loC}ZI1W02;NMTkhiPvKg7T5i>qdMHr-sQ&ELf}{Y z`4w3=*cH{z3-xZ2z%xX-9EvW5(iCv~S+QEk^bKMV;YLJ>4hq4$G;~y_2R+6E!NQ+` z54wdwc!KCJ9fVv%zopy#gIaO8??9v74RK7?ZA2gYTJ(>j@>n4*ajpP4oSe}a_G|#= z{%|=!{wgT=AdKRe6ah7$MVHLwl+<1{t!fcgdLDov&HlbjCY*T-?o!|R@*~o{D!Qh^ z=@u{wMG$NjJoFo5Hw7WgsFBoosE~{&^`5#Oi>FFZON52OA$M~sVKk?Q4xS`E&?@U1tH`r6j)nHz@lmHqawHnLfoRw4} zE_Lq=;orhZ+G0!tUzRY^B&a%vR=yrqj)L{=SZKDbP0J47tf&f1yfV8Vd#2~Rv$mJQ zwQgH(mRCR!QvJ1Qn)T@1HR|?I-_dF)3FP~~lnVa8Vj7C90O=s2E=f<|dbvir@qes z^>+C7`QSCXzC)K5#~fz4*V6L~^c)4E1F}m)2voh%Ql)%Jep_!TcKo--ZyR)v=AtoO z=n0RxwYwLfFOo`pcxHrVM!0571uULoJGXi7<`%P`t#+)tA6DlKuh05E%$xgQ zvERs^;i6M}v)zRN3Y#DpThWRk*G#t|(|y5I7M3mRTCAXZz$MExOvR5^NjaCU_0BpO zlaVyiJ_rTGeu~~;BWd<<7`QjfW%+zpI&|?p1k&B11x)lN+|>VtFUR$I#>wwKtHtx5%H$*p@tVo^|2bPNa6;zS>uNP2 zOSY!tkLO{EMn-z;vO415pT4)g8)-hBZjV=L_e#yu|8N9J$p2pT_@2LR)jBo+3$y*4 zr@;-T%;zRQl_ftnj|60Ex97CZcIV7LK|5XSe8PI>37%&Z@Q`Q(X$UcFX$d<#!6{_Y z9ROvWhSEO-tmrY%lY^=Xqt|K#?XO`Fo3I@kZ3?3997j-Sq4}RP>7kblVFD^qI_YF! zek<{cR4Iq3qgTOIxU5G`eIJuCO)GN3;-Rj5i1@!3j6E}clN z)uNE?YUM2LS?idlzCO_W_J@HQ6l}rSoh{cT_O>m4SAR&oP`ms8$>K0}{^j1`BSh;u zI!?MDwxjMGyiEOCI*p%$d}m3K)HUw};X0mDb9|ldK+FQ1`)>DU%W%XMB!67_Z#o%( z-7tc56mYT#$efDhgS+80uGYcNa8!1C5!OBnl4R7`RPvz2(nI_r87x392RsXal^0cr z4{@s}>>LICPKWGUP%30?9sx9+XMloQ|7Ij0RK$lg*n=G*;?n;zek-XZ$ysRzqdj|;l9&=p36%gsjxnpAX zDXyNguo->V^7`IJFx9g!O#HKRALPBUv;5L?@17+^N-hU(;}+A z*XeC>pVcF%!0*vlvZ7;+o>TuQwRnH+@87?hk}dQ9{vG&#OKOpAMcuX^qvnwQ$cBDD z9>>kQ79JK-yI5^)SNV+X*Lk*oXwzoeJwp*4TO9n6jM$m%alxi8gbq=TnQH0GRfL-w z;Ux<{;OQ%r^WUA=kXj%3?0OQ{36+TCwOY+m&3VsMjboS%l+N`xlf}}^5aB!nO}3*` z6+!Ufp`~EZjanC@(NV7h$1N1iA%Y6O83lBkS0Oy2p*$flvrdUmxPO3>qn%y8pUtKI8d?Z!u&z=7A_UJ4h()$RmGm z9b4IF!5D0M`y`itzT{9v?nhih3bzd|e6p#v5kU4SmVoeEfC5RHUF0IQua7szeZ9h@ zW|fF$mOl9+)WC_sQMDC^P39PYc%I&?22nO3n6ZT#-Uq9u%BUa*zWu|BWXU>}#GkQ~2iyVGg~9WTP!ty~pzN{16GL!Fd(57>vwet-%b6g0*R zFfXsn$&^#!c)#$hPRmd|KHFtSfd_?(e?wg0XCz-U20gU$Ht8!SMT1^;l_|b44wD1A zr)bXt`W>hIpGQM2pPz@gTJM!Wp{*nT@Ds_P&c%EW?Hd98RNJ5fIr7{~+gkb!0oqb4 zGrBS+{_3x^^at@#Wxy~;C37FJ5c-^(4$+0qD~tY!fbeh=l5Wvcc0-> z$lBZ(uA`?Q%CB~4wdUbws$nBQx$YKHd)glZi%pDkrcD zG98qQt2UKbSQ#*?w^`NAs1)O9+aw>efBT~E`FH+KmbvrKv@9WUr|#)dL-W(n>ia?W z)r{<2+;cm_Ka3K@e=*_VdGm_*eEB0PnC|C1v~EoKKI?QBG}(909;|wlY@OMUdp#3g zyEZrM{^0#k;4_6*x8w1+QvS$%LaEF5K*E%lDuGAlwR*^C+UmX%Csv4ELHK_sh?MgQ-5jRz z>R4aj-{p<|cE8jF?@eBE|5ZB9^qDoFByiVx(I?>&6?2>U=jC5tWgwb|RPgBKKr^dd z0dA^tIOyd?^{0}#3Mb7?BuktWq@*J~(7su+!7jqX9+HPZ`*-VY+`>f^03e-0`*IM0 zA)@xF{E#0j>RVr^kqtv=tD42QJy!8P*X_=J^G7A`O5i-KJ?lLD$Its#_yLyLk51?M zAGGGBK=@x-29@uL;p>or_oeuTo!x!r-cM2_uYSX&wQJ&i2o(siHORo<4LR>WZkNpk zRh%>0kxQCZE>4B1YhmZ7?tgP!FrewdP!tJiLKR8CSq*4u?v5{pD*~pzORM)~?Ygn| z0-%*Lnv@Xv2pC}!!4d)C+yDTN@qTLZr-AVlbS>22`3@C{bhTiTRDa6ohGz!Kit-B> zG?he;iDI$QG5`j&5MPd*BH+6!#7MC8w!f5ThvlANR;cuZuPPflENuO?IKN+g^!%-4 z)9Y#>YxM5B5KS(ceNd7Qd7K8tti<|XrMWHIVE)!*3KeE4zg06f_^0n@dKhOBrX-*@ zNF@N-DR;cv9_`_5f{lQZ%mo@i2}_bZvY`AZ{-aszNlfi2(g+264X^y~A0bAKu%kI; zoh)se?zbVrtTBxmR}j#@R9k`3?yk|ewPeBWZvLs_RixDnSGLK)!{br1&h~$3_y->D z^`8Xhb?mtF-3%=a0_TT7V5gx|Dr>hw9WLWupyd^0*97(iIDAY zJo$+@c`ugeV3?T%Z#>x@F7jS@O!c++(cT_aGQy5IqzclsG{! zH3k$7GGtQloM8Y^#Bz60!ZMVoWSmDZm1-}Tz7AaJAeGZK&=^;^BE@zg&Bik!W6pkY z35(g6Gfqfd4+6*jkipY4d0~;XdLJ!iGsbY7v=g{8k+RyG4Rkj%3U6!_KtU_Cd%`Cd z3EfPZCf>wb&MFAT&Uh8) z$(68Vr(*)jGenzIjrx@t*}paMtg$gRndK?l>vulWsQKZc`_MDg~SmO8YyB~j+G1g;sRO- zP%_J;I)xGy4(%tRCuyDn`u=-Dh7MF{?NE4g`#R-!!@6kq@4w>nm*(ypN4l zZ;DesNVsn$PFSVl&yEHP5dlhOw6+B=ohg3<+3qO(zS6+(Z!0KHV=J$Y>Bb0POT;SC z2s-_RRYiw3q{i$J3tlrXC8xF$Qnf8*iRdzN<(NHD{wC;e#u1}zy2zw<7s-zJ?Mq|p ztk<8H!_KQ4?-D-tjmLuKg+RfME82QjgMVrZlm9sB_=hs+YYf2V^IE6y)Y^Tg@ZuFr zCnUHovf3n-0$NDXck6L~jQM5tI>pGm#>(a1s&S)YTDX~Hsb9oUOZ=$);{l4x1hFBa zO!cr^Zf0;G-Lk;BL@Ms!TqT!6sj7*)er4__J*SADkfuZ-`W~B8?9HzwxQ|aJKnhEF z^(%CTyVBa=$bi(mcT~!s?0wYTGT&E9hIFR$J0#jD4jhJ-PaDm*>ThRg+y3IkyMSdO zVH%ALiG;l#CpM6>^}hh#E1fJ;HtKET~I##27aQ$He(h0Y&FT%=4mjX&q$`13fF z6ZM{SjPH;Q%ZhxwS-5j`GFf};G(ZTZtS|e!TNe46Wf^ct0K{59hT)NJ5F4CZG8~~q zA~3B)Ht~WP_!2Tohs9Qn5b-CF?7cO4sU!!SekDBjmys$P;T!^}pGt}W6fES(m2(#M zM%$)u6Hr7pDNPTlHpB5!oWoJAsSx=hzSJ-@3*tG5h zZ#prGjPN<={7xVDWtjQib(fD$uukse$?<+f33qE0W~&75|AYj83eMI+;x|C$SCAZ; zgQy(kLjV~4hDe&3$~7ttF)ID|aWeEO=q&bLlNugK0b*TmQc3&x(Fj+=h0t2l-9j|Z z3iapGiC;;Rmdw{xqQ^z5MaZ2klK6o$n<5L={$?Pbw&ij7I2+`Swm_%7$uk`(EDZm6 zwBTnrAzN2Psg)mT+IMtud<^lX#y$oWK#NtKO+`^;l{(>1Woym0{Py(x(ebW-;9)_J ze;I+`fngH-B7f>3QOE6lzuAXV`&a9NPLKWrn{}48wW^QVhk8h1ojgrXDt8Vnf04ps zrhduf*`}gHQL`ioiyYaI!Ii@WSsgrwuv{Q=z##<(z^lsu4wP5`1hV>!AUW3|L1xLq zgtE1`m8)sFSK;bp|7PBC+_e%2{|I$xW1eb`aD(WSgE)7LDJA%KsUg3CQ)W=%UidU< zh#Di|M^3lt8>#^1otP3|e(7f=RfXvvva`q;bXE#V^8$H|l0wg_YM)BWO;xQw6{uSu z{{2&}RDCMUd>gKGrZMR|S)KXZVVhp8LWh-^!pOKq+Ucv2==l#=2mk-`)d3?9kFV~R zgSdL_&7|C&{9Jf9r-n=CO5npj=X-B3V=ekqHpx?0Z^JwJJbVCrd>(ei@*{|W zd~Z5=xIs0!SxV?xc5^d+XV(Sx8KKc^MJ_kX1=CTuYdT4X>sro7*Art96xyTrd8Iqb}@t4hBNNR>U^LdzLxOc%mp1j^IC z!5p(TOeaxqYRf>OmJ|Ph7_^c1jrG?;3H1;oB7yyN88uGLTt|q&B|A#cF$qyif_8*q z&~t5Qr_zz8WO_#Ggzd*2J$(En*7kj?S z1Mu)C8BiDVv-YtsQD}uDQMJ`4u5VRbO}0!QyR@q9SLTye%v#&*Qjd?7 zGxnP-^?&Saw=qW@n_c&IE!(tB%!2PSz&WnRm;H8n0!P`eFFN<93LCG-@0b7w834c^ zHvNof$*y^Aetv9gz9Mz);rUu{SWv&wq}%@Y4JY#cj)QA6Jj>mhF~MC}mvvZPj^Ja> zwV@#L?JSZ$?ktW_*@V+N5O3^-pm!^!eFsN~{`P7+zqO--`)zHB1otH4@;voS;TJ&W zs~w7*=*uCzf4{3QKgwH8%@woTKFZl=%rwy+N08xzZ*xZX8Nd4!*vOE`evJEU?B>u9 z#03b|&Zv_^H(Up5-ncj}EdE;K`rkLXiWV~RIMy`Nee^zuwP_=dU0?g&UOv{+9UCcS zBMr9`1N`5^0RRAM`kT%(9-@M{%5z1zQ3a2&qV`11{;v23=E7cAd*7?L^?146)`X{aeznx2N2o7zyzXL t1VE%h1Be{e0t$rD5CaARISHm=KSS3)$aeqPK=;`X`vd$@?2>{$}WD5WQ literal 10932 zcmeHN2~<R zh`|8`A_PQ1nSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|pSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9Bq>~TVErigKH1~P zRX-!h-f0NJ4Mh++{D}J+K>~~rq}d%o%+4dogzXp7RxX4C>Km5XEI|PAFDmo;DFm6G zzjVoB`@qW98Yl0Kvc-9w09^PrsobmG*Eju^=3f?0o-t$U)TL1B3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzzeSZ$&9=X$3)_7Z{SspSYJ!lGE z7yig_41zpQ)%5dr4ff0rh$@ky3-JLRk&DK)NEIHecf9c*?Z1bUB4%pZjQ7hD!A0r-@NF(^WKdr(LXj|=UE7?gBYGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuNF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0yE9N&*05XHZpPlE zxu@?8(ZNy7rm?|<+UNe0Vs6&o?l`Pt>P&WaL~M&#Eh%`rg@Mbb)J&@DA-wheQ>hRV z<(XhigZAT z>=M;URcdCaiO3d^?H<^EiEMDV+7HsTiOhoaMX%P65E<(5xMPJKxf!0u>U~uVqnPN7T!X!o@_gs3Ct1 zlZ_$5QXP4{Aj645wG_SNT&6m|O6~Tsl$q?nK*)(`{J4b=(yb^nOATtF1_aS978$x3 zx>Q@s4i3~IT*+l{@dx~Hst21fR*+5}S1@cf>&8*uLw-0^zK(+OpW?cS-YG1QBZ5q! zgTAgivzoF#`cSz&HL>Ti!!v#?36I1*l^mkrx7Y|K6L#n!-~5=d3;K<;Zqi|gpNUn_ z_^GaQDEQ*jfzh;`j&KXb66fWEk1K7vxQIMQ_#Wu_%3 z4Oeb7FJ`8I>Px;^S?)}2+4D_83gHEq>8qSQY0PVP?o)zAv3K~;R$fnwTmI-=ZLK`= zTm+0h*e+Yfr(IlH3i7gUclNH^!MU>id$Jw>O?2i0Cila#v|twub21@e{S2v}8Z13( zNDrTXZVgris|qYm<0NU(tAPouG!QF4ZNpZPkX~{tVf8xY690JqY1NVdiTtW+NqyRP zZ&;T0ikb8V{wxmFhlLTQ&?OP7 z;(z*<+?J2~z*6asSe7h`$8~Se(@t(#%?BGLVs$p``;CyvcT?7Y!{tIPva$LxCQ&4W z6v#F*);|RXvI%qnoOY&i4S*EL&h%hP3O zLsrFZhv&Hu5tF$Lx!8(hs&?!Kx5&L(fdu}UI5d*wn~A`nPUhG&Rv z2#ixiJdhSF-K2tpVL=)5UkXRuPAFrEW}7mW=uAmtVQ&pGE-&az6@#-(Te^n*lrH^m@X-ftVcwO_#7{WI)5v(?>uC9GG{lcGXYJ~Q8q zbMFl7;t+kV;|;KkBW2!P_o%Czhw&Q(nXlxK9ak&6r5t_KH8#1Mr-*0}2h8R9XNkr zto5-b7P_auqTJb(TJlmJ9xreA=6d=d)CVbYP-r4$hDn5|TIhB>SReMfh&OVLkMk-T zYf%$taLF0OqYF?V{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{U2)~$>-3;Dp)*(? zg*$mu8^i=-e#acaj*T$pNowo{xiGEk$%DusaQiS!KjJH96XZ-hXv+jk%ard#fu=@Q z$AM)YWvE^{%tDfK%nD49=PI|wYu}lYVbB#a7wtN^Nml@CE@{Gv7+jo{_V?I*jkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>=MBDNlpiSb_tAF|Zy`K7kcp@|d?yaTmB^ zo?(vg;B$vxS|SszusORgDg-*Uitzdi{dUV+glA~R8V(?`3GZIl^egW{a919!j#>f` znL1o_^-b`}xnU0+~KIFLQ)$Q6#ym%)(GYC`^XM*{g zv3AM5$+TtDRs%`2TyR^$(hqE7Y1b&`Jd6dS6B#hDVbJlUXcG3y*439D8MrK!2D~6gn>UD4Imctb z+IvAt0iaW73Iq$K?4}H`7wq6YkTMm`tcktXgK0lKPmh=>h+l}Y+pDtvHnG>uqBA)l zAH6BV4F}v$(o$8Gfo*PB>IuaY1*^*`OTx4|hM8jZ?B6HY;F6p4{`OcZZ(us-RVwDx zUzJrCQlp@mz1ZFiSZ*$yX3c_#h9J;yBE$2g%xjmGF4ca z&yL`nGVs!Zxsh^j6i%$a*I3ZD2SoNT`{D%mU=LKaEwbN(_J5%i-6Va?@*>=3(dQy` zOv%$_9lcy9+(t>qohkuU4r_P=R^6ME+wFu&LA9tw9RA?azGhjrVJKy&8=*qZT5Dr8g--d+S8zAyJ$1HlW3Olryt`yE zFIph~Z6oF&o64rw{>lgZISC6p^CBer9C5G6yq%?8tC+)7*d+ib^?fU!JRFxynRLEZ zj;?PwtS}Ao#9whV@KEmwQgM0TVP{hs>dg(1*DiMUOKHdQGIqa0`yZnHk9mtbPfoLx zo;^V6pKUJ!5#n`w2D&381#5#_t}AlTGEgDz$^;u;-vxDN?^#5!zN9ngytY@oTv!nc zp1Xn8uR$1Z;7vY`-<*?DfPHB;x|GUi_fI9@I9SVRv1)qETbNU_8{5U|(>Du84qP#7 z*l9Y$SgA&wGbj>R1YeT9vYjZuC@|{rajTL0f%N@>3$DFU=`lSPl=Iv;EjuGjBa$Gw zHD-;%YOE@<-!7-Mn`0WuO3oWuL6tB2cpPw~Nvuj|KM@))ixuDK`9;jGMe2d)7gHin zS<>k@!x;!TJEc#HdL#RF(`|4W+H88d4V%zlh(7#{q2d0OQX9*FW^`^_<3r$kabWAB z$9BONo5}*(%kx zOXi-yM_cmB3>inPpI~)duvZykJ@^^aWzQ=eQ&STUa}2uT@lV&WoRzkUoE`rR0)`=l zFT%f|LA9fCw>`enm$p7W^E@U7RNBtsh{_-7vVz3DtB*y#*~(L9+x9*wn8VjWw|Q~q zKFsj1Yl>;}%MG3=PY`$g$_mnyhuV&~O~u~)968$0b2!Jkd;2MtAP#ZDYw9hmK_+M$ zb3pxyYC&|CuAbtiG8HZjj?MZJBFbt`ryf+c1dXFuC z0*ZQhBzNBd*}s6K_G}(|Z_9NDV162#y%WSNe|FTDDhx)K!c(mMJh@h87@8(^YdK$&d*^WQe8Z53 z(|@MRJ$Lk-&ii74MPIs80WsOFZ(NX23oR-?As+*aq6b?~62@fSVmM-_*cb1RzZ)`5$agEiL`-E9s7{GM2?(KNPgK1(+c*|-FKoy}X(D_b#etO|YR z(BGZ)0Ntfv-7R4GHoXp?l5g#*={S1{u-QzxCGng*oWr~@X-5f~RA14b8~B+pLKvr4 zfgL|7I>jlak9>D4=(i(cqYf7#318!OSR=^`xxvI!bBlS??`xxWeg?+|>MxaIdH1U~#1tHu zB{QMR?EGRmQ_l4p6YXJ{o(hh-7Tdm>TAX380TZZZyVkqHNzjUn*_|cb?T? zt;d2s-?B#Mc>T-gvBmQZx(y_cfkXZO~{N zT6rP7SD6g~n9QJ)8F*8uHxTLCAZ{l1Y&?6v)BOJZ)=R-pY=Y=&1}jE7fQ>USS}xP#exo57uND0i*rEk@$;nLvRB@u~s^dwRf?G?_enN@$t* zbL%JO=rV(3Ju8#GqUpeE3l_Wu1lN9Y{D4uaUe`g>zlj$1ER$6S6@{m1!~V|bYkhZA z%CvrDRTkHuajMU8;&RZ&itnC~iYLW4DVkP<$}>#&(`UO>!n)Po;Mt(SY8Yb`AS9lt znbX^i?Oe9r_o=?})IHKHoQGKXsps_SE{hwrg?6dMI|^+$CeC&z@*LuF+P`7LfZ*yr+KN8B4{Nzv<`A(wyR@!|gw{zB6Ha ziwPAYh)oJ(nlqSknu(8g9N&1hu0$vFK$W#mp%>X~AU1ay+EKWcFdif{% z#4!4aoVVJ;ULmkQf!ke2}3hqxLK>eq|-d7Ly7-J9zMpT`?dxo6HdfJA|t)?qPEVBDv z{y_b?4^|YA4%WW0VZd8C(ZgQzRI5(I^)=Ub`Y#MHc@nv0w-DaJAqsbEHDWG8Ia6ju zo-iyr*sq((gEwCC&^TYBWt4_@|81?=B-?#P6NMff(*^re zYqvDuO`K@`mjm_Jd;mW_tP`3$cS?R$jR1ZN09$YO%_iBqh5ftzSpMQQtxKFU=FYmP zeY^jph+g<4>YO;U^O>-NFLn~-RqlHvnZl2yd2A{Yc1G@Ga$d+Q&(f^tnPf+Z7serIU};17+2DU_f4Z z@GaPFut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L={{OIb8IQmf-!xmZkm8A0Ga zQSWONI17_ru5wpHg3jI@i9D+_Y|pCqVuHJNdHUauTD=R$JcD2K_liQisqG$(sm=k9;L* z!L?*4B~ql7uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%|@%6=fyx)5rzUpI;bCj>3RKzNG_1w$fIFCZ&UR0(7S?g}`&Pg$M zf`SLsz8wK82Vyj7;RyKmY{a8G{2BHG%w!^T|Njr!h9TO2LaP^_f22Q1=l$QiU84ao zHe_#{S6;qrC6w~7{y(hs-?-j?lbOfgH^E=XcSgnwW*eEz{_Z<_}VsZeZ73$#7$X?qq}<{*ZREc+*K@_u;o%k$=a-hVd;|8s)2QbYywL;%4# zy*}rE1~U{Q^X<=F?|OWG@221j+xU{oqpx%r1HtL# zC1ofnH~_}u0e?vlxZB?YeP0{SS6{@n8$XabmOEYbYH@P?_nOl6=mzjmNq+4dNu|GW z^a!SOL#X@cHmW|T1}&2!WN{XJ#{%pQ2eNkVLU^bQ?Oi=ZhYR;sU(smadk)N2#_n@T zB9H9J&PGCf9DH^gCI>X=tv-Y0m>tM*8}Wo>ajT;PG=Ck6G?faDLjBdN5L04&`0*#GC@lq*QvgF-Gw8hq$W^Ifnx99{ zzyL-k#(&{r7(_?O;WsQ50{9z@52chYN)~1^7}s#qoEZc`psA$=00&wm#l0y#9C{;I zFAIVsv9z=TZGRu!3x!t(*`G2PZf&dBNPjIyx+u|akBjpfNB7|%c ztc}aDiVD!Q3`q(FtX3b%1r@U5L}!=+FmLR@KTf;v@& z^A|2a9v+U#$5Uu-ZG}uKh23sPNGw7hsN~k)CYt4dQDFxbs5*_&e@Hj)wtt(&JE<3Eq*D z;_gQLvqXoKv=I*gWqM9C(Tvu0>=?hTbOp9!6k6AF;>f6|S5%jGEE}TA9h)e`Yuiu8 d7)l?o1NFcJg%EAfM$P~L002ovPDHLkV1iJynzjG{ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 797d452e458972bab9d994556c8305db4c827017..88b21adc9499a9a97f2031fac23ac0aabd1d4809 100644 GIT binary patch literal 3414 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 delta 390 zcmV;10eSw`8kPf)8Gi!+006rnNM8T|0E$pdR7L;)|5U~J0au$Tw)XJ){%+3s=lA~6 z@BMVp`S<<*VaoaP`~U3u{%g(ou*=|m)B4`@{`33)?ezIj#Q6OF|6IuUF}e2O>+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$g4^KNpa1{> diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 6ed2d933e1120817fe9182483a228007b18ab6ae..7a965d18f2924595afd8af6b8d84e1825706faae 100644 GIT binary patch literal 6792 zcmV;38h7Q1P)D7XEKx$DQ7o~=h9!1m6uYsvsHj-5U;#yh z5oA=PgE-7E!!W(v@4E*z?+^2y@tJ&Uz3-j1?t(jW?>YN-_C9<6_C9Ag_<#<+yE=9a4CxSL;oxLrXl)NY#Rf$KES(05hI(3DS1WkJD=c_YC%W@UsJxJ0 z-H@l%YU#g1u1^lQqq{?g*fus3ddJ2LWjT4Y;z{)=s%^lDg6Al&dIX_R1eHn+M#IL& zMsTpRqukwG9omQVj_nX@6+6MwU~yB~)3WndZyve$Qked%PFVUW<@;oSLtSkxy&VL)Qvz1w^sS!RaV}=YHed)D^ zJ@}`6Xb?3b)IR|8XUv3=ks+iC1&T`e$j-~fs|Ep@WpdCo4Kq_yIN905+tU-tlPAI0 z$QTky6HZ^chzX09GM{s%4I4i8XiQ_mfn%pv?|$%NZL>n9`ac8Q*WbO*cSC#af7Pb5 z!^llrAZTd7fL^hP>(dw6xw-gh*Dr8(bVBc_Xbc@N5Psf1aB+4bKpDV{hHGEFLh&;` z?mo;z#`P0WtCSc!ED>I<-Ld=dVSJnR6M_Q#&DW&N`!Vv;;URO++>3u%FRc1o0kbFy zGa`K!eKB#u4_k6yuukk>g7DxFq|QjjrK~KZu3V1zzWs6K=t%_o`$Hma!uiXWVQgds zL#`pT8ZFpt7VNBTka0B=_j7XK+twGiPo73WNeT8HKZc(V?8nHs!AOjY!`8jKF=+Mz zq<)nYx@V?m?xF*yN8Bi>zV){NX0zE?GO*)@s4^CLF2k6S zBe7=5GPHJfCK})P%MN&Zd16FD0=OIwD2f8V^aX?h0azRkj_*%Lyg5)+#>14~j^Nmt zD~JpaM;@;L>$dN}k>Ac@$#=7m^XL(lY}t-465^fK&-gNP!PdRQGm5Lv{iT3e6h$o= z6t*EEaqP@-YqmnIQe*9+CD?WFAgryd@$0U1bPWrGk%0lqD#~GDZjSi={o(5D46#H4 zX|oJ!wGv+L9`N?`!ucziFi^qqJYfn*RU+m8W#l;+^AQfl_>|Ykx{6s zu7<0#D~1dlh~*o9f|Z#m_H5jQNh!%VboM0D7A?Z8#f#wL(K)} zBf6qbR1^w$JUH0cV(IsDuzBZBoVj!XGbT*H#`JWArp|I-)~{sGv}4&r^!k5I&OQim zaQ?&D0B)A!NTo3adBaCLIS^b=*j%jlm9m0?(JH4>C`ta zF>&KIM1+MwB9TC;(ZIWn7c^=OSfHTMXwf8jmf%-Vq&?8Z-zSpn@K0Tef2D!XJ>lU?JAt$iwu3QOhs!YtPE$3hhS&X4c!JE?#M8 z%cU%lM1n68hG6=nO^y&w{1ZqFSLwpqhpqhr;XgMzSX+a^pII}Yo1Y{RG}b9{#dWPiCYm%r8~r0DR}FV?M3R*`#5y$^rA@e6-i!<( zjYuyQ8tbaz>*kI6ygRV5wt`fuK)FH(OSTpd8#Rau=>VxzO4ew7eLbpbYQT)oto!=c z_2l9`eS*5$It+@5#i7$DG5+(BgpGZ_YQ9&5`?a1|`L$R6G+;AR6K>x={SqdhK7&r7 zpW%A;ZG?Xo1``ugSXf)b&dCwYO-)$1Xf=3zK9*garO}(t&A)2DE|>6J)LmnnEpwE!U|&&M-q?ESc_7vf>bVt zR-=JNtARqPghHu;wY3f8DkTE^+TqaYQ}A!+3!PSv%Qa2t>FqrHqX2huvF_1mWMf-e zQHe1lMiRC&W!yM$LBZAD9tVyb!KUz#TNs71f|oPvb;IDXa|GFrX-yQh@efACf3MjrBuyb{q>Ys&!}h_KY2a^b z+^wJr9}d{m$dK*f)i&tqwIT%i`-A`D1uk5>0&{b7__yDQVTt&0-8u{#H~?M3 zI^xjr<7nsS3j-Dhw{q{}+?7mJ)>OgK!2uqwZa8-I1m^rOA9>G;a9>KpJ}3;Ef7*nr zw{GHxHEZy!tPEPc9tTdHgpGv-;hrVWpA&PYY2e(&OR%xDgs`y@JtMoJx~?8sckWrKk5t3h$OC@ZgkUPptXSb$Cskw}aS znVCeWF<*ZTBSQn!*40C%Qi08)h{Iun!in=2h^81?*&)auNu$Q#)T)Irv#^AbqZ97r zwu|M|)0z)I=;pGYXk9hDK&~N)C|FI~vYwJz= zZW+5pLWYnS8yO%>`n;F@jc3LJNweaE08_M{%d4!zx^3GDxiB#{B^5@cQVFp{+yd;~ zSS_0PeQ@fn3@rk_nFJO9J0mu(Dzz{Gg?3gZc<{OjoXks5>dD(J6GgYY`);CX`uC}B z=@ekGU}|DQ{0Q?MLpSw$J$c5~#u|er#Zk0Q^ImN4{ZOyhQxr{O)X<^$dCeL^_}?PT z=RLvbY12?yU5&ZP$w=tm50g{AML|&!M#jfuPI5AoY9;3VxB^+(w-Fr~iPZ}i;+OsV zvE$G|>_}USu#jMAv}!!aFTmn8X^@L0m^)(zh7KHvlm!cLCpQNJVq&pq)-23kya*jb zI*_bv=Dc|*tFFTRjEk_hvwdfELXj9VQd9BU<;z3?jIq#vU@-3mOj8uGor9-NV%C(Y z@NjR9CF|CpLqGtA4;qa5Dc@l7ci$l@A_DDw+mWlZq5|92tVQ~-2T?C-0B9Z2SaAFH zXz%Nb(4ZhthbUy;%);=vLD;%`7l!m7h)$tL5HVl?*6r9%=qnTJ@8srU;ul}wWkoq| z~A+3@oYxVt(Nz^xn|2`%gr7KZBTYQ**Ji_@1gh*?=%T4U|c+X*dXjImF2PgGP^ zA~q_TOuJsEgIuY?!d0tqIwJ#j&SxOVKLGi>0;DWnh|7nMVOAjzJ-c_uXED(*HZ(%_ zE?rPjQAu*+^uxd6b%T(InQ`?RPMklBo?W`4Q+P*Mn3<9>e_sS22$;=cy_+HCRU;!K zoZEi@-fh|tt(`b~2GL!+lFG#HUk_q#^0%OA3ZuTBf(=W4MDfjRO#1d4T)lM*;h~}U zeCi~e+P$9??y5QikW7v26 z1h%E6pxL=FuKX>Nx6tZVRT+ZL-gZA9Jc zdN59s3AcFTZE2m3>^Sy|>4ht|Zj!oKy+DAN?%nZ(Ure4^y=@yh1_k2VDN_;T*B%cZ zKmJ`&)cc{oKP-{RNxiX(mKWJz;naomr1MFm$6)Tt<%B!e)Yg*v6!YA+J-g7Yb7wS) z8*w@724Z?dp|Yk1xsM;CYsWBB24XyZ((GBJ@2Ag7z$<>*0`yI+m#b75JM(J-*51wz z$qVO`$WT^UiHC)SP%Bk1F)?nbk5Rz6E0>8(Ukn+72L%Oh0g&MO;TnDu7Y#WaBBYU_ zAxZlfhBGd4B$m#dgKM{M!Pde82Tq)XSR{raBcQb{G;$?62X#QBNJ4T}E{lz*uuf1Y z6=3T@l7UCOLInHyBQmrj)Cv_s0)ilsigEjXE_^)Nz?5qQb7NCdpDrnRh7Nx15!*Eq zf<_T;=iJBF3W{HF-=_lF*O7#JAh^C1b4G)o~6H6S9aBg$&3$@`_% zl_b;|a5-?avm;*pTxKRh{M*CW*aV4RB_Va@H%OT}8Qb@yx9|q~{mc2ifaMy!G~Cq@ z8P~33(V8?8*BJZpYvaSH9~ZA(C-=T>ym9Qp1!7tZlM*&cT9yM1yp&gxzKUL!5@*7E z)*uuUDfrJz-_j-&H@$c(AWADM-z}l4SM}s?JuQ5b8#jXygKKDvrRz74HP18;7dP_8 z_C0%ulKg$W(Il*sYQR!{FyJ#U8n=X9+}mwyOkh_-Cok?pjw2_JSJ>hZsFoE@oLb9T zA)hfDW21fT(U_m}CM2{>v9Yr|WYy&inQ1B0l0<+4#ipRs(QmjmLyuX6G%$Dix0c2v zA>9(NC-de%M2@#IQ13W9)Abj9V!*n0S}PR`U#&X%U}}?0@!m5O?*&}b&?x%y;LTVY z8y?05xz3InJ2`Fd;UloLvLf3fOmZLN+XnU)W;mMr7%wWT;Nj+mA;Tl_@@^JvxGgCi z$H*9V!CjzlmJnbpGCeE^^6$d6?{FyUtKR`;8yJDs>L9Nxhxkbz8Z>~tAqz^^AnZPL zh)h(!p3yK;%JEFxj3>oKu(h#+SS*5P>(&_MW+b0^ATuEUMP(UNKK`TjPm6dWkqGGz zR6q3%&l&$^;&8u1r_aK#eS4JfOHgBLi@us_bdC+jk{k;NB@&p}+M{(FPhtT~bTMw- z7PWUTK_hK?qeXx@7EQj{b|Gmc*8pZ7J}{GtVMe!1klMfyMkb~(HQ-?J z=LwiOBL()Moxx$V;pWr|jbb5I&G-sucCOi&TU=W9&+z<9z)WkB$+T5F7fawgQ; zy#Y#*=s~eqEhf*bI-UR&?a<<9X`u1=Z!j|8qFY2~$RFQ@*2EmI8wBul_W+MyjA>&= zLw@tvvt9RJuKZV6J_s<=uJWt04($Imb^W9%X`@zcfu3UFPF^1RM@3_2?hSZX)xxEf zFD_rXf;R3RXzk>L?wvY-|Dp_6?&d-$ZX^H$e0NXX@O`=cVGyk)u%Z zjE{#oIq+%S8uX0^N47x-_qN%Vz}U(TVo4!6^3d2ILVbf6G^K~2Q4GCSgU|f^ zkvKR3JJziy=Dm4GI)dB#;r6{d;Fp)7s_qrUG8vwiy(C%M(*67jLY_HYJ^WRC@H!%KlM+nI>tLspg)~8=KT1y|*ecZtble-Aq>hyc65Y zN)Z|u255X-WlGC8co*aqrXncuU^cns4M?>WyPmFYk8%p{Py*ds_q@LcpZDSu^+p- zPwxbEd{5V>QVq%^3Y3(-M0H&)PF>F=IqmbRGMJi}A~-OZR4shm-QZ=;MmuvBEqGpB zbaCg}zV?@$msV?abZ&(p zkGYV`$e#ln3o|xbuQ79VaWT^Abo8tGdWBriYHpUv|B|!O?`wbSPXI(s&CF2*iGcs| qgU(d_745&jdH7Fn{{{S?-u?%q7wNA|JbCf}0000GM-ShrilfUZt{^9lhT*&z4_x{-O{Rv#2V9EI}xb^~1iQe@7)8g(7UZ4B@ z|4zgB>+<*9=;^^)>d)H7pzGjuM>Jnezy3`@G2r z?{~a!Fj;`+8Gq^x2Jl;?IEV8)=fG217*|@)CCYgFze-x?IFODUIA>nWKpE+bn~n7; z-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGrXPIdeRE&b2Thd#{MtDK$ zpx*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{HY|nMnXd&JOovdH8X7fc!Wk44 z#RH{cMX?@LJnPx&T6f!3TBhBq+ojixRNbDmx?{)L9ktfcZq?$gsP(F-ta!8*M6E)R z2toh>2_!+2K<@0|PG@V?+U<5`XFoH~pTFnze80cr`33VoNPqDE1u6~}i6Z1;eNezJ z^$DVOlf&KU_4)k2I;xh1sHdk5$cXJ8|D;C{4QX}zdZN3JeI;|i z`?cj)-`#fl;(sSTzyE>NKM;*n%A#JI_te2J>#c(${4#nabYu9CGzRqPOKeOGa+!px znre=G`6Yr>Mnz>MSKHcjx71NLWYhfJ1dI=M}PAvx=_M#v-yc788eUMY|NX~ z?)G#%6qSmDC9h}9I+$-XCr0SP$$IGzRFsvma(NCJFD^vaMT1VGK`a&%=`_<+S4G6o z@ti&P4FUX295aSvr%!R*)H-VMGgCLcy?OtfKp^nbXy(LWi;oyBgLOI`lg5oBE=JFe zwSPn3VSgci%`#>#`he)D2)6CnMOtE4E?*4b76dGI8{yi?R+sseT z7~FU7{`2KKABbv0C0bcb>>DvcC_g_uuX19+0-A2#M5onK-_(RMR6(#vghvoDbnu`V_eG`R zV6huvus;yMaQ!+*3bK)gNSQr#8e8-77(RU(Ig7F>l1iy=&Lv7DFy)mcwA{Aw#j$)W zZB{n#+J#yjMn^|G>vD5(xtt&f1W7{D?teR{$$D*Chf*h%yM1)FzgLe0Zrf}WUAjbk zTpR+hV(rJMlnQ$FOTyH6lQX9ZvG_WV3jw7B zG%6J>W;0DFA5`}Jkzd++hoa~UKJ9K@(G={*1Ht9SfRxMjb z-;u+4dir!e-uM|g+1VW2^69^TAAh%32omsme1z+?{4q0=KP_3z^S^zD@uNrc){4Kd zXyMCzTUJV$p@P(uLDb!7xYJg@*T=>k+ZmFQ!lREo!kKelGk(-)d4@YFPR9N14ceJsOMQ#n^sjHT@sr;5&zl-LKYPJcswVF6C3 zld9@!++Gj*$S78C`iux|I3}~1yh8_x(CV<;S~?e0;2yLSjF0Wg)oYck&)vf73+Cgn zJGfj{Mi3Ah8VZ2`KDUn=qml2fUPTZDCX5-4)8!^aB&OV8Kp!2Aq3RmfjWz5!bch8R z&r#h{d;dyH>rF+OLpzRDet%m$wohU&QNiicNF@^7UN2L7L?UXrfh0_WC&Z5s>?BAP zf~UidDAlZ+SryA|@j`l*1+m+P+b!qynM3Fhp@(5&S-!Rx@Hv0zpCmzkjO(TfLE6u6As; zTcn1Cu)gRr30?J+e^vd?rW3_~y>F%8XU)F+MN8+;OaJKDxgK8xybRRH$=aFEu;l*S zsxGIfw4BLf#}b5qqr$+2vMX4uZH#{GG1N*w!{YUnTq#AN2xW4drts|z1*?B-+=E)% zUDmamcT8OP>~9J;oPW8fH`<-dn=+BiS<~@$*m(Do%|z>TG@H$IjfukPbnwF5=Ww=n zaO!L!#l{Ajy#ZcKOZs-%`fW44KEL;&XlJU;wyKR=_KeD!JL_=nx$80 ztA2mo*1?$*M=S}Jin3PapHovt!f=Z#JuD$`E&&zFxNk)hVPaC#NR;K6XI-G`}bz^|qHVfd>Tvz1Lw`B?YviBqbWG11^gjUr0000qVZqE6)=lqo0`vF#&*75!I`TIh@_d&k*HoEtQyV-iD z%Xz2D9EQRbeYh5Nr~y=#0ZD;^+vz0$004MNL_t(2&&|%+4u6C&2tZM$Wf&dzefR%A z(^3-?6X>hnCz2Ba@RH&`m!pgy?n@#@AuLYB&}Q)FGY`?vcft0!vht0Z@M&ZeNCWXh75gzRTXR8EE3oN&6 Q00000NkvXXt^-0~f<}#n+yDRo diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index fe730945a01f64a61e2235dbe3f45b08f7729182..236a95dbb1efa7fe4f6ba7b64e85ba63a890cd99 100644 GIT binary patch literal 6394 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 IM6N<$f>KnF_W%F@ delta 447 zcmV;w0YLuxG0p>!8Gi!+007oyx*7lg0G3cpR7L;)|5U~J0au$Tw)URh`@-w}Xw3Np zS)Ix4{k7)&ujKrh-TO(x_}20L&+q+}+xr1ilg8}*yXgGl_5RcF{f*iBEV%Z~-t4>5 ziGV;=={^- z?sLQGb)?A{hr$_!z8HbH7kH=vM0x-*R~t>;jsO4v^GQTOR7l6|(&r9>FcgO2dg?%> z;=sK?5%;?Pn^T7LL?Y$@5u?06NuIR*0?Yf$Hf5Afk+lM<^ch*jvO$sU*m9J?JI7eI zGFV6+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9R%3*Q+)t%S!MU_`id^@& zY{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&p6kME1_Z%?`+u)^el0!1<0sd p?Eyu!OMLDifi)An*I;?S-wj=m4RYIt!kPd8002ovPDHLkV1nJD^qc?y diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 321773cd857a8a0f0c9c7d3dc3f5ff4fb298dc10..990c5bce8172b2b387fdbff774212ce25627e6c8 100644 GIT binary patch literal 12711 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 delta 691 zcmV;k0!;m4br2|=<_Wb|z`~RBV`-<24{r>;E==`tb{CU#(0alua*7{P! z_>|iF0Z@&o;`@Zw`ed2Hv*!Fwin#$(m7w4Ij@kM+yZ0`*_J0?7s{u=e0YGxN=lnXn z_j;$xb)?A|hr(Z#!1DV3H@o+7qQ_N_ycmMI0acg)Gg|cf|J(EaqTu_A!rvTerUFQQ z05n|zFjFP9FmM0>0mMl}K~z}7?bK^if#bc3@hBPX@I$58-z}(ZZE!t-aOGpjNkbau@>yEzH(5Yj4kZ ziMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_stABAHe$v|ToifVv60B@podBTcIqVcr1w`hG7HeY|fvLid#^Ok4NAXIXSt1 Zxpx7IC@PekH?;r&002ovPDHLkV1lfKYnlK6 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 797d452e458972bab9d994556c8305db4c827017..88b21adc9499a9a97f2031fac23ac0aabd1d4809 100644 GIT binary patch literal 3414 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 delta 390 zcmV;10eSw`8kPf)8Gi!+006rnNM8T|0E$pdR7L;)|5U~J0au$Tw)XJ){%+3s=lA~6 z@BMVp`S<<*VaoaP`~U3u{%g(ou*=|m)B4`@{`33)?ezIj#Q6OF|6IuUF}e2O>+>eB z?J{?+FLkYu+4_Uk`r_>LHF~flZm0oBf#vr8%vJ>#p~!KNvqGG3)|f1T_)ydeh8$vDceZ>oNbH^|*hJ*t?Yc*1`WB&W>VYVEzu) zq#7;;VjO)t*nbgf(!`OXJBr45rP>>AQr$6c7slJWvbpNW@KTwna6d?PP>hvXCcp=4 zF;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$g4^KNpa1{> diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 502f463a9bc882b461c96aadf492d1729e49e725..36e9bad3caf37497e08ce9da71f42fb8b541dcc7 100644 GIT binary patch literal 11024 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 KMNUMnLSTX{%>04? delta 572 zcmV-C0>k}~R>}mB8Gi!+006nq0-pc?0H{z*R7L;)|5U~JDYo_jSDXF*|5nEMy6F5^ z$M}8I`uzU?*Yf=uXr;5|{0m;6_Wb|A>ik^D_|)+I$?g3CSDK^3+eX0mD!2CP`2NN0 z{dLg!a?km&%iyTt`yiax0acdp`~T(l{$a`ZF1YpsRg(cvjDG_-U$Er-fz#Bw>2W$eUI#iU z)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G!hkE!s;%oku3;IwG3U^2k zw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn_j%}l|2+O?a>_7qq7W zmx(qtA2nV^tZlLpy_#$U%ZNx5;$`0L&dZ!@e7rFXPGAOup%q`|03hpdtXsPP0000< KMNUMnLSTYqel=qN diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 0ec303439225b78712f49115768196d8d76f6790..844763282fe06ff9631b0ba72642b4423e4e8078 100644 GIT binary patch literal 21977 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 delta 851 zcmV-Z1FZbns{!5ykQsji0000Ey2juD008GuOjJex|Nm6Q_yAX%DYo|f{{L9U`1}3; zNx}F2{{Ke6_f^IC`ThQK&-nmVnULA~Ov3jDTb=d${!qmDF1Yv6;OqcNk|wnDQjEI$ z{Qc7K{gvDLV#)aS{QmU%{w=}(Dz^320Z)wqMt%V?S?~D#06};FA3KcL`Wb+>5ObvgQIG&i zg8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU^ws0;(c$gI+2~q^tO#GD zHf@=;DncUw00Mt9Nkl<*#{d~Za)k&3P z0rwz$yX6`Twg&F-qc@e;1Pi$Lk|x_q(#zcEE*UqhaD{(ytt#xUaH*@Vy6UQ{uDUQy zU3Jw}S6y}0Rrk)i*38Tbx;M{lCEe`BX1~ArTYWtB{ACBMpj%7oY|VG4)>=8Y7teU# zl-$4lrM6&B8*5Yt67w0wetd@Bkhl{yx-g)E*<%L`eFsJ+|4t?BT zUiLjN$v%JfikDe8g3dDcir+AP-nh%V^xRl{W^Ug4Zudb&XkL;zx3#*CvW!bt`xn<- zyQ^K2OMA5}xn7=B=6DXvHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@nH#K002ovPDHLkV1g|}%Af!M diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e3a10199dcb692cb48121856ea501483698213cb GIT binary patch literal 4982 zcmV-+6N&7JP)t9hFhwI$dBXKu zDdZIu^7g<1I4JG8mYmFM2M)?22ljh^N0+XHSH{Fn-k1Dvo7H0Z>wvg8D4Z6(-DRJ) zZg|IcRz=gOUVWxbn8>a}2QidaFm%wHd_8v_4<0?@QD!EsTC}ts3Q~y#LwPyT+rNhZ zf5y(8$B(B^vw7DJlnMn?-y6^7UAx$CGI=bXIB9F6gWJRB9liX1Wu@_@(Y!PeZ#T8a z%F%s}pD?LIHm&)V_ajGfKm8#m&z)!CXLD%Nyt$z4cU!j5r$-MuwQYw)Dj_E~2c1^O z&V&0fT|SAuPREq9$Juh|Zw&7D8vBp_$nte-=-#mddVLu~=PzT?gt6o2$t6x7?@t(R zG?~qR8W0x;h4ad>eNP-IQ#CwzJf6>|PUD;P-|}Yv0em@YHa@j#k(r%^gS`VI-gyVP zOh&@x%M=$C(z$&HYIsz~Y5}FEAGM?=uAMkbZhk(sy}W2tH<%sYe#fkN3&_dK;iGZy zF?H2imPNfcSyt z8to&Nu3pWQi4!oJO^C%}v^p)@cEvJ(WIrC>Iz?oFlJ(hEq*4hb8V$?Wt>x=4=ke3I zvotKM%ia5T>D#$GS8pcMp=B5|b{!GVi5RdVaqjxi@=D{sjF(>pGO>H}MVqc?D4M)b!hkK10Wai{zvY5G=oWi8Bqw#Qe$I01=_%o;J-l07S8?JCm7S>>J zW4}=`7w@h6%|KcQ)M#D3ajRF4EZ@k?s1Mk-Z!gm)MPaW{U@==LC@#Xq#g)Mmrm}hY zJVITRWSAAS%1_}HM-jJo-lWLhoxu(2VEFbE${yUtMQq`x0s{ed5>nDqQ7G-vYPCX4 zJ$n2Yv&F)J_;|XsYsb*nUuW^U)r^f8%Bnqkh<J zQY>aO*Ddy*J^kI@j!n{UcxfP>u1+5HTD0mtb@4_fj~U0E`>6!_`y+QyqIPxRTG9>n z9XZ0Zi4$@Ad#rpu;}d3oJcY!2N!$@x$(K8jU18>xN-G7)cL`8C^03&-&4NlYE8xDt zLUga*>^~ewnW2obiVC5Im@Q^>dOejU6LNbydUo!_M{~ZQfA^m3KAT8X_x8hLlQzFR zknozSS1%TsWG>EX@(PRS5FU<`y*+9N6;oz^%E9<}x_0PDSnr<9nKG5J!$$D^jy)_| zxsvP0eqdOT2XQCQv*V}B*!)0ZEyPhO#$dAIAc4MPCgAH+n^L_Fovw`H;$m#nvbdy_ zQjJESFaZ^{sb;67j-NjYg`7**lW^%as#R@w7x#?(qWqTw(jch&Pq)(P-l-F(FD9^b z?p&d2uidhlAC4arSZ$eJhe2;(Wz0q-QW=B#^ku|bZ!z=U9cCPiqpgFOV5Jy^RE!u4 z*_BYs&yPM4kqjODwvc9R@nJg=U0E3-u}Ij%mgP!HHDu@JV5d;fHawiHoF`OsaO7&K zNz%wg-Z>+m?Jor+tVPSP#oz5`T+>LT5-Ceot>VnZi!==lrJAZ517GdK*r7vtedI{$ z1=S&H)-1mKdO2UunZvx#zFF6k;n38ao<{CQh9@$L@oN@NjpdPuH$oyK#eNjT@7aUqT}vkMKixb6yO@ z&B;+!Vl;be^m_DqJ!u&aF;rC0qeCa0s;MZ*FBIrV!j(%H3^$}G$Q5pZCd*H1i+0K$4DnX*MVuGYNBx?BQaZH+^`Y4y z=}HjRr0Mf@ZQrqdS!l+@BJ_rGnuUf6pXV;$q6Ia|Gdif03YpGOVf$7C|1(Q1Xwtxq+r+Sk@FiK;rlr#GwafP+kow?c{p5hg68-MY>G>&a9# zjn?O25Q(2I%JXZsbrlK)N~OJUp}3?(xN5ONk4Zxvq#~;v_;nz*VrP>@vt~2iW@(W{ zuvFr;YrH-(61B54`(tAGbm2nw$HnpO(xr50)0&On$1-pEG9uo1lMmm0kMLeSY1p9? zUrd`uMP)h1e>%)Y9YlXMXa2^kT+iIOJQ*_ z{=UA1H*dkM`}gS3x(&UCyd`iin%Ectd8D*$!y}tu@h8x_n?2TR}mu;z$BkMMZ-FE_-xSvOlAvBLPGfI z%vpMN>B8Ad7X{j)kjZd#a6lvyq0?%q8e>$Q$%}!Ast`Xry{Qu?B9ltlbLbG;5A0_~ z)MUm_|A-&9ZO7lsoA$5wV^ZWOV%M!_(5R8*7Z#9k?J9k`^kB`V=qh)$fQPFarJ7Pf z2c1UC;x(%nGbDnod-u}0OyBFF~71p4t93ziP=D_=FRCpVuYZK&Gqy0^2sYK6nIpRj-9ZI!K+qH>IMhl>+L1%V~fLJ ze?RI41q(BQfAaqqo`@|ASw+tum58Kl*|n4TpUmXIkt0M-j^avE5}^$m2(9go1AD0# z9K_KRCkP4*V(Y%WWMw~Qf7}to5{XdcBw`5@Kbb*ZUV+d=*?N^5cW(35if@Fxx9?~i z*)h37Mc;YokWiOIPrYO3p#%J|C6)%k!6e_k^S>GLg(qTbuCWRhv`O8dAeL|VmcHG4 zuzty6emZ}S4`$A$N&SX6J60njJBz0E8e%6^pfA(Yv_S}WQ&S0V+LYY90@5-b&?2-E zfnHt|YqYq#x(FL}qhJkem^z-FP@(r}rt0R-iXjH#G%hs>udP*`& zKmUUMBZoh)H!tB@7OPY$B|Y;#z1|v(vC>3kxsh&fz99??Z0_Le<3r4zU6fap)2MEJ zw*PPtHy2l2ot%Ukp*I*fb?G9`Do4~#PMl0gz-Th!>*-BVNilT-16jE_nwst&WIWEs z$*~$mB_%?D+q4X+Tc4h94Hgu(liAUI@L)pg*T<_ybtGbu6|wlm!G1Nj?AT&QLvHJq zb*hVNH{jyEbV5TKJon6JN86!QE8Ns->Y~Hgx?$CQD@g4fFqY|_mP$*Nv$hL;UIcAf zOL(wJz*ECEL*eDmnTPrRn3bOI)}U@(>|`>+yCe6BUu3Pa3Zv;xW^Ud$u?HtliHzL$-pY+4 ze}8}SON!AHJYs&QFjiMnkzuIB{grSWYj_LRl)KbGmz(+A`nJF7&@l7`c~8&AmJm&d zrBYm)wZq=ikD9gzeFCvpsR#)UBqG?0ndw=GL{@5f)F5A)PygDE#ltq=oRM8n`img` zC6H%w@aDq~3c_F;@UolW~?+l1E!b$tEM8E%u6 zoBNz^$s`i|d}<3LQwvt^KYSnzvY*c9s~8C2=#YrWYN30Za1u`(pv+nguUej@W~8%n z$^@dL*L;#)Q2MiG>ZO5LEEYc9dunXVhrW#-1qTM6yL^R|hYzrN`g8W!WgOKtajmAJ zm6V$V`311}v)SBDOXtGHi}?E1#!00Th75O7Q-xa9qhm)tn>L-( zXU`IM;%~?_g`CSQKvdI7m_$w+89~me1F<`=JzD!~dcF{dO`eqM3MQ?N?Xfy4;+)xR zuAX@P2AMh?Ry!xO`2{SV_C9`Yt~3k@!CJ1PuD>5!eo&z`8i_x75@#1RPEIP+Y9|yj z36Azkd_6r`Hup=sJ-vwCy_4d?0=(Sah`*VJ!8?!}DL45jas)NAuAY4V;HBY4qw$3^ z)0dk4-pMISdvD2x&Z{PmJhnoqsCgkN1$S3h+*}l7UP(aa=SyJSx@dAAQB!FZTuE#) zar4$q%n~^T#Ra5hWeeF%?c~hBzm7R3* zquA4Zb!Fw1FQem2Pvh_8Yj2KOwkdq+$bN_G`1ES9cKa^8yuHaSGh@1c5BaVb>V>uD z#=|^{^kt-GJ)%{UrpWD-I6FHEDYV?+K+?T?965fR^t3dxpFASJsED-eEGjF_$V4Jm zPK~1IY~1b%`_B*2mHiVh`E!8SBrUHbW5miG;U9EqykKk8h%p;3-IcD7KS{lyAg<(S zsGp-FK<`*9ie^sW5UQ`KGXzv!f%U-+Y5tebvVEKgMkw5q)!ZcA+Nk zx9aq}fIO3=?4pzr>kjsA8+a*vV2k=u<3EV#b5(0qUdt}vYSInit(CUifJ`RGU^HU3 zSh2HH66EJcvqlYRQe8zIrKLFj$dTChw?0^U`*Bg)@73iG0eL28QlBK)KGhFjtk$fC zs#~)FugY->L3#rJxG6W=R)G)3!Afxf4ufYce+$p z_R?|imjZbvxurVI;Zoi1!*_Fb6L(p7Yo(Hll`d*$rNv^gmTGln#rld0%Wr(i`Lgnt z{qmvGXr#!9p-7+mi_`NzTmJvIDF12lUjyWS0JQIxu3n>Z=>Px#07*qoM6N<$f-+3o A2LJ#7 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c40c83f7e4e3e2040f465ebb49d05c723e4f9112 GIT binary patch literal 16102 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

2CJj>hwl*Vr?AChSy>^!&Xv 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d100ec632b7ef03b40aef265817f9c37d5c3451 GIT binary patch literal 6164 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

  • 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 delta 851 zcmV-Z1FZbns{!5ykQsji0000Ey2juD008GuOjJex|Nm6Q_yAX%DYo|f{{L9U`1}3; zNx}F2{{Ke6_f^IC`ThQK&-nmVnULA~Ov3jDTb=d${!qmDF1Yv6;OqcNk|wnDQjEI$ z{Qc7K{gvDLV#)aS{QmU%{w=}(Dz^320Z)wqMt%V?S?~D#06};FA3KcL`Wb+>5ObvgQIG&i zg8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU^ws0;(c$gI+2~q^tO#GD zHf@=;DncUw00Mt9Nkl<*#{d~Za)k&3P z0rwz$yX6`Twg&F-qc@e;1Pi$Lk|x_q(#zcEE*UqhaD{(ytt#xUaH*@Vy6UQ{uDUQy zU3Jw}S6y}0Rrk)i*38Tbx;M{lCEe`BX1~ArTYWtB{ACBMpj%7oY|VG4)>=8Y7teU# zl-$4lrM6&B8*5Yt67w0wetd@Bkhl{yx-g)E*<%L`eFsJ+|4t?BT zUiLjN$v%JfikDe8g3dDcir+AP-nh%V^xRl{W^Ug4Zudb&XkL;zx3#*CvW!bt`xn<- zyQ^K2OMA5}xn7=B=6DXvHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@nH#K002ovPDHLkV1g|}%Af!M diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index e9f5fea27c705180eb716271f41b582e76dcbd90..c6fe7adff9250f79da0dfd54e4dbee923c2aa19e 100644 GIT binary patch literal 43216 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 delta 1669 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 M07*qoM6N<$g530c-~a#s literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2efdd5c30fb8d86a3c85c5dce552dd6f3000c7da GIT binary patch literal 29732 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 84ac32ae7d989f82d5e46a60405adcc8279e8001..dc49aba08d845d1c8f9248ebca04adef3550ef4c 100644 GIT binary patch literal 10108 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 8953cba09064923c5daf2d37e7c3c836ccdd794b..ac4802eb739653e9e3adbf049dc44b81738dc306 100644 GIT binary patch literal 32442 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 delta 1218 zcmV;z1U>t@{Q=4ekQsji0000l9MBU0009V4OjJex|Nm6Q_$jvb0au$-#rXRD|5(QO z{Qm#_{{H^|{{U8+R>k;B!uRL){b9-YNx}D?-TM6f{zbp{`~3X}Tb%$&k_1|u zfV0u>{42ctGP(8vQj-Btk1n|O0ZD=YLwd&R{Ko41Gr9H=Y@z@@bOAMB5Ltl$E>bJJ z{>JP30ZxkmI%?eW{k`b?Wy<&gOo;dS`~CR$Vwb@XWtR|Ni~t=w02?-0&j0TD{>bb6 zsNwsK*!p?V`RIS|^^~{NQ;oVfi@GXtsy}m|06&ZXRfhl}L;FffSO5S6eMv+?RCwC$ zm+Mj*K@f#|VPSRzV-`>`5=AivqaegY#CX>v=6+A!|4lL@R9e~05Q;d{YJXM!v7q>> z&!M*ghG7_nVHk#Ch$1t?5a0tTVJH&ZBLEH`Sebvn1@3nI=#>g9wp4IUiKWZU*nra%8XRM`ec%3_8fn6*N~&dEd0kD-FRV|g=|QuUsuh> z-xCI}vD2imzYIOIdcCVV=$Bz@*u0+Bs<|L^)32nN*=wu3n%Ynw@1|eLG>!8ruU1pF zXUfb`j>(=Gy~?Rn4QJ-c3%3T|(Frd!bI`9u&zAnyFYTqlG#&J7AkD(jpw|oZLNiA> z;>>?C9}bLOXyzQ{1Rn4<%v)eC3l%nM2G34t{)-XFW3|MzCkLnfZHeN+{A#^TwHZ+!{p9q?%c*%w{Z< z=GMTm8KyaBqw(Y0Cy2orXm)b;<)J!_v$f9pF07*qoM6N<$f>j=bq5uE@ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 0467bf12aa4d28f374bb26596605a46dcbb3e7c8..22e98d6c75bbb4d13fc4c0122277f213a6587cfe 100644 GIT binary patch literal 37923 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 D21yJo delta 1411 zcmV-}1$_FWr~--$kQsji0000($h_VF008q)OjJex|Nm6Q_$jvb0au$-#Q6RG|NQ;_ z`u+b{#`ydG|5wKNPQ&*^zxM!2lL1zlir4y3!}tVRozU+516Z8?|Nrj!{>AJ3O2PMD z$oLqr^>U%d=l1<#%J_z@&PKrZF1Ysc`u@@H{E623uH*YZz4w1BzW*n(@|xWGCA9Sc zMt*e9`2kdxPQ&&>|-UCa7_51w+LUsW@ZzZSW0y$)Hp~e9% zPvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq^={4hPQv)y=I|4n+?>7F zim=dxt#sqj!A8000D1Nkl*v&^&=|+Hd{KUTbfjFY149`B9Z?JA;JODI|1Ri*a+Z z^#PDGc`IecWa-9LVrC5Yc`M^4C1>fnVoIQkNbF4J1hZR{8AI(*G83SSi04gDEzE4O znmIHdWbzu!0o~cerl;1X52(&2GX1Df7)YyS+AHMCK%#EC)SIp+C1-jvkP=@8QulHV zB+{lQHJX3Uvyw@D_1H_9IT`uctkHDlK-0asdie7--IsyHF3&)stx&Ct9Qmeua`m`$ z1IdA=`>~o{yoG8o-KdZ+Zz1OT4Jo{ZAiRanxq1w|8A$TNPqy$Da<=K7F#WlDSeV?8 zf#lB(>8dy1Ep~k%aVIKtnSU;n%Nh~QzJ<8n^qPMH(P-24A5=>a*R9#QvjzF8n%@1N zw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE>Gkj4Sq&2e+-G%| z+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62(dqY93Zy}v&c4n($ zVv&CoG~?z9=}cy1a%8Rynx7Bl=Qq8Hv#GCWpDl%I%)DgQtB?d}0E$dW)pQ*y)z&k{ zb*A3**JaZQm{=yp%~uZ`NX<0e4n?NaRx{%bH(iIajGNvnpxOy0%)jxXEG1&U%R}*0(7v|MOC;<~= zXCjn3}VQ-`MO)Jy?KTrtggxbyx9Bv2-SZ99MS z!MEEWV<3%y54UX0x5MHm2wJEBcyw!R)65*VuiPVt3L{i8$K!SsxdDB13e}h|#znim zfX4XFr-+nlMNQ0I1?^Q(${4-OViN1!6d z)+2K|9S)V#DX6HR$b2@N72{Kia9!*mQDq&n2{r`j};V| zuV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvwvtqy3iz0WS zpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqvo}PPwx_d@r z;T5#w0aR`MiTh`C0rj9v-ax%+eePZBBRe#A0@~{sqCR=@13&;#uuS&+c?p6TD&YIC z+e`8i|D*o={t84pkFEFN*8wW1NMd^gIaE Date: Sat, 7 Jun 2025 12:40:27 +0330 Subject: [PATCH 110/256] chore : add device_info_plus lib --- packages/core/lib/core.dart | 16 ++++++---------- packages/core/pubspec.lock | 24 ++++++++++++++++++++++++ packages/core/pubspec.yaml | 3 +++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 0197984..5ddf640 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -6,39 +6,35 @@ export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_map/flutter_map.dart'; export 'package:flutter_map_animations/flutter_map_animations.dart'; export 'package:flutter_rating_bar/flutter_rating_bar.dart'; +export 'package:flutter_secure_storage/flutter_secure_storage.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; -export 'package:hive_ce_flutter/hive_flutter.dart'; +export 'package:device_info_plus/device_info_plus.dart'; +export 'package:dio/dio.dart' show DioException; //freezed export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; export 'package:get/get.dart'; //di export 'package:get_it/get_it.dart'; -export 'injection/di.dart'; - //local storage export 'package:hive_ce_flutter/hive_flutter.dart'; -export 'package:flutter_secure_storage/flutter_secure_storage.dart'; -export 'infrastructure/local/hive_local_storage.dart'; - //encryption //export 'package:encrypt/encrypt.dart' show Encrypted; //Map and location -export 'package:latlong2/latlong.dart' ; +export 'package:latlong2/latlong.dart'; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; - +export 'infrastructure/local/hive_local_storage.dart'; //network export 'infrastructure/remote/dio_form_data.dart'; export 'infrastructure/remote/dio_remote.dart'; export 'infrastructure/remote/dio_response.dart'; -export 'package:dio/dio.dart' show DioException; - +export 'injection/di.dart'; //utils export 'utils/logger_utils.dart'; export 'utils/safe_call_utils.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 42a3880..d023e16 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -217,6 +217,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "0c6396126421b590089447154c5f98a5de423b70cfb15b1578fd018843ee6f53" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + url: "https://pub.dev" + source: hosted + version: "7.0.2" dio: dependency: "direct main" description: @@ -1210,6 +1226,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.13.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" wkt_parser: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 346a62b..5cd944d 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -12,6 +12,9 @@ dependencies: flutter_localizations: sdk: flutter + #utils + device_info_plus: ^11.4.0 + #UI cupertino_icons: ^1.0.8 From 40b8d6f913172d0272de2cb3a8d722fdc35b1cd2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 7 Jun 2025 14:54:44 +0330 Subject: [PATCH 111/256] feat : apk updater --- android/app/build.gradle.kts | 6 ++ android/app/src/main/AndroidManifest.xml | 42 +++++++++----- .../kotlin/ir/mnpc/rasadyar/MainActivity.kt | 56 ++++++++++++++++++- android/app/src/main/res/xml/file_paths.xml | 6 ++ packages/core/lib/core.dart | 6 +- packages/core/lib/utils/apk_updater.dart | 22 ++++++++ pubspec.lock | 24 ++++++++ 7 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 android/app/src/main/res/xml/file_paths.xml create mode 100644 packages/core/lib/utils/apk_updater.dart diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 8686b85..50bea74 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -26,6 +26,12 @@ android { versionName = flutter.versionName } + packaging { + resources { + excludes += "META-INF/DEPENDENCIES" + } + } + buildTypes { release { signingConfig = signingConfigs.getByName("debug") diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0c41f54..0258a40 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,33 +1,37 @@ + - - + + + + + + + android:icon="@mipmap/launcher_icon" + android:label="رصــدیـار"> + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" /> - - + + - - + + diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt index a56ba32..8c73ca4 100644 --- a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt @@ -1,5 +1,57 @@ -package هir.mnpc.rasadyar +package ir.mnpc.rasadyar +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import androidx.core.content.FileProvider import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import java.io.File -class MainActivity : FlutterActivity() +class MainActivity : FlutterActivity() { + + private val CHANNEL = "apk_installer" + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + CHANNEL + ).setMethodCallHandler { call, result -> + if (call.method == "installApk") { + val apkPath = call.argument("appPath") ?: "" + installApk(apkPath) + result.success(null) + } + } + + + } + + + private fun installApk(path: String) { + val file = File(path) + val intent = Intent(Intent.ACTION_VIEW) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + val apkUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val uri = FileProvider.getUriForFile( + applicationContext, + "${BuildConfig.APPLICATION_ID}.fileprovider", + file + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + uri + } else { + Uri.fromFile(file) + } + + intent.setDataAndType(apkUri, "application/vnd.android.package-archive") + applicationContext.startActivity(intent) + + + } + +} diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..03d4219 --- /dev/null +++ b/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,6 @@ + + + + diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 306e2fe..d1c0ae9 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -10,18 +10,18 @@ export 'package:flutter_secure_storage/flutter_secure_storage.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:device_info_plus/device_info_plus.dart'; -export 'package:dio/dio.dart' show DioException; +export 'package:dio/dio.dart' ; +export 'package:pretty_dio_logger/pretty_dio_logger.dart'; //freezed export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; -export 'package:get/get.dart'; +export 'package:get/get.dart' hide FormData, MultipartFile, Response; //di export 'package:get_it/get_it.dart'; export 'injection/di.dart'; //local storage export 'package:hive_ce_flutter/hive_flutter.dart'; -export 'package:flutter_secure_storage/flutter_secure_storage.dart'; export 'infrastructure/local/hive_local_storage.dart'; //encryption diff --git a/packages/core/lib/utils/apk_updater.dart b/packages/core/lib/utils/apk_updater.dart new file mode 100644 index 0000000..23776db --- /dev/null +++ b/packages/core/lib/utils/apk_updater.dart @@ -0,0 +1,22 @@ +import 'dart:io'; + +import 'package:dio/dio.dart'; +import 'package:flutter/services.dart'; +import 'package:path_provider/path_provider.dart'; + +class ApkUpdater { + static const _channel = MethodChannel('apk_installer'); + + static Future downloadAndInstall() async { + final dio = Dio(); + final apkUrl = "https://yourdomain.com/app.apk"; + + final dir = await getExternalStorageDirectory(); + final path = "${dir!.path}/update.apk"; + final file = File(path); + + await dio.download(apkUrl, path); + + await _channel.invokeMethod("installApk", {"path": path}); + } +} diff --git a/pubspec.lock b/pubspec.lock index 1ef2d3a..c2ae1cd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -233,6 +233,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "0c6396126421b590089447154c5f98a5de423b70cfb15b1578fd018843ee6f53" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + url: "https://pub.dev" + source: hosted + version: "7.0.2" dio: dependency: transitive description: @@ -1277,6 +1293,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.13.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" wkt_parser: dependency: transitive description: From 845ff0d2b490e08421f5aa2938ab5ca6369a5eb9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 8 Jun 2025 11:35:22 +0330 Subject: [PATCH 112/256] feat : home page chicken-Steward --- .../kotlin/ir/mnpc/rasadyar/MainActivity.kt | 2 +- assets/icons/chicken.svg | 8 + assets/icons/convert_cube.svg | 10 + assets/icons/cube.svg | 3 + assets/icons/cube_rotate.svg | 7 + assets/icons/cube_scan.svg | 8 + assets/icons/cube_search.svg | 6 + assets/icons/home.svg | 3 + assets/icons/truck.svg | 7 + assets/icons/truck_fast.svg | 10 + assets/icons/user.svg | 4 +- assets/icons/user_raduis.svg | 4 + assets/images/chicken.png | Bin 0 -> 2585 bytes assets/vec/convert_cube.svg.vec | Bin 0 -> 1977 bytes assets/vec/cube.svg.vec | Bin 0 -> 864 bytes assets/vec/cube_rotate.svg.vec | Bin 0 -> 1248 bytes assets/vec/cube_search.svg.vec | Bin 0 -> 1041 bytes assets/vec/inside.svg.vec | Bin 0 -> 1997 bytes assets/vec/outside.svg.vec | Bin 0 -> 1123 bytes assets/vec/truck.svg.vec | Bin 0 -> 1068 bytes assets/vec/truck_fast.svg.vec | Bin 0 -> 1685 bytes assets/vec/user.svg.vec | Bin 295 -> 295 bytes assets/vec/whare_house.svg.vec | Bin 0 -> 32996 bytes .../lib/presentation/pages/root/view.dart | 703 ++++++++++++++---- .../lib/presentation/common/app_color.dart | 2 + .../lib/presentation/common/assets.gen.dart | 100 ++- .../lib/presentation/common/fonts.gen.dart | 4 +- .../wave_bottom_navigation.dart | 30 +- 28 files changed, 758 insertions(+), 153 deletions(-) create mode 100644 assets/icons/chicken.svg create mode 100644 assets/icons/convert_cube.svg create mode 100644 assets/icons/cube.svg create mode 100644 assets/icons/cube_rotate.svg create mode 100644 assets/icons/cube_scan.svg create mode 100644 assets/icons/cube_search.svg create mode 100644 assets/icons/home.svg create mode 100644 assets/icons/truck.svg create mode 100644 assets/icons/truck_fast.svg create mode 100644 assets/icons/user_raduis.svg create mode 100644 assets/images/chicken.png create mode 100644 assets/vec/convert_cube.svg.vec create mode 100644 assets/vec/cube.svg.vec create mode 100644 assets/vec/cube_rotate.svg.vec create mode 100644 assets/vec/cube_search.svg.vec create mode 100644 assets/vec/inside.svg.vec create mode 100644 assets/vec/outside.svg.vec create mode 100644 assets/vec/truck.svg.vec create mode 100644 assets/vec/truck_fast.svg.vec create mode 100644 assets/vec/whare_house.svg.vec diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt index 8c73ca4..5bae765 100644 --- a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt @@ -39,7 +39,7 @@ class MainActivity : FlutterActivity() { val apkUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val uri = FileProvider.getUriForFile( applicationContext, - "${BuildConfig.APPLICATION_ID}.fileprovider", + "${applicationContext.packageName}.fileprovider", file ) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) diff --git a/assets/icons/chicken.svg b/assets/icons/chicken.svg new file mode 100644 index 0000000..1352445 --- /dev/null +++ b/assets/icons/chicken.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/convert_cube.svg b/assets/icons/convert_cube.svg new file mode 100644 index 0000000..5ada319 --- /dev/null +++ b/assets/icons/convert_cube.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/cube.svg b/assets/icons/cube.svg new file mode 100644 index 0000000..c44cba3 --- /dev/null +++ b/assets/icons/cube.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/cube_rotate.svg b/assets/icons/cube_rotate.svg new file mode 100644 index 0000000..e5280c5 --- /dev/null +++ b/assets/icons/cube_rotate.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/cube_scan.svg b/assets/icons/cube_scan.svg new file mode 100644 index 0000000..5d088f4 --- /dev/null +++ b/assets/icons/cube_scan.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/cube_search.svg b/assets/icons/cube_search.svg new file mode 100644 index 0000000..e9308ea --- /dev/null +++ b/assets/icons/cube_search.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/home.svg b/assets/icons/home.svg new file mode 100644 index 0000000..a2a952c --- /dev/null +++ b/assets/icons/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/truck.svg b/assets/icons/truck.svg new file mode 100644 index 0000000..9a40d42 --- /dev/null +++ b/assets/icons/truck.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/truck_fast.svg b/assets/icons/truck_fast.svg new file mode 100644 index 0000000..7c05346 --- /dev/null +++ b/assets/icons/truck_fast.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/user.svg b/assets/icons/user.svg index af27d7c..b60b7b7 100644 --- a/assets/icons/user.svg +++ b/assets/icons/user.svg @@ -1,4 +1,4 @@ - - + + diff --git a/assets/icons/user_raduis.svg b/assets/icons/user_raduis.svg new file mode 100644 index 0000000..d52d9b2 --- /dev/null +++ b/assets/icons/user_raduis.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/chicken.png b/assets/images/chicken.png new file mode 100644 index 0000000000000000000000000000000000000000..20f7ab3144cb2847fb5e90794a01c16d1603109c GIT binary patch literal 2585 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 literal 0 HcmV?d00001 diff --git a/assets/vec/cube.svg.vec b/assets/vec/cube.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..a5b5704531b0bdf8fa7bfa39ccc22ecc7a33867e GIT binary patch literal 864 zcmXw&OK1~e5XZl45F{dA;z24~J&0Y?O6h8~khI@W$f{8!+aMxQ!9!0T5`q`SLa1L| zAMFM_)k8rNJg$$^QbCH^i)6jYq8ABP5Yu>(#>XYj%r*&|UuNg^&HQ(-jW{A^2(boq z?eF0yE<~?4AcPphOT@J38yA|!f9WR{$NPOtLl;`xW_*pZ#GtCe&I5a;YX6nQMoBTz zB_G)}NnD-Pu&avSz?C4eGd%2OEqpiuG?HkPT;5xGso?t#rm=HAI$yfeS%n#&MV;JZ8D7D81_W2@r zmko^jE*+IZ4uhjC=nfr&+g=VlYXU0a3^Ua&GW&B7-8aXfV5h+}f5|K10M7G6{weLl zKHucQAjzz#JBc63hVcQbhG`3KspA^B_Lht+@v!x(mk4E KRL3V9-=qHF%ko!e<8as7!>Y=vMCiOqlxsF5n zY~pVnFh8TQ*)VL2;u7RKx@m41CZ-osPB{h#N`%4K?~!=C4B6z5k*TJIsIDF(8d7Vq z=3wkN)x#QwBmX^@!sl|Uxr&-2*4f}1?oet~eIwpZU)Mv`T_|k!(4LuSOTUEgQaz}P zdxg{8^MuKaA>$p1SHbx|-|>OxPc_wH-kc~pje7EWH5zjDbVjsrtg}vdEWbj=w@xgR z{H~f8n&*!md7^o}mtX%?^ZHDFACuqD<6IBtbA2sS%cR~*&2@NEa#`Qct`-(`_*|Z% zR?LFJK{N-P3)619X0FXd|+Z_Uwud z{`QeDaq~l=eRsJqH>VntnQMCb+e%_a4=j0u>btGOCxZxkf6~$2K{_jr4xgIkXmw=D zy{PrI)FJTPWU>!D_i9Bicy6X(lJ*de7dD6oXYP=G^5F3|?}!IX_JGMAFxi9k{+5V7z<1cu@YdNi^^6cu)AEf1_|`@_qW=ESkSbJec16De(YyB@V+se;?IhfjwZd j2Tb;W$sU}@^n*Pp>ZtPbX)P4|E(dN0^#8@3vjqPDR}s*b literal 0 HcmV?d00001 diff --git a/assets/vec/cube_search.svg.vec b/assets/vec/cube_search.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..da0dc56ce81e52cdacf51c77c3fb9acafe051021 GIT binary patch literal 1041 zcmXw&YeVxK zJF>JaN@cTllTr&5EtA=t`&qo~P-^w+3fQ;i>G58&**Vr9%H#kFYCJEb;Mlk>tnI zZJPK0OSNdO_b+u^bA2YikIC7FRY(}no%k6~=az^0EeBrEfT&4x|r|7yiVLyR<-i?%0G;!gc~tQEUQoI1bv z0@+GC&YTzCDQgs-`?N&3w$DL%HvPGv06yz7{k9^X{8~S6w;^$2KlyFQ&0#m0m5mQk z4wc8HW!bqK0uFd4y9(NR6d)nCzuI*Kw;MzsI!{oQ&q_rKa(KlneX!K(e zqR}T`xoE^>jhL(vlQsG==@X5Ps*QBsQSxu5^NvC%{GvslwF>XLVpyK>lSbV*s{9z8 zx-MLA3JZ^WgIMI+i=p}TsC6I1x?cgxKZEea9n^0tPMQ7GZ&>)y=oEU~J(S1(*?H~C zqUN&zvvTm$vWCnL@nNL1_vuXg(Nx(>S`LsMgDW_MgOP}^Gugi0L%$C;eZtUu99cccX+p<&5q211=;kIh8U-!w?^1g^{^>CW84m;T3?+VueQ ztSQ=`Bs)d>9tvH-0b#OoNa6vi#res~6zv}r#^Xuk<|%dZu-UBBGz;@A=({K9f4Rnc AaR2}S literal 0 HcmV?d00001 diff --git a/assets/vec/inside.svg.vec b/assets/vec/inside.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..b43a512ed84e299c85ab53eba0f807ac3512ec85 GIT binary patch literal 1997 zcmXw)3rtgI6vw~PxWz{V)TC~xfOFAq=!|Y40t(-siF3}y7cxY7su&bOMIFPmMP5=V z@@kB$48UyRg%f48y{fK#|!zSgnMW^F`J*Y-jR5+u1(U}4Glg$ACK1CDL8sA z7)nzznh*J)#XT1CL_aKUiN-d|=eU*>i7y+%&>X%BCH`4hs)|5_y#O@~sPY1&DKp^6(~Zg4XpuM-WAKzwQN$?^6mnVJ-?-=1 zhu{2FT<|ZS1^hnovcEgmTryK`qn0vG!DQQlnmxhRH{t&&(~$bvK3S>d}O zbfZCwBld9;T@*8U8QD470?GC>?3es@SK>8DkQOEqHFo)~y*_JJAKp;5gLp;rfaZbUo+ z$qt+sk08}Pcu?;|+l_GXHp26D8C-HJVf&*LzV$!gbhQBw$JOHfo?IkZ55bm`jpN~^ zur;K^>d_5VYb~$0^w7$>u3e&Sm_^c$2k%1T7b_9M?_LF>UT&BOT8^~h5MLpNk2A}$Bv-04K9okO7dB@rXXhTz-liRg?E z!Ppmx2t5^o=%cj1%?Y?ryc6b@jTl~`g6G~%ST|CGFhvqV7N$d2o`h!oE=<0?2`y|J!QDYO@Zt+sz29)S)Jz3d3^p;dZGKCuS8uZ8XEW zx&X(0%h0%|5KO<5v?4?`tb>{rR^@xi)kN=!wevaT0V*!oe$1Dz?0AkTi)H-K zoh~>9$oO4)zvM(l^FipAoDaG1TM%jqa-ul=jG#`X+Za>6@-|ftLF5=YMdafz|l{;wNa08~^TX3+E=EKnbTd0lNg0byw zDB6<%6U~Rl-Gbc`m01Il?vwOV@-rpBgoqQg(*E5xy@bdoF18mUzk`(b-M4u&g_1wM z63$n8D*5V=0RG_cJT4Ci;4;crP{a$psi6bHPoK~w)yuY_i|$YLBWBKh2BC-c^g#Gk z^!C6;aVDbJM=~+F`a8^z>4AH0>f3z_iab*B53@;nOR`n+GZ6>(Z>9ZPP(}8bxox<1 z;SL^lwxfdPr;VtgxoRcWFF(wMo>Xq)!Y`d@qc{ywP4jmX@gzUMh2KW4o~KisnmAa0 zJ)b{68|QQNJo#oeCM+uECZc#=g5voJy{TZT|^@5@%lc(n4hVYQ~wHkxdeqM6$>02eZGig^lP1H~bx z_zr)14+Vx70=%0l;@kXF+`2S|-MwW57{`e#kFjlUVzB(tFwL2F!eF^!Mo-?Rc*C^w zcZ7+~l<-0D2%FP0X1|`rTy@-3vJZtHh(oWNrjvb!$7fn*K);~*zf3)NE*$EVg*%`` zdFPSY-&+;d@-<8>P2%B&S2&!yh3>qbQm}~?iJ(?aa^IjTl7C-;Z6A75uQYIBT8;MlcVI0hwgKUg~>2A?_Ib~=Vt!R-hb%( zm$SnNde8+MIrC~8NJFH;!xTtM3Fpa!%&;CM@=uNYGl}OS54w7=Cv#LEet(hbC z<~p*+9p|EY*Qx$Trdx*nkgGP$QSyiL3;W2Bf1ID3zqofQQSWStdM6+CPG8hJeBQ8b eCEV+?8f$$8{E_fuz+VVolLZKI;4gyTCHM_Lg@HT( literal 0 HcmV?d00001 diff --git a/assets/vec/truck.svg.vec b/assets/vec/truck.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..6cd1b6fef9f95a64ea5891e0ec9247634944b267 GIT binary patch literal 1068 zcmZuxJ!n%=6h1Gn2s%{=h)GFTUw!TZxI?Cq=^VRC_ymlB5_iZB|}p(D2Y|E z$rNlwhZx@^8ABZ$OxAXB3Ajidy676e@7!A_Z#aDSyXQMUIrqJH_fk`WC6SS(EzGb& zk=ZOAh@26uAmM)D1v0FX%}*~IVsa26ssy`Yi^HNFtQTy#yrw8(4EbcdpolS`Rc z@7O;Vf0)DFSN2z71pdNKt9>)AGJnq$hg*uSr=E$TC!SX@y8-f6z(*dJv9F+?Yp^@m zbJlr}2AY!2*PRP;-G@(nEU~G4u>RV%_HTgqzKF@O$P}%C0Mw)M3~}^OZ~z=`c@83 zdTjgJ%*$MDt?m3gqrPoh*B>eJE?n&rIQ1oscYfBU9<^o8zhC-#1&J_&wzy(EFL~9t zd*vKUnD%00{^97Ld&;`~@GO2vh(7 literal 0 HcmV?d00001 diff --git a/assets/vec/truck_fast.svg.vec b/assets/vec/truck_fast.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..f8a24c1da81bd9562a960e7368dcc9ac3c6e9cd9 GIT binary patch literal 1685 zcmZ{lPiPcZ9LL}6#7M-Vfdw@i%zDy=2&r>uENt?g2pcUFlM-nm35#GVJ;(%wwpl29 za3zP9Y>lPv261T;Z6KZQB}GCHNfbO}H^(e3UKYKSc<`b*Zol8(o5`tt;kTdno8Mo4 z@6F`e*%{@elv+2G?iQA-RI8P6lsciXVh;Y~hZ}6IxHo9zsv9Pqj|LEDxl6imTwQelj zH*bd5q5o)_(<{0;&HNQT^7O9I_EgcH_jRcIW^yt>ULX2;$bRg7^z$iX0{bjvD5Qo@ z*3@g=LZuXPeF>X_&K%^7Fv$F5W;aKnSD;t+S+CtQp0^eG!8U^)x`aygA@@D(`xpb^ zEG+rFT)GaO`SU{0`ytdHgmIit1v6O^a{lbYo(JQqki1Daj%rs}IJlVG#T}Q}M^-vR zzoa?8^DFjA2zyAH7pb3(wHKk&zi7svywoJ;N4uRP{ns_)t(|r0Uq$WMf7H&4?fg#E zV==7Fyv$XU+Sblz^e>v(&u$8NCbo7KI{mW}Z|$s2f7W)@AvB^KxwcNsJxL9#iu*Do zKK8sh$1LVOCuFU9?Q`r|`%1{9(DROken+7*?kMiyFT%p^Z>F)(k2Cn)Ec$6YtD2$a z1tIGtoHliw<)xh%x`OQg#N4Ye<>G&6KnIy{Y#e<5UlQ|T_)vdHHqmSCBEnaw!ep4>egXT@o((fiv^jC$$P?U{V=(H6cr{veqeJ0iqg8@Tmw1Ah5|?{2RO zXFgdLJM+<>jOrwu_NWgYzT?V;P^w;g1HZk{e=m&ZeDVX&mlWom9~fL~7p`p|#vG3f z-ktBnee;Ekr_O#OGGCN8p$`6U-BZ=ml80nolJ#CK^$I7}&I$k8?ic&x`Ly_x%uljz iM8@+u*(a}Dt98STX6cS|w09`-^r~m)} diff --git a/assets/vec/whare_house.svg.vec b/assets/vec/whare_house.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..1f5898788618a627e61dc9cdcc9ba488bd4a243a GIT binary patch literal 32996 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 z⪚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

    Zi)HM!u?1f{iz9hztb`Rj!Ck0m> zA7Ef$MlEL6_NUNj77r%pxmFT?Oee|q0p3#^0_`(9`EP$*YYFE2=EpEri^Srsk1^|O z6k4iQVMksTZmCpZaW$V z#M}~V?FU;U(QQ*Uyy^D)j?eI?y|C8OgMRgf&6^Z6JH@2V z{&5Jhw4dUi_;BrK(D6W>M7;q4d<936|+F;6gcTr6IzJp+^TvYwLI znCy30Ue@cE^Gy~5%PBfN3B8>{AyDtiCq< zD2|K+lk;3(i9hD2VD?LN9r?IcSMa-m`lauyk<2%L&aZQEupo4(JF#QoK zH{DXyNU#x3Ybe;z_lQP{ny}U~K!W+?a~7_jV$nPM4kA{)!2PkY@TJ?kzTLr`?ZSES zz+bkh=Eu$=w{bfDiJw|>2f7aVVDg)-&!eV{o(JolhjHL5MCo2dy9cSrZFLpdDw$w% z`u-Y8Y)tk$EPa2?FWVH0f#o#wS}^+2ek@SGqC^<-p@>O(4n4~-`i|Wf3OYPHt~U3~ z8L=p)xiLHRoi~!$?$(J!G+x1pP5- z5?$wkK`5d3i8DFR4VCy~ezx`wLJxzKT3x~KX6l!h8A{sJ&-r!Bic{p@cx{9#YGE9Q$)FBz)17fjk!&?kge}RvwRZ!g*i)-$0 z5vMP-DdS(Zsd0Uisr@wk6YsS9E!?~1gUR1rO~KmzsffEokM)yY;p@dL_%2F?_SGy* zJ^va^PTy-IiH*sAho$ee`DL48F|eH6Og`XLn|KJc-rhv45Bvy&UC%M4(I>Q~IScfL z16{ZNk-OI0D$J+3F+03$xFog`?{W;9lZb)=<#_Lvh+9L-k$L15p6)A0opfOzn@HN! z#i(L*QKp!EXWeOW$83X;VMvchEjgk-ycy z)Pd(lN&H@TkPQp^%#mPAu;EN=DA>p?e+|>~!dlB{3Fgk1U~q0pbX`3G26eNs=SmhD z&~1|?2}sZo=7VE?*{0I!g<$6CLi`i2Gd%%bt;)dUI~+r?fws^2cA>a2A`fo1F$kFc z7UvvdFynABn4G@HMiLv7{SM2^#{IHQu^3oRdOArsOV6zZ+R#1+b@n8~aD5hXvQp5F z<}A?LmUR61k^9M@EG(kAF+22KHo(r6b2D5A)ZgLnT2t zAO1tqri>0I!YBK!MA!6CB9=@o1e5dJ1c^W9$1orf$DY5b)fN1{qkif8Yb0&z=lqUr zPgCT-=U?i;a}yWW*cqO2ZW-=xg?BC~HX>;&YPJ(`?ZvGQ zbOn`W)KT2(MBjHsw>pcY3w`@2-ReqjR;Q$!n0t4+{7koch+92H(u=NbQf6=Z*b60n z!~pwp!bgYo`icJfi_8HcbD-#UkjNY?G7Ut{AtH0A$TSo+jYQ@!k!dVy5|Ig!Ib75< z5rZGW2_HJv8%e(fNXaO1YqTgEBNk+=XhnFD6jd27%Ki{FCx|vpMfgOKIZ0HREW)RV z@TnqvnkbttYR(XGGsUexMcFJ7H(SKb5pi=x**sBmzUX#=2wx~N7l|s1MfegCzEp%S z6J^Uq%@rctOoW?@%$1_bDiLlW!iBdc(4^Oh6YT+b7jer~+;S7Q+(qIcGCjpc>m@SxicD{j=_79Wid%kS)cztf zKDOK?D}?q6bA4~nuwA~`I=kBH=`NREl*xJXWj-b~az#gZVr2Ou^NpxdAoj7hV($>HfYV+4PLvgin#Cggy$CN6nIA-zk0QKOgbNot zDZEUSm5Z7cBK)%muN0Y8qDr+0|02SL>sl24O_Y5XHETpTCsT}yGWwBLs#1r3=bI8G znc^_0OrIU2Tf!v_O6rO#s-j9g5m#SiHV~N&>1SrCW+Rc=SY$R4nN3AzGm)t#!qr8l zhRD { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar(title: 'مدیریت انبار', centerTitle: true, hasBack: false), - body: SingleChildScrollView( - child: Column( - children: [ - inventoryWidget(), - ObxValue( - (data) => broadcastInformationWidget(data.value), - controller.killHouseDistributionInfo, + backgroundColor: AppColor.bgLight, + appBar: RAppBar( + title: 'رصدطیور', + titleTextStyle:AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: false, + leading: Row(children: [Text('مباشر', style: AppFonts.yekan16Bold.copyWith(color: Colors.white))]), + ), + body: Column( + spacing: 8, + children: [ + Card( + margin: EdgeInsetsGeometry.all(6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), ), - SizedBox(height: 20), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ - cardWidget( - title: 'ورود به انبار', - iconPath: Assets.icons.whareHouse.path, - onTap: () { - Get.toNamed(ChickenRoutes.enteringTheWarehouse); - }, + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage(image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), + shape: RoundedRectangleBorder( + side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ), + Spacer(), + AnimatedRotation( + turns: 180, + duration: Duration(milliseconds: 3000), + child: Icon(CupertinoIcons.chevron_up, size: 18), + ), + ], ), - cardWidget( - title: 'فروش داخل استان', - iconPath: Assets.icons.inside.path, - onTap: () { - Get.toNamed(ChickenRoutes.salesWithinProvince); - }, + SizedBox(height: 8), + _todayShipmentWidget(), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'مانده انبار', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: const Color(0xFF426060), + bgDescriptionColor: const Color(0xFFC7DFE0), + bgLabelColor: const Color(0xFFA5D1D2), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'توزیع شده', + description: '2،225،256', + iconPath: Assets.vec.cubeRotateSvg.path, + iconColor: Color(0xFF5C4D64), + bgLabelColor: Color(0xFFC8B8D1), + bgDescriptionColor: Color(0xFFDAD4DD), + ), + ), + ], + ), ), - cardWidget( - title: 'فروش خارج استان', - iconPath: Assets.icons.outside.path, - onTap: () { - Get.toNamed(ChickenRoutes.salesWithOutProvince); - }, + + Row( + children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'داخل استان', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: const Color(0xFF6C5D60), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFDDC0C7), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'خارج استان', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: Color(0xFF2D5FFF), + bgLabelColor: const Color(0xFFAFCBFF), + bgDescriptionColor: const Color(0xFFCEDFFF), + ), + ), + ], + ), + ), + + Row( + children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Expanded( + child: _informationIconCard( + title: 'توزیع داخل استان', + description: '2،225،256', + iconPath: Assets.vec.truckSvg.path, + iconColor: const Color.fromRGBO(85, 97, 93, 1), + bgDescriptionColor: const Color(0xFFE6FAF5), + bgLabelColor: const Color(0xFFB0EFDF), + ), + ), + Expanded( + child: _informationIconCard( + title: 'توزیع خارج استان', + description: '2،225،256', + iconPath: Assets.vec.truckFastSvg.path, + iconColor: Color(0xFF647379), + bgDescriptionColor: const Color(0xFFEAEFFF), + bgLabelColor: const Color(0xFFD4DEFF), + ), + ), + Expanded( + child: _informationIconCard( + title: 'قطعه بندی', + description: '2،225،256', + iconPath: Assets.vec.convertCubeSvg.path, + iconColor: const Color(0xFF6F6164), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFE0BCC5), + ), + ), + ], + ), ), ], ), ), - ], - ), + ), + + Padding( + padding: EdgeInsetsGeometry.all(6), + child: Row( + children: [Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + ), + + SizedBox( + height: 70, + child: ListView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 8), + physics: BouncingScrollPhysics(), + children: [ + widelyUsed( + title: 'خرید خارج استان', + iconPath: Assets.vec.cubeSearchSvg.path, + onTap: () { + // Get.toNamed(ChickenRoutes.enteringTheWarehouse); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'عمده فروشی', + iconPath: Assets.vec.truckFastSvg.path, + onTap: () { + //Get.toNamed(ChickenRoutes.salesWithinProvince); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'ثبت قطعه بندی', + iconPath: Assets.vec.convertCubeSvg.path, + onTap: () { + // Get.toNamed(ChickenRoutes.salesWithOutProvince); + }, + ), + SizedBox(width: 15), + addWidelyUsed(onTap: () {}), + ], + ), + ), + ], ), + bottomNavigationBar: WaveBottomNavigation( + initPage: 2, + items: [ + WaveBottomNavigationItem( + title: 'بارها', + icon: Assets.vec.truckFastSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'خارج استان', + icon: Assets.vec.cubeSearchSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'خانه', + icon: Assets.vec.homeSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'قطعه بندی', + icon: Assets.vec.convertCubeSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'پروفایل', + icon: Assets.vec.userSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + ], + onPageChanged: (index) { + // controller.changePage(index); + }, + ), + ); + } + + Container _todayShipmentWidget() { + return Container( + height: 70, + width: Get.width / 2, + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [const Color(0xFFEAEFFF), Colors.white], + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Assets.icons.cubeScan.svg(width: 30, height: 30), + Text( + 'بارهای امروز', + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + '2،225،256', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.textColor), + ), + Text( + 'کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + ], + ), + ); + } + + Container _informationLabelCard({ + required String title, + required String description, + String unit = 'کیلوگرم', + required String iconPath, + required Color iconColor, + required Color bgDescriptionColor, + required Color bgLabelColor, + }) { + return Container( + height: 82, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + // Left side with icon and title + Expanded( + child: Container( + height: 82, + decoration: BoxDecoration( + color: bgLabelColor, + borderRadius: BorderRadius.only(topRight: Radius.circular(8), bottomRight: Radius.circular(8)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + // Right side with description and unit + Expanded( + child: Container( + decoration: BoxDecoration( + color: bgDescriptionColor, + borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + ], + ), + ); + } + + Container _informationIconCard({ + required String title, + required String description, + String unit = 'کیلوگرم', + required String iconPath, + required Color iconColor, + required Color bgDescriptionColor, + required Color bgLabelColor, + }) { + return Container( + height: 110, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Stack( + alignment: Alignment.topCenter, + children: [ + Positioned( + bottom: 0, + right: 0, + left: 0, + child: Container( + height: 91, + decoration: BoxDecoration( + color: bgDescriptionColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.25, color: const Color(0xFFB4B4B4)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + Positioned( + top: 0, + child: Container( + width: 32, + height: 32, + decoration: ShapeDecoration( + color: bgLabelColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + side: BorderSide(width: 0.25, color: const Color(0xFFD5D5D5)), + ), + ), + child: Center( + child: SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + ), + ), + ), + ], + ), + ); + } + + Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFBECDFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + ), + Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + ], + ); + } + + Widget addWidelyUsed({required VoidCallback onTap}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFD9F7F0), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Assets.vec.messageAddSvg.svg( + width: 40, + height: 40, + colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), + ], + ); + } + + Column oldPage() { + return Column( + children: [ + inventoryWidget(), + ObxValue((data) => broadcastInformationWidget(data.value), controller.killHouseDistributionInfo), + SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + cardWidget( + title: 'ورود به انبار', + iconPath: Assets.icons.whareHouse.path, + onTap: () { + Get.toNamed(ChickenRoutes.enteringTheWarehouse); + }, + ), + cardWidget( + title: 'فروش داخل استان', + iconPath: Assets.icons.inside.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesWithinProvince); + }, + ), + cardWidget( + title: 'فروش خارج استان', + iconPath: Assets.icons.outside.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesWithOutProvince); + }, + ), + ], + ), + ), + ], ); } @@ -63,10 +574,7 @@ class RootPage extends GetView { const SizedBox(height: 20), Align( alignment: Alignment.centerRight, - child: Text( - 'موجودی انبار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), + child: Text('موجودی انبار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), ), SizedBox(height: 4), ObxValue( @@ -86,8 +594,7 @@ class RootPage extends GetView { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: controller.inventoryList.length, - separatorBuilder: (context, index) => - const SizedBox(height: 8), + separatorBuilder: (context, index) => const SizedBox(height: 8), itemBuilder: (context, index) { return ObxValue((expand) { return GestureDetector( @@ -97,8 +604,7 @@ class RootPage extends GetView { behavior: HitTestBehavior.opaque, child: AnimatedContainer( onEnd: () { - controller.inventoryExpandedList[index] = - !controller.inventoryExpandedList[index]!; + controller.inventoryExpandedList[index] = !controller.inventoryExpandedList[index]!; }, margin: const EdgeInsets.symmetric(vertical: 2), padding: EdgeInsets.all(6), @@ -106,16 +612,12 @@ class RootPage extends GetView { decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.blueNormal, - width: 1, - ), + border: Border.all(color: AppColor.blueNormal, width: 1), ), duration: const Duration(seconds: 1), height: expand.keys.contains(index) ? 250 : 80, child: inventoryItem( - isExpanded: - expand.keys.contains(index) && expand[index]!, + isExpanded: expand.keys.contains(index) && expand[index]!, index: index, model: controller.inventoryList[index], ), @@ -131,11 +633,7 @@ class RootPage extends GetView { ); } - Widget inventoryItem({ - required bool isExpanded, - required int index, - required InventoryModel model, - }) { + Widget inventoryItem({required bool isExpanded, required int index, required InventoryModel model}) { return Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 8, @@ -147,26 +645,11 @@ class RootPage extends GetView { spacing: 8, children: [ buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), - buildRow( - 'وزن خریدهای آزاد داخل استان (کیلوگرم)', - model.receiveFreeCarcassesWeight.toString(), - ), - buildRow( - 'وزن خریدهای خارج استان (کیلوگرم)', - model.freeBuyingCarcassesWeight.toString(), - ), - buildRow( - 'کل ورودی به انبار (کیلوگرم)', - model.totalFreeBarsCarcassesWeight.toString(), - ), - buildRow( - 'کل فروش (کیلوگرم)', - model.realAllocatedWeight.toString(), - ), - buildRow( - 'مانده انبار (کیلوگرم)', - model.totalRemainWeight.toString(), - ), + buildRow('وزن خریدهای آزاد داخل استان (کیلوگرم)', model.receiveFreeCarcassesWeight.toString()), + buildRow('وزن خریدهای خارج استان (کیلوگرم)', model.freeBuyingCarcassesWeight.toString()), + buildRow('کل ورودی به انبار (کیلوگرم)', model.totalFreeBarsCarcassesWeight.toString()), + buildRow('کل فروش (کیلوگرم)', model.realAllocatedWeight.toString()), + buildRow('مانده انبار (کیلوگرم)', model.totalRemainWeight.toString()), ], ), ), @@ -185,9 +668,7 @@ class RootPage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -195,9 +676,7 @@ class RootPage extends GetView { child: Text( value, textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), ], @@ -223,19 +702,11 @@ class RootPage extends GetView { Text( 'اطلاعات ارسالی', textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), const SizedBox(height: 12), - buildRow( - 'فروش و توزیع داخل استان (کیلوگرم)', - model.stewardAllocationsWeight!.toInt().toString(), - ), - buildRow( - 'فروش و توزیع خارج استان (کیلوگرم)', - model.freeSalesWeight!.toInt().toString(), - ), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), ], ) : const Center(child: CircularProgressIndicator()), @@ -282,9 +753,7 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'سوابق بازرسی من', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), vecWidgetWithOnTap( child: Assets.vec.trashSvg.svg(), @@ -301,9 +770,7 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), decoration: ShapeDecoration( color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - ), + shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppColor.blueLightHover)), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -311,16 +778,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'تاریخ بازرسی', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '1403/12/12', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -333,16 +796,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'شماره همراه', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '0326598653', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -354,17 +813,13 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'آخرین فعالیت', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '1409/12/12', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -376,16 +831,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'موجودی', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '5کیلوگرم', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -400,16 +851,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'فروش رفته', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '0 کیلوگرم', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -420,11 +867,7 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { ); } -Widget cardWidget({ - required String title, - required String iconPath, - required VoidCallback onTap, -}) { +Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { return Container( width: Get.width / 4, height: 130, diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index 8116ba2..acb62bd 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -362,6 +362,8 @@ class AppColor { static const Color bgLight = Color(0xFFF5F5F5); // #083940 rgb(8, 57, 64) static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64) + static const Color textColor = Color(0xFF5B5B5B); // #083940 rgb(8, 57, 64) + //endregion //region --- category Colors --- diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 9be3066..5fd8d8d 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -36,6 +36,21 @@ class $AssetsIconsGen { /// File path: assets/icons/call.svg SvgGenImage get call => const SvgGenImage('assets/icons/call.svg'); + /// File path: assets/icons/convert_cube.svg + SvgGenImage get convertCube => const SvgGenImage('assets/icons/convert_cube.svg'); + + /// File path: assets/icons/cube.svg + SvgGenImage get cube => const SvgGenImage('assets/icons/cube.svg'); + + /// File path: assets/icons/cube_rotate.svg + SvgGenImage get cubeRotate => const SvgGenImage('assets/icons/cube_rotate.svg'); + + /// File path: assets/icons/cube_scan.svg + SvgGenImage get cubeScan => const SvgGenImage('assets/icons/cube_scan.svg'); + + /// File path: assets/icons/cube_search.svg + SvgGenImage get cubeSearch => const SvgGenImage('assets/icons/cube_search.svg'); + /// File path: assets/icons/diagram.svg SvgGenImage get diagram => const SvgGenImage('assets/icons/diagram.svg'); @@ -54,6 +69,9 @@ class $AssetsIconsGen { /// File path: assets/icons/gps.svg SvgGenImage get gps => const SvgGenImage('assets/icons/gps.svg'); + /// File path: assets/icons/home.svg + SvgGenImage get home => const SvgGenImage('assets/icons/home.svg'); + /// File path: assets/icons/information.svg SvgGenImage get information => const SvgGenImage('assets/icons/information.svg'); @@ -126,9 +144,18 @@ class $AssetsIconsGen { /// File path: assets/icons/trash.svg SvgGenImage get trash => const SvgGenImage('assets/icons/trash.svg'); + /// File path: assets/icons/truck.svg + SvgGenImage get truck => const SvgGenImage('assets/icons/truck.svg'); + + /// File path: assets/icons/truck_fast.svg + SvgGenImage get truckFast => const SvgGenImage('assets/icons/truck_fast.svg'); + /// File path: assets/icons/user.svg SvgGenImage get user => const SvgGenImage('assets/icons/user.svg'); + /// File path: assets/icons/user_raduis.svg + SvgGenImage get userRaduis => const SvgGenImage('assets/icons/user_raduis.svg'); + /// File path: assets/icons/user_square.svg SvgGenImage get userSquare => const SvgGenImage('assets/icons/user_square.svg'); @@ -147,12 +174,18 @@ class $AssetsIconsGen { calendar, calendarSearch, call, + convertCube, + cube, + cubeRotate, + cubeScan, + cubeSearch, diagram, download, edit, excelDownload, filter, gps, + home, information, inside, inspection, @@ -177,7 +210,10 @@ class $AssetsIconsGen { tagLabel, tagUser, trash, + truck, + truckFast, user, + userRaduis, userSquare, virtual, whareHouse, @@ -187,6 +223,9 @@ class $AssetsIconsGen { class $AssetsImagesGen { const $AssetsImagesGen(); + /// File path: assets/images/chicken.png + AssetGenImage get chicken => const AssetGenImage('assets/images/chicken.png'); + /// File path: assets/images/inner_splash.webp AssetGenImage get innerSplash => const AssetGenImage('assets/images/inner_splash.webp'); @@ -197,7 +236,17 @@ class $AssetsImagesGen { AssetGenImage get placeHolder => const AssetGenImage('assets/images/place_holder.png'); /// List of all assets - List get values => [innerSplash, outterSplash, placeHolder]; + List get values => [chicken, innerSplash, outterSplash, placeHolder]; +} + +class $AssetsLogosGen { + const $AssetsLogosGen(); + + /// File path: assets/logos/final_logo.png + AssetGenImage get finalLogo => const AssetGenImage('assets/logos/final_logo.png'); + + /// List of all assets + List get values => [finalLogo]; } class $AssetsVecGen { @@ -224,6 +273,21 @@ class $AssetsVecGen { /// File path: assets/vec/call.svg.vec SvgGenImage get callSvg => const SvgGenImage.vec('assets/vec/call.svg.vec'); + /// File path: assets/vec/convert_cube.svg.vec + SvgGenImage get convertCubeSvg => const SvgGenImage.vec('assets/vec/convert_cube.svg.vec'); + + /// File path: assets/vec/cube.svg.vec + SvgGenImage get cubeSvg => const SvgGenImage.vec('assets/vec/cube.svg.vec'); + + /// File path: assets/vec/cube_rotate.svg.vec + SvgGenImage get cubeRotateSvg => const SvgGenImage.vec('assets/vec/cube_rotate.svg.vec'); + + /// File path: assets/vec/cube_scan.svg.vec + SvgGenImage get cubeScanSvg => const SvgGenImage.vec('assets/vec/cube_scan.svg.vec'); + + /// File path: assets/vec/cube_search.svg.vec + SvgGenImage get cubeSearchSvg => const SvgGenImage.vec('assets/vec/cube_search.svg.vec'); + /// File path: assets/vec/diagram.svg.vec SvgGenImage get diagramSvg => const SvgGenImage.vec('assets/vec/diagram.svg.vec'); @@ -242,9 +306,15 @@ class $AssetsVecGen { /// File path: assets/vec/gps.svg.vec SvgGenImage get gpsSvg => const SvgGenImage.vec('assets/vec/gps.svg.vec'); + /// File path: assets/vec/home.svg.vec + SvgGenImage get homeSvg => const SvgGenImage.vec('assets/vec/home.svg.vec'); + /// File path: assets/vec/information.svg.vec SvgGenImage get informationSvg => const SvgGenImage.vec('assets/vec/information.svg.vec'); + /// File path: assets/vec/inside.svg.vec + SvgGenImage get insideSvg => const SvgGenImage.vec('assets/vec/inside.svg.vec'); + /// File path: assets/vec/inspection.svg.vec SvgGenImage get inspectionSvg => const SvgGenImage.vec('assets/vec/inspection.svg.vec'); @@ -266,6 +336,9 @@ class $AssetsVecGen { /// File path: assets/vec/message_add.svg.vec SvgGenImage get messageAddSvg => const SvgGenImage.vec('assets/vec/message_add.svg.vec'); + /// File path: assets/vec/outside.svg.vec + SvgGenImage get outsideSvg => const SvgGenImage.vec('assets/vec/outside.svg.vec'); + /// File path: assets/vec/pdf_download.svg.vec SvgGenImage get pdfDownloadSvg => const SvgGenImage.vec('assets/vec/pdf_download.svg.vec'); @@ -308,15 +381,27 @@ class $AssetsVecGen { /// File path: assets/vec/trash.svg.vec SvgGenImage get trashSvg => const SvgGenImage.vec('assets/vec/trash.svg.vec'); + /// File path: assets/vec/truck.svg.vec + SvgGenImage get truckSvg => const SvgGenImage.vec('assets/vec/truck.svg.vec'); + + /// File path: assets/vec/truck_fast.svg.vec + SvgGenImage get truckFastSvg => const SvgGenImage.vec('assets/vec/truck_fast.svg.vec'); + /// File path: assets/vec/user.svg.vec SvgGenImage get userSvg => const SvgGenImage.vec('assets/vec/user.svg.vec'); + /// File path: assets/vec/user_raduis.svg.vec + SvgGenImage get userRaduisSvg => const SvgGenImage.vec('assets/vec/user_raduis.svg.vec'); + /// File path: assets/vec/user_square.svg.vec SvgGenImage get userSquareSvg => const SvgGenImage.vec('assets/vec/user_square.svg.vec'); /// File path: assets/vec/virtual.svg.vec SvgGenImage get virtualSvg => const SvgGenImage.vec('assets/vec/virtual.svg.vec'); + /// File path: assets/vec/whare_house.svg.vec + SvgGenImage get whareHouseSvg => const SvgGenImage.vec('assets/vec/whare_house.svg.vec'); + /// List of all assets List get values => [ addSvg, @@ -326,13 +411,20 @@ class $AssetsVecGen { calendarSvg, calendarSearchSvg, callSvg, + convertCubeSvg, + cubeSvg, + cubeRotateSvg, + cubeScanSvg, + cubeSearchSvg, diagramSvg, downloadSvg, editSvg, excelDownloadSvg, filterSvg, gpsSvg, + homeSvg, informationSvg, + insideSvg, inspectionSvg, keySvg, liveStockSvg, @@ -340,6 +432,7 @@ class $AssetsVecGen { mapSvg, mapMarkerSvg, messageAddSvg, + outsideSvg, pdfDownloadSvg, pictureFrameSvg, placeHolderSvg, @@ -354,9 +447,13 @@ class $AssetsVecGen { tagLabelSvg, tagUserSvg, trashSvg, + truckSvg, + truckFastSvg, userSvg, + userRaduisSvg, userSquareSvg, virtualSvg, + whareHouseSvg, ]; } @@ -365,6 +462,7 @@ class Assets { static const $AssetsIconsGen icons = $AssetsIconsGen(); static const $AssetsImagesGen images = $AssetsImagesGen(); + static const $AssetsLogosGen logos = $AssetsLogosGen(); static const $AssetsVecGen vec = $AssetsVecGen(); } diff --git a/packages/core/lib/presentation/common/fonts.gen.dart b/packages/core/lib/presentation/common/fonts.gen.dart index 9e7368f..66ad118 100644 --- a/packages/core/lib/presentation/common/fonts.gen.dart +++ b/packages/core/lib/presentation/common/fonts.gen.dart @@ -10,6 +10,6 @@ class FontFamily { FontFamily._(); - /// Font family: iranyekanregularfanum - static const String iranyekanregularfanum = 'iranyekanregularfanum'; + /// Font family: yekan + static const String yekan = 'yekan'; } diff --git a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart index f2b50b3..3db9ad8 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart @@ -9,21 +9,24 @@ class WaveBottomNavigationItem { } class WaveBottomNavigation extends StatefulWidget { - const WaveBottomNavigation({ - super.key, - required this.items, - required this.onPageChanged, - }); + const WaveBottomNavigation({super.key, this.initPage = 0, required this.items, required this.onPageChanged}); final List items; final Function(int) onPageChanged; + final int initPage; @override State createState() => _WaveBottomNavigationState(); } class _WaveBottomNavigationState extends State { - final PageController _controller = PageController(viewportFraction: 0.3); + late PageController _controller; + + @override + void initState() { + super.initState(); + _controller = PageController(viewportFraction: 0.3, initialPage: widget.initPage); + } @override void dispose() { @@ -85,19 +88,15 @@ class _WaveBottomNavigationState extends State { final WaveBottomNavigationItem item = widget.items[index]; return GestureDetector( onTap: () { - _controller.animateToPage( - index, - duration: Duration(milliseconds: 500), - curve: Curves.easeInOut, - ); + _controller.animateToPage(index, duration: Duration(milliseconds: 500), curve: Curves.easeInOut); }, child: Center( child: AnimatedBuilder( animation: _controller, builder: (context, child) { double value = 0.0; - final scale = _calculateScale(_controller.page ?? 0, index); - value = index - (_controller.page ?? 0); + final scale = _calculateScale(_controller.page ?? _controller.initialPage.toDouble() ?? 0.0, index); + value = index - (_controller.page ?? _controller.initialPage.toDouble() ?? 0.0); value = (value).clamp(-1, 1); double offset = value * 30; if (value.abs() < 0.2 || value.abs() > 0.2) { @@ -110,10 +109,7 @@ class _WaveBottomNavigationState extends State { offset: Offset(0, offset), child: Column( children: [ - Tooltip( - message: item.title, - child: item.icon - ), + Tooltip(message: item.title, child: item.icon), /* Visibility( visible: (_controller.page ?? 0) == index, From 964f94cb327ddb99fe317920a786cb20c7828180 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 8 Jun 2025 11:46:13 +0330 Subject: [PATCH 113/256] chore : add new icons --- assets/icons/chicken.svg | 2 +- assets/vec/chicken.svg.vec | Bin 0 -> 1159 bytes assets/vec/cube_scan.svg.vec | Bin 0 -> 1759 bytes assets/vec/home.svg.vec | Bin 0 -> 447 bytes assets/vec/user_raduis.svg.vec | Bin 0 -> 395 bytes .../core/lib/presentation/common/assets.gen.dart | 8 ++++++++ 6 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 assets/vec/chicken.svg.vec create mode 100644 assets/vec/cube_scan.svg.vec create mode 100644 assets/vec/home.svg.vec create mode 100644 assets/vec/user_raduis.svg.vec diff --git a/assets/icons/chicken.svg b/assets/icons/chicken.svg index 1352445..dbf0757 100644 --- a/assets/icons/chicken.svg +++ b/assets/icons/chicken.svg @@ -4,5 +4,5 @@ - + diff --git a/assets/vec/chicken.svg.vec b/assets/vec/chicken.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..3424ea7cfb914e10572db60b8b6eb4cb721deb89 GIT binary patch literal 1159 zcmX|BYfw~W7(VALpa|3eO%5y@LCF9Lsl*7% za1V&lY-cve2*?ZRC<3b_7$_LpGC(k`tz?)oVBvyz+5;WlKhN|2`JT&s^X~P|V^}YS z$s>koBPYQ$GKLWZCtO)T#c!u)%Ul0&5GlEK0*g+~0+5a*Cg-aQ@2E=VKe zIXMlNRgy8sl0qlys73oHela$4Fw@!~PEI-@Dw@fq^p-$n!VQ+PJJl~zqnBGtH+ z4*xxg&&OlP_QOZ0M@Z9+ia_lc)lNQou}ab-gzjODxd^F7zk$DfKJ$T^g;Rju-j38@-*b=^sGKC1+*KqJ`YDWgyKF@;PA(_I3sBc5mmO zhM%I@_!_>mN==IKZhq;d8q&3Kh`L-){)0eiS0hO}a>kso5QW9>AafKM6P_!;>98-E zjk2^fEQo#;o@4*=5SmOG#RP@XzJdFA8TSq~u58CzA(#e-TH)-!o`z0e#mPh;ir9M- zcS}~&xKW4DR8Pt(d4y|G9`sho46K^oAnARDi>M|DE~X120yht)`yy^;^I*=1N9I3) C+{wED literal 0 HcmV?d00001 diff --git a/assets/vec/cube_scan.svg.vec b/assets/vec/cube_scan.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..4c5c41d1cf7b773dfd69b589ac6ba29eca441c22 GIT binary patch literal 1759 zcmZ8i&r4KM6h3dB13^XNDjSg&L9`HJW)>pRyqjAI`hk%MRyuEpp>QFjBs$Sh(n5$L zbO;9_GL&qX_b0e<@m_%mZdwF_%Wzej@b#T@-kW*$*L={oK-MLqL&K{l zTzeAQL}Azy;@;I*8%Af$t!05IN@sUH7P<_I5$~(l%`L73BQwg6l3iypm_ypMAc@R`!j= z0Ev(%$n)>&($?q80OM z^HDC!?Km&xE`3|ts8((5R7=&H> zOxx#=7us=O)>3R}&VA*5p|2pnWqnKkzoCp}(`kMaqKN8Z=lOuB9?Y7( z{2%8beK6_#1@qqf2)t;%xu47q^$GTua*;hC{(4X_9A6KvVa=NUQW-dH%C$$>PXQkz zcT%uiD+{LcCGn^8;}X9^XC=Q}>jDo1MVyxep0>o2Ds zOhu?XGFC^-6>Q}Jq++gt-w6$eq3bYk2ESAHO>KD&`w~_a`x5T@m0&Kn5#c6q0{7fN z%oy&r340WK4|o@~JnXq9+qVRXZXk~B>&WBy6Np)b?=S9k1^0C5jk#tIzDVxU&}YdFv+I)U&#%e6{(KcU zV`BlMU_Y1+S`%*Lr zn+u{r*xW$;D&iXOuNXh{3~Rv18Zfd3ietu~Zz6ug#5^wd@@oylUW@n-RBuYbR_IVj G3;YAGXdw^) literal 0 HcmV?d00001 diff --git a/assets/vec/home.svg.vec b/assets/vec/home.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..79187964fa4211d1be94e45be80a02e0ed71d333 GIT binary patch literal 447 zcmYe&?O~;wm>3zEm>9tj z$YcicL0sktpwwmGd`ISl6%HO3IvtaA6C8f;TIN{vFUewQQrhdBrGOLr{pXH|i2T=J?%uio?g`RL6puiyYX`g*h&pz15*=si)(Q>{AYB ztsNX0N-jHG%C~WZ`Hzipfg=OMF2^6iGr%+(<0QvVK?fW`Gy}s4DE-0F8pyx3=DVX# z2uR&Opg2h1KgTs|mph*M|JU&n!#c;MKzTOCbwKeCP#UCvougXt0kAp~pgl1A4CFu& L@c%!M0!0Y`s0pKC literal 0 HcmV?d00001 diff --git a/assets/vec/user_raduis.svg.vec b/assets/vec/user_raduis.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..06d5bdab653619b710def96abf83fb4eff454067 GIT binary patch literal 395 zcmXwzF-QVo6vyA)5p=FzE!GWA3I)-SLs{QH8XD8t7BL}$v^6K86DcSNp(`+mbBvmz z8>9JV&qc^hu-VbC?|apQ$M5@p|M&R6@@kumEYSyaFG*Dvk(4QeXr5G=rfHa_mDX<> z3!;JQv6yBqM8jEBTcosLdXwWn-GcUsT1pRuH}Md<3vgaeP_1sD815nw=kRb3W*i9R z<&Z7yFdNP`|4%ax&+9zB|DT^CgKQP7Z_{P1Xh9SQZOo3!h=U4FgFSrpQ_RiJq0s*o z_f6c%8fNd0LasNNcH)Ye9Cg@_WEThZp;!)kxOV5Tm48O*CXGnGs(iuh)eo8bqjUCk ruAVQ3w const SvgGenImage('assets/icons/call.svg'); + /// File path: assets/icons/chicken.svg + SvgGenImage get chicken => const SvgGenImage('assets/icons/chicken.svg'); + /// File path: assets/icons/convert_cube.svg SvgGenImage get convertCube => const SvgGenImage('assets/icons/convert_cube.svg'); @@ -174,6 +177,7 @@ class $AssetsIconsGen { calendar, calendarSearch, call, + chicken, convertCube, cube, cubeRotate, @@ -273,6 +277,9 @@ class $AssetsVecGen { /// File path: assets/vec/call.svg.vec SvgGenImage get callSvg => const SvgGenImage.vec('assets/vec/call.svg.vec'); + /// File path: assets/vec/chicken.svg.vec + SvgGenImage get chickenSvg => const SvgGenImage.vec('assets/vec/chicken.svg.vec'); + /// File path: assets/vec/convert_cube.svg.vec SvgGenImage get convertCubeSvg => const SvgGenImage.vec('assets/vec/convert_cube.svg.vec'); @@ -411,6 +418,7 @@ class $AssetsVecGen { calendarSvg, calendarSearchSvg, callSvg, + chickenSvg, convertCubeSvg, cubeSvg, cubeRotateSvg, From 50be255f42f395cfc8eaabd0ec4efd49adbab1ce Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 15 Jun 2025 09:08:09 +0330 Subject: [PATCH 114/256] feat : app bar in app and inner state icon --- assets/icons/3d_cube_square.svg | 4 +++ assets/vec/3d_cube_square.svg.vec | Bin 0 -> 864 bytes .../lib/presentation/pages/root/view.dart | 3 +- .../lib/presentation/common/assets.gen.dart | 8 +++++ .../widget/app_bar/r_app_bar.dart | 28 ++++++++++++++---- 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 assets/icons/3d_cube_square.svg create mode 100644 assets/vec/3d_cube_square.svg.vec diff --git a/assets/icons/3d_cube_square.svg b/assets/icons/3d_cube_square.svg new file mode 100644 index 0000000..4eb620a --- /dev/null +++ b/assets/icons/3d_cube_square.svg @@ -0,0 +1,4 @@ + + + diff --git a/assets/vec/3d_cube_square.svg.vec b/assets/vec/3d_cube_square.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..a5b5704531b0bdf8fa7bfa39ccc22ecc7a33867e GIT binary patch literal 864 zcmXw&OK1~e5XZl45F{dA;z24~J&0Y?O6h8~khI@W$f{8!+aMxQ!9!0T5`q`SLa1L| zAMFM_)k8rNJg$$^QbCH^i)6jYq8ABP5Yu>(#>XYj%r*&|UuNg^&HQ(-jW{A^2(boq z?eF0yE<~?4AcPphOT@J38yA|!f9WR{$NPOtLl;`xW_*pZ#GtCe&I5a;YX6nQMoBTz zB_G)}NnD-Pu&avSz?C4eGd%2OEqpiuG?HkPT;5xGso?t#rm=HAI$yfeS%n#&MV;JZ8D7D81_W2@r zmko^jE*+IZ4uhjC=nfr&+g=VlYXU0a3^Ua&GW&B7-8aXfV5h+}f5|K10M7G6{weLl zKHucQAjzz#JBc63hVcQbhG`3KspA^B_Lht+@v!x(mk4E KRL3V9-=qH { backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'رصدطیور', + iconTitle: Assets.vec.chickenSvg.path, titleTextStyle:AppFonts.yekan16Bold.copyWith(color: Colors.white), centerTitle: true, hasBack: false, @@ -107,7 +108,7 @@ class RootPage extends GetView { child: _informationLabelCard( title: 'داخل استان', description: '2،225،256', - iconPath: Assets.vec.cubeSearchSvg.path, + iconPath: Assets.vec.a3dCubeSquareSvg.path, iconColor: const Color(0xFF6C5D60), bgDescriptionColor: const Color(0xFFEDDCE0), bgLabelColor: const Color(0xFFDDC0C7), diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 724b021..9a2f111 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -15,6 +15,9 @@ import 'package:vector_graphics/vector_graphics.dart' as _vg; class $AssetsIconsGen { const $AssetsIconsGen(); + /// File path: assets/icons/3d_cube_square.svg + SvgGenImage get a3dCubeSquare => const SvgGenImage('assets/icons/3d_cube_square.svg'); + /// File path: assets/icons/add.svg SvgGenImage get add => const SvgGenImage('assets/icons/add.svg'); @@ -170,6 +173,7 @@ class $AssetsIconsGen { /// List of all assets List get values => [ + a3dCubeSquare, add, arrowLeft, arrowRight, @@ -256,6 +260,9 @@ class $AssetsLogosGen { class $AssetsVecGen { const $AssetsVecGen(); + /// File path: assets/vec/3d_cube_square.svg.vec + SvgGenImage get a3dCubeSquareSvg => const SvgGenImage.vec('assets/vec/3d_cube_square.svg.vec'); + /// File path: assets/vec/add.svg.vec SvgGenImage get addSvg => const SvgGenImage.vec('assets/vec/add.svg.vec'); @@ -411,6 +418,7 @@ class $AssetsVecGen { /// List of all assets List get values => [ + a3dCubeSquareSvg, addSvg, arrowLeftSvg, arrowRightSvg, diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index 3871758..c9e12bb 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -1,11 +1,13 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/common/app_fonts.dart'; class RAppBar extends StatelessWidget implements PreferredSizeWidget { final String title; + final String? iconTitle; final Color backgroundColor; final Color iconColor; final bool hasBack; @@ -20,6 +22,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { const RAppBar({ super.key, required this.title, + this.iconTitle, this.backgroundColor = AppColor.blueNormal, this.iconColor = Colors.white, this.titleTextStyle, @@ -42,13 +45,26 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { scrolledUnderElevation: 0, centerTitle: centerTitle, - titleTextStyle: - titleTextStyle ?? AppFonts.yekan16.copyWith(color: Colors.white), - title: Text(title), + titleTextStyle: titleTextStyle ?? AppFonts.yekan16.copyWith(color: Colors.white), + title: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [Text(title), + if (iconTitle != null)...{ + const SizedBox(width: 8) + }, + if (iconTitle != null)...{ + SvgGenImage.vec(iconTitle!).svg( + width: 24, + height: 24, + + ) + } + + + ]), leadingWidth: leadingWidth?.toDouble(), - leading: leading != null - ? Padding(padding: const EdgeInsets.only(right: 16), child: leading) - : null, + leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 16), child: leading) : null, titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, From e7bf4c361b4d4a47f0eeac77f13628227b6a70b4 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 15 Jun 2025 09:10:34 +0330 Subject: [PATCH 115/256] fix : intent padding --- packages/chicken/lib/presentation/pages/root/view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 6d87aa9..716bb41 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -187,7 +187,7 @@ class RootPage extends GetView { height: 70, child: ListView( scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 8), + padding: EdgeInsets.symmetric(horizontal: 12), physics: BouncingScrollPhysics(), children: [ widelyUsed( From c8c6002d79e635c467809dc59f3748f3194628e1 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 15 Jun 2025 09:23:09 +0330 Subject: [PATCH 116/256] fix : page name and routes and controller --- .../lib/presentation/pages/root/view.dart | 4 ++-- .../logic.dart | 2 +- .../view.dart | 6 +++--- .../logic.dart | 2 +- .../view.dart | 4 ++-- .../lib/presentation/routes/pages.dart | 20 +++++++++---------- .../lib/presentation/routes/routes.dart | 4 ++-- 7 files changed, 21 insertions(+), 21 deletions(-) rename packages/chicken/lib/presentation/pages/{sales_within_province => sales_in_province}/logic.dart (99%) rename packages/chicken/lib/presentation/pages/{sales_within_province => sales_in_province}/view.dart (99%) rename packages/chicken/lib/presentation/pages/{sales_with_out_province => sales_out_of_province}/logic.dart (98%) rename packages/chicken/lib/presentation/pages/{sales_with_out_province => sales_out_of_province}/view.dart (99%) diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 716bb41..a3bc734 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -550,14 +550,14 @@ class RootPage extends GetView { title: 'فروش داخل استان', iconPath: Assets.icons.inside.path, onTap: () { - Get.toNamed(ChickenRoutes.salesWithinProvince); + Get.toNamed(ChickenRoutes.salesInProvince); }, ), cardWidget( title: 'فروش خارج استان', iconPath: Assets.icons.outside.path, onTap: () { - Get.toNamed(ChickenRoutes.salesWithOutProvince); + Get.toNamed(ChickenRoutes.salesOutOfProvince); }, ), ], diff --git a/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart similarity index 99% rename from packages/chicken/lib/presentation/pages/sales_within_province/logic.dart rename to packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 7d35e2e..d9d71cd 100644 --- a/packages/chicken/lib/presentation/pages/sales_within_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -9,7 +9,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; -class SalesWithinProvinceLogic extends GetxController { +class SalesInProvinceLogic extends GetxController { var rootLogic = Get.find(); Rxn allocatedMadeModel = Rxn(); RxList rolesProductsModel = RxList(); diff --git a/packages/chicken/lib/presentation/pages/sales_within_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart similarity index 99% rename from packages/chicken/lib/presentation/pages/sales_within_province/view.dart rename to packages/chicken/lib/presentation/pages/sales_in_province/view.dart index fdd57df..67485c6 100644 --- a/packages/chicken/lib/presentation/pages/sales_within_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -8,8 +8,8 @@ import 'package:rasadyar_core/core.dart'; import 'logic.dart'; -class SalesWithinProvincePage extends GetView { - SalesWithinProvincePage({super.key}); +class SalesInProvincePage extends GetView { + SalesInProvincePage({super.key}); @override Widget build(BuildContext context) { @@ -559,7 +559,7 @@ class SalesWithinProvincePage extends GetView { } Widget productDropDown() { - return GetBuilder( + return GetBuilder( builder: (controller) { return DropdownButtonFormField( value: controller.selectedProductModel.value, diff --git a/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart similarity index 98% rename from packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart rename to packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 499dcb9..3f6b534 100644 --- a/packages/chicken/lib/presentation/pages/sales_with_out_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -8,7 +8,7 @@ import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; -class SalesWithOutProvinceLogic extends GetxController { +class SalesOutOfProvinceLogic extends GetxController { var rootLogic = Get.find(); Rxn allocatedMadeModel = Rxn(); RxList rolesProductsModel = RxList(); diff --git a/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart similarity index 99% rename from packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart rename to packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 832e3fb..41a2e85 100644 --- a/packages/chicken/lib/presentation/pages/sales_with_out_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -5,8 +5,8 @@ import 'package:rasadyar_core/core.dart'; import 'logic.dart'; -class SalesWithOutProvincePage extends GetView { - SalesWithOutProvincePage({super.key}); +class SalesOutOfProvincePage extends GetView { + SalesOutOfProvincePage({super.key}); @override Widget build(BuildContext context) { diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 1e794c0..8386c1c 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -3,10 +3,10 @@ import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/logic import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/view.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_with_out_province/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_with_out_province/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_within_province/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_within_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_in_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; @@ -33,20 +33,20 @@ sealed class ChickenPages { }), ), GetPage( - name: ChickenRoutes.salesWithinProvince, - page: () => SalesWithinProvincePage(), + name: ChickenRoutes.salesInProvince, + page: () => SalesInProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(SalesWithinProvinceLogic()); + Get.put(SalesInProvinceLogic()); Get.put(RootLogic()); }), ), GetPage( - name: ChickenRoutes.salesWithOutProvince, - page: () => SalesWithOutProvincePage(), + name: ChickenRoutes.salesOutOfProvince, + page: () => SalesOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(SalesWithOutProvinceLogic()); + Get.put(SalesOutOfProvinceLogic()); Get.put(RootLogic()); }), ), diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index 7f47386..7209a86 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -4,7 +4,7 @@ sealed class ChickenRoutes { static const init = '$_base/init'; static const enteringTheWarehouse = '$_base/enteringTheWarehouse'; - static const salesWithinProvince = '$_base/SalesWithinProvincePage'; - static const salesWithOutProvince = '$_base/SalesWithOutProvincePage'; + static const salesInProvince = '$_base/SalesInProvincePage'; + static const salesOutOfProvince = '$_base/SalesOutOfProvincePage'; } From a8935454032a42ab4827768857d3ad65e4515c52 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 15 Jun 2025 09:48:52 +0330 Subject: [PATCH 117/256] chore : home page separation --- .../lib/presentation/pages/home/logic.dart | 17 + .../lib/presentation/pages/home/view.dart | 703 ++++++++++++++++++ .../lib/presentation/pages/root/logic.dart | 41 +- .../lib/presentation/pages/root/view.dart | 614 ++++----------- .../pages/sales_out_of_province/view.dart | 16 +- .../lib/presentation/routes/pages.dart | 15 + .../lib/presentation/routes/routes.dart | 1 + 7 files changed, 896 insertions(+), 511 deletions(-) create mode 100644 packages/chicken/lib/presentation/pages/home/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/home/view.dart diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart new file mode 100644 index 0000000..b8de756 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -0,0 +1,17 @@ + + +import 'package:rasadyar_core/core.dart'; + +class HomeLogic extends GetxController { + @override + void onReady() { + + super.onReady(); + } + + @override + void onClose() { + + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart new file mode 100644 index 0000000..f455b43 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -0,0 +1,703 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class HomePage extends GetView { + const HomePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.bgLight, + appBar: RAppBar( + title: 'رصدطیور', + iconTitle: Assets.vec.chickenSvg.path, + titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: false, + leading: Row( + children: [Text('مباشر', style: AppFonts.yekan16Bold.copyWith(color: Colors.white))], + ), + ), + body: Column( + spacing: 8, + children: [ + Card( + margin: EdgeInsetsGeometry.all(6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), + ), + + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage(image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), + shape: RoundedRectangleBorder( + side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ), + Spacer(), + AnimatedRotation( + turns: 180, + duration: Duration(milliseconds: 3000), + child: Icon(CupertinoIcons.chevron_up, size: 18), + ), + ], + ), + SizedBox(height: 8), + _todayShipmentWidget(), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'مانده انبار', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: const Color(0xFF426060), + bgDescriptionColor: const Color(0xFFC7DFE0), + bgLabelColor: const Color(0xFFA5D1D2), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'توزیع شده', + description: '2،225،256', + iconPath: Assets.vec.cubeRotateSvg.path, + iconColor: Color(0xFF5C4D64), + bgLabelColor: Color(0xFFC8B8D1), + bgDescriptionColor: Color(0xFFDAD4DD), + ), + ), + ], + ), + ), + + Row( + children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'داخل استان', + description: '2،225،256', + iconPath: Assets.vec.a3dCubeSquareSvg.path, + iconColor: const Color(0xFF6C5D60), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFDDC0C7), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'خارج استان', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: Color(0xFF2D5FFF), + bgLabelColor: const Color(0xFFAFCBFF), + bgDescriptionColor: const Color(0xFFCEDFFF), + ), + ), + ], + ), + ), + + Row( + children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Expanded( + child: _informationIconCard( + title: 'توزیع داخل استان', + description: '2،225،256', + iconPath: Assets.vec.truckSvg.path, + iconColor: const Color.fromRGBO(85, 97, 93, 1), + bgDescriptionColor: const Color(0xFFE6FAF5), + bgLabelColor: const Color(0xFFB0EFDF), + ), + ), + Expanded( + child: _informationIconCard( + title: 'توزیع خارج استان', + description: '2،225،256', + iconPath: Assets.vec.truckFastSvg.path, + iconColor: Color(0xFF647379), + bgDescriptionColor: const Color(0xFFEAEFFF), + bgLabelColor: const Color(0xFFD4DEFF), + ), + ), + Expanded( + child: _informationIconCard( + title: 'قطعه بندی', + description: '2،225،256', + iconPath: Assets.vec.convertCubeSvg.path, + iconColor: const Color(0xFF6F6164), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFE0BCC5), + ), + ), + ], + ), + ), + ], + ), + ), + ), + + Padding( + padding: EdgeInsetsGeometry.all(6), + child: Row( + children: [Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + ), + + SizedBox( + height: 70, + child: ListView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 12), + physics: BouncingScrollPhysics(), + children: [ + widelyUsed( + title: 'خرید خارج استان', + iconPath: Assets.vec.cubeSearchSvg.path, + onTap: () { + // Get.toNamed(ChickenRoutes.enteringTheWarehouse); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'عمده فروشی', + iconPath: Assets.vec.truckFastSvg.path, + onTap: () { + //Get.toNamed(ChickenRoutes.salesWithinProvince); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'ثبت قطعه بندی', + iconPath: Assets.vec.convertCubeSvg.path, + onTap: () { + // Get.toNamed(ChickenRoutes.salesWithOutProvince); + }, + ), + SizedBox(width: 15), + addWidelyUsed(onTap: () {}), + ], + ), + ), + ], + ), + ); + } + Container _todayShipmentWidget() { + return Container( + height: 70, + width: Get.width / 2, + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [const Color(0xFFEAEFFF), Colors.white], + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Assets.icons.cubeScan.svg(width: 30, height: 30), + Text( + 'بارهای امروز', + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + '2،225،256', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.textColor), + ), + Text( + 'کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + ], + ), + ); + } + + Container _informationLabelCard({ + required String title, + required String description, + String unit = 'کیلوگرم', + required String iconPath, + required Color iconColor, + required Color bgDescriptionColor, + required Color bgLabelColor, + }) { + return Container( + height: 82, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + // Left side with icon and title + Expanded( + child: Container( + height: 82, + decoration: BoxDecoration( + color: bgLabelColor, + borderRadius: BorderRadius.only(topRight: Radius.circular(8), bottomRight: Radius.circular(8)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + // Right side with description and unit + Expanded( + child: Container( + decoration: BoxDecoration( + color: bgDescriptionColor, + borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + ], + ), + ); + } + + Container _informationIconCard({ + required String title, + required String description, + String unit = 'کیلوگرم', + required String iconPath, + required Color iconColor, + required Color bgDescriptionColor, + required Color bgLabelColor, + }) { + return Container( + height: 110, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Stack( + alignment: Alignment.topCenter, + children: [ + Positioned( + bottom: 0, + right: 0, + left: 0, + child: Container( + height: 91, + decoration: BoxDecoration( + color: bgDescriptionColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.25, color: const Color(0xFFB4B4B4)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + Positioned( + top: 0, + child: Container( + width: 32, + height: 32, + decoration: ShapeDecoration( + color: bgLabelColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + side: BorderSide(width: 0.25, color: const Color(0xFFD5D5D5)), + ), + ), + child: Center( + child: SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + ), + ), + ), + ], + ), + ); + } + + Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFBECDFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + ), + Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + ], + ); + } + + Widget addWidelyUsed({required VoidCallback onTap}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFD9F7F0), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Assets.vec.messageAddSvg.svg( + width: 40, + height: 40, + colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), + ], + ); + } + +/* Column oldPage() { + return Column( + children: [ + inventoryWidget(), + ObxValue((data) => broadcastInformationWidget(data.value), controller.killHouseDistributionInfo), + SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + cardWidget( + title: 'ورود به انبار', + iconPath: Assets.icons.whareHouse.path, + onTap: () { + Get.toNamed(ChickenRoutes.enteringTheWarehouse); + }, + ), + cardWidget( + title: 'فروش داخل استان', + iconPath: Assets.icons.inside.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesInProvince); + }, + ), + cardWidget( + title: 'فروش خارج استان', + iconPath: Assets.icons.outside.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesOutOfProvince); + }, + ), + ], + ), + ), + ], + ); + } + + Widget inventoryWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text('موجودی انبار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + ), + SizedBox(height: 4), + ObxValue( + (data) => data.isEmpty + ? Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 80, + padding: EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.inventoryList.length, + separatorBuilder: (context, index) => const SizedBox(height: 8), + itemBuilder: (context, index) { + return ObxValue((expand) { + return GestureDetector( + onTap: () { + controller.toggleExpanded(index); + }, + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + onEnd: () { + controller.inventoryExpandedList[index] = !controller.inventoryExpandedList[index]!; + }, + margin: const EdgeInsets.symmetric(vertical: 2), + padding: EdgeInsets.all(6), + curve: Curves.easeInOut, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + duration: const Duration(seconds: 1), + height: expand.keys.contains(index) ? 250 : 80, + child: inventoryItem( + isExpanded: expand.keys.contains(index) && expand[index]!, + index: index, + model: controller.inventoryList[index], + ), + ), + ); + }, controller.inventoryExpandedList); + }, + ), + controller.inventoryList, + ), + ], + ), + ); + }*/ + + Widget inventoryItem({required bool isExpanded, required int index, required InventoryModel model}) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + buildRow('نام محصول', model.name ?? ''), + Visibility( + visible: isExpanded, + child: Column( + spacing: 8, + children: [ + buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), + buildRow('وزن خریدهای آزاد داخل استان (کیلوگرم)', model.receiveFreeCarcassesWeight.toString()), + buildRow('وزن خریدهای خارج استان (کیلوگرم)', model.freeBuyingCarcassesWeight.toString()), + buildRow('کل ورودی به انبار (کیلوگرم)', model.totalFreeBarsCarcassesWeight.toString()), + buildRow('کل فروش (کیلوگرم)', model.realAllocatedWeight.toString()), + buildRow('مانده انبار (کیلوگرم)', model.totalRemainWeight.toString()), + ], + ), + ), + ], + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + Flexible( + flex: 1, + child: Text( + value, + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ], + ), + ); + } + + Widget broadcastInformationWidget(KillHouseDistributionInfo? model) { + return Container( + height: 140, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: model != null + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Text( + 'اطلاعات ارسالی', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + const SizedBox(height: 12), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + ], + ) + : const Center(child: CircularProgressIndicator()), + ); + } + + Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { + return Container( + width: Get.width / 4, + height: 130, + child: GestureDetector( + onTap: onTap, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 1, color: AppColor.blueNormal), + ), + child: Padding( + padding: EdgeInsets.all(16), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgGenImage(iconPath).svg(width: 50, height: 50), + SizedBox(height: 4), + Text( + title, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 65bb286..3d9a7b0 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart' show Text, EdgeInsets, Colors; +import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; @@ -7,11 +8,22 @@ import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model. import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; +import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_core/core.dart'; enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { + RxInt currentPage = 2.obs; + List pages = [ + Container(color: Colors.red), + SalesOutOfProvincePage(), + HomePage(), + Container(color: Colors.blue), + Container(color: Colors.amber), + ]; + RxList errorLocationType = RxList(); RxMap inventoryExpandedList = RxMap(); var tokenService = Get.find(); @@ -20,8 +32,7 @@ class RootLogic extends GetxController { RxInt count = 5.obs; RxList inventoryList = RxList(); - Rxn killHouseDistributionInfo = - Rxn(); + Rxn killHouseDistributionInfo = Rxn(); @override void onInit() { @@ -43,9 +54,7 @@ class RootLogic extends GetxController { Future getInventory() async { await safeCall?>( - call: () async => await chickenRepository.getInventory( - token: tokenService.accessToken.value!, - ), + call: () async => await chickenRepository.getInventory(token: tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { iLog(result); @@ -71,9 +80,7 @@ class RootLogic extends GetxController { Future getKillHouseDistributionInfo() async { await safeCall( - call: () async => await chickenRepository.getIKillHouseDistributionInfo( - token: tokenService.accessToken.value!, - ), + call: () async => await chickenRepository.getIKillHouseDistributionInfo(token: tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { iLog(result); @@ -86,23 +93,15 @@ class RootLogic extends GetxController { } void _handleGeneric(DioException error) { - Get.showSnackbar( - _errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید'), - ); + Get.showSnackbar(_errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید')); tokenService.deleteTokens(); Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); } GetSnackBar _errorSnackBar(String message) { return GetSnackBar( - titleText: Text( - 'خطا', - style: AppFonts.yekan14.copyWith(color: Colors.white), - ), - messageText: Text( - message, - style: AppFonts.yekan12.copyWith(color: Colors.white), - ), + titleText: Text('خطا', style: AppFonts.yekan14.copyWith(color: Colors.white)), + messageText: Text(message, style: AppFonts.yekan12.copyWith(color: Colors.white)), backgroundColor: AppColor.error, margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), borderRadius: 12, @@ -110,4 +109,8 @@ class RootLogic extends GetxController { snackPosition: SnackPosition.TOP, ); } + + void changePage(int index) { + currentPage.value = index; + } } diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index a3bc734..e1e1c93 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -10,265 +10,63 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColor.bgLight, - appBar: RAppBar( - title: 'رصدطیور', - iconTitle: Assets.vec.chickenSvg.path, - titleTextStyle:AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: false, - leading: Row(children: [Text('مباشر', style: AppFonts.yekan16Bold.copyWith(color: Colors.white))]), - ), - body: Column( - spacing: 8, - children: [ - Card( - margin: EdgeInsetsGeometry.all(6), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), - ), - - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - spacing: 8, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - image: DecorationImage(image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), - shape: RoundedRectangleBorder( - side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), - borderRadius: BorderRadius.circular(4), - ), - ), - ), - Text( - 'مرغ گرم', - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), - ), - Spacer(), - AnimatedRotation( - turns: 180, - duration: Duration(milliseconds: 3000), - child: Icon(CupertinoIcons.chevron_up, size: 18), - ), - ], - ), - SizedBox(height: 8), - _todayShipmentWidget(), - - Padding( - padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), - child: Row( - spacing: 8, - children: [ - Expanded( - child: _informationLabelCard( - title: 'مانده انبار', - description: '2،225،256', - iconPath: Assets.vec.cubeSearchSvg.path, - iconColor: const Color(0xFF426060), - bgDescriptionColor: const Color(0xFFC7DFE0), - bgLabelColor: const Color(0xFFA5D1D2), - ), - ), - Expanded( - child: _informationLabelCard( - title: 'توزیع شده', - description: '2،225،256', - iconPath: Assets.vec.cubeRotateSvg.path, - iconColor: Color(0xFF5C4D64), - bgLabelColor: Color(0xFFC8B8D1), - bgDescriptionColor: Color(0xFFDAD4DD), - ), - ), - ], - ), - ), - - Row( - children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - - Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), - child: Row( - spacing: 8, - children: [ - Expanded( - child: _informationLabelCard( - title: 'داخل استان', - description: '2،225،256', - iconPath: Assets.vec.a3dCubeSquareSvg.path, - iconColor: const Color(0xFF6C5D60), - bgDescriptionColor: const Color(0xFFEDDCE0), - bgLabelColor: const Color(0xFFDDC0C7), - ), - ), - Expanded( - child: _informationLabelCard( - title: 'خارج استان', - description: '2،225،256', - iconPath: Assets.vec.cubeSearchSvg.path, - iconColor: Color(0xFF2D5FFF), - bgLabelColor: const Color(0xFFAFCBFF), - bgDescriptionColor: const Color(0xFFCEDFFF), - ), - ), - ], - ), - ), - - Row( - children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - - Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Expanded( - child: _informationIconCard( - title: 'توزیع داخل استان', - description: '2،225،256', - iconPath: Assets.vec.truckSvg.path, - iconColor: const Color.fromRGBO(85, 97, 93, 1), - bgDescriptionColor: const Color(0xFFE6FAF5), - bgLabelColor: const Color(0xFFB0EFDF), - ), - ), - Expanded( - child: _informationIconCard( - title: 'توزیع خارج استان', - description: '2،225،256', - iconPath: Assets.vec.truckFastSvg.path, - iconColor: Color(0xFF647379), - bgDescriptionColor: const Color(0xFFEAEFFF), - bgLabelColor: const Color(0xFFD4DEFF), - ), - ), - Expanded( - child: _informationIconCard( - title: 'قطعه بندی', - description: '2،225،256', - iconPath: Assets.vec.convertCubeSvg.path, - iconColor: const Color(0xFF6F6164), - bgDescriptionColor: const Color(0xFFEDDCE0), - bgLabelColor: const Color(0xFFE0BCC5), - ), - ), - ], - ), - ), - ], + return ObxValue((data) { + return Scaffold( + backgroundColor: AppColor.bgLight, + body: IndexedStack( + children: controller.pages, + index: data.value, + ), + bottomNavigationBar: WaveBottomNavigation( + initPage: controller.currentPage.value, + items: [ + WaveBottomNavigationItem( + title: 'بارها', + icon: Assets.vec.truckFastSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), ), ), - ), - - Padding( - padding: EdgeInsetsGeometry.all(6), - child: Row( - children: [Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + WaveBottomNavigationItem( + title: 'خارج استان', + icon: Assets.vec.cubeSearchSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), - ), - - SizedBox( - height: 70, - child: ListView( - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 12), - physics: BouncingScrollPhysics(), - children: [ - widelyUsed( - title: 'خرید خارج استان', - iconPath: Assets.vec.cubeSearchSvg.path, - onTap: () { - // Get.toNamed(ChickenRoutes.enteringTheWarehouse); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'عمده فروشی', - iconPath: Assets.vec.truckFastSvg.path, - onTap: () { - //Get.toNamed(ChickenRoutes.salesWithinProvince); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'ثبت قطعه بندی', - iconPath: Assets.vec.convertCubeSvg.path, - onTap: () { - // Get.toNamed(ChickenRoutes.salesWithOutProvince); - }, - ), - SizedBox(width: 15), - addWidelyUsed(onTap: () {}), - ], + WaveBottomNavigationItem( + title: 'خانه', + icon: Assets.vec.homeSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), - ), - ], - ), - bottomNavigationBar: WaveBottomNavigation( - initPage: 2, - items: [ - WaveBottomNavigationItem( - title: 'بارها', - icon: Assets.vec.truckFastSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + WaveBottomNavigationItem( + title: 'قطعه بندی', + icon: Assets.vec.convertCubeSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), - ), - WaveBottomNavigationItem( - title: 'خارج استان', - icon: Assets.vec.cubeSearchSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + WaveBottomNavigationItem( + title: 'پروفایل', + icon: Assets.vec.userSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), - ), - WaveBottomNavigationItem( - title: 'خانه', - icon: Assets.vec.homeSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'قطعه بندی', - icon: Assets.vec.convertCubeSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'پروفایل', - icon: Assets.vec.userSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - ], - onPageChanged: (index) { - // controller.changePage(index); - }, - ), - ); + ], + onPageChanged: (index) { + controller.changePage(index); + }, + ), + ); + },controller.currentPage); } Container _todayShipmentWidget() { @@ -579,54 +377,55 @@ class RootPage extends GetView { ), SizedBox(height: 4), ObxValue( - (data) => data.isEmpty + (data) => + data.isEmpty ? Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 80, - padding: EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ) + margin: const EdgeInsets.symmetric(vertical: 2), + height: 80, + padding: EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ) : ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: controller.inventoryList.length, - separatorBuilder: (context, index) => const SizedBox(height: 8), - itemBuilder: (context, index) { - return ObxValue((expand) { - return GestureDetector( - onTap: () { - controller.toggleExpanded(index); - }, - behavior: HitTestBehavior.opaque, - child: AnimatedContainer( - onEnd: () { - controller.inventoryExpandedList[index] = !controller.inventoryExpandedList[index]!; - }, - margin: const EdgeInsets.symmetric(vertical: 2), - padding: EdgeInsets.all(6), - curve: Curves.easeInOut, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 250 : 80, - child: inventoryItem( - isExpanded: expand.keys.contains(index) && expand[index]!, - index: index, - model: controller.inventoryList[index], - ), - ), - ); - }, controller.inventoryExpandedList); + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.inventoryList.length, + separatorBuilder: (context, index) => const SizedBox(height: 8), + itemBuilder: (context, index) { + return ObxValue((expand) { + return GestureDetector( + onTap: () { + controller.toggleExpanded(index); }, - ), + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + onEnd: () { + controller.inventoryExpandedList[index] = !controller.inventoryExpandedList[index]!; + }, + margin: const EdgeInsets.symmetric(vertical: 2), + padding: EdgeInsets.all(6), + curve: Curves.easeInOut, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + duration: const Duration(seconds: 1), + height: expand.keys.contains(index) ? 250 : 80, + child: inventoryItem( + isExpanded: expand.keys.contains(index) && expand[index]!, + index: index, + model: controller.inventoryList[index], + ), + ), + ); + }, controller.inventoryExpandedList); + }, + ), controller.inventoryList, ), ], @@ -697,205 +496,52 @@ class RootPage extends GetView { ), child: model != null ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 10, - children: [ - Text( - 'اطلاعات ارسالی', - textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), - ], - ) + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Text( + 'اطلاعات ارسالی', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + const SizedBox(height: 12), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + ], + ) : const Center(child: CircularProgressIndicator()), ); } -} -Widget expandedContainer(bool isExpanded, VoidCallback onTap) { - return AnimatedContainer( - margin: EdgeInsets.symmetric(horizontal: 30, vertical: 10), - curve: Curves.easeInOut, - duration: Duration(seconds: 1), - height: isExpanded ? 364 : 80, - child: markerDetailsWidget(ontap: onTap), - ); -} - -Widget markerDetailsWidget({required VoidCallback ontap}) { - return GestureDetector( - onTap: ontap, - behavior: HitTestBehavior.opaque, - child: Container( - clipBehavior: Clip.antiAlias, - - padding: EdgeInsets.symmetric(horizontal: 0, vertical: 10), - decoration: ShapeDecoration( - color: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Column( - spacing: 15, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 12, - children: [ - vecWidgetWithOnTap( - child: Assets.vec.editSvg.svg(), - onTap: () {}, - width: 24, - height: 24, - color: AppColor.blueNormal, - ), - Text( - 'سوابق بازرسی من', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - vecWidgetWithOnTap( - child: Assets.vec.trashSvg.svg(), - width: 24, - height: 24, - color: AppColor.redNormal, - onTap: () {}, - ), - ], + Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { + return Container( + width: Get.width / 4, + height: 130, + child: GestureDetector( + onTap: onTap, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 1, color: AppColor.blueNormal), ), - Container( - height: 32, - clipBehavior: Clip.antiAlias, - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppColor.blueLightHover)), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'تاریخ بازرسی', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '1403/12/12', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - ), - - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'شماره همراه', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '0326598653', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'آخرین فعالیت', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - - Text( - '1409/12/12', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'موجودی', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '5کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - - ...List.generate( - 5, - (index) => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + child: Padding( + padding: EdgeInsets.all(16), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: [ + SvgGenImage(iconPath).svg(width: 50, height: 50), + SizedBox(height: 4), Text( - 'فروش رفته', + title, textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), ], ), ), - ], - ), - ), - ); -} - -Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { - return Container( - width: Get.width / 4, - height: 130, - child: GestureDetector( - onTap: onTap, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide(width: 1, color: AppColor.blueNormal), - ), - child: Padding( - padding: EdgeInsets.all(16), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SvgGenImage(iconPath).svg(width: 50, height: 50), - SizedBox(height: 4), - Text( - title, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - ], - ), ), ), - ), - ); + ); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 41a2e85..7be0885 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -11,14 +11,14 @@ class SalesOutOfProvincePage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar( - title: 'فروش خارج استان', - - - - - - ), + appBar: RAppBar( + title: 'رصدطیور', + iconTitle: Assets.vec.chickenSvg.path, + titleTextStyle:AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: false, + leading: Row(children: [Text('مباشر', style: AppFonts.yekan16Bold.copyWith(color: Colors.white))]), + ), body: SingleChildScrollView( child: Column( children: [ diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 8386c1c..437e079 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,6 +1,8 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/logic.dart'; @@ -20,6 +22,19 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.put(RootLogic()); + Get.lazyPut(()=>HomeLogic()); + Get.lazyPut(()=>SalesInProvinceLogic()); + Get.lazyPut(()=>SalesOutOfProvinceLogic()); + }), + ), + + GetPage( + name: ChickenRoutes.home, + page: () => HomePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.put(HomeLogic()); + Get.put(RootLogic()); }), ), diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index 7209a86..9ecbbdc 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -2,6 +2,7 @@ sealed class ChickenRoutes { ChickenRoutes._(); static const _base = '/init'; static const init = '$_base/init'; + static const home = '$_base/home'; static const enteringTheWarehouse = '$_base/enteringTheWarehouse'; static const salesInProvince = '$_base/SalesInProvincePage'; From 448834ecb2fe221bfd85acaefb1036bf5f14efa5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 15 Jun 2025 11:24:35 +0330 Subject: [PATCH 118/256] feat : SalesOutOfProvincePage main page --- assets/icons/filter_outline.svg | 4 + assets/icons/search.svg | 8 +- assets/vec/filter_outline.svg.vec | Bin 0 -> 1063 bytes assets/vec/search.svg.vec | Bin 203 -> 203 bytes .../pages/sales_out_of_province/view.dart | 141 +++++++++++++----- .../lib/presentation/common/assets.gen.dart | 8 + .../widget/app_bar/r_app_bar.dart | 27 +--- .../core/lib/presentation/widget/widget.dart | 1 + 8 files changed, 126 insertions(+), 63 deletions(-) create mode 100644 assets/icons/filter_outline.svg create mode 100644 assets/vec/filter_outline.svg.vec diff --git a/assets/icons/filter_outline.svg b/assets/icons/filter_outline.svg new file mode 100644 index 0000000..cd9d913 --- /dev/null +++ b/assets/icons/filter_outline.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/search.svg b/assets/icons/search.svg index 4a4e42d..e12b6da 100644 --- a/assets/icons/search.svg +++ b/assets/icons/search.svg @@ -1,6 +1,4 @@ - - - + + + diff --git a/assets/vec/filter_outline.svg.vec b/assets/vec/filter_outline.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..0c4ac2d988c8db685cfb7e98b5d22310a5b589d6 GIT binary patch literal 1063 zcmbW$Sxgf_90u@R2ue|-79}7;11ZH8m0LuPoiAd+Cr~t+786kF5hH<^s0a@llo%p} zC`YLYY zC3dH)h+BFjoYPkj_ZMZ{ueaY*qYt=b_xE6 zpORdi9}K#O4=WZdhXF5o^sf2h8e?Ab zr_p{DgylVX*Us(HdGWk$4Qi=w>bIO=<7k5Z+ zow5-l9d0z|X8L{p+7I4>C@ARu;QNYhEN3+<1mS=4`~AMX+9g>3$S!?68jJzCdfM-G Px^)ckWwUZPd_~SrJ?)Xe literal 0 HcmV?d00001 diff --git a/assets/vec/search.svg.vec b/assets/vec/search.svg.vec index da0271d4916ce3d2156595941fc6690f9daf8a0a..2e7b5e04d4a4c0e95e9b652e546ca0f03f820dce 100644 GIT binary patch literal 203 zcmYe&?ObnSr6ffq{Vmi2whW1~S-yn1Klhn59501_Pk#8II8# z%fK`$8zNUc_mTrd-oXK)-oXJR1~e3m5p0lp2e4X**bE>aVumyWBLfrAHU>r(5Xo?f XVTB_IvzoMmv4I>&^#6Z3Mlb~cxaKcj literal 203 zcmYe&?O { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar( - title: 'رصدطیور', - iconTitle: Assets.vec.chickenSvg.path, - titleTextStyle:AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: false, - leading: Row(children: [Text('مباشر', style: AppFonts.yekan16Bold.copyWith(color: Colors.white))]), - ), - body: SingleChildScrollView( - child: Column( + backgroundColor: AppColor.bgLight, + appBar: RAppBar( + title: 'رصدطیور', + iconTitle: Assets.vec.chickenSvg.path, + titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: false, + leadingWidth: 130, + leading: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, children: [ - SizedBox(height: 12), - ObxValue( - (model) => summaryOfInformation(model.value), - controller.stewardFreeDashboard, + Assets.vec.cubeSearchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), + Text('خارج استان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), ], ), + additionalActions: [ + Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + SizedBox(width: 8), + Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + SizedBox(width: 8), + ], ), + body: Column( + children: [ + SizedBox(height: 12), + ObxValue((model) => summaryOfInformation(model.value), controller.stewardFreeDashboard), + Expanded( + child: ListView.separated( + padding: const EdgeInsets.fromLTRB(8, 12, 8, 100), + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 10), + + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + + Text( + 'لرستان - خرم آباد', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), + ), + + buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), + buildRow('وزن خریداری شده', '200 کیلوگرم'), + buildRow('لاشه خریداری شده', '200 عدد'), + ], + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => SizedBox(height: 6), + itemCount: 3, + ), + ), + ], + ), + floatingActionButton: RFab.add(onPressed: () {}), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } @@ -39,14 +121,7 @@ class SalesOutOfProvincePage extends GetView { Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Row( - children: [ - Text( - 'خلاصه اطلاعات', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - ], + children: [Text('خلاصه اطلاعات', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal))], ), ), Container( @@ -65,15 +140,9 @@ class SalesOutOfProvincePage extends GetView { spacing: 10, children: [ const SizedBox(height: 12), - buildRow( - 'تعداد کل بارها', - model.totalQuantity?.toString() ?? '0', - ), + buildRow('تعداد کل بارها', model.totalQuantity?.toString() ?? '0'), buildRow('تعداد کل', model.totalBars?.toString() ?? '0'), - buildRow( - 'وزن کل (کیلوگرم)', - model.totalWeight?.toString() ?? '0', - ), + buildRow('وزن کل (کیلوگرم)', model.totalWeight?.toString() ?? '0'), ], ), ), @@ -92,9 +161,7 @@ class SalesOutOfProvincePage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -102,9 +169,7 @@ class SalesOutOfProvincePage extends GetView { child: Text( value, textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), ], @@ -112,8 +177,6 @@ class SalesOutOfProvincePage extends GetView { ); } - - /* Widget inventoryWidget() { return Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0), diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 9a2f111..76f24c7 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -72,6 +72,9 @@ class $AssetsIconsGen { /// File path: assets/icons/filter.svg SvgGenImage get filter => const SvgGenImage('assets/icons/filter.svg'); + /// File path: assets/icons/filter_outline.svg + SvgGenImage get filterOutline => const SvgGenImage('assets/icons/filter_outline.svg'); + /// File path: assets/icons/gps.svg SvgGenImage get gps => const SvgGenImage('assets/icons/gps.svg'); @@ -192,6 +195,7 @@ class $AssetsIconsGen { edit, excelDownload, filter, + filterOutline, gps, home, information, @@ -317,6 +321,9 @@ class $AssetsVecGen { /// File path: assets/vec/filter.svg.vec SvgGenImage get filterSvg => const SvgGenImage.vec('assets/vec/filter.svg.vec'); + /// File path: assets/vec/filter_outline.svg.vec + SvgGenImage get filterOutlineSvg => const SvgGenImage.vec('assets/vec/filter_outline.svg.vec'); + /// File path: assets/vec/gps.svg.vec SvgGenImage get gpsSvg => const SvgGenImage.vec('assets/vec/gps.svg.vec'); @@ -437,6 +444,7 @@ class $AssetsVecGen { editSvg, excelDownloadSvg, filterSvg, + filterOutlineSvg, gpsSvg, homeSvg, informationSvg, diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index c9e12bb..d48c8c2 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -1,9 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/common/app_color.dart'; -import 'package:rasadyar_core/presentation/common/app_fonts.dart'; class RAppBar extends StatelessWidget implements PreferredSizeWidget { final String title; @@ -48,23 +45,15 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { titleTextStyle: titleTextStyle ?? AppFonts.yekan16.copyWith(color: Colors.white), title: Row( mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [Text(title), - if (iconTitle != null)...{ - const SizedBox(width: 8) - }, - if (iconTitle != null)...{ - SvgGenImage.vec(iconTitle!).svg( - width: 24, - height: 24, - - ) - } - - - ]), + mainAxisSize: MainAxisSize.min, + children: [ + Text(title), + if (iconTitle != null) ...{const SizedBox(width: 8)}, + if (iconTitle != null) ...{SvgGenImage.vec(iconTitle!).svg(width: 24, height: 24)}, + ], + ), leadingWidth: leadingWidth?.toDouble(), - leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 16), child: leading) : null, + leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 6), child: leading) : null, titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 52c3f21..20d3bdd 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -20,3 +20,4 @@ export 'chips/r_chips.dart'; export 'overlay_dropdown_widget/view.dart'; export 'inputs/input_fixed_hint.dart'; export 'bottom_sheet/base_bottom_sheet.dart'; +export 'buttons/fab.dart'; From 77d5f3be3e9fbfd93e2a5b84b41cab16116eee3c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 15 Jun 2025 17:16:04 +0330 Subject: [PATCH 119/256] feat : home page --- assets/icons/cube_bottom_rotation.svg | 10 + assets/icons/cube_top_rotation.svg | 10 + assets/vec/cube_bottom_rotation.svg.vec | Bin 0 -> 1001 bytes assets/vec/cube_top_rotation.svg.vec | Bin 0 -> 1001 bytes .../data/repositories/chicken_repository.dart | 2 +- .../repositories/chicken_repository_imp.dart | 2 + .../pages/entering_the_warehouse/logic.dart | 2 +- .../pages/entering_the_warehouse/view.dart | 4 +- .../lib/presentation/pages/home/logic.dart | 94 ++++- .../lib/presentation/pages/home/view.dart | 397 ++++++++++-------- .../lib/presentation/pages/root/logic.dart | 84 +--- .../lib/presentation/pages/root/view.dart | 4 +- .../pages/sales_in_province/logic.dart | 2 +- .../pages/sales_in_province/view.dart | 4 +- .../pages/sales_out_of_province/view.dart | 94 ++++- .../chicken/lib/presentation/utils/utils.dart | 22 + packages/core/lib/core.dart | 3 +- .../lib/presentation/common/assets.gen.dart | 16 + packages/core/lib/utils/map_utils.dart | 44 ++ packages/core/lib/utils/num_utils.dart | 8 + 20 files changed, 540 insertions(+), 262 deletions(-) create mode 100644 assets/icons/cube_bottom_rotation.svg create mode 100644 assets/icons/cube_top_rotation.svg create mode 100644 assets/vec/cube_bottom_rotation.svg.vec create mode 100644 assets/vec/cube_top_rotation.svg.vec create mode 100644 packages/chicken/lib/presentation/utils/utils.dart create mode 100644 packages/core/lib/utils/map_utils.dart create mode 100644 packages/core/lib/utils/num_utils.dart diff --git a/assets/icons/cube_bottom_rotation.svg b/assets/icons/cube_bottom_rotation.svg new file mode 100644 index 0000000..94089f8 --- /dev/null +++ b/assets/icons/cube_bottom_rotation.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/assets/icons/cube_top_rotation.svg b/assets/icons/cube_top_rotation.svg new file mode 100644 index 0000000..828ec46 --- /dev/null +++ b/assets/icons/cube_top_rotation.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/assets/vec/cube_bottom_rotation.svg.vec b/assets/vec/cube_bottom_rotation.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..17ce852ca46d1af7bafffd7d711400e6176b5488 GIT binary patch literal 1001 zcmXw&X>3eU6vyw(Fi}I%nuUs?ZMxA$Mr#=wJ%5v;KG>o@h}|?ImWYxulo49BlO{!I zNkfIy60MYGT53|7v1BZ%wX~Gh6kTHpGVZKp;%TSbxS3m0GQwnndw}F~|N7q>CI!Ykr2Jz_pVeEHdEGrrpGt38ntMlKX;> zNG`MF)A=n1d~7@^;~l38N#xsfHMH^hJBl>kql(toJhql!FCFTPLYi|@T~_9>aW<7vUdH!6UqwY0cUh@^N>7yHk?52l7?)k<%WEkFy_= zrC1Nc?^+7~V!#vET`E3lMEPS6k2T>`c(vrp`YOrq$K2#DGh)e}3d)*oM0(aX+Nue{ zYWHgD=+=tvP)(Iua-QK2&sj?TUUwx&nyV>kv7N3JxGDO~S}GV+LG{-+lRLYd+HSb$ z@Vs(TJi=7!9@qb#!d7vujtPNq_0Jy+kyCQt05L~KtqEdIbInkQ8jKBts3}9^#Sb81BF8-iD_wa9VkvBTd7S(m#gW4sX&-VW)gyWYlQO^818Rni_O*3X2ZvKG3{ z*C=WICz{yX2+yYXH2s#IJ2%kL?V*w-xtw{;wUtUudD1CIlVN57Hn0&u|lnSRY8ten(LD-xz4xul8jp=A8XX(H=fD;&CJ zN;glyrO&@;v^^R#F8`&X?g&^TG?@G-98q~%bY6`_h^8+*c~P*%>Tt0k4sTL}kT@p+ zk6vmqtI&ehq7g{&jY6DrES%p%aoTM`oVA@+6%CE;yHBbA+)hz*sEv@SCl zn!Syb?M^|wrUJ2z;IO$)IH$;Gk^IHAMIbI literal 0 HcmV?d00001 diff --git a/assets/vec/cube_top_rotation.svg.vec b/assets/vec/cube_top_rotation.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..aed0a349b47482dabc73530bf420ee7501f28419 GIT binary patch literal 1001 zcmXw&dq`A46vpqp>t=;LP_bgm*5|ffrJ_tiY5Pv%A5sV_h<`+hh1gSj2}Z`&W~E@E z5{3Cldup1d_@IXsrX>}oCM!{zqLkS7uof5H+V0G@!@cLn+?g|HzVFVYMw}N!y&$9z zdzU+vrV<3FQzHt3m!LFBl0^PUstro_b*~4!PXEH-vAOV)W|8%E37T7-n6ZW;W&97y zzei%Tj{`;94aiRZ4P#q0vIoDSFCzf!np$wTCkY9wO^DlY6@Ie`cpG~KM=Yr@ST3Pw z`ViuLOR)Q+2~B$|F%fD;{Olc67w1A8YCvVuDFm--QtBSXlMC$#iVwruWl!;{Qj4sf zcHCC`Vey`ai0W8~8mSGBO`cG9HsV-}2kiZI$f=qG&z%OO7lvc%&Ew5!X*c24qY*`6 z0n_Ue%cE*N`ydFJ!*-0B%}B5Er-rF&yz~s91D|W*s1BsA?TwserZ&!_H`;MMD1bT= zpY!?o3txcc2j*C@PqrZ{?>p`re!}PQ57-l}oSV`oICD>o^KsM55k6nLs|+l^Cglp) zdiKOiVCyrodW@_-8{bk_3pStakL9!d4%ologXJU=>VI;&b!bG%tyR&f{9YxxwQBpW zL2n&Fz3(98bAK@r^$A*|NcO~Wq@7oDP6p2BtdK)E&y?#Za%dFM!+Po%8$x)9Oi2|V zQ2$P*V*Pu}+Zax7n=G8x@&V3y`Tgj!%5?l@FV5!4G?`k0+?W+~-%x~^2#vCC0h*`% zIG4qGb9QHaQ#2P~ec=QibYDc_qH$P?iqT*mMa84b%J~^a@SRdrbq>R=LnEkMT3s@E zbZb4Q(-F^g1QW|Wvn`NVZmo4CF%R~4i^M#LXq@@)f$hHsHb^nd0~=amnFltMwCc!P zWrxwOr_p2wXp>B#{eQU!+GheW5AH3MICn>@IK>?v#5~xVrlyQcnQr9=(ZQe7&!$d6N!y*W!`zbWS|jF<-*Mm;eP+&b3yv(xHy`YU&rL2^O4&r0tfGeMDr literal 0 HcmV?d00001 diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index a39a053..a3b6eef 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -19,7 +19,7 @@ abstract class ChickenRepository { required String token, }); - Future getGeneralBarInformation({required String token}); + Future getGeneralBarInformation({required String token,Map? queryParameters}); Future getWaitingArrivals({ required String token, diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 5c14e85..8cc819b 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -49,9 +49,11 @@ class ChickenRepositoryImpl implements ChickenRepository { @override Future getGeneralBarInformation({ required String token, + Map? queryParameters }) async { var res = await _httpClient.get( '/bars_for_kill_house_dashboard/?role=Steward', + queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJson: BarInformation.fromJson, ); diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart index 76e94f9..70de9f7 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart @@ -33,7 +33,7 @@ class EnteringTheWarehouseLogic extends GetxController { @override void onReady() { super.onReady(); - rootLogic.getInventory(); + //rootLogic.getInventory(); getBarGeneralInformation(); getWaitingArrivals(); getImportedEntried(); diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart index cf09d6b..83ede6a 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart @@ -43,7 +43,7 @@ class EnteringTheWarehousePage extends GetView { ), ), SizedBox(height: 4), - ObxValue( + /* ObxValue( (data) => data.isEmpty ? Container( margin: const EdgeInsets.symmetric(vertical: 2), @@ -101,7 +101,7 @@ class EnteringTheWarehousePage extends GetView { }, ), controller.rootLogic.inventoryList, - ), + ),*/ ], ), ); diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index b8de756..4360c92 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -1,17 +1,103 @@ - - +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class HomeLogic extends GetxController { + RootLogic root = Get.find(); + RxnInt totalWeightTodayBars = RxnInt(); + Rxn inventoryModel = Rxn(); + Rxn killHouseDistributionInfo = Rxn(); + + + @override + void onInit() { + super.onInit(); + getTodayBars(); + getInventory(); + getDistributionInformation(); + } + + Future getTodayBars() async { + await safeCall( + call: () async => await root.chickenRepository.getGeneralBarInformation( + token: root.tokenService.accessToken.value!, + queryParameters: buildQueryParams(fromDate: DateTime.now(), toDate: DateTime.now()), + ), + onSuccess: (result) { + if (result != null) { + totalWeightTodayBars.value = result.totalBarsWeight?.toInt(); + } + }, + onError: (error, stackTrace) { + switch (error.response?.statusCode) { + case 401: + errorHandler(error); + break; + case 403: + errorHandler(error); + break; + default: + errorHandler(error); + } + }, + ); + } + + Future getInventory() async { + await safeCall?>( + call: () async => await root.chickenRepository.getInventory(token: root.tokenService.accessToken.value!), + onSuccess: (result) { + if (result != null) { + inventoryModel.value = result.first; + } + }, + onError: (error, stackTrace) { + switch (error.response?.statusCode) { + case 401: + errorHandler(error); + break; + case 403: + errorHandler(error); + break; + default: + errorHandler(error); + } + }, + ); + } + + Future getDistributionInformation() async { + await safeCall( + call: () async => await root.chickenRepository.getIKillHouseDistributionInfo(token: root.tokenService.accessToken.value!), + onSuccess: (result) { + if (result != null) { + iLog(result); + killHouseDistributionInfo.value = result; + iLog(killHouseDistributionInfo.value); + } + }, + onError: (error, stackTrace) {}, + ); + } + + + void errorHandler(DioException error) { + handleGeneric(error, () { + root.tokenService.deleteTokens(); + }); + } + @override void onReady() { - super.onReady(); } @override void onClose() { - super.onClose(); } } diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index f455b43..fa00a71 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -2,7 +2,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; -import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -70,111 +69,19 @@ class HomePage extends GetView { SizedBox(height: 8), _todayShipmentWidget(), - Padding( - padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), - child: Row( - spacing: 8, - children: [ - Expanded( - child: _informationLabelCard( - title: 'مانده انبار', - description: '2،225،256', - iconPath: Assets.vec.cubeSearchSvg.path, - iconColor: const Color(0xFF426060), - bgDescriptionColor: const Color(0xFFC7DFE0), - bgLabelColor: const Color(0xFFA5D1D2), - ), - ), - Expanded( - child: _informationLabelCard( - title: 'توزیع شده', - description: '2،225،256', - iconPath: Assets.vec.cubeRotateSvg.path, - iconColor: Color(0xFF5C4D64), - bgLabelColor: Color(0xFFC8B8D1), - bgDescriptionColor: Color(0xFFDAD4DD), - ), - ), - ], - ), - ), + _inventoryWidget(), Row( children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), - child: Row( - spacing: 8, - children: [ - Expanded( - child: _informationLabelCard( - title: 'داخل استان', - description: '2،225،256', - iconPath: Assets.vec.a3dCubeSquareSvg.path, - iconColor: const Color(0xFF6C5D60), - bgDescriptionColor: const Color(0xFFEDDCE0), - bgLabelColor: const Color(0xFFDDC0C7), - ), - ), - Expanded( - child: _informationLabelCard( - title: 'خارج استان', - description: '2،225،256', - iconPath: Assets.vec.cubeSearchSvg.path, - iconColor: Color(0xFF2D5FFF), - bgLabelColor: const Color(0xFFAFCBFF), - bgDescriptionColor: const Color(0xFFCEDFFF), - ), - ), - ], - ), - ), + _informationShipment(), Row( children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Expanded( - child: _informationIconCard( - title: 'توزیع داخل استان', - description: '2،225،256', - iconPath: Assets.vec.truckSvg.path, - iconColor: const Color.fromRGBO(85, 97, 93, 1), - bgDescriptionColor: const Color(0xFFE6FAF5), - bgLabelColor: const Color(0xFFB0EFDF), - ), - ), - Expanded( - child: _informationIconCard( - title: 'توزیع خارج استان', - description: '2،225،256', - iconPath: Assets.vec.truckFastSvg.path, - iconColor: Color(0xFF647379), - bgDescriptionColor: const Color(0xFFEAEFFF), - bgLabelColor: const Color(0xFFD4DEFF), - ), - ), - Expanded( - child: _informationIconCard( - title: 'قطعه بندی', - description: '2،225،256', - iconPath: Assets.vec.convertCubeSvg.path, - iconColor: const Color(0xFF6F6164), - bgDescriptionColor: const Color(0xFFEDDCE0), - bgLabelColor: const Color(0xFFE0BCC5), - ), - ), - ], - ), - ), + distributionInformationWidget(), ], ), ), @@ -226,64 +133,190 @@ class HomePage extends GetView { ), ); } - Container _todayShipmentWidget() { - return Container( - height: 70, - width: Get.width / 2, - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), - clipBehavior: Clip.hardEdge, - child: Row( - children: [ - Expanded( - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [const Color(0xFFEAEFFF), Colors.white], - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Assets.icons.cubeScan.svg(width: 30, height: 30), - Text( - 'بارهای امروز', - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - ], + + Widget distributionInformationWidget() { + return Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Expanded( + child: _informationIconCard( + title: 'توزیع داخل استان', + isLoading: data.value == null, + description: data.value?.freeSalesWeight.toFormatted ?? '0', + iconPath: Assets.vec.truckSvg.path, + iconColor: const Color.fromRGBO(85, 97, 93, 1), + bgDescriptionColor: const Color(0xFFE6FAF5), + bgLabelColor: const Color(0xFFB0EFDF), ), ), - ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - '2،225،256', - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.textColor), - ), - Text( - 'کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.textColor), - ), - ], + Expanded( + child: _informationIconCard( + title: 'توزیع خارج استان', + isLoading: data.value == null, + description: data.value?.stewardAllocationsWeight.toFormatted ?? '0', + iconPath: Assets.vec.truckFastSvg.path, + iconColor: Color(0xFF647379), + bgDescriptionColor: const Color(0xFFEAEFFF), + bgLabelColor: const Color(0xFFD4DEFF), + ), ), - ), - ], - ), + Expanded( + child: _informationIconCard( + title: 'قطعه بندی', + description: '2،225،256', + iconPath: Assets.vec.convertCubeSvg.path, + iconColor: const Color(0xFF6F6164), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFE0BCC5), + ), + ), + ], + ); + }, controller.killHouseDistributionInfo), ); } + Widget _informationShipment() { + return Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: ObxValue((data) { + return Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'داخل استان', + isLoading: data.value == null, + description: data.value != null + ? ((data.value?.provinceGovernmentalCarcassesWeight ?? 0) + + (data.value?.provinceFreeCarcassesWeight ?? 0)) + .toFormatted + : '0', + iconPath: Assets.vec.a3dCubeSquareSvg.path, + iconColor: const Color(0xFF6C5D60), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFDDC0C7), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'خارج استان', + isLoading: data.value == null, + description: data.value?.freeBuyingCarcassesWeight.toFormatted ?? '0', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: Color(0xFF2D5FFF), + bgLabelColor: const Color(0xFFAFCBFF), + bgDescriptionColor: const Color(0xFFCEDFFF), + ), + ), + ], + ); + }, controller.inventoryModel), + ); + } + + Widget _inventoryWidget() { + return ObxValue((data) { + return Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'مانده انبار', + isLoading: data.value == null, + description: data.value?.totalRemainWeight.toFormatted ?? '0', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: const Color(0xFF426060), + bgDescriptionColor: const Color(0xFFC7DFE0), + bgLabelColor: const Color(0xFFA5D1D2), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'توزیع شده', + isLoading: data.value == null, + description: data.value?.realAllocatedWeight.toFormatted ?? '0', + iconPath: Assets.vec.cubeRotateSvg.path, + iconColor: Color(0xFF5C4D64), + bgLabelColor: Color(0xFFC8B8D1), + bgDescriptionColor: Color(0xFFDAD4DD), + ), + ), + ], + ), + ); + }, controller.inventoryModel); + } + + Widget _todayShipmentWidget() { + return ObxValue((data) { + return Container( + height: 70, + width: Get.width / 2, + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [const Color(0xFFEAEFFF), Colors.white], + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Assets.icons.cubeScan.svg(width: 30, height: 30), + Text( + 'بارهای امروز', + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + Expanded( + child: data.value == null + ? CupertinoActivityIndicator() + : Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + data.value.toFormatted, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.textColor), + ), + Text( + 'کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + ], + ), + ); + }, controller.totalWeightTodayBars); + } + Container _informationLabelCard({ required String title, required String description, String unit = 'کیلوگرم', + bool isLoading = false, required String iconPath, required Color iconColor, required Color bgDescriptionColor, @@ -326,22 +359,24 @@ class HomePage extends GetView { color: bgDescriptionColor, borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - description, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), - ), - Text( - unit, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), - ), - ], - ), + child: isLoading + ? Center(child: CupertinoActivityIndicator()) + : Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), ), ), ], @@ -353,6 +388,7 @@ class HomePage extends GetView { required String title, required String description, String unit = 'کیلوگرم', + bool isLoading = false, required String iconPath, required Color iconColor, required Color bgDescriptionColor, @@ -385,11 +421,14 @@ class HomePage extends GetView { textAlign: TextAlign.right, style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), ), - Text( - description, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), - ), + + isLoading + ? Center(child: CupertinoActivityIndicator()) + : Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), Text( unit, textAlign: TextAlign.center, @@ -483,7 +522,7 @@ class HomePage extends GetView { ); } -/* Column oldPage() { + /* Column oldPage() { return Column( children: [ inventoryWidget(), @@ -652,19 +691,19 @@ class HomePage extends GetView { ), child: model != null ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 10, - children: [ - Text( - 'اطلاعات ارسالی', - textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), - ], - ) + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Text( + 'اطلاعات ارسالی', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + const SizedBox(height: 12), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + ], + ) : const Center(child: CircularProgressIndicator()), ); } diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 3d9a7b0..6cc4aeb 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,15 +1,14 @@ -import 'package:flutter/material.dart' show Text, EdgeInsets, Colors; +import 'package:flutter/material.dart' show Colors; import 'package:flutter/widgets.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; enum ErrorLocationType { serviceDisabled, permissionDenied, none } @@ -24,15 +23,14 @@ class RootLogic extends GetxController { Container(color: Colors.amber), ]; - RxList errorLocationType = RxList(); - RxMap inventoryExpandedList = RxMap(); + late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; - late DioRemote dioRemote; - RxInt count = 5.obs; - RxList inventoryList = RxList(); - Rxn killHouseDistributionInfo = Rxn(); + RxList errorLocationType = RxList(); + RxMap inventoryExpandedList = RxMap(); + + @override void onInit() { @@ -40,8 +38,9 @@ class RootLogic extends GetxController { dioRemote = DioRemote(baseUrl: tokenService.baseurl.value); dioRemote.init(); chickenRepository = ChickenRepositoryImpl(dioRemote); - getInventory(); - getKillHouseDistributionInfo(); + + /*getInventory(); + getKillHouseDistributionInfo();*/ } void toggleExpanded(int index) { @@ -52,63 +51,16 @@ class RootLogic extends GetxController { } } - Future getInventory() async { - await safeCall?>( - call: () async => await chickenRepository.getInventory(token: tokenService.accessToken.value!), - onSuccess: (result) { - if (result != null) { - iLog(result); - inventoryList.clear(); - inventoryList.addAll(result); - iLog(inventoryList); - } - }, - onError: (error, stackTrace) { - switch (error.response?.statusCode) { - case 401: - _handleGeneric(error); - break; - case 403: - _handleGeneric(error); - break; - default: - _handleGeneric(error); - } - }, - ); + + + + + void rootErrorHandler(DioException error) { + handleGeneric(error, () { + tokenService.deleteTokens(); + }); } - Future getKillHouseDistributionInfo() async { - await safeCall( - call: () async => await chickenRepository.getIKillHouseDistributionInfo(token: tokenService.accessToken.value!), - onSuccess: (result) { - if (result != null) { - iLog(result); - killHouseDistributionInfo.value = result; - iLog(killHouseDistributionInfo.value); - } - }, - onError: (error, stackTrace) {}, - ); - } - - void _handleGeneric(DioException error) { - Get.showSnackbar(_errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید')); - tokenService.deleteTokens(); - Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); - } - - GetSnackBar _errorSnackBar(String message) { - return GetSnackBar( - titleText: Text('خطا', style: AppFonts.yekan14.copyWith(color: Colors.white)), - messageText: Text(message, style: AppFonts.yekan12.copyWith(color: Colors.white)), - backgroundColor: AppColor.error, - margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), - borderRadius: 12, - duration: Duration(milliseconds: 3500), - snackPosition: SnackPosition.TOP, - ); - } void changePage(int index) { currentPage.value = index; diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index e1e1c93..3c7515d 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -326,7 +326,7 @@ class RootPage extends GetView { ); } - Column oldPage() { + /*Column oldPage() { return Column( children: [ inventoryWidget(), @@ -455,7 +455,7 @@ class RootPage extends GetView { ), ], ); - } + }*/ Widget buildRow(String title, String value) { return Padding( diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index d9d71cd..90f6164 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -37,7 +37,7 @@ class SalesInProvinceLogic extends GetxController { @override void onInit() { super.onInit(); - rootLogic.getInventory(); + //rootLogic.getInventory(); getAllocatedMade(); getRolesProducts(); getGuilds(); diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 67485c6..d07bbfa 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -48,7 +48,7 @@ class SalesInProvincePage extends GetView { ), ), SizedBox(height: 4), - ObxValue( + /* ObxValue( (data) => data.isEmpty ? Container( margin: const EdgeInsets.symmetric(vertical: 2), @@ -106,7 +106,7 @@ class SalesInProvincePage extends GetView { }, ), controller.rootLogic.inventoryList, - ), + ),*/ ], ), ); diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index fe0710f..eecc579 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -47,7 +47,14 @@ class SalesOutOfProvincePage extends GetView { ), body: Column( children: [ - SizedBox(height: 12), + _typeOuterInfoCard( + title: 'خرید خارج استان', + iconPath: Assets.vec.searchSvg.path, + backgroundColor: AppColor.blueLight, + foregroundColor: AppColor.blueNormal, + ), + + /* SizedBox(height: 12), ObxValue((model) => summaryOfInformation(model.value), controller.stewardFreeDashboard), Expanded( child: ListView.separated( @@ -107,11 +114,92 @@ class SalesOutOfProvincePage extends GetView { separatorBuilder: (BuildContext context, int index) => SizedBox(height: 6), itemCount: 3, ), + ),*/ + ], + ), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet(addSaleOutOfTheProvinceBottomSheet()); + }, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + Widget addSaleOutOfTheProvinceBottomSheet() { + return BaseBottomSheet( + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text('ثبت فروش خارج استان', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + ), + SizedBox(height: 4), + RElevated(text: 'ثبت توزیع/ فروش', onPressed: () {}), + ], + ), + ); + } + + Container _typeOuterInfoCard({ + required String title, + required String iconPath, + required Color backgroundColor, + required Color foregroundColor, + }) { + return Container( + height: 110, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Stack( + alignment: Alignment.topCenter, + children: [ + Positioned( + bottom: 0, + right: 0, + left: 0, + child: Container( + height: 120, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: foregroundColor), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + Positioned( + top: 0, + child: Container( + width: 50, + height: 50, + decoration: ShapeDecoration( + color: backgroundColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + side: BorderSide(width: 1, color: foregroundColor), + ), + ), + child: Center( + child: SvgGenImage.vec( + iconPath, + ).svg(width: 36, height: 36, colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn)), + ), + ), ), ], ), - floatingActionButton: RFab.add(onPressed: () {}), - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } diff --git a/packages/chicken/lib/presentation/utils/utils.dart b/packages/chicken/lib/presentation/utils/utils.dart new file mode 100644 index 0000000..13b968a --- /dev/null +++ b/packages/chicken/lib/presentation/utils/utils.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_auth/presentation/routes/pages.dart'; +import 'package:rasadyar_core/core.dart'; + +void handleGeneric(DioException error,[void Function()? onError]) { + Get.showSnackbar(_errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید')); + + Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); +} + +GetSnackBar _errorSnackBar(String message) { + return GetSnackBar( + titleText: Text('خطا', style: AppFonts.yekan14.copyWith(color: Colors.white)), + messageText: Text(message, style: AppFonts.yekan12.copyWith(color: Colors.white)), + backgroundColor: AppColor.error, + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: 12, + duration: Duration(milliseconds: 3500), + snackPosition: SnackPosition.TOP, + ); +} \ No newline at end of file diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index d1c0ae9..1ad8104 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -1,6 +1,5 @@ library; - //other packages export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_map/flutter_map.dart'; @@ -44,3 +43,5 @@ export 'injection/di.dart'; export 'utils/logger_utils.dart'; export 'utils/safe_call_utils.dart'; export 'utils/date_time_utils.dart'; +export 'utils/num_utils.dart'; +export 'utils/map_utils.dart'; diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 76f24c7..c8fa214 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -48,6 +48,9 @@ class $AssetsIconsGen { /// File path: assets/icons/cube.svg SvgGenImage get cube => const SvgGenImage('assets/icons/cube.svg'); + /// File path: assets/icons/cube_bottom_rotation.svg + SvgGenImage get cubeBottomRotation => const SvgGenImage('assets/icons/cube_bottom_rotation.svg'); + /// File path: assets/icons/cube_rotate.svg SvgGenImage get cubeRotate => const SvgGenImage('assets/icons/cube_rotate.svg'); @@ -57,6 +60,9 @@ class $AssetsIconsGen { /// File path: assets/icons/cube_search.svg SvgGenImage get cubeSearch => const SvgGenImage('assets/icons/cube_search.svg'); + /// File path: assets/icons/cube_top_rotation.svg + SvgGenImage get cubeTopRotation => const SvgGenImage('assets/icons/cube_top_rotation.svg'); + /// File path: assets/icons/diagram.svg SvgGenImage get diagram => const SvgGenImage('assets/icons/diagram.svg'); @@ -187,9 +193,11 @@ class $AssetsIconsGen { chicken, convertCube, cube, + cubeBottomRotation, cubeRotate, cubeScan, cubeSearch, + cubeTopRotation, diagram, download, edit, @@ -297,6 +305,9 @@ class $AssetsVecGen { /// File path: assets/vec/cube.svg.vec SvgGenImage get cubeSvg => const SvgGenImage.vec('assets/vec/cube.svg.vec'); + /// File path: assets/vec/cube_bottom_rotation.svg.vec + SvgGenImage get cubeBottomRotationSvg => const SvgGenImage.vec('assets/vec/cube_bottom_rotation.svg.vec'); + /// File path: assets/vec/cube_rotate.svg.vec SvgGenImage get cubeRotateSvg => const SvgGenImage.vec('assets/vec/cube_rotate.svg.vec'); @@ -306,6 +317,9 @@ class $AssetsVecGen { /// File path: assets/vec/cube_search.svg.vec SvgGenImage get cubeSearchSvg => const SvgGenImage.vec('assets/vec/cube_search.svg.vec'); + /// File path: assets/vec/cube_top_rotation.svg.vec + SvgGenImage get cubeTopRotationSvg => const SvgGenImage.vec('assets/vec/cube_top_rotation.svg.vec'); + /// File path: assets/vec/diagram.svg.vec SvgGenImage get diagramSvg => const SvgGenImage.vec('assets/vec/diagram.svg.vec'); @@ -436,9 +450,11 @@ class $AssetsVecGen { chickenSvg, convertCubeSvg, cubeSvg, + cubeBottomRotationSvg, cubeRotateSvg, cubeScanSvg, cubeSearchSvg, + cubeTopRotationSvg, diagramSvg, downloadSvg, editSvg, diff --git a/packages/core/lib/utils/map_utils.dart b/packages/core/lib/utils/map_utils.dart new file mode 100644 index 0000000..99866c8 --- /dev/null +++ b/packages/core/lib/utils/map_utils.dart @@ -0,0 +1,44 @@ +import 'package:rasadyar_core/presentation/utils/data_time_utils.dart'; + +Map buildQueryParams({ + Map? queryParams, + String? search, + String? value, + int? page, + int? pageSize, + DateTime? fromDate, + DateTime? toDate, + +}) { + final params = {}; + + if (queryParams != null) { + params.addAll(queryParams); + } + + if (fromDate != null) { + params['date1'] = fromDate.formattedDashedGregorian; + } + + if (toDate != null) { + params['date2'] = toDate.formattedDashedGregorian; + } + + if (search != null && search.isNotEmpty) { + params['search'] = search; + } + + if (value != null && value.isNotEmpty) { + params['value'] = value; + } + + if (page != null) { + params['page'] = page; + } + + if (pageSize != null) { + params['page_size'] = pageSize; + } + + return params; +} diff --git a/packages/core/lib/utils/num_utils.dart b/packages/core/lib/utils/num_utils.dart new file mode 100644 index 0000000..4df60b5 --- /dev/null +++ b/packages/core/lib/utils/num_utils.dart @@ -0,0 +1,8 @@ +import 'package:intl/intl.dart'; + +extension XNumExtension on num? { + String get toFormatted { + final formatter = NumberFormat('#,###', 'fa_IR'); + return this == null ? '':formatter.format(this); + } +} From f9a43c3ca7430b7b972732cbbd8c1ce5f73be055 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 16 Jun 2025 09:06:20 +0330 Subject: [PATCH 120/256] feat : out of the province --- assets/icons/shopping_basket.svg | 10 ++ assets/vec/shopping_basket.svg.vec | Bin 0 -> 811 bytes .../pages/sales_out_of_province/view.dart | 114 +++++++++--------- .../lib/presentation/common/assets.gen.dart | 8 ++ 4 files changed, 75 insertions(+), 57 deletions(-) create mode 100644 assets/icons/shopping_basket.svg create mode 100644 assets/vec/shopping_basket.svg.vec diff --git a/assets/icons/shopping_basket.svg b/assets/icons/shopping_basket.svg new file mode 100644 index 0000000..76d34a5 --- /dev/null +++ b/assets/icons/shopping_basket.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/assets/vec/shopping_basket.svg.vec b/assets/vec/shopping_basket.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..c19c21e35ece7d7116567e5cb36f2f22b7b5ae47 GIT binary patch literal 811 zcmZ8fTS!z<6y5h;$-p%65ysS%sMJK^qlZSpoV_e7iyF`mLrQ!gG>n0n(T9aF5fy$| z>3m33ANFBTA30HAL1Z6UXoVj=Buh&RwFf>hZR~dU9i+#BbJsolti8_K`<$|MXGn7q z`9M^M<)$?>%^<2*M9P|`xy%ZYp;>?b@9I{}K}5PWNna>m3b}4@tm<*^EoUr_SUxZH2gY-{hyUdH9e<_}a1xCmIPM*BA>roM&y+yh(gCm2h{# zJth3${?khG_Z>)4qIa32l<4R5>1z1qFvne;b!Sb#x3Oyb8ynj$_VTOmx|-_iw)uag|B#oT7m-_#xC)`}!fa0gk=U*c_N@gpey1dlDw!#D?R|H7AgBwy+iJ*ijp zJ)v^QdA|xPAmwcjd8)>@oR?@3k78h{wr| zb1HQv8z^=%r57V`D}{}mQuON?y!(13Mw*!~J@TT&Rlr~R4rW(XGJ>a~wTD#|h6YruR`0%9@5rG8nO$Nj6T2Ugs99xAaq2 zD-5<(Lf@K;XW6B=bAB7d&kp|{h(Axr1MxeOSb(ADCRdN;!k3*oyK{M69E mf}K+ { Text('خارج استان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), ], ), - additionalActions: [ + /* additionalActions: [ Assets.vec.searchSvg.svg( width: 24, height: 24, @@ -43,15 +43,31 @@ class SalesOutOfProvincePage extends GetView { colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), SizedBox(width: 8), - ], + ],*/ ), body: Column( children: [ - _typeOuterInfoCard( - title: 'خرید خارج استان', - iconPath: Assets.vec.searchSvg.path, - backgroundColor: AppColor.blueLight, - foregroundColor: AppColor.blueNormal, + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _typeOuterInfoCard( + title: 'خرید خارج استان', + iconPath: Assets.vec.cubeBottomRotationSvg.path, + foregroundColor: AppColor.blueNormal, + ), + ), + Expanded( + child: _typeOuterInfoCard( + title: 'فروش خارج استان', + iconPath: Assets.vec.cubeTopRotationSvg.path, + foregroundColor: AppColor.greenDark, + ), + ), + ], + ), ), /* SizedBox(height: 12), @@ -142,61 +158,45 @@ class SalesOutOfProvincePage extends GetView { ); } - Container _typeOuterInfoCard({ - required String title, - required String iconPath, - required Color backgroundColor, - required Color foregroundColor, - }) { + Container _typeOuterInfoCard({required String title, required String iconPath, required Color foregroundColor}) { return Container( - height: 110, - decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), - clipBehavior: Clip.hardEdge, - child: Stack( - alignment: Alignment.topCenter, + height: (Get.width - 24) / 2, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: foregroundColor), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, children: [ - Positioned( - bottom: 0, - right: 0, - left: 0, - child: Container( - height: 120, - decoration: BoxDecoration( - color: backgroundColor, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: foregroundColor), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), - ), - ], - ), - ), - ), - Positioned( - top: 0, - child: Container( - width: 50, - height: 50, - decoration: ShapeDecoration( - color: backgroundColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(30), - side: BorderSide(width: 1, color: foregroundColor), - ), - ), - child: Center( + Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + + Positioned( + top: -41, child: SvgGenImage.vec( iconPath, - ).svg(width: 36, height: 36, colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn)), + ).svg(width: 45, height: 45, colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn)), ), - ), + + + Assets.vec.shoppingBasketSvg.svg( + width: 55, + height: 60, + colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ], + ), + const SizedBox(height: 15), + + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: foregroundColor), ), ], ), diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index c8fa214..f33b3bb 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -150,6 +150,9 @@ class $AssetsIconsGen { /// File path: assets/icons/setting.svg SvgGenImage get setting => const SvgGenImage('assets/icons/setting.svg'); + /// File path: assets/icons/shopping_basket.svg + SvgGenImage get shoppingBasket => const SvgGenImage('assets/icons/shopping_basket.svg'); + /// File path: assets/icons/tag_label.svg SvgGenImage get tagLabel => const SvgGenImage('assets/icons/tag_label.svg'); @@ -227,6 +230,7 @@ class $AssetsIconsGen { search, securityTime, setting, + shoppingBasket, tagLabel, tagUser, trash, @@ -407,6 +411,9 @@ class $AssetsVecGen { /// File path: assets/vec/setting.svg.vec SvgGenImage get settingSvg => const SvgGenImage.vec('assets/vec/setting.svg.vec'); + /// File path: assets/vec/shopping_basket.svg.vec + SvgGenImage get shoppingBasketSvg => const SvgGenImage.vec('assets/vec/shopping_basket.svg.vec'); + /// File path: assets/vec/tag_label.svg.vec SvgGenImage get tagLabelSvg => const SvgGenImage.vec('assets/vec/tag_label.svg.vec'); @@ -484,6 +491,7 @@ class $AssetsVecGen { searchSvg, securityTimeSvg, settingSvg, + shoppingBasketSvg, tagLabelSvg, tagUserSvg, trashSvg, From 369403ef61dc764c38dc76697a29544383ed7ff0 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 16 Jun 2025 09:06:42 +0330 Subject: [PATCH 121/256] fix : out of the province --- .../lib/presentation/pages/sales_out_of_province/view.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index c720929..73aed55 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -133,12 +133,12 @@ class SalesOutOfProvincePage extends GetView { ),*/ ], ), - floatingActionButton: RFab.add( + /* floatingActionButton: RFab.add( onPressed: () { Get.bottomSheet(addSaleOutOfTheProvinceBottomSheet()); }, ), - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat,*/ ); } From ee489ecb8422b8351a248e2dfadb1da2ad6adfb4 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 16 Jun 2025 09:11:31 +0330 Subject: [PATCH 122/256] fix : out of the province --- .../lib/presentation/pages/sales_out_of_province/view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 73aed55..69f71cb 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -160,7 +160,7 @@ class SalesOutOfProvincePage extends GetView { Container _typeOuterInfoCard({required String title, required String iconPath, required Color foregroundColor}) { return Container( - height: (Get.width - 24) / 2, + height: 180, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), From e54f4ec2c38e3bee6b7b780d9121511d1e9cdbb8 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 16 Jun 2025 10:55:33 +0330 Subject: [PATCH 123/256] feat : sale in province / but out of province / out of province page --- .../pages/buys_out_of_province/logic.dart | 15 + .../pages/buys_out_of_province/view.dart | 13 + .../pages/out_of_province/logic.dart | 147 ++++ .../pages/out_of_province/view.dart | 769 ++++++++++++++++++ .../lib/presentation/pages/root/logic.dart | 24 +- .../lib/presentation/pages/root/view.dart | 69 +- .../pages/sales_out_of_province/logic.dart | 148 +--- .../pages/sales_out_of_province/view.dart | 739 +---------------- .../lib/presentation/routes/pages.dart | 15 +- .../lib/presentation/routes/routes.dart | 5 +- 10 files changed, 1040 insertions(+), 904 deletions(-) create mode 100644 packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart create mode 100644 packages/chicken/lib/presentation/pages/out_of_province/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/out_of_province/view.dart diff --git a/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart new file mode 100644 index 0000000..0466222 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class BuysOutOfProvinceLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart new file mode 100644 index 0000000..d076df7 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class BuysOutOfProvincePage extends GetView { + const BuysOutOfProvincePage({super.key}); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart new file mode 100644 index 0000000..35fd35c --- /dev/null +++ b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart @@ -0,0 +1,147 @@ +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +class OutOfProvinceLogic extends GetxController { + var rootLogic = Get.find(); + Rxn allocatedMadeModel = Rxn(); + RxList rolesProductsModel = RxList(); + + RxList guildsModel = [].obs; + + Rxn stewardFreeDashboard = + Rxn(); + + @override + void onInit() { + super.onInit(); + getStewardDashBord(); + } + + Future getAllocatedMade() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getAllocatedMade( + token: rootLogic.tokenService.accessToken.value!, + page: 1, + ), + onSuccess: (result) { + if (result != null) { + allocatedMadeModel.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } + + void checkVerfication() {} + + void confirmAllocation(ConformAllocation allocation) { + safeCall( + call: () async => await rootLogic.chickenRepository.confirmAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocation: allocation.toJson(), + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + void denyAllocation(String token) { + safeCall( + call: () async => await rootLogic.chickenRepository.denyAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocationToken: token, + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + Future confirmAllAllocations() async { + safeCall( + call: () async => await rootLogic.chickenRepository.confirmAllAllocation( + token: rootLogic.tokenService.accessToken.value!, + allocationTokens: + allocatedMadeModel.value?.results?.map((e) => e.key!).toList() ?? + [], + ), + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stacktrace) {}, + ); + } + + Future getRolesProducts() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getRolesProducts( + token: rootLogic.tokenService.accessToken.value!, + ), + onSuccess: (result) { + if (result != null) { + rolesProductsModel.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } + + Future getGuilds() async {} + + Future addSale() async {} + + void setSelectedGuild(GuildModel value) {} + + void setSelectedProduct(ProductModel value) {} + + Future getStewardDashBord() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getStewardDashboard( + token: rootLogic.tokenService.accessToken.value!, + stratDate: DateTime.now().formattedDashedGregorian, + endDate: DateTime.now().formattedDashedGregorian, + ), + onSuccess: (result) { + if (result != null) { + stewardFreeDashboard.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } + +/* Future getKillHouseDashBord() async { + safeCall( + call: () async => + await rootLogic.chickenRepository.getDashboardKillHouseFreeBar( + token: rootLogic.tokenService.accessToken.value!, + stratDate: DateTime.now().formattedDashedGregorian, + endDate: DateTime.now().formattedDashedGregorian, + ), + onSuccess: (result) { + if (result != null) { + killHouseDashboard.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + }*/ + + Future submitAllocation() async {} + + @override + void dispose() { + rootLogic.inventoryExpandedList.clear(); + super.dispose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/out_of_province/view.dart b/packages/chicken/lib/presentation/pages/out_of_province/view.dart new file mode 100644 index 0000000..07c369b --- /dev/null +++ b/packages/chicken/lib/presentation/pages/out_of_province/view.dart @@ -0,0 +1,769 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class OutOfProvincePage extends GetView { + OutOfProvincePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.bgLight, + appBar: RAppBar( + title: 'رصدطیور', + iconTitle: Assets.vec.chickenSvg.path, + titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: false, + leadingWidth: 130, + leading: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, + children: [ + Assets.vec.cubeSearchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Text('خارج استان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), + ], + ), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _typeOuterInfoCard( + title: 'خرید خارج استان', + iconPath: Assets.vec.cubeBottomRotationSvg.path, + foregroundColor: AppColor.blueNormal, + onTap: () { + Get.toNamed(ChickenRoutes.salesOutOfProvince,id:1); + }, + ), + ), + Expanded( + child: _typeOuterInfoCard( + title: 'فروش خارج استان', + iconPath: Assets.vec.cubeTopRotationSvg.path, + foregroundColor: AppColor.greenDark, + onTap: () { + Get.toNamed(ChickenRoutes.buysOutOfProvince,id: 1); + }, + ), + ), + ], + ), + ), + + /* SizedBox(height: 12), + ObxValue((model) => summaryOfInformation(model.value), controller.stewardFreeDashboard), + Expanded( + child: ListView.separated( + padding: const EdgeInsets.fromLTRB(8, 12, 8, 100), + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 10), + + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + + Text( + 'لرستان - خرم آباد', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), + ), + + buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), + buildRow('وزن خریداری شده', '200 کیلوگرم'), + buildRow('لاشه خریداری شده', '200 عدد'), + ], + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => SizedBox(height: 6), + itemCount: 3, + ), + ),*/ + ], + ), + ); + } + + Widget addSaleOutOfTheProvinceBottomSheet() { + return BaseBottomSheet( + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text('ثبت فروش خارج استان', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + ), + SizedBox(height: 4), + RElevated(text: 'ثبت توزیع/ فروش', onPressed: () {}), + ], + ), + ); + } + + Widget _typeOuterInfoCard({ + required String title, + required String iconPath, + required Color foregroundColor, + VoidCallback? onTap, + }) { + return InkWell( + onTap: onTap, + child: Container( + height: 180, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: foregroundColor), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + Positioned( + top: -41, + child: SvgGenImage.vec( + iconPath, + ).svg(width: 45, height: 45, colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn)), + ), + + Assets.vec.shoppingBasketSvg.svg( + width: 55, + height: 60, + colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ], + ), + const SizedBox(height: 15), + + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: foregroundColor), + ), + ], + ), + ), + ); + } + + Widget summaryOfInformation(StewardFreeBarDashboard? model) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + children: [Text('خلاصه اطلاعات', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal))], + ), + ), + Container( + height: 140, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: model == null + ? const Center(child: CircularProgressIndicator()) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + const SizedBox(height: 12), + buildRow('تعداد کل بارها', model.totalQuantity?.toString() ?? '0'), + buildRow('تعداد کل', model.totalBars?.toString() ?? '0'), + buildRow('وزن کل (کیلوگرم)', model.totalWeight?.toString() ?? '0'), + ], + ), + ), + ], + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ], + ), + ); + } + + /* Widget inventoryWidget() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Align( + alignment: Alignment.centerRight, + child: Text( + 'خرید های خارج استان', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(height: 4), + ObxValue( + (data) => data.isEmpty + ? Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 80, + padding: EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.rootLogic.inventoryList.length, + separatorBuilder: (context, index) => + const SizedBox(height: 8), + itemBuilder: (context, index) { + return ObxValue((expand) { + return GestureDetector( + onTap: () { + controller.rootLogic.toggleExpanded(index); + }, + behavior: HitTestBehavior.opaque, + child: AnimatedContainer( + onEnd: () { + controller + .rootLogic + .inventoryExpandedList[index] = !controller + .rootLogic + .inventoryExpandedList[index]!; + }, + margin: const EdgeInsets.symmetric(vertical: 2), + padding: EdgeInsets.all(6), + curve: Curves.easeInOut, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: AppColor.blueNormal, + width: 1, + ), + ), + duration: const Duration(seconds: 1), + height: expand.keys.contains(index) ? 250 : 80, + child: inventoryItem( + isExpanded: + expand.keys.contains(index) && expand[index]!, + index: index, + model: controller.rootLogic.inventoryList[index], + ), + ), + ); + }, controller.rootLogic.inventoryExpandedList); + }, + ), + controller.rootLogic.inventoryList, + ), + ], + ), + ); + }*/ + + /* Widget inventoryItem({ + required bool isExpanded, + required int index, + required InventoryModel model, + }) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + buildRow('نام محصول', model.name ?? ''), + Visibility( + visible: isExpanded, + child: Column( + spacing: 8, + children: [ + buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), + buildRow( + 'وزن خریدهای آزاد داخل استان (کیلوگرم)', + model.receiveFreeCarcassesWeight.toString(), + ), + buildRow( + 'وزن خریدهای خارج استان (کیلوگرم)', + model.freeBuyingCarcassesWeight.toString(), + ), + buildRow( + 'کل ورودی به انبار (کیلوگرم)', + model.totalFreeBarsCarcassesWeight.toString(), + ), + buildRow( + 'کل فروش (کیلوگرم)', + model.realAllocatedWeight.toString(), + ), + buildRow( + 'مانده انبار (کیلوگرم)', + model.totalRemainWeight.toString(), + ), + ], + ), + ), + ], + ); + } + + + + Widget allocationsMade() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + children: [ + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تخصیصات صورت گرفته', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + RElevated( + text: 'تایید یکجا', + height: 30, + onPressed: () { + controller.confirmAllAllocations(); + }, + ), + ], + ), + SizedBox(height: 4), + ObxValue((data) { + if (data.value == null) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ); + } else if (data.value?.results?.isEmpty ?? true) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), + ); + } else { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2), + height: 700, + padding: const EdgeInsets.all(6), + child: ListView.separated( + padding: const EdgeInsets.all(8.0), + itemCount: data.value?.results?.length ?? 0, + itemBuilder: (BuildContext context, int index) { + final result = data.value!.results![index]; + return Card( + margin: const EdgeInsets.symmetric(vertical: 4.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: const BorderSide( + color: AppColor.blueNormal, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildRow('ردیف', '${index + 1}'), + buildRow( + 'تاریخ ثبت', + result.date!.formattedJalaliDate ?? 'N/A', + ), + buildRow( + 'نوع تخصیص', + result.allocation_type?.faAllocationType ?? 'N/A', + ), + buildRow( + 'مشخصات خریدار', + '${result.to_guilds?.user?.fullname} - ${result.to_guilds?.guilds_name}' ?? + 'N/A', + ), + buildRow( + 'مشخصات فروشنده', + result.steward?.user?.fullname ?? 'N/A', + ), + buildRow( + 'نوع فروش', + result.sell_type?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${result.amount ?? 0} ریال ', + ), + buildRow( + 'قیمت کل', + '${result.total_amount ?? 0} ریال', + ), + buildRow( + 'وزن تخصیصی', + '${result.weight_of_carcasses?.toInt() ?? 0} کیلوگرم', + ), + buildRow( + 'کداحراز', + result.registration_code?.toString() ?? 'N/A', + ), + buildRow( + 'وضعیت کد احراز', + result.system_registration_code == true + ? "ارسال شده" + : "ارسال نشده" ?? 'N/A', + ), + buildRow( + 'افت وزن(کیلوگرم)', + result.weight_loss_of_carcasses + ?.toInt() + .toString() ?? + 'N/A', + ), + buildRow( + 'وضعیت', + result.receiver_state?.faItem ?? 'N/A', + ), + + Row( + spacing: 10, + children: [ + Expanded( + child: RElevated( + height: 40, + text: 'تایید', + onPressed: () { + ConformAllocation confromation = + ConformAllocation( + allocation_key: result.key, + number_of_carcasses: + result.number_of_carcasses, + weight_of_carcasses: result + .weight_of_carcasses + ?.toInt(), + amount: result.amount, + total_amount: result.total_amount, + ); + + controller.confirmAllocation( + confromation, + ); + }, + ), + ), + Expanded( + child: RElevated( + height: 40, + backgroundColor: AppColor.error, + text: 'رد', + onPressed: () { + controller.denyAllocation( + result.key ?? '', + ); + }, + ), + ), + ], + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => + SizedBox(height: 8), + ), + ); + } + }, controller.allocatedMadeModel), + ], + ), + ); + } + + void showAddBottomSheet() { + Get.bottomSheet( + SafeArea( + child: BaseBottomSheet( + height: 700, + child: Padding( + padding: EdgeInsets.only( + left: 16, + right: 16, + top: 16, + bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'ثبت توزیع/ فروش', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), + ), + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material( + type: MaterialType.transparency, + child: productDropDown(), + ), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + Material( + type: MaterialType.transparency, + child: guildsDropDown(), + ), + + const SizedBox(height: 12), + RTextField( + controller: controller.weightController, + keyboardType: TextInputType.number, + onChanged: (p0) { + controller.weight.value = int.tryParse(p0) ?? 0; + }, + label: 'وزن لاشه', + ), + const SizedBox(height: 12), + RTextField( + controller: controller.pricePerKiloController, + onChanged: (p0) { + controller.pricePerKilo.value = int.tryParse(p0) ?? 0; + }, + keyboardType: TextInputType.number, + label: 'قیمت هر کیلو', + ), + const SizedBox(height: 12), + ObxValue( + (p0) => RTextField( + enabled: false, + keyboardType: TextInputType.number, + initText: controller.totalCost.value.toString(), + controller: controller.totalCostController, + label: 'هزینه کل', + ), + controller.totalCost, + ), + const SizedBox(height: 20), + ObxValue((data) { + return RElevated( + text: 'ثبت', + onPressed: data.value + ? () { + controller.submitAllocation(); + } + : null, + ); + }, controller.isValid), + const SizedBox(height: 20), + ], + ), + ), + ), + ), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); + } + + Widget guildsDropDown() { + return ObxValue((p0) { + return DropdownButtonFormField( + value: controller.selectedGuildModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب مباشر/صنف', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.guildsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text( + '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user?.fullname} (${guild.user?.mobile})', + ), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedGuild(value); + controller.checkVerfication(); + } + }, + ); + }, controller.guildsModel); + */ /* return GetBuilder( + builder: (controller) { + return DropdownButtonFormField( + value: controller.selectedGuildModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب مباشر/صنف', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.guildsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text( + '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user + ?.fullname} (${guild.user?.mobile})', + ), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedGuild(value); + } + }, + ); + }, + );*/ /* + } + + Widget productDropDown() { + return GetBuilder( + builder: (controller) { + return DropdownButtonFormField( + value: controller.selectedProductModel.value, + decoration: const InputDecoration( + labelText: 'انتخاب محصول', + border: OutlineInputBorder(), + ), + isExpanded: true, + items: controller.rolesProductsModel.map((guild) { + return DropdownMenuItem( + value: guild, + child: Text('${guild.name}'), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + controller.setSelectedProduct(value); + controller.checkVerfication(); + } + }, + ); + }, + ); + }*/ +} diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 6cc4aeb..7a24a03 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,13 +1,10 @@ import 'package:flutter/material.dart' show Colors; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; -import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; @@ -17,12 +14,22 @@ class RootLogic extends GetxController { RxInt currentPage = 2.obs; List pages = [ Container(color: Colors.red), - SalesOutOfProvincePage(), + OutOfProvincePage(), HomePage(), Container(color: Colors.blue), Container(color: Colors.amber), ]; + final List> navigatorKeys = [ + GlobalKey(), + GlobalKey(), + GlobalKey(), + GlobalKey(), + GlobalKey(), + ]; + + + late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; @@ -30,8 +37,6 @@ class RootLogic extends GetxController { RxList errorLocationType = RxList(); RxMap inventoryExpandedList = RxMap(); - - @override void onInit() { super.onInit(); @@ -51,17 +56,12 @@ class RootLogic extends GetxController { } } - - - - void rootErrorHandler(DioException error) { handleGeneric(error, () { tokenService.deleteTokens(); }); } - void changePage(int index) { currentPage.value = index; } diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 3c7515d..e442966 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -1,8 +1,8 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/chicken.dart'; -import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_core/core.dart'; class RootPage extends GetView { @@ -14,7 +14,40 @@ class RootPage extends GetView { return Scaffold( backgroundColor: AppColor.bgLight, body: IndexedStack( - children: controller.pages, + children: [ + Navigator( + key: controller.navigatorKeys[0], + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[0]), + ), + Navigator( + key: Get.nestedKey(1), + onGenerateRoute: (settings) { + Widget page; + if (settings.name == ChickenRoutes.outOfProvince) { + page = controller.pages[1]; + } else if (settings.name == ChickenRoutes.salesOutOfProvince) { + page = SalesOutOfProvincePage(); + } else if (settings.name == ChickenRoutes.buysOutOfProvince) { + page = BuysOutOfProvincePage(); + } else { + page = controller.pages[1]; + } + return GetPageRoute(page: () => page); + }, + ), + Navigator( + key: controller.navigatorKeys[2], + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]), + ), + Navigator( + key: controller.navigatorKeys[3], + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[3]), + ), + Navigator( + key: controller.navigatorKeys[4], + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[4]), + ), + ], index: data.value, ), bottomNavigationBar: WaveBottomNavigation( @@ -62,11 +95,11 @@ class RootPage extends GetView { ), ], onPageChanged: (index) { - controller.changePage(index); + controller.changePage(index); }, ), ); - },controller.currentPage); + }, controller.currentPage); } Container _todayShipmentWidget() { @@ -496,19 +529,19 @@ class RootPage extends GetView { ), child: model != null ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 10, - children: [ - Text( - 'اطلاعات ارسالی', - textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), - ], - ) + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Text( + 'اطلاعات ارسالی', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + const SizedBox(height: 12), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + ], + ) : const Center(child: CircularProgressIndicator()), ); } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 3f6b534..a580de0 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,147 +1,15 @@ -import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; -import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; -import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; -import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; -import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; -import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { - var rootLogic = Get.find(); - Rxn allocatedMadeModel = Rxn(); - RxList rolesProductsModel = RxList(); - - RxList guildsModel = [].obs; - - Rxn stewardFreeDashboard = - Rxn(); + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } @override - void onInit() { - super.onInit(); - getStewardDashBord(); - } - - Future getAllocatedMade() async { - safeCall( - call: () async => await rootLogic.chickenRepository.getAllocatedMade( - token: rootLogic.tokenService.accessToken.value!, - page: 1, - ), - onSuccess: (result) { - if (result != null) { - allocatedMadeModel.value = result; - } - }, - onError: (error, stacktrace) {}, - ); - } - - void checkVerfication() {} - - void confirmAllocation(ConformAllocation allocation) { - safeCall( - call: () async => await rootLogic.chickenRepository.confirmAllocation( - token: rootLogic.tokenService.accessToken.value!, - allocation: allocation.toJson(), - ), - onSuccess: (result) { - getAllocatedMade(); - }, - onError: (error, stacktrace) {}, - ); - } - - void denyAllocation(String token) { - safeCall( - call: () async => await rootLogic.chickenRepository.denyAllocation( - token: rootLogic.tokenService.accessToken.value!, - allocationToken: token, - ), - onSuccess: (result) { - getAllocatedMade(); - }, - onError: (error, stacktrace) {}, - ); - } - - Future confirmAllAllocations() async { - safeCall( - call: () async => await rootLogic.chickenRepository.confirmAllAllocation( - token: rootLogic.tokenService.accessToken.value!, - allocationTokens: - allocatedMadeModel.value?.results?.map((e) => e.key!).toList() ?? - [], - ), - onSuccess: (result) { - getAllocatedMade(); - }, - onError: (error, stacktrace) {}, - ); - } - - Future getRolesProducts() async { - safeCall( - call: () async => await rootLogic.chickenRepository.getRolesProducts( - token: rootLogic.tokenService.accessToken.value!, - ), - onSuccess: (result) { - if (result != null) { - rolesProductsModel.value = result; - } - }, - onError: (error, stacktrace) {}, - ); - } - - Future getGuilds() async {} - - Future addSale() async {} - - void setSelectedGuild(GuildModel value) {} - - void setSelectedProduct(ProductModel value) {} - - Future getStewardDashBord() async { - safeCall( - call: () async => await rootLogic.chickenRepository.getStewardDashboard( - token: rootLogic.tokenService.accessToken.value!, - stratDate: DateTime.now().formattedDashedGregorian, - endDate: DateTime.now().formattedDashedGregorian, - ), - onSuccess: (result) { - if (result != null) { - stewardFreeDashboard.value = result; - } - }, - onError: (error, stacktrace) {}, - ); - } - -/* Future getKillHouseDashBord() async { - safeCall( - call: () async => - await rootLogic.chickenRepository.getDashboardKillHouseFreeBar( - token: rootLogic.tokenService.accessToken.value!, - stratDate: DateTime.now().formattedDashedGregorian, - endDate: DateTime.now().formattedDashedGregorian, - ), - onSuccess: (result) { - if (result != null) { - killHouseDashboard.value = result; - } - }, - onError: (error, stacktrace) {}, - ); - }*/ - - Future submitAllocation() async {} - - @override - void dispose() { - rootLogic.inventoryExpandedList.clear(); - super.dispose(); + void onClose() { + // TODO: implement onClose + super.onClose(); } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 69f71cb..d4a82a3 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -1,23 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; class SalesOutOfProvincePage extends GetView { - SalesOutOfProvincePage({super.key}); + const SalesOutOfProvincePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'رصدطیور', iconTitle: Assets.vec.chickenSvg.path, titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), centerTitle: true, hasBack: false, - leadingWidth: 130, + leadingWidth: 155, leading: Row( mainAxisSize: MainAxisSize.min, spacing: 6, @@ -27,10 +25,10 @@ class SalesOutOfProvincePage extends GetView { height: 24, colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), - Text('خارج استان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), + Text('خرید خارج استان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), ], ), - /* additionalActions: [ + additionalActions: [ Assets.vec.searchSvg.svg( width: 24, height: 24, @@ -43,734 +41,11 @@ class SalesOutOfProvincePage extends GetView { colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), SizedBox(width: 8), - ],*/ - ), - body: Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - spacing: 8, - children: [ - Expanded( - child: _typeOuterInfoCard( - title: 'خرید خارج استان', - iconPath: Assets.vec.cubeBottomRotationSvg.path, - foregroundColor: AppColor.blueNormal, - ), - ), - Expanded( - child: _typeOuterInfoCard( - title: 'فروش خارج استان', - iconPath: Assets.vec.cubeTopRotationSvg.path, - foregroundColor: AppColor.greenDark, - ), - ), - ], - ), - ), - - /* SizedBox(height: 12), - ObxValue((model) => summaryOfInformation(model.value), controller.stewardFreeDashboard), - Expanded( - child: ListView.separated( - padding: const EdgeInsets.fromLTRB(8, 12, 8, 100), - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemBuilder: (BuildContext context, int index) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 10), - - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - - Text( - 'لرستان - خرم آباد', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - - Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), - ), - - buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), - buildRow('وزن خریداری شده', '200 کیلوگرم'), - buildRow('لاشه خریداری شده', '200 عدد'), - ], - ), - ); - }, - separatorBuilder: (BuildContext context, int index) => SizedBox(height: 6), - itemCount: 3, - ), - ),*/ ], ), - /* floatingActionButton: RFab.add( - onPressed: () { - Get.bottomSheet(addSaleOutOfTheProvinceBottomSheet()); - }, - ), - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat,*/ + body: Container(color: Colors.amber), + floatingActionButton: RFab.add(onPressed: () {}), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } - - Widget addSaleOutOfTheProvinceBottomSheet() { - return BaseBottomSheet( - child: Column( - children: [ - const SizedBox(height: 20), - Align( - alignment: Alignment.centerRight, - child: Text('ثبت فروش خارج استان', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), - ), - SizedBox(height: 4), - RElevated(text: 'ثبت توزیع/ فروش', onPressed: () {}), - ], - ), - ); - } - - Container _typeOuterInfoCard({required String title, required String iconPath, required Color foregroundColor}) { - return Container( - height: 180, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: foregroundColor), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Stack( - clipBehavior: Clip.none, - alignment: Alignment.center, - children: [ - - Positioned( - top: -41, - child: SvgGenImage.vec( - iconPath, - ).svg(width: 45, height: 45, colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn)), - ), - - - Assets.vec.shoppingBasketSvg.svg( - width: 55, - height: 60, - colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn), - fit: BoxFit.cover, - ), - ], - ), - const SizedBox(height: 15), - - Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: foregroundColor), - ), - ], - ), - ); - } - - Widget summaryOfInformation(StewardFreeBarDashboard? model) { - return Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Row( - children: [Text('خلاصه اطلاعات', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal))], - ), - ), - Container( - height: 140, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: model == null - ? const Center(child: CircularProgressIndicator()) - : Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 10, - children: [ - const SizedBox(height: 12), - buildRow('تعداد کل بارها', model.totalQuantity?.toString() ?? '0'), - buildRow('تعداد کل', model.totalBars?.toString() ?? '0'), - buildRow('وزن کل (کیلوگرم)', model.totalWeight?.toString() ?? '0'), - ], - ), - ), - ], - ); - } - - Widget buildRow(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - Flexible( - flex: 2, - child: Text( - value, - textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - ], - ), - ); - } - - /* Widget inventoryWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Align( - alignment: Alignment.centerRight, - child: Text( - 'خرید های خارج استان', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(height: 4), - ObxValue( - (data) => data.isEmpty - ? Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 80, - padding: EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ) - : ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: controller.rootLogic.inventoryList.length, - separatorBuilder: (context, index) => - const SizedBox(height: 8), - itemBuilder: (context, index) { - return ObxValue((expand) { - return GestureDetector( - onTap: () { - controller.rootLogic.toggleExpanded(index); - }, - behavior: HitTestBehavior.opaque, - child: AnimatedContainer( - onEnd: () { - controller - .rootLogic - .inventoryExpandedList[index] = !controller - .rootLogic - .inventoryExpandedList[index]!; - }, - margin: const EdgeInsets.symmetric(vertical: 2), - padding: EdgeInsets.all(6), - curve: Curves.easeInOut, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.blueNormal, - width: 1, - ), - ), - duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 250 : 80, - child: inventoryItem( - isExpanded: - expand.keys.contains(index) && expand[index]!, - index: index, - model: controller.rootLogic.inventoryList[index], - ), - ), - ); - }, controller.rootLogic.inventoryExpandedList); - }, - ), - controller.rootLogic.inventoryList, - ), - ], - ), - ); - }*/ - - /* Widget inventoryItem({ - required bool isExpanded, - required int index, - required InventoryModel model, - }) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - buildRow('نام محصول', model.name ?? ''), - Visibility( - visible: isExpanded, - child: Column( - spacing: 8, - children: [ - buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), - buildRow( - 'وزن خریدهای آزاد داخل استان (کیلوگرم)', - model.receiveFreeCarcassesWeight.toString(), - ), - buildRow( - 'وزن خریدهای خارج استان (کیلوگرم)', - model.freeBuyingCarcassesWeight.toString(), - ), - buildRow( - 'کل ورودی به انبار (کیلوگرم)', - model.totalFreeBarsCarcassesWeight.toString(), - ), - buildRow( - 'کل فروش (کیلوگرم)', - model.realAllocatedWeight.toString(), - ), - buildRow( - 'مانده انبار (کیلوگرم)', - model.totalRemainWeight.toString(), - ), - ], - ), - ), - ], - ); - } - - - - Widget allocationsMade() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'تخصیصات صورت گرفته', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - RElevated( - text: 'تایید یکجا', - height: 30, - onPressed: () { - controller.confirmAllAllocations(); - }, - ), - ], - ), - SizedBox(height: 4), - ObxValue((data) { - if (data.value == null) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ); - } else if (data.value?.results?.isEmpty ?? true) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), - ); - } else { - return Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 700, - padding: const EdgeInsets.all(6), - child: ListView.separated( - padding: const EdgeInsets.all(8.0), - itemCount: data.value?.results?.length ?? 0, - itemBuilder: (BuildContext context, int index) { - final result = data.value!.results![index]; - return Card( - margin: const EdgeInsets.symmetric(vertical: 4.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: const BorderSide( - color: AppColor.blueNormal, - width: 1, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildRow('ردیف', '${index + 1}'), - buildRow( - 'تاریخ ثبت', - result.date!.formattedJalaliDate ?? 'N/A', - ), - buildRow( - 'نوع تخصیص', - result.allocation_type?.faAllocationType ?? 'N/A', - ), - buildRow( - 'مشخصات خریدار', - '${result.to_guilds?.user?.fullname} - ${result.to_guilds?.guilds_name}' ?? - 'N/A', - ), - buildRow( - 'مشخصات فروشنده', - result.steward?.user?.fullname ?? 'N/A', - ), - buildRow( - 'نوع فروش', - result.sell_type?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${result.amount ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${result.total_amount ?? 0} ریال', - ), - buildRow( - 'وزن تخصیصی', - '${result.weight_of_carcasses?.toInt() ?? 0} کیلوگرم', - ), - buildRow( - 'کداحراز', - result.registration_code?.toString() ?? 'N/A', - ), - buildRow( - 'وضعیت کد احراز', - result.system_registration_code == true - ? "ارسال شده" - : "ارسال نشده" ?? 'N/A', - ), - buildRow( - 'افت وزن(کیلوگرم)', - result.weight_loss_of_carcasses - ?.toInt() - .toString() ?? - 'N/A', - ), - buildRow( - 'وضعیت', - result.receiver_state?.faItem ?? 'N/A', - ), - - Row( - spacing: 10, - children: [ - Expanded( - child: RElevated( - height: 40, - text: 'تایید', - onPressed: () { - ConformAllocation confromation = - ConformAllocation( - allocation_key: result.key, - number_of_carcasses: - result.number_of_carcasses, - weight_of_carcasses: result - .weight_of_carcasses - ?.toInt(), - amount: result.amount, - total_amount: result.total_amount, - ); - - controller.confirmAllocation( - confromation, - ); - }, - ), - ), - Expanded( - child: RElevated( - height: 40, - backgroundColor: AppColor.error, - text: 'رد', - onPressed: () { - controller.denyAllocation( - result.key ?? '', - ); - }, - ), - ), - ], - ), - ], - ), - ), - ); - }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), - ), - ); - } - }, controller.allocatedMadeModel), - ], - ), - ); - } - - void showAddBottomSheet() { - Get.bottomSheet( - SafeArea( - child: BaseBottomSheet( - height: 700, - child: Padding( - padding: EdgeInsets.only( - left: 16, - right: 16, - top: 16, - bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'ثبت توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), - ), - const SizedBox(height: 12), - Material( - type: MaterialType.transparency, - child: productDropDown(), - ), - const SizedBox(height: 12), - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش اختصاصی', style: AppFonts.yekan14), - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش آزاد', style: AppFonts.yekan14), - ], - ); - }, controller.saleType), - ), - const SizedBox(height: 12), - - Material( - type: MaterialType.transparency, - child: guildsDropDown(), - ), - - const SizedBox(height: 12), - RTextField( - controller: controller.weightController, - keyboardType: TextInputType.number, - onChanged: (p0) { - controller.weight.value = int.tryParse(p0) ?? 0; - }, - label: 'وزن لاشه', - ), - const SizedBox(height: 12), - RTextField( - controller: controller.pricePerKiloController, - onChanged: (p0) { - controller.pricePerKilo.value = int.tryParse(p0) ?? 0; - }, - keyboardType: TextInputType.number, - label: 'قیمت هر کیلو', - ), - const SizedBox(height: 12), - ObxValue( - (p0) => RTextField( - enabled: false, - keyboardType: TextInputType.number, - initText: controller.totalCost.value.toString(), - controller: controller.totalCostController, - label: 'هزینه کل', - ), - controller.totalCost, - ), - const SizedBox(height: 20), - ObxValue((data) { - return RElevated( - text: 'ثبت', - onPressed: data.value - ? () { - controller.submitAllocation(); - } - : null, - ); - }, controller.isValid), - const SizedBox(height: 20), - ], - ), - ), - ), - ), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ); - } - - Widget guildsDropDown() { - return ObxValue((p0) { - return DropdownButtonFormField( - value: controller.selectedGuildModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب مباشر/صنف', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.guildsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text( - '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user?.fullname} (${guild.user?.mobile})', - ), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedGuild(value); - controller.checkVerfication(); - } - }, - ); - }, controller.guildsModel); - */ /* return GetBuilder( - builder: (controller) { - return DropdownButtonFormField( - value: controller.selectedGuildModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب مباشر/صنف', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.guildsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text( - '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user - ?.fullname} (${guild.user?.mobile})', - ), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedGuild(value); - } - }, - ); - }, - );*/ /* - } - - Widget productDropDown() { - return GetBuilder( - builder: (controller) { - return DropdownButtonFormField( - value: controller.selectedProductModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب محصول', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.rolesProductsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text('${guild.name}'), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedProduct(value); - controller.checkVerfication(); - } - }, - ); - }, - ); - }*/ } diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 437e079..a226f5e 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,8 +1,11 @@ import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/logic.dart'; @@ -24,7 +27,7 @@ sealed class ChickenPages { Get.put(RootLogic()); Get.lazyPut(()=>HomeLogic()); Get.lazyPut(()=>SalesInProvinceLogic()); - Get.lazyPut(()=>SalesOutOfProvinceLogic()); + Get.lazyPut(()=>OutOfProvinceLogic()); }), ), @@ -65,5 +68,15 @@ sealed class ChickenPages { Get.put(RootLogic()); }), ), + + GetPage( + name: ChickenRoutes.buysOutOfProvince, + page: () => BuysOutOfProvincePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.put(BuysOutOfProvinceLogic()); + Get.put(RootLogic()); + }), + ), ]; } diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index 9ecbbdc..c209277 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -1,11 +1,14 @@ sealed class ChickenRoutes { ChickenRoutes._(); + static const _base = '/init'; static const init = '$_base/init'; static const home = '$_base/home'; static const enteringTheWarehouse = '$_base/enteringTheWarehouse'; static const salesInProvince = '$_base/SalesInProvincePage'; - static const salesOutOfProvince = '$_base/SalesOutOfProvincePage'; + static const outOfProvince = '$_base/OutOfProvincePage'; + static const salesOutOfProvince = '$outOfProvince/saleOutOfProvince'; + static const buysOutOfProvince = '$outOfProvince/buyOutOfProvince'; } From 4c40bfa43e6324bb695d7c57b2cf891001e58fd3 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 16 Jun 2025 12:54:28 +0330 Subject: [PATCH 124/256] feat : sale out province --- .../pages/sales_out_of_province/logic.dart | 2 + .../pages/sales_out_of_province/view.dart | 180 +++++++++++++++++- .../lib/presentation/routes/pages.dart | 16 ++ 3 files changed, 196 insertions(+), 2 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index a580de0..aaadad3 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,6 +1,8 @@ import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { + RxBool isExpanded = false.obs; + RxList isExpandedList = [].obs; @override void onReady() { // TODO: implement onReady diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index d4a82a3..7d36522 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; @@ -14,7 +15,10 @@ class SalesOutOfProvincePage extends GetView { iconTitle: Assets.vec.chickenSvg.path, titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), centerTitle: true, - hasBack: false, + hasBack: true, + onBackPressed: () { + Get.back(id: 1); + }, leadingWidth: 155, leading: Row( mainAxisSize: MainAxisSize.min, @@ -43,9 +47,181 @@ class SalesOutOfProvincePage extends GetView { SizedBox(width: 8), ], ), - body: Container(color: Colors.amber), + body: ListView.separated( + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) { + return ObxValue( + (data) => GestureDetector( + onTap: () { + if(data.contains(index)){ + controller.isExpandedList.remove(index); + }else{ + controller.isExpandedList.add(index); + } + + }, + child: AnimatedContainer( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + height: data.contains(index)? 210 : 56, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedContainer( + width: Get.width - 30, + duration: Duration(milliseconds: 400), + height: data.contains(index) ? 210 : 56, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), + ), + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text( + '1403/5/5', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + Text( + 'افلاک', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + Text( + 'kg 200 مرغ گرم ', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + Text( + 'لرستان-خرم آباد', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + + Icon(CupertinoIcons.chevron_down,size: 12,) + ], + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + + Text( + 'لرستان - خرم آباد', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), + ), + + buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), + buildRow('وزن خریداری شده', '200 کیلوگرم'), + buildRow('لاشه خریداری شده', '200 عدد'), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Icon(CupertinoIcons.chevron_up,size: 12,) + ], + ) + ], + ), + ), + crossFadeState: data.contains(index)?CrossFadeState.showSecond:CrossFadeState.showFirst, + duration: Duration(milliseconds: 200), + ), + ), + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), + ), + ), + ], + ), + ), + ), + controller.isExpandedList, + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemCount: 5, + ), floatingActionButton: RFab.add(onPressed: () {}), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ], + ), + ); + } + + } diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index a226f5e..f86a54f 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -6,6 +6,7 @@ import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/view. import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/logic.dart'; @@ -28,6 +29,7 @@ sealed class ChickenPages { Get.lazyPut(()=>HomeLogic()); Get.lazyPut(()=>SalesInProvinceLogic()); Get.lazyPut(()=>OutOfProvinceLogic()); + Get.lazyPut(()=>SalesOutOfProvinceLogic()); }), ), @@ -59,6 +61,20 @@ sealed class ChickenPages { Get.put(RootLogic()); }), ), + + + + GetPage( + name: ChickenRoutes.outOfProvince, + page: () => OutOfProvincePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.put(OutOfProvinceLogic()); + Get.put(SalesOutOfProvinceLogic()); + Get.put(RootLogic()); + }), + ), + GetPage( name: ChickenRoutes.salesOutOfProvince, page: () => SalesOutOfProvincePage(), From f5088027baf5b33f51a35d6953c4f9e0759c576d Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 17 Jun 2025 11:46:09 +0330 Subject: [PATCH 125/256] feat: sale out of the province --- .../lib/presentation/pages/root/view.dart | 154 ++++++++++---- .../pages/sales_out_of_province/view.dart | 198 +++++++++++++----- packages/core/lib/core.dart | 1 + .../widget/app_bar/r_app_bar.dart | 10 +- packages/core/lib/utils/route_utils.dart | 24 +++ 5 files changed, 286 insertions(+), 101 deletions(-) create mode 100644 packages/core/lib/utils/route_utils.dart diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index e442966..81c54f0 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; -import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_core/core.dart'; class RootPage extends GetView { @@ -17,35 +15,37 @@ class RootPage extends GetView { children: [ Navigator( key: controller.navigatorKeys[0], - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[0]), + onGenerateRoute: (settings) => + GetPageRoute(page: () => controller.pages[0]), ), Navigator( key: Get.nestedKey(1), onGenerateRoute: (settings) { - Widget page; - if (settings.name == ChickenRoutes.outOfProvince) { - page = controller.pages[1]; - } else if (settings.name == ChickenRoutes.salesOutOfProvince) { - page = SalesOutOfProvincePage(); - } else if (settings.name == ChickenRoutes.buysOutOfProvince) { - page = BuysOutOfProvincePage(); - } else { - page = controller.pages[1]; - } - return GetPageRoute(page: () => page); + final page = ChickenPages.pages.firstWhere( + (e) => e.name == settings.name, + orElse: () => ChickenPages.pages.firstWhere( + (e) => e.name == ChickenRoutes.outOfProvince, + ), + ); + + return buildRouteFromGetPage(page); + }, ), Navigator( key: controller.navigatorKeys[2], - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]), + onGenerateRoute: (settings) => + GetPageRoute(page: () => controller.pages[2]), ), Navigator( key: controller.navigatorKeys[3], - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[3]), + onGenerateRoute: (settings) => + GetPageRoute(page: () => controller.pages[3]), ), Navigator( key: controller.navigatorKeys[4], - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[4]), + onGenerateRoute: (settings) => + GetPageRoute(page: () => controller.pages[4]), ), ], index: data.value, @@ -106,7 +106,10 @@ class RootPage extends GetView { return Container( height: 70, width: Get.width / 2, - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), clipBehavior: Clip.hardEdge, child: Row( children: [ @@ -127,7 +130,9 @@ class RootPage extends GetView { Text( 'بارهای امروز', textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), ), ], ), @@ -177,19 +182,26 @@ class RootPage extends GetView { height: 82, decoration: BoxDecoration( color: bgLabelColor, - borderRadius: BorderRadius.only(topRight: Radius.circular(8), bottomRight: Radius.circular(8)), + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 4, children: [ - SvgGenImage.vec( - iconPath, - ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), + ), Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + style: AppFonts.yekan14.copyWith( + color: AppColor.mediumGreyDarkActive, + ), ), ], ), @@ -200,7 +212,10 @@ class RootPage extends GetView { child: Container( decoration: BoxDecoration( color: bgDescriptionColor, - borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -209,12 +224,16 @@ class RootPage extends GetView { Text( description, textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + style: AppFonts.yekan16.copyWith( + color: AppColor.mediumGreyDarkActive, + ), ), Text( unit, textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + style: AppFonts.yekan12.copyWith( + color: AppColor.mediumGreyDarkActive, + ), ), ], ), @@ -259,17 +278,23 @@ class RootPage extends GetView { Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + style: AppFonts.yekan14.copyWith( + color: AppColor.mediumGreyDarkActive, + ), ), Text( description, textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + style: AppFonts.yekan16.copyWith( + color: AppColor.mediumGreyDarkActive, + ), ), Text( unit, textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + style: AppFonts.yekan12.copyWith( + color: AppColor.mediumGreyDarkActive, + ), ), ], ), @@ -288,9 +313,11 @@ class RootPage extends GetView { ), ), child: Center( - child: SvgGenImage.vec( - iconPath, - ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), + ), ), ), ), @@ -299,7 +326,11 @@ class RootPage extends GetView { ); } - Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { + Widget widelyUsed({ + required String title, + required String iconPath, + required VoidCallback onTap, + }) { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, @@ -311,14 +342,18 @@ class RootPage extends GetView { padding: EdgeInsets.all(4), decoration: ShapeDecoration( color: const Color(0xFFBECDFF), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), ), child: Container( width: 40, height: 40, decoration: ShapeDecoration( color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), ), child: SvgGenImage.vec(iconPath).svg( width: 24, @@ -328,7 +363,10 @@ class RootPage extends GetView { ), ), ), - Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text( + title, + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), ], ); } @@ -345,16 +383,24 @@ class RootPage extends GetView { padding: EdgeInsets.all(4), decoration: ShapeDecoration( color: const Color(0xFFD9F7F0), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), ), child: Assets.vec.messageAddSvg.svg( width: 40, height: 40, - colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppColor.greenNormal, + BlendMode.srcIn, + ), fit: BoxFit.cover, ), ), - Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), + Text( + 'افزودن', + style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover), + ), ], ); } @@ -501,7 +547,9 @@ class RootPage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), ), Flexible( @@ -509,7 +557,9 @@ class RootPage extends GetView { child: Text( value, textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), ), ], @@ -535,18 +585,30 @@ class RootPage extends GetView { Text( 'اطلاعات ارسالی', textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), ), const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + buildRow( + 'فروش و توزیع داخل استان (کیلوگرم)', + model.stewardAllocationsWeight!.toInt().toString(), + ), + buildRow( + 'فروش و توزیع خارج استان (کیلوگرم)', + model.freeSalesWeight!.toInt().toString(), + ), ], ) : const Center(child: CircularProgressIndicator()), ); } - Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { + Widget cardWidget({ + required String title, + required String iconPath, + required VoidCallback onTap, + }) { return Container( width: Get.width / 4, height: 130, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 7d36522..cc17bb4 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -11,8 +11,6 @@ class SalesOutOfProvincePage extends GetView { Widget build(BuildContext context) { return Scaffold( appBar: RAppBar( - title: 'رصدطیور', - iconTitle: Assets.vec.chickenSvg.path, titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), centerTitle: true, hasBack: true, @@ -24,12 +22,18 @@ class SalesOutOfProvincePage extends GetView { mainAxisSize: MainAxisSize.min, spacing: 6, children: [ - Assets.vec.cubeSearchSvg.svg( + Assets.vec.chickenSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + colorFilter: const ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + Text( + 'رصدطیور', + style: AppFonts.yekan16Bold.copyWith(color: Colors.white), ), - Text('خرید خارج استان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), ], ), additionalActions: [ @@ -47,123 +51,182 @@ class SalesOutOfProvincePage extends GetView { SizedBox(width: 8), ], ), - body: ListView.separated( - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) { - return ObxValue( - (data) => GestureDetector( + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + routePageWidget(), + saleListWidget(), + ], + ), + floatingActionButton: RFab.add(onPressed: () {}), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + ListView saleListWidget() { + return ListView.separated( + shrinkWrap: true, + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) { + return ObxValue( + (data) => saleListItem(data, index), + controller.isExpandedList, + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemCount: 5, + ); + } + + GestureDetector saleListItem(RxList data, int index) { + return GestureDetector( onTap: () { - if(data.contains(index)){ + if (data.contains(index)) { controller.isExpandedList.remove(index); - }else{ + } else { controller.isExpandedList.add(index); } - }, child: AnimatedContainer( duration: Duration(milliseconds: 400), alignment: Alignment.center, - height: data.contains(index)? 210 : 56, + height: data.contains(index) ? 210 : 56, child: Stack( clipBehavior: Clip.none, alignment: Alignment.centerRight, children: [ AnimatedContainer( width: Get.width - 30, - duration: Duration(milliseconds: 400), + duration: Duration(milliseconds: 300), height: data.contains(index) ? 210 : 56, alignment: Alignment.center, decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), + border: Border.all( + width: 0.5, + color: AppColor.darkGreyNormal, + ), ), child: AnimatedCrossFade( alignment: Alignment.center, firstChild: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( '1403/5/5', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), ), Text( 'افلاک', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), ), Text( 'kg 200 مرغ گرم ', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), ), Text( 'لرستان-خرم آباد', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), ), - Icon(CupertinoIcons.chevron_down,size: 12,) + Icon(CupertinoIcons.chevron_down, size: 12), ], ), secondChild: Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), child: Column( spacing: 8, children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ Assets.vec.editSvg.svg( width: 20, height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), ), Text( 'لرستان - خرم آباد', textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, + ), ), Assets.vec.trashSvg.svg( width: 20, height: 20, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), ), ], ), Container( height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), + padding: EdgeInsets.symmetric( + horizontal: 4, + ), decoration: ShapeDecoration( color: AppColor.blueLight, shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), + side: BorderSide( + width: 1, + color: AppColor.blueLightHover, + ), borderRadius: BorderRadius.circular(8), ), ), - child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), + child: buildRow( + 'تاریخ', + '07:15:00 - 1402/07/01', + ), ), - buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), + buildRow( + 'مشخصات فروشنده', + 'افلاک - 09203659874', + ), buildRow('وزن خریداری شده', '200 کیلوگرم'), buildRow('لاشه خریداری شده', '200 عدد'), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Icon(CupertinoIcons.chevron_up,size: 12,) + Icon(CupertinoIcons.chevron_up, size: 12), ], - ) + ), ], ), ), - crossFadeState: data.contains(index)?CrossFadeState.showSecond:CrossFadeState.showFirst, - duration: Duration(milliseconds: 200), + crossFadeState: data.contains(index) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), ), ), Positioned( @@ -175,25 +238,58 @@ class SalesOutOfProvincePage extends GetView { decoration: BoxDecoration( color: AppColor.greenLightHover, borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + border: Border.all( + width: 0.50, + color: AppColor.greenDarkActive, + ), ), alignment: Alignment.center, - child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith( + color: Colors.black, + ), + ), ), ), ], ), ), + ); + } + + Row routePageWidget() { + return Row( + children: [ + SizedBox(width: 8), + RichText( + text: TextSpan( + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + children: [ + WidgetSpan( + child: Row( + children: [ + Assets.vec.cubeSearchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + SizedBox(width: 6,) + ], + ), + ), + + TextSpan(text: 'خارج استان'), + TextSpan(text: '/'), + TextSpan(text: 'خرید'), + ], + ), ), - controller.isExpandedList, - ); - }, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemCount: 5, - ), - floatingActionButton: RFab.add(onPressed: () {}), - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, - ); + ], + ); } Widget buildRow(String title, String value) { @@ -207,7 +303,9 @@ class SalesOutOfProvincePage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), ), Flexible( @@ -215,13 +313,13 @@ class SalesOutOfProvincePage extends GetView { child: Text( value, textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), ), ], ), ); } - - } diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 1ad8104..a2b70e5 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -45,3 +45,4 @@ export 'utils/safe_call_utils.dart'; export 'utils/date_time_utils.dart'; export 'utils/num_utils.dart'; export 'utils/map_utils.dart'; +export 'utils/route_utils.dart'; diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index d48c8c2..b14fe91 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; class RAppBar extends StatelessWidget implements PreferredSizeWidget { - final String title; + final String? title; final String? iconTitle; final Color backgroundColor; final Color iconColor; @@ -18,7 +18,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { const RAppBar({ super.key, - required this.title, + this.title, this.iconTitle, this.backgroundColor = AppColor.blueNormal, this.iconColor = Colors.white, @@ -43,15 +43,15 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { centerTitle: centerTitle, titleTextStyle: titleTextStyle ?? AppFonts.yekan16.copyWith(color: Colors.white), - title: Row( + title:title != null ? Row( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Text(title), + Text(title!), if (iconTitle != null) ...{const SizedBox(width: 8)}, if (iconTitle != null) ...{SvgGenImage.vec(iconTitle!).svg(width: 24, height: 24)}, ], - ), + ): null, leadingWidth: leadingWidth?.toDouble(), leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 6), child: leading) : null, titleSpacing: 8, diff --git a/packages/core/lib/utils/route_utils.dart b/packages/core/lib/utils/route_utils.dart new file mode 100644 index 0000000..64e23d3 --- /dev/null +++ b/packages/core/lib/utils/route_utils.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +GetPageRoute buildRouteFromGetPage(GetPage page) { + return GetPageRoute( + page: page.page, + settings: RouteSettings(name: page.name), + transition: page.transition, + curve: page.curve, + binding: page.binding, + bindings: page.bindings, + routeName: page.name, + title: page.title, + gestureWidth: page.gestureWidth, + alignment: page.alignment, + maintainState: page.maintainState, + customTransition: page.customTransition, + transitionDuration: page.transitionDuration ?? const Duration(milliseconds: 300), + fullscreenDialog: page.fullscreenDialog, + opaque: page.opaque, + popGesture: page.popGesture, + showCupertinoParallax: page.showCupertinoParallax, + ); +} \ No newline at end of file From cda87cba95cf48241eefad646a31dde08c60de08 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 17 Jun 2025 11:47:36 +0330 Subject: [PATCH 126/256] feat: sale out of the province --- .../lib/presentation/pages/sales_out_of_province/view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index cc17bb4..b44b6f9 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -55,7 +55,7 @@ class SalesOutOfProvincePage extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ routePageWidget(), - saleListWidget(), + Expanded(child: saleListWidget()), ], ), floatingActionButton: RFab.add(onPressed: () {}), From fc4295e5320939d5626312d88acb3c16f8a3b054 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 17 Jun 2025 14:53:03 +0330 Subject: [PATCH 127/256] feat: new changes in StewardFreeBar model and some change ui --- .../roles_products/roles_products.dart | 108 ++--- .../steward_free_bar/steward_free_bar.dart | 96 ++-- .../steward_free_bar.freezed.dart | 412 +++++++++--------- .../steward_free_bar/steward_free_bar.g.dart | 192 ++++---- .../pages/sales_out_of_province/logic.dart | 12 + .../pages/sales_out_of_province/view.dart | 400 +++++++++-------- 6 files changed, 611 insertions(+), 609 deletions(-) diff --git a/packages/chicken/lib/data/models/response/roles_products/roles_products.dart b/packages/chicken/lib/data/models/response/roles_products/roles_products.dart index 4be9533..34b30f0 100644 --- a/packages/chicken/lib/data/models/response/roles_products/roles_products.dart +++ b/packages/chicken/lib/data/models/response/roles_products/roles_products.dart @@ -1,4 +1,3 @@ - import 'package:freezed_annotation/freezed_annotation.dart'; part 'roles_products.freezed.dart'; @@ -6,62 +5,63 @@ part 'roles_products.g.dart'; @freezed abstract class RolesProductsModel with _$RolesProductsModel { -factory RolesProductsModel({ -required List products, -}) = _RolesProductsModel; + factory RolesProductsModel({required List products}) = + _RolesProductsModel; -factory RolesProductsModel.fromJson(Map json) => _$RolesProductsModelFromJson(json); + factory RolesProductsModel.fromJson(Map json) => + _$RolesProductsModelFromJson(json); } @freezed abstract class ProductModel with _$ProductModel { -factory ProductModel({ -int? id, -String? key, -String? create_date, // Changed from createDate, removed @JsonKey -String? modify_date, // Changed from modifyDate, removed @JsonKey -bool? trash, -String? name, - int? provinceGovernmentalCarcassesQuantity, - int? provinceGovernmentalCarcassesWeight, -int? provinceFreeCarcassesQuantity, -int? provinceFreeCarcassesWeight, -int? receiveGovernmentalCarcassesQuantity, -int? receiveGovernmentalCarcassesWeight, - int? receiveFreeCarcassesQuantity, -int? receiveFreeCarcassesWeight, - int? freeBuyingCarcassesQuantity, -int? freeBuyingCarcassesWeight, - int? totalGovernmentalCarcassesQuantity, -int? totalGovernmentalCarcassesWeight, -int? totalFreeBarsCarcassesQuantity, - int? totalFreeBarsCarcassesWeight, - double? weightAverage, -int? totalCarcassesQuantity, -int? totalCarcassesWeight, - int? freezingQuantity, -int? freezingWeight, -int? lossWeight, - int? outProvinceAllocatedQuantity, - int? outProvinceAllocatedWeight, -int? provinceAllocatedQuantity, -int? provinceAllocatedWeight, - int? realAllocatedQuantity, -int? realAllocatedWeight, -int? coldHouseAllocatedWeight, - int? posAllocatedWeight, -int? segmentationWeight, -int? totalRemainQuantity, - int? totalRemainWeight, - int? freePrice, -int? approvedPrice, - bool? approvedPriceStatus, - dynamic createdBy, - dynamic modifiedBy, -int? parentProduct, - dynamic killHouse, -int? guild, -}) = _ProductModel; + factory ProductModel({ + int? id, + String? key, + String? create_date, // Changed from createDate, removed @JsonKey + String? modify_date, // Changed from modifyDate, removed @JsonKey + bool? trash, + String? name, + int? provinceGovernmentalCarcassesQuantity, + int? provinceGovernmentalCarcassesWeight, + int? provinceFreeCarcassesQuantity, + int? provinceFreeCarcassesWeight, + int? receiveGovernmentalCarcassesQuantity, + int? receiveGovernmentalCarcassesWeight, + int? receiveFreeCarcassesQuantity, + int? receiveFreeCarcassesWeight, + int? freeBuyingCarcassesQuantity, + int? freeBuyingCarcassesWeight, + int? totalGovernmentalCarcassesQuantity, + int? totalGovernmentalCarcassesWeight, + int? totalFreeBarsCarcassesQuantity, + int? totalFreeBarsCarcassesWeight, + double? weightAverage, + int? totalCarcassesQuantity, + int? totalCarcassesWeight, + int? freezingQuantity, + int? freezingWeight, + int? lossWeight, + int? outProvinceAllocatedQuantity, + int? outProvinceAllocatedWeight, + int? provinceAllocatedQuantity, + int? provinceAllocatedWeight, + int? realAllocatedQuantity, + int? realAllocatedWeight, + int? coldHouseAllocatedWeight, + int? posAllocatedWeight, + int? segmentationWeight, + int? totalRemainQuantity, + int? totalRemainWeight, + int? freePrice, + int? approvedPrice, + bool? approvedPriceStatus, + dynamic createdBy, + dynamic modifiedBy, + int? parentProduct, + dynamic killHouse, + int? guild, + }) = _ProductModel; -factory ProductModel.fromJson(Map json) => _$ProductModelFromJson(json); -} \ No newline at end of file + factory ProductModel.fromJson(Map json) => + _$ProductModelFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart index 359451a..9247f9f 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart @@ -24,27 +24,27 @@ abstract class Result with _$Result { dynamic guild, Product? product, String? key, - String? create_date, - String? modify_date, + String? createDate, + String? modifyDate, bool? trash, - String? kill_house_name, - String? kill_house_mobile, - String? kill_house_vet_name, - String? kill_house_vet_mobile, + String? killHouseName, + String? killHouseMobile, + String? killHouseVetName, + String? killHouseVetMobile, String? province, String? city, - String? driver_name, - String? driver_mobile, + String? driverName, + String? driverMobile, dynamic car, String? pelak, - int? number_of_carcasses, - int? weight_of_carcasses, - String? bar_image, + int? numberOfCarcasses, + double? weightOfCarcasses, + String? barImage, String? date, - bool? temporary_trash, - bool? temporary_deleted, - String? created_by, - String? modified_by, + bool? temporaryTrash, + bool? temporaryDeleted, + String? createdBy, + String? modifiedBy, }) = _Result; factory Result.fromJson(Map json) => _$ResultFromJson(json); @@ -54,15 +54,15 @@ abstract class Result with _$Result { abstract class Steward with _$Steward { const factory Steward({ User? user, - String? guilds_name, + String? guildsName, bool? steward, - dynamic allocation_limit, + int? allocationLimit, Address? address, - String? license_number, - String? type_activity, - String? area_activity, - String? guilds_id, - String? create_date, + String? licenseNumber, + String? typeActivity, + String? areaActivity, + String? guildsId, + String? createDate, }) = _Steward; factory Steward.fromJson(Map json) => _$StewardFromJson(json); @@ -72,22 +72,22 @@ abstract class Steward with _$Steward { abstract class User with _$User { const factory User({ String? fullname, - String? first_name, - String? last_name, - int? base_order, + String? firstName, + String? lastName, + int? baseOrder, String? mobile, - String? national_id, - String? national_code, + String? nationalId, + String? nationalCode, String? key, City? city, - String? unit_name, - String? unit_national_id, - String? unit_registration_number, - String? unit_economical_number, - String? unit_province, - String? unit_city, - String? unit_postal_code, - String? unit_address, + String? unitName, + String? unitNationalId, + String? unitRegistrationNumber, + String? unitEconomicalNumber, + String? unitProvince, + String? unitCity, + String? unitPostalCode, + String? unitAddress, }) = _User; factory User.fromJson(Map json) => _$UserFromJson(json); @@ -98,20 +98,20 @@ abstract class City with _$City { const factory City({ int? id, String? key, - String? create_date, - String? modify_date, + String? createDate, + String? modifyDate, bool? trash, - int? province_id_foreign_key, - int? city_id_key, + int? provinceIdForeignKey, + int? cityIdKey, String? name, - int? product_price, - bool? province_center, - int? city_number, - String? city_name, - int? province_number, - String? province_name, - String? created_by, - String? modified_by, + double? productPrice, + bool? provinceCenter, + int? cityNumber, + String? cityName, + int? provinceNumber, + String? provinceName, + String? createdBy, + String? modifiedBy, int? province, }) = _City; @@ -124,7 +124,7 @@ abstract class Address with _$Address { Province? province, City? city, String? address, - String? postal_code, + String? postalCode, }) = _Address; factory Address.fromJson(Map json) => _$AddressFromJson(json); diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart index 84c082a..1e99c86 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart @@ -166,7 +166,7 @@ as List?, /// @nodoc mixin _$Result { - int? get id; Steward? get steward; dynamic get guild; Product? get product; String? get key; String? get create_date; String? get modify_date; bool? get trash; String? get kill_house_name; String? get kill_house_mobile; String? get kill_house_vet_name; String? get kill_house_vet_mobile; String? get province; String? get city; String? get driver_name; String? get driver_mobile; dynamic get car; String? get pelak; int? get number_of_carcasses; int? get weight_of_carcasses; String? get bar_image; String? get date; bool? get temporary_trash; bool? get temporary_deleted; String? get created_by; String? get modified_by; + int? get id; Steward? get steward; dynamic get guild; Product? get product; String? get key; String? get createDate; String? get modifyDate; bool? get trash; String? get killHouseName; String? get killHouseMobile; String? get killHouseVetName; String? get killHouseVetMobile; String? get province; String? get city; String? get driverName; String? get driverMobile; dynamic get car; String? get pelak; int? get numberOfCarcasses; double? get weightOfCarcasses; String? get barImage; String? get date; bool? get temporaryTrash; bool? get temporaryDeleted; String? get createdBy; String? get modifiedBy; /// Create a copy of Result /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -179,16 +179,16 @@ $ResultCopyWith get copyWith => _$ResultCopyWithImpl(this as Res @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.kill_house_name, kill_house_name) || other.kill_house_name == kill_house_name)&&(identical(other.kill_house_mobile, kill_house_mobile) || other.kill_house_mobile == kill_house_mobile)&&(identical(other.kill_house_vet_name, kill_house_vet_name) || other.kill_house_vet_name == kill_house_vet_name)&&(identical(other.kill_house_vet_mobile, kill_house_vet_mobile) || other.kill_house_vet_mobile == kill_house_vet_mobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driver_name, driver_name) || other.driver_name == driver_name)&&(identical(other.driver_mobile, driver_mobile) || other.driver_mobile == driver_mobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.bar_image, bar_image) || other.bar_image == bar_image)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.killHouseVetName, killHouseVetName) || other.killHouseVetName == killHouseVetName)&&(identical(other.killHouseVetMobile, killHouseVetMobile) || other.killHouseVetMobile == killHouseVetMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,create_date,modify_date,trash,kill_house_name,kill_house_mobile,kill_house_vet_name,kill_house_vet_mobile,province,city,driver_name,driver_mobile,const DeepCollectionEquality().hash(car),pelak,number_of_carcasses,weight_of_carcasses,bar_image,date,temporary_trash,temporary_deleted,created_by,modified_by]); +int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,createDate,modifyDate,trash,killHouseName,killHouseMobile,killHouseVetName,killHouseVetMobile,province,city,driverName,driverMobile,const DeepCollectionEquality().hash(car),pelak,numberOfCarcasses,weightOfCarcasses,barImage,date,temporaryTrash,temporaryDeleted,createdBy,modifiedBy]); @override String toString() { - return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, kill_house_name: $kill_house_name, kill_house_mobile: $kill_house_mobile, kill_house_vet_name: $kill_house_vet_name, kill_house_vet_mobile: $kill_house_vet_mobile, province: $province, city: $city, driver_name: $driver_name, driver_mobile: $driver_mobile, car: $car, pelak: $pelak, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, bar_image: $bar_image, date: $date, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by)'; + return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, killHouseVetName: $killHouseVetName, killHouseVetMobile: $killHouseVetMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, car: $car, pelak: $pelak, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, barImage: $barImage, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy)'; } @@ -199,7 +199,7 @@ abstract mixin class $ResultCopyWith<$Res> { factory $ResultCopyWith(Result value, $Res Function(Result) _then) = _$ResultCopyWithImpl; @useResult $Res call({ - int? id, Steward? steward, dynamic guild, Product? product, String? key, String? create_date, String? modify_date, bool? trash, String? kill_house_name, String? kill_house_mobile, String? kill_house_vet_name, String? kill_house_vet_mobile, String? province, String? city, String? driver_name, String? driver_mobile, dynamic car, String? pelak, int? number_of_carcasses, int? weight_of_carcasses, String? bar_image, String? date, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by + int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy }); @@ -216,34 +216,34 @@ class _$ResultCopyWithImpl<$Res> /// Create a copy of Result /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? kill_house_name = freezed,Object? kill_house_mobile = freezed,Object? kill_house_vet_name = freezed,Object? kill_house_vet_mobile = freezed,Object? province = freezed,Object? city = freezed,Object? driver_name = freezed,Object? driver_mobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? bar_image = freezed,Object? date = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? killHouseName = freezed,Object? killHouseMobile = freezed,Object? killHouseVetName = freezed,Object? killHouseVetMobile = freezed,Object? province = freezed,Object? city = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? barImage = freezed,Object? date = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable as Steward?,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable as Product?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,kill_house_name: freezed == kill_house_name ? _self.kill_house_name : kill_house_name // ignore: cast_nullable_to_non_nullable -as String?,kill_house_mobile: freezed == kill_house_mobile ? _self.kill_house_mobile : kill_house_mobile // ignore: cast_nullable_to_non_nullable -as String?,kill_house_vet_name: freezed == kill_house_vet_name ? _self.kill_house_vet_name : kill_house_vet_name // ignore: cast_nullable_to_non_nullable -as String?,kill_house_vet_mobile: freezed == kill_house_vet_mobile ? _self.kill_house_vet_mobile : kill_house_vet_mobile // ignore: cast_nullable_to_non_nullable +as bool?,killHouseName: freezed == killHouseName ? _self.killHouseName : killHouseName // ignore: cast_nullable_to_non_nullable +as String?,killHouseMobile: freezed == killHouseMobile ? _self.killHouseMobile : killHouseMobile // ignore: cast_nullable_to_non_nullable +as String?,killHouseVetName: freezed == killHouseVetName ? _self.killHouseVetName : killHouseVetName // ignore: cast_nullable_to_non_nullable +as String?,killHouseVetMobile: freezed == killHouseVetMobile ? _self.killHouseVetMobile : killHouseVetMobile // ignore: cast_nullable_to_non_nullable as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as String?,driver_name: freezed == driver_name ? _self.driver_name : driver_name // ignore: cast_nullable_to_non_nullable -as String?,driver_mobile: freezed == driver_mobile ? _self.driver_mobile : driver_mobile // ignore: cast_nullable_to_non_nullable +as String?,driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable as dynamic,pelak: freezed == pelak ? _self.pelak : pelak // ignore: cast_nullable_to_non_nullable -as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,bar_image: freezed == bar_image ? _self.bar_image : bar_image // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable -as String?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable -as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable -as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -279,7 +279,7 @@ $ProductCopyWith<$Res>? get product { @JsonSerializable() class _Result implements Result { - const _Result({this.id, this.steward, this.guild, this.product, this.key, this.create_date, this.modify_date, this.trash, this.kill_house_name, this.kill_house_mobile, this.kill_house_vet_name, this.kill_house_vet_mobile, this.province, this.city, this.driver_name, this.driver_mobile, this.car, this.pelak, this.number_of_carcasses, this.weight_of_carcasses, this.bar_image, this.date, this.temporary_trash, this.temporary_deleted, this.created_by, this.modified_by}); + const _Result({this.id, this.steward, this.guild, this.product, this.key, this.createDate, this.modifyDate, this.trash, this.killHouseName, this.killHouseMobile, this.killHouseVetName, this.killHouseVetMobile, this.province, this.city, this.driverName, this.driverMobile, this.car, this.pelak, this.numberOfCarcasses, this.weightOfCarcasses, this.barImage, this.date, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy}); factory _Result.fromJson(Map json) => _$ResultFromJson(json); @override final int? id; @@ -287,27 +287,27 @@ class _Result implements Result { @override final dynamic guild; @override final Product? product; @override final String? key; -@override final String? create_date; -@override final String? modify_date; +@override final String? createDate; +@override final String? modifyDate; @override final bool? trash; -@override final String? kill_house_name; -@override final String? kill_house_mobile; -@override final String? kill_house_vet_name; -@override final String? kill_house_vet_mobile; +@override final String? killHouseName; +@override final String? killHouseMobile; +@override final String? killHouseVetName; +@override final String? killHouseVetMobile; @override final String? province; @override final String? city; -@override final String? driver_name; -@override final String? driver_mobile; +@override final String? driverName; +@override final String? driverMobile; @override final dynamic car; @override final String? pelak; -@override final int? number_of_carcasses; -@override final int? weight_of_carcasses; -@override final String? bar_image; +@override final int? numberOfCarcasses; +@override final double? weightOfCarcasses; +@override final String? barImage; @override final String? date; -@override final bool? temporary_trash; -@override final bool? temporary_deleted; -@override final String? created_by; -@override final String? modified_by; +@override final bool? temporaryTrash; +@override final bool? temporaryDeleted; +@override final String? createdBy; +@override final String? modifiedBy; /// Create a copy of Result /// with the given fields replaced by the non-null parameter values. @@ -322,16 +322,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.kill_house_name, kill_house_name) || other.kill_house_name == kill_house_name)&&(identical(other.kill_house_mobile, kill_house_mobile) || other.kill_house_mobile == kill_house_mobile)&&(identical(other.kill_house_vet_name, kill_house_vet_name) || other.kill_house_vet_name == kill_house_vet_name)&&(identical(other.kill_house_vet_mobile, kill_house_vet_mobile) || other.kill_house_vet_mobile == kill_house_vet_mobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driver_name, driver_name) || other.driver_name == driver_name)&&(identical(other.driver_mobile, driver_mobile) || other.driver_mobile == driver_mobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.bar_image, bar_image) || other.bar_image == bar_image)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.killHouseVetName, killHouseVetName) || other.killHouseVetName == killHouseVetName)&&(identical(other.killHouseVetMobile, killHouseVetMobile) || other.killHouseVetMobile == killHouseVetMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,create_date,modify_date,trash,kill_house_name,kill_house_mobile,kill_house_vet_name,kill_house_vet_mobile,province,city,driver_name,driver_mobile,const DeepCollectionEquality().hash(car),pelak,number_of_carcasses,weight_of_carcasses,bar_image,date,temporary_trash,temporary_deleted,created_by,modified_by]); +int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,createDate,modifyDate,trash,killHouseName,killHouseMobile,killHouseVetName,killHouseVetMobile,province,city,driverName,driverMobile,const DeepCollectionEquality().hash(car),pelak,numberOfCarcasses,weightOfCarcasses,barImage,date,temporaryTrash,temporaryDeleted,createdBy,modifiedBy]); @override String toString() { - return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, kill_house_name: $kill_house_name, kill_house_mobile: $kill_house_mobile, kill_house_vet_name: $kill_house_vet_name, kill_house_vet_mobile: $kill_house_vet_mobile, province: $province, city: $city, driver_name: $driver_name, driver_mobile: $driver_mobile, car: $car, pelak: $pelak, number_of_carcasses: $number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, bar_image: $bar_image, date: $date, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by)'; + return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, killHouseVetName: $killHouseVetName, killHouseVetMobile: $killHouseVetMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, car: $car, pelak: $pelak, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, barImage: $barImage, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy)'; } @@ -342,7 +342,7 @@ abstract mixin class _$ResultCopyWith<$Res> implements $ResultCopyWith<$Res> { factory _$ResultCopyWith(_Result value, $Res Function(_Result) _then) = __$ResultCopyWithImpl; @override @useResult $Res call({ - int? id, Steward? steward, dynamic guild, Product? product, String? key, String? create_date, String? modify_date, bool? trash, String? kill_house_name, String? kill_house_mobile, String? kill_house_vet_name, String? kill_house_vet_mobile, String? province, String? city, String? driver_name, String? driver_mobile, dynamic car, String? pelak, int? number_of_carcasses, int? weight_of_carcasses, String? bar_image, String? date, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by + int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy }); @@ -359,34 +359,34 @@ class __$ResultCopyWithImpl<$Res> /// Create a copy of Result /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? kill_house_name = freezed,Object? kill_house_mobile = freezed,Object? kill_house_vet_name = freezed,Object? kill_house_vet_mobile = freezed,Object? province = freezed,Object? city = freezed,Object? driver_name = freezed,Object? driver_mobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? bar_image = freezed,Object? date = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? killHouseName = freezed,Object? killHouseMobile = freezed,Object? killHouseVetName = freezed,Object? killHouseVetMobile = freezed,Object? province = freezed,Object? city = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? barImage = freezed,Object? date = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,}) { return _then(_Result( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable as Steward?,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable as Product?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,kill_house_name: freezed == kill_house_name ? _self.kill_house_name : kill_house_name // ignore: cast_nullable_to_non_nullable -as String?,kill_house_mobile: freezed == kill_house_mobile ? _self.kill_house_mobile : kill_house_mobile // ignore: cast_nullable_to_non_nullable -as String?,kill_house_vet_name: freezed == kill_house_vet_name ? _self.kill_house_vet_name : kill_house_vet_name // ignore: cast_nullable_to_non_nullable -as String?,kill_house_vet_mobile: freezed == kill_house_vet_mobile ? _self.kill_house_vet_mobile : kill_house_vet_mobile // ignore: cast_nullable_to_non_nullable +as bool?,killHouseName: freezed == killHouseName ? _self.killHouseName : killHouseName // ignore: cast_nullable_to_non_nullable +as String?,killHouseMobile: freezed == killHouseMobile ? _self.killHouseMobile : killHouseMobile // ignore: cast_nullable_to_non_nullable +as String?,killHouseVetName: freezed == killHouseVetName ? _self.killHouseVetName : killHouseVetName // ignore: cast_nullable_to_non_nullable +as String?,killHouseVetMobile: freezed == killHouseVetMobile ? _self.killHouseVetMobile : killHouseVetMobile // ignore: cast_nullable_to_non_nullable as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as String?,driver_name: freezed == driver_name ? _self.driver_name : driver_name // ignore: cast_nullable_to_non_nullable -as String?,driver_mobile: freezed == driver_mobile ? _self.driver_mobile : driver_mobile // ignore: cast_nullable_to_non_nullable +as String?,driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable as String?,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable as dynamic,pelak: freezed == pelak ? _self.pelak : pelak // ignore: cast_nullable_to_non_nullable -as String?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,bar_image: freezed == bar_image ? _self.bar_image : bar_image // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable -as String?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable -as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable -as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -422,7 +422,7 @@ $ProductCopyWith<$Res>? get product { /// @nodoc mixin _$Steward { - User? get user; String? get guilds_name; bool? get steward; dynamic get allocation_limit; Address? get address; String? get license_number; String? get type_activity; String? get area_activity; String? get guilds_id; String? get create_date; + User? get user; String? get guildsName; bool? get steward; int? get allocationLimit; Address? get address; String? get licenseNumber; String? get typeActivity; String? get areaActivity; String? get guildsId; String? get createDate; /// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -435,16 +435,16 @@ $StewardCopyWith get copyWith => _$StewardCopyWithImpl(this as @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Steward&&(identical(other.user, user) || other.user == user)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.address, address) || other.address == address)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.create_date, create_date) || other.create_date == create_date)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Steward&&(identical(other.user, user) || other.user == user)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.allocationLimit, allocationLimit) || other.allocationLimit == allocationLimit)&&(identical(other.address, address) || other.address == address)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.createDate, createDate) || other.createDate == createDate)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,user,guilds_name,steward,const DeepCollectionEquality().hash(allocation_limit),address,license_number,type_activity,area_activity,guilds_id,create_date); +int get hashCode => Object.hash(runtimeType,user,guildsName,steward,allocationLimit,address,licenseNumber,typeActivity,areaActivity,guildsId,createDate); @override String toString() { - return 'Steward(user: $user, guilds_name: $guilds_name, steward: $steward, allocation_limit: $allocation_limit, address: $address, license_number: $license_number, type_activity: $type_activity, area_activity: $area_activity, guilds_id: $guilds_id, create_date: $create_date)'; + return 'Steward(user: $user, guildsName: $guildsName, steward: $steward, allocationLimit: $allocationLimit, address: $address, licenseNumber: $licenseNumber, typeActivity: $typeActivity, areaActivity: $areaActivity, guildsId: $guildsId, createDate: $createDate)'; } @@ -455,7 +455,7 @@ abstract mixin class $StewardCopyWith<$Res> { factory $StewardCopyWith(Steward value, $Res Function(Steward) _then) = _$StewardCopyWithImpl; @useResult $Res call({ - User? user, String? guilds_name, bool? steward, dynamic allocation_limit, Address? address, String? license_number, String? type_activity, String? area_activity, String? guilds_id, String? create_date + User? user, String? guildsName, bool? steward, int? allocationLimit, Address? address, String? licenseNumber, String? typeActivity, String? areaActivity, String? guildsId, String? createDate }); @@ -472,18 +472,18 @@ class _$StewardCopyWithImpl<$Res> /// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? user = freezed,Object? guilds_name = freezed,Object? steward = freezed,Object? allocation_limit = freezed,Object? address = freezed,Object? license_number = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? guilds_id = freezed,Object? create_date = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? user = freezed,Object? guildsName = freezed,Object? steward = freezed,Object? allocationLimit = freezed,Object? address = freezed,Object? licenseNumber = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? guildsId = freezed,Object? createDate = freezed,}) { return _then(_self.copyWith( user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable -as User?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as User?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as bool?,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable -as dynamic,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as Address?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable -as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable -as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable -as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as bool?,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as int?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -519,19 +519,19 @@ $AddressCopyWith<$Res>? get address { @JsonSerializable() class _Steward implements Steward { - const _Steward({this.user, this.guilds_name, this.steward, this.allocation_limit, this.address, this.license_number, this.type_activity, this.area_activity, this.guilds_id, this.create_date}); + const _Steward({this.user, this.guildsName, this.steward, this.allocationLimit, this.address, this.licenseNumber, this.typeActivity, this.areaActivity, this.guildsId, this.createDate}); factory _Steward.fromJson(Map json) => _$StewardFromJson(json); @override final User? user; -@override final String? guilds_name; +@override final String? guildsName; @override final bool? steward; -@override final dynamic allocation_limit; +@override final int? allocationLimit; @override final Address? address; -@override final String? license_number; -@override final String? type_activity; -@override final String? area_activity; -@override final String? guilds_id; -@override final String? create_date; +@override final String? licenseNumber; +@override final String? typeActivity; +@override final String? areaActivity; +@override final String? guildsId; +@override final String? createDate; /// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. @@ -546,16 +546,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Steward&&(identical(other.user, user) || other.user == user)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.address, address) || other.address == address)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.create_date, create_date) || other.create_date == create_date)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Steward&&(identical(other.user, user) || other.user == user)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.allocationLimit, allocationLimit) || other.allocationLimit == allocationLimit)&&(identical(other.address, address) || other.address == address)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.createDate, createDate) || other.createDate == createDate)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,user,guilds_name,steward,const DeepCollectionEquality().hash(allocation_limit),address,license_number,type_activity,area_activity,guilds_id,create_date); +int get hashCode => Object.hash(runtimeType,user,guildsName,steward,allocationLimit,address,licenseNumber,typeActivity,areaActivity,guildsId,createDate); @override String toString() { - return 'Steward(user: $user, guilds_name: $guilds_name, steward: $steward, allocation_limit: $allocation_limit, address: $address, license_number: $license_number, type_activity: $type_activity, area_activity: $area_activity, guilds_id: $guilds_id, create_date: $create_date)'; + return 'Steward(user: $user, guildsName: $guildsName, steward: $steward, allocationLimit: $allocationLimit, address: $address, licenseNumber: $licenseNumber, typeActivity: $typeActivity, areaActivity: $areaActivity, guildsId: $guildsId, createDate: $createDate)'; } @@ -566,7 +566,7 @@ abstract mixin class _$StewardCopyWith<$Res> implements $StewardCopyWith<$Res> { factory _$StewardCopyWith(_Steward value, $Res Function(_Steward) _then) = __$StewardCopyWithImpl; @override @useResult $Res call({ - User? user, String? guilds_name, bool? steward, dynamic allocation_limit, Address? address, String? license_number, String? type_activity, String? area_activity, String? guilds_id, String? create_date + User? user, String? guildsName, bool? steward, int? allocationLimit, Address? address, String? licenseNumber, String? typeActivity, String? areaActivity, String? guildsId, String? createDate }); @@ -583,18 +583,18 @@ class __$StewardCopyWithImpl<$Res> /// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? user = freezed,Object? guilds_name = freezed,Object? steward = freezed,Object? allocation_limit = freezed,Object? address = freezed,Object? license_number = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? guilds_id = freezed,Object? create_date = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? user = freezed,Object? guildsName = freezed,Object? steward = freezed,Object? allocationLimit = freezed,Object? address = freezed,Object? licenseNumber = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? guildsId = freezed,Object? createDate = freezed,}) { return _then(_Steward( user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable -as User?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as User?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as bool?,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable -as dynamic,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as Address?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable -as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable -as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable -as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable +as bool?,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as int?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -630,7 +630,7 @@ $AddressCopyWith<$Res>? get address { /// @nodoc mixin _$User { - String? get fullname; String? get first_name; String? get last_name; int? get base_order; String? get mobile; String? get national_id; String? get national_code; String? get key; City? get city; String? get unit_name; String? get unit_national_id; String? get unit_registration_number; String? get unit_economical_number; String? get unit_province; String? get unit_city; String? get unit_postal_code; String? get unit_address; + String? get fullname; String? get firstName; String? get lastName; int? get baseOrder; String? get mobile; String? get nationalId; String? get nationalCode; String? get key; City? get city; String? get unitName; String? get unitNationalId; String? get unitRegistrationNumber; String? get unitEconomicalNumber; String? get unitProvince; String? get unitCity; String? get unitPostalCode; String? get unitAddress; /// Create a copy of User /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -643,16 +643,16 @@ $UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$ide @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.base_order, base_order) || other.base_order == base_order)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.national_code, national_code) || other.national_code == national_code)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unit_name, unit_name) || other.unit_name == unit_name)&&(identical(other.unit_national_id, unit_national_id) || other.unit_national_id == unit_national_id)&&(identical(other.unit_registration_number, unit_registration_number) || other.unit_registration_number == unit_registration_number)&&(identical(other.unit_economical_number, unit_economical_number) || other.unit_economical_number == unit_economical_number)&&(identical(other.unit_province, unit_province) || other.unit_province == unit_province)&&(identical(other.unit_city, unit_city) || other.unit_city == unit_city)&&(identical(other.unit_postal_code, unit_postal_code) || other.unit_postal_code == unit_postal_code)&&(identical(other.unit_address, unit_address) || other.unit_address == unit_address)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,base_order,mobile,national_id,national_code,key,city,unit_name,unit_national_id,unit_registration_number,unit_economical_number,unit_province,unit_city,unit_postal_code,unit_address); +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); @override String toString() { - return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, base_order: $base_order, mobile: $mobile, national_id: $national_id, national_code: $national_code, key: $key, city: $city, unit_name: $unit_name, unit_national_id: $unit_national_id, unit_registration_number: $unit_registration_number, unit_economical_number: $unit_economical_number, unit_province: $unit_province, unit_city: $unit_city, unit_postal_code: $unit_postal_code, unit_address: $unit_address)'; + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; } @@ -663,7 +663,7 @@ abstract mixin class $UserCopyWith<$Res> { factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; @useResult $Res call({ - String? fullname, String? first_name, String? last_name, int? base_order, String? mobile, String? national_id, String? national_code, String? key, City? city, String? unit_name, String? unit_national_id, String? unit_registration_number, String? unit_economical_number, String? unit_province, String? unit_city, String? unit_postal_code, String? unit_address + String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress }); @@ -680,25 +680,25 @@ class _$UserCopyWithImpl<$Res> /// Create a copy of User /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? base_order = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? national_code = freezed,Object? key = freezed,Object? city = freezed,Object? unit_name = freezed,Object? unit_national_id = freezed,Object? unit_registration_number = freezed,Object? unit_economical_number = freezed,Object? unit_province = freezed,Object? unit_city = freezed,Object? unit_postal_code = freezed,Object? unit_address = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { return _then(_self.copyWith( fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable -as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable -as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable -as String?,base_order: freezed == base_order ? _self.base_order : base_order // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable -as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable -as String?,national_code: freezed == national_code ? _self.national_code : national_code // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as City?,unit_name: freezed == unit_name ? _self.unit_name : unit_name // ignore: cast_nullable_to_non_nullable -as String?,unit_national_id: freezed == unit_national_id ? _self.unit_national_id : unit_national_id // ignore: cast_nullable_to_non_nullable -as String?,unit_registration_number: freezed == unit_registration_number ? _self.unit_registration_number : unit_registration_number // ignore: cast_nullable_to_non_nullable -as String?,unit_economical_number: freezed == unit_economical_number ? _self.unit_economical_number : unit_economical_number // ignore: cast_nullable_to_non_nullable -as String?,unit_province: freezed == unit_province ? _self.unit_province : unit_province // ignore: cast_nullable_to_non_nullable -as String?,unit_city: freezed == unit_city ? _self.unit_city : unit_city // ignore: cast_nullable_to_non_nullable -as String?,unit_postal_code: freezed == unit_postal_code ? _self.unit_postal_code : unit_postal_code // ignore: cast_nullable_to_non_nullable -as String?,unit_address: freezed == unit_address ? _self.unit_address : unit_address // ignore: cast_nullable_to_non_nullable +as City?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -722,26 +722,26 @@ $CityCopyWith<$Res>? get city { @JsonSerializable() class _User implements User { - const _User({this.fullname, this.first_name, this.last_name, this.base_order, this.mobile, this.national_id, this.national_code, this.key, this.city, this.unit_name, this.unit_national_id, this.unit_registration_number, this.unit_economical_number, this.unit_province, this.unit_city, this.unit_postal_code, this.unit_address}); + const _User({this.fullname, this.firstName, this.lastName, this.baseOrder, this.mobile, this.nationalId, this.nationalCode, this.key, this.city, this.unitName, this.unitNationalId, this.unitRegistrationNumber, this.unitEconomicalNumber, this.unitProvince, this.unitCity, this.unitPostalCode, this.unitAddress}); factory _User.fromJson(Map json) => _$UserFromJson(json); @override final String? fullname; -@override final String? first_name; -@override final String? last_name; -@override final int? base_order; +@override final String? firstName; +@override final String? lastName; +@override final int? baseOrder; @override final String? mobile; -@override final String? national_id; -@override final String? national_code; +@override final String? nationalId; +@override final String? nationalCode; @override final String? key; @override final City? city; -@override final String? unit_name; -@override final String? unit_national_id; -@override final String? unit_registration_number; -@override final String? unit_economical_number; -@override final String? unit_province; -@override final String? unit_city; -@override final String? unit_postal_code; -@override final String? unit_address; +@override final String? unitName; +@override final String? unitNationalId; +@override final String? unitRegistrationNumber; +@override final String? unitEconomicalNumber; +@override final String? unitProvince; +@override final String? unitCity; +@override final String? unitPostalCode; +@override final String? unitAddress; /// Create a copy of User /// with the given fields replaced by the non-null parameter values. @@ -756,16 +756,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.base_order, base_order) || other.base_order == base_order)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.national_code, national_code) || other.national_code == national_code)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unit_name, unit_name) || other.unit_name == unit_name)&&(identical(other.unit_national_id, unit_national_id) || other.unit_national_id == unit_national_id)&&(identical(other.unit_registration_number, unit_registration_number) || other.unit_registration_number == unit_registration_number)&&(identical(other.unit_economical_number, unit_economical_number) || other.unit_economical_number == unit_economical_number)&&(identical(other.unit_province, unit_province) || other.unit_province == unit_province)&&(identical(other.unit_city, unit_city) || other.unit_city == unit_city)&&(identical(other.unit_postal_code, unit_postal_code) || other.unit_postal_code == unit_postal_code)&&(identical(other.unit_address, unit_address) || other.unit_address == unit_address)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,base_order,mobile,national_id,national_code,key,city,unit_name,unit_national_id,unit_registration_number,unit_economical_number,unit_province,unit_city,unit_postal_code,unit_address); +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); @override String toString() { - return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, base_order: $base_order, mobile: $mobile, national_id: $national_id, national_code: $national_code, key: $key, city: $city, unit_name: $unit_name, unit_national_id: $unit_national_id, unit_registration_number: $unit_registration_number, unit_economical_number: $unit_economical_number, unit_province: $unit_province, unit_city: $unit_city, unit_postal_code: $unit_postal_code, unit_address: $unit_address)'; + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; } @@ -776,7 +776,7 @@ abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; @override @useResult $Res call({ - String? fullname, String? first_name, String? last_name, int? base_order, String? mobile, String? national_id, String? national_code, String? key, City? city, String? unit_name, String? unit_national_id, String? unit_registration_number, String? unit_economical_number, String? unit_province, String? unit_city, String? unit_postal_code, String? unit_address + String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress }); @@ -793,25 +793,25 @@ class __$UserCopyWithImpl<$Res> /// Create a copy of User /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? base_order = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? national_code = freezed,Object? key = freezed,Object? city = freezed,Object? unit_name = freezed,Object? unit_national_id = freezed,Object? unit_registration_number = freezed,Object? unit_economical_number = freezed,Object? unit_province = freezed,Object? unit_city = freezed,Object? unit_postal_code = freezed,Object? unit_address = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { return _then(_User( fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable -as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable -as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable -as String?,base_order: freezed == base_order ? _self.base_order : base_order // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable -as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable -as String?,national_code: freezed == national_code ? _self.national_code : national_code // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as City?,unit_name: freezed == unit_name ? _self.unit_name : unit_name // ignore: cast_nullable_to_non_nullable -as String?,unit_national_id: freezed == unit_national_id ? _self.unit_national_id : unit_national_id // ignore: cast_nullable_to_non_nullable -as String?,unit_registration_number: freezed == unit_registration_number ? _self.unit_registration_number : unit_registration_number // ignore: cast_nullable_to_non_nullable -as String?,unit_economical_number: freezed == unit_economical_number ? _self.unit_economical_number : unit_economical_number // ignore: cast_nullable_to_non_nullable -as String?,unit_province: freezed == unit_province ? _self.unit_province : unit_province // ignore: cast_nullable_to_non_nullable -as String?,unit_city: freezed == unit_city ? _self.unit_city : unit_city // ignore: cast_nullable_to_non_nullable -as String?,unit_postal_code: freezed == unit_postal_code ? _self.unit_postal_code : unit_postal_code // ignore: cast_nullable_to_non_nullable -as String?,unit_address: freezed == unit_address ? _self.unit_address : unit_address // ignore: cast_nullable_to_non_nullable +as City?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -835,7 +835,7 @@ $CityCopyWith<$Res>? get city { /// @nodoc mixin _$City { - int? get id; String? get key; String? get create_date; String? get modify_date; bool? get trash; int? get province_id_foreign_key; int? get city_id_key; String? get name; int? get product_price; bool? get province_center; int? get city_number; String? get city_name; int? get province_number; String? get province_name; String? get created_by; String? get modified_by; int? get province; + int? get id; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get provinceIdForeignKey; int? get cityIdKey; String? get name; double? get productPrice; bool? get provinceCenter; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; String? get createdBy; String? get modifiedBy; int? get province; /// Create a copy of City /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -848,16 +848,16 @@ $CityCopyWith get copyWith => _$CityCopyWithImpl(this as City, _$ide @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.province_id_foreign_key, province_id_foreign_key) || other.province_id_foreign_key == province_id_foreign_key)&&(identical(other.city_id_key, city_id_key) || other.city_id_key == city_id_key)&&(identical(other.name, name) || other.name == name)&&(identical(other.product_price, product_price) || other.product_price == product_price)&&(identical(other.province_center, province_center) || other.province_center == province_center)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&(identical(other.province, province) || other.province == province)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&(identical(other.province, province) || other.province == province)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,id,key,create_date,modify_date,trash,province_id_foreign_key,city_id_key,name,product_price,province_center,city_number,city_name,province_number,province_name,created_by,modified_by,province); +int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,createdBy,modifiedBy,province); @override String toString() { - return 'City(id: $id, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, province_id_foreign_key: $province_id_foreign_key, city_id_key: $city_id_key, name: $name, product_price: $product_price, province_center: $province_center, city_number: $city_number, city_name: $city_name, province_number: $province_number, province_name: $province_name, created_by: $created_by, modified_by: $modified_by, province: $province)'; + return 'City(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; } @@ -868,7 +868,7 @@ abstract mixin class $CityCopyWith<$Res> { factory $CityCopyWith(City value, $Res Function(City) _then) = _$CityCopyWithImpl; @useResult $Res call({ - int? id, String? key, String? create_date, String? modify_date, bool? trash, int? province_id_foreign_key, int? city_id_key, String? name, int? product_price, bool? province_center, int? city_number, String? city_name, int? province_number, String? province_name, String? created_by, String? modified_by, int? province + int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? createdBy, String? modifiedBy, int? province }); @@ -885,24 +885,24 @@ class _$CityCopyWithImpl<$Res> /// Create a copy of City /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? province_id_foreign_key = freezed,Object? city_id_key = freezed,Object? name = freezed,Object? product_price = freezed,Object? province_center = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? province = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,province_id_foreign_key: freezed == province_id_foreign_key ? _self.province_id_foreign_key : province_id_foreign_key // ignore: cast_nullable_to_non_nullable -as int?,city_id_key: freezed == city_id_key ? _self.city_id_key : city_id_key // ignore: cast_nullable_to_non_nullable +as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String?,product_price: freezed == product_price ? _self.product_price : product_price // ignore: cast_nullable_to_non_nullable -as int?,province_center: freezed == province_center ? _self.province_center : province_center // ignore: cast_nullable_to_non_nullable -as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable -as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable -as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable -as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable -as String?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable +as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as int?, )); @@ -915,25 +915,25 @@ as int?, @JsonSerializable() class _City implements City { - const _City({this.id, this.key, this.create_date, this.modify_date, this.trash, this.province_id_foreign_key, this.city_id_key, this.name, this.product_price, this.province_center, this.city_number, this.city_name, this.province_number, this.province_name, this.created_by, this.modified_by, this.province}); + const _City({this.id, this.key, this.createDate, this.modifyDate, this.trash, this.provinceIdForeignKey, this.cityIdKey, this.name, this.productPrice, this.provinceCenter, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.createdBy, this.modifiedBy, this.province}); factory _City.fromJson(Map json) => _$CityFromJson(json); @override final int? id; @override final String? key; -@override final String? create_date; -@override final String? modify_date; +@override final String? createDate; +@override final String? modifyDate; @override final bool? trash; -@override final int? province_id_foreign_key; -@override final int? city_id_key; +@override final int? provinceIdForeignKey; +@override final int? cityIdKey; @override final String? name; -@override final int? product_price; -@override final bool? province_center; -@override final int? city_number; -@override final String? city_name; -@override final int? province_number; -@override final String? province_name; -@override final String? created_by; -@override final String? modified_by; +@override final double? productPrice; +@override final bool? provinceCenter; +@override final int? cityNumber; +@override final String? cityName; +@override final int? provinceNumber; +@override final String? provinceName; +@override final String? createdBy; +@override final String? modifiedBy; @override final int? province; /// Create a copy of City @@ -949,16 +949,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.province_id_foreign_key, province_id_foreign_key) || other.province_id_foreign_key == province_id_foreign_key)&&(identical(other.city_id_key, city_id_key) || other.city_id_key == city_id_key)&&(identical(other.name, name) || other.name == name)&&(identical(other.product_price, product_price) || other.product_price == product_price)&&(identical(other.province_center, province_center) || other.province_center == province_center)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&(identical(other.province, province) || other.province == province)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _City&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&(identical(other.province, province) || other.province == province)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,id,key,create_date,modify_date,trash,province_id_foreign_key,city_id_key,name,product_price,province_center,city_number,city_name,province_number,province_name,created_by,modified_by,province); +int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,createdBy,modifiedBy,province); @override String toString() { - return 'City(id: $id, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, province_id_foreign_key: $province_id_foreign_key, city_id_key: $city_id_key, name: $name, product_price: $product_price, province_center: $province_center, city_number: $city_number, city_name: $city_name, province_number: $province_number, province_name: $province_name, created_by: $created_by, modified_by: $modified_by, province: $province)'; + return 'City(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; } @@ -969,7 +969,7 @@ abstract mixin class _$CityCopyWith<$Res> implements $CityCopyWith<$Res> { factory _$CityCopyWith(_City value, $Res Function(_City) _then) = __$CityCopyWithImpl; @override @useResult $Res call({ - int? id, String? key, String? create_date, String? modify_date, bool? trash, int? province_id_foreign_key, int? city_id_key, String? name, int? product_price, bool? province_center, int? city_number, String? city_name, int? province_number, String? province_name, String? created_by, String? modified_by, int? province + int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? createdBy, String? modifiedBy, int? province }); @@ -986,24 +986,24 @@ class __$CityCopyWithImpl<$Res> /// Create a copy of City /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? province_id_foreign_key = freezed,Object? city_id_key = freezed,Object? name = freezed,Object? product_price = freezed,Object? province_center = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? province = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { return _then(_City( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,province_id_foreign_key: freezed == province_id_foreign_key ? _self.province_id_foreign_key : province_id_foreign_key // ignore: cast_nullable_to_non_nullable -as int?,city_id_key: freezed == city_id_key ? _self.city_id_key : city_id_key // ignore: cast_nullable_to_non_nullable +as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String?,product_price: freezed == product_price ? _self.product_price : product_price // ignore: cast_nullable_to_non_nullable -as int?,province_center: freezed == province_center ? _self.province_center : province_center // ignore: cast_nullable_to_non_nullable -as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable -as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable -as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable -as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable -as String?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable +as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable +as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as int?, )); @@ -1016,7 +1016,7 @@ as int?, /// @nodoc mixin _$Address { - Province? get province; City? get city; String? get address; String? get postal_code; + Province? get province; City? get city; String? get address; String? get postalCode; /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -1029,16 +1029,16 @@ $AddressCopyWith
    get copyWith => _$AddressCopyWithImpl
    (this as @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); @override String toString() { - return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; + return 'Address(province: $province, city: $city, address: $address, postalCode: $postalCode)'; } @@ -1049,7 +1049,7 @@ abstract mixin class $AddressCopyWith<$Res> { factory $AddressCopyWith(Address value, $Res Function(Address) _then) = _$AddressCopyWithImpl; @useResult $Res call({ - Province? province, City? city, String? address, String? postal_code + Province? province, City? city, String? address, String? postalCode }); @@ -1066,12 +1066,12 @@ class _$AddressCopyWithImpl<$Res> /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { return _then(_self.copyWith( province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -1107,13 +1107,13 @@ $CityCopyWith<$Res>? get city { @JsonSerializable() class _Address implements Address { - const _Address({this.province, this.city, this.address, this.postal_code}); + const _Address({this.province, this.city, this.address, this.postalCode}); factory _Address.fromJson(Map json) => _$AddressFromJson(json); @override final Province? province; @override final City? city; @override final String? address; -@override final String? postal_code; +@override final String? postalCode; /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. @@ -1128,16 +1128,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); @override String toString() { - return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; + return 'Address(province: $province, city: $city, address: $address, postalCode: $postalCode)'; } @@ -1148,7 +1148,7 @@ abstract mixin class _$AddressCopyWith<$Res> implements $AddressCopyWith<$Res> { factory _$AddressCopyWith(_Address value, $Res Function(_Address) _then) = __$AddressCopyWithImpl; @override @useResult $Res call({ - Province? province, City? city, String? address, String? postal_code + Province? province, City? city, String? address, String? postalCode }); @@ -1165,12 +1165,12 @@ class __$AddressCopyWithImpl<$Res> /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { return _then(_Address( province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable as String?, )); } diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart index 3059d21..b895764 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart @@ -34,27 +34,27 @@ _Result _$ResultFromJson(Map json) => _Result( ? null : Product.fromJson(json['product'] as Map), key: json['key'] as String?, - create_date: json['create_date'] as String?, - modify_date: json['modify_date'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, trash: json['trash'] as bool?, - kill_house_name: json['kill_house_name'] as String?, - kill_house_mobile: json['kill_house_mobile'] as String?, - kill_house_vet_name: json['kill_house_vet_name'] as String?, - kill_house_vet_mobile: json['kill_house_vet_mobile'] as String?, + killHouseName: json['kill_house_name'] as String?, + killHouseMobile: json['kill_house_mobile'] as String?, + killHouseVetName: json['kill_house_vet_name'] as String?, + killHouseVetMobile: json['kill_house_vet_mobile'] as String?, province: json['province'] as String?, city: json['city'] as String?, - driver_name: json['driver_name'] as String?, - driver_mobile: json['driver_mobile'] as String?, + driverName: json['driver_name'] as String?, + driverMobile: json['driver_mobile'] as String?, car: json['car'], pelak: json['pelak'] as String?, - number_of_carcasses: (json['number_of_carcasses'] as num?)?.toInt(), - weight_of_carcasses: (json['weight_of_carcasses'] as num?)?.toInt(), - bar_image: json['bar_image'] as String?, + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toDouble(), + barImage: json['bar_image'] as String?, date: json['date'] as String?, - temporary_trash: json['temporary_trash'] as bool?, - temporary_deleted: json['temporary_deleted'] as bool?, - created_by: json['created_by'] as String?, - modified_by: json['modified_by'] as String?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + createdBy: json['created_by'] as String?, + modifiedBy: json['modified_by'] as String?, ); Map _$ResultToJson(_Result instance) => { @@ -63,138 +63,138 @@ Map _$ResultToJson(_Result instance) => { 'guild': instance.guild, 'product': instance.product, 'key': instance.key, - 'create_date': instance.create_date, - 'modify_date': instance.modify_date, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, 'trash': instance.trash, - 'kill_house_name': instance.kill_house_name, - 'kill_house_mobile': instance.kill_house_mobile, - 'kill_house_vet_name': instance.kill_house_vet_name, - 'kill_house_vet_mobile': instance.kill_house_vet_mobile, + 'kill_house_name': instance.killHouseName, + 'kill_house_mobile': instance.killHouseMobile, + 'kill_house_vet_name': instance.killHouseVetName, + 'kill_house_vet_mobile': instance.killHouseVetMobile, 'province': instance.province, 'city': instance.city, - 'driver_name': instance.driver_name, - 'driver_mobile': instance.driver_mobile, + 'driver_name': instance.driverName, + 'driver_mobile': instance.driverMobile, 'car': instance.car, 'pelak': instance.pelak, - 'number_of_carcasses': instance.number_of_carcasses, - 'weight_of_carcasses': instance.weight_of_carcasses, - 'bar_image': instance.bar_image, + 'number_of_carcasses': instance.numberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'bar_image': instance.barImage, 'date': instance.date, - 'temporary_trash': instance.temporary_trash, - 'temporary_deleted': instance.temporary_deleted, - 'created_by': instance.created_by, - 'modified_by': instance.modified_by, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, }; _Steward _$StewardFromJson(Map json) => _Steward( user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - guilds_name: json['guilds_name'] as String?, + guildsName: json['guilds_name'] as String?, steward: json['steward'] as bool?, - allocation_limit: json['allocation_limit'], + allocationLimit: (json['allocation_limit'] as num?)?.toInt(), address: json['address'] == null ? null : Address.fromJson(json['address'] as Map), - license_number: json['license_number'] as String?, - type_activity: json['type_activity'] as String?, - area_activity: json['area_activity'] as String?, - guilds_id: json['guilds_id'] as String?, - create_date: json['create_date'] as String?, + licenseNumber: json['license_number'] as String?, + typeActivity: json['type_activity'] as String?, + areaActivity: json['area_activity'] as String?, + guildsId: json['guilds_id'] as String?, + createDate: json['create_date'] as String?, ); Map _$StewardToJson(_Steward instance) => { 'user': instance.user, - 'guilds_name': instance.guilds_name, + 'guilds_name': instance.guildsName, 'steward': instance.steward, - 'allocation_limit': instance.allocation_limit, + 'allocation_limit': instance.allocationLimit, 'address': instance.address, - 'license_number': instance.license_number, - 'type_activity': instance.type_activity, - 'area_activity': instance.area_activity, - 'guilds_id': instance.guilds_id, - 'create_date': instance.create_date, + 'license_number': instance.licenseNumber, + 'type_activity': instance.typeActivity, + 'area_activity': instance.areaActivity, + 'guilds_id': instance.guildsId, + 'create_date': instance.createDate, }; _User _$UserFromJson(Map json) => _User( fullname: json['fullname'] as String?, - first_name: json['first_name'] as String?, - last_name: json['last_name'] as String?, - base_order: (json['base_order'] as num?)?.toInt(), + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + baseOrder: (json['base_order'] as num?)?.toInt(), mobile: json['mobile'] as String?, - national_id: json['national_id'] as String?, - national_code: json['national_code'] as String?, + nationalId: json['national_id'] as String?, + nationalCode: json['national_code'] as String?, key: json['key'] as String?, city: json['city'] == null ? null : City.fromJson(json['city'] as Map), - unit_name: json['unit_name'] as String?, - unit_national_id: json['unit_national_id'] as String?, - unit_registration_number: json['unit_registration_number'] as String?, - unit_economical_number: json['unit_economical_number'] as String?, - unit_province: json['unit_province'] as String?, - unit_city: json['unit_city'] as String?, - unit_postal_code: json['unit_postal_code'] as String?, - unit_address: json['unit_address'] as String?, + unitName: json['unit_name'] as String?, + unitNationalId: json['unit_national_id'] as String?, + unitRegistrationNumber: json['unit_registration_number'] as String?, + unitEconomicalNumber: json['unit_economical_number'] as String?, + unitProvince: json['unit_province'] as String?, + unitCity: json['unit_city'] as String?, + unitPostalCode: json['unit_postal_code'] as String?, + unitAddress: json['unit_address'] as String?, ); Map _$UserToJson(_User instance) => { 'fullname': instance.fullname, - 'first_name': instance.first_name, - 'last_name': instance.last_name, - 'base_order': instance.base_order, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'base_order': instance.baseOrder, 'mobile': instance.mobile, - 'national_id': instance.national_id, - 'national_code': instance.national_code, + 'national_id': instance.nationalId, + 'national_code': instance.nationalCode, 'key': instance.key, 'city': instance.city, - 'unit_name': instance.unit_name, - 'unit_national_id': instance.unit_national_id, - 'unit_registration_number': instance.unit_registration_number, - 'unit_economical_number': instance.unit_economical_number, - 'unit_province': instance.unit_province, - 'unit_city': instance.unit_city, - 'unit_postal_code': instance.unit_postal_code, - 'unit_address': instance.unit_address, + 'unit_name': instance.unitName, + 'unit_national_id': instance.unitNationalId, + 'unit_registration_number': instance.unitRegistrationNumber, + 'unit_economical_number': instance.unitEconomicalNumber, + 'unit_province': instance.unitProvince, + 'unit_city': instance.unitCity, + 'unit_postal_code': instance.unitPostalCode, + 'unit_address': instance.unitAddress, }; _City _$CityFromJson(Map json) => _City( id: (json['id'] as num?)?.toInt(), key: json['key'] as String?, - create_date: json['create_date'] as String?, - modify_date: json['modify_date'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, trash: json['trash'] as bool?, - province_id_foreign_key: (json['province_id_foreign_key'] as num?)?.toInt(), - city_id_key: (json['city_id_key'] as num?)?.toInt(), + provinceIdForeignKey: (json['province_id_foreign_key'] as num?)?.toInt(), + cityIdKey: (json['city_id_key'] as num?)?.toInt(), name: json['name'] as String?, - product_price: (json['product_price'] as num?)?.toInt(), - province_center: json['province_center'] as bool?, - city_number: (json['city_number'] as num?)?.toInt(), - city_name: json['city_name'] as String?, - province_number: (json['province_number'] as num?)?.toInt(), - province_name: json['province_name'] as String?, - created_by: json['created_by'] as String?, - modified_by: json['modified_by'] as String?, + productPrice: (json['product_price'] as num?)?.toDouble(), + provinceCenter: json['province_center'] as bool?, + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, + createdBy: json['created_by'] as String?, + modifiedBy: json['modified_by'] as String?, province: (json['province'] as num?)?.toInt(), ); Map _$CityToJson(_City instance) => { 'id': instance.id, 'key': instance.key, - 'create_date': instance.create_date, - 'modify_date': instance.modify_date, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, 'trash': instance.trash, - 'province_id_foreign_key': instance.province_id_foreign_key, - 'city_id_key': instance.city_id_key, + 'province_id_foreign_key': instance.provinceIdForeignKey, + 'city_id_key': instance.cityIdKey, 'name': instance.name, - 'product_price': instance.product_price, - 'province_center': instance.province_center, - 'city_number': instance.city_number, - 'city_name': instance.city_name, - 'province_number': instance.province_number, - 'province_name': instance.province_name, - 'created_by': instance.created_by, - 'modified_by': instance.modified_by, + 'product_price': instance.productPrice, + 'province_center': instance.provinceCenter, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, 'province': instance.province, }; @@ -206,14 +206,14 @@ _Address _$AddressFromJson(Map json) => _Address( ? null : City.fromJson(json['city'] as Map), address: json['address'] as String?, - postal_code: json['postal_code'] as String?, + postalCode: json['postal_code'] as String?, ); Map _$AddressToJson(_Address instance) => { 'province': instance.province, 'city': instance.city, 'address': instance.address, - 'postal_code': instance.postal_code, + 'postal_code': instance.postalCode, }; _Province _$ProvinceFromJson(Map json) => diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index aaadad3..4e6359d 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,8 +1,20 @@ +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { RxBool isExpanded = false.obs; RxList isExpandedList = [].obs; + + RootLogic get rootLogic => Get.find(); + + + + + + + + + @override void onReady() { // TODO: implement onReady diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index b44b6f9..b5cc18b 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -65,231 +65,221 @@ class SalesOutOfProvincePage extends GetView { ListView saleListWidget() { return ListView.separated( - shrinkWrap: true, - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) { - return ObxValue( - (data) => saleListItem(data, index), - controller.isExpandedList, - ); - }, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemCount: 5, + shrinkWrap: true, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) { + return ObxValue( + (data) => saleListItem(data, index), + controller.isExpandedList, ); + }, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemCount: 5, + ); + } + + Widget emptyWidget() { + return Center( + child: Text( + 'داده ای دریافت نشد!', + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover), + ), + ); } GestureDetector saleListItem(RxList data, int index) { return GestureDetector( - onTap: () { - if (data.contains(index)) { - controller.isExpandedList.remove(index); - } else { - controller.isExpandedList.add(index); - } - }, - child: AnimatedContainer( - duration: Duration(milliseconds: 400), + onTap: () { + if (data.contains(index)) { + controller.isExpandedList.remove(index); + } else { + controller.isExpandedList.add(index); + } + }, + child: AnimatedContainer( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + height: data.contains(index) ? 210 : 56, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedContainer( + width: Get.width - 30, + duration: Duration(milliseconds: 300), + height: data.contains(index) ? 210 : 56, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), + ), + child: AnimatedCrossFade( alignment: Alignment.center, - height: data.contains(index) ? 210 : 56, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, + firstChild: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - AnimatedContainer( - width: Get.width - 30, - duration: Duration(milliseconds: 300), - height: data.contains(index) ? 210 : 56, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: Border.all( - width: 0.5, - color: AppColor.darkGreyNormal, - ), - ), - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text( - '1403/5/5', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), - ), - Text( - 'افلاک', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'kg 200 مرغ گرم ', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - - Text( - 'لرستان-خرم آباد', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), - ), - - Icon(CupertinoIcons.chevron_down, size: 12), - ], - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - - Text( - 'لرستان - خرم آباد', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), - ), - - Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.error, - BlendMode.srcIn, - ), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric( - horizontal: 4, - ), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1, - color: AppColor.blueLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - ), - child: buildRow( - 'تاریخ', - '07:15:00 - 1402/07/01', - ), - ), - - buildRow( - 'مشخصات فروشنده', - 'افلاک - 09203659874', - ), - buildRow('وزن خریداری شده', '200 کیلوگرم'), - buildRow('لاشه خریداری شده', '200 عدد'), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Icon(CupertinoIcons.chevron_up, size: 12), - ], - ), - ], - ), - ), - crossFadeState: data.contains(index) - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), + Text( + '1403/5/5', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + Text( + 'افلاک', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, ), ), - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all( - width: 0.50, - color: AppColor.greenDarkActive, - ), - ), - alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith( - color: Colors.black, - ), - ), + Text( + 'kg 200 مرغ گرم ', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, ), ), + + Text( + 'لرستان-خرم آباد', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + + Icon(CupertinoIcons.chevron_down, size: 12), ], ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + + Text( + 'لرستان - خرم آباد', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, + ), + ), + + Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: AppColor.blueLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), + ), + + buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), + buildRow('وزن خریداری شده', '200 کیلوگرم'), + buildRow('لاشه خریداری شده', '200 عدد'), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [Icon(CupertinoIcons.chevron_up, size: 12)], + ), + ], + ), + ), + crossFadeState: data.contains(index) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), ), - ); + ), + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all( + width: 0.50, + color: AppColor.greenDarkActive, + ), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ); } Row routePageWidget() { return Row( - children: [ - SizedBox(width: 8), - RichText( - text: TextSpan( - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - children: [ - WidgetSpan( - child: Row( - children: [ - Assets.vec.cubeSearchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - SizedBox(width: 6,) - ], + children: [ + SizedBox(width: 8), + RichText( + text: TextSpan( + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + children: [ + WidgetSpan( + child: Row( + children: [ + Assets.vec.cubeSearchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), ), - ), - - TextSpan(text: 'خارج استان'), - TextSpan(text: '/'), - TextSpan(text: 'خرید'), - ], + SizedBox(width: 6), + ], + ), ), - ), - ], - ); + + TextSpan(text: 'خارج استان'), + TextSpan(text: '/'), + TextSpan(text: 'خرید'), + ], + ), + ), + ], + ); } Widget buildRow(String title, String value) { From 656b5f0d8735175b5a230934eca62a18e58095dd Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 21 Jun 2025 17:01:37 +0330 Subject: [PATCH 128/256] feat : sale out of Province --- android/app/src/main/AndroidManifest.xml | 2 + packages/chicken/lib/data/di/chicken_di.dart | 10 +- .../create_steward_free_bar.dart | 21 + .../iran_province_city_model.dart | 16 + .../pagination_model/pagination_model.dart | 19 + .../steward_free_bar/steward_free_bar.dart | 18 +- .../steward_free_bar.freezed.dart | 204 +----- .../steward_free_bar/steward_free_bar.g.dart | 128 ++-- .../data/repositories/chicken_repository.dart | 76 +-- .../repositories/chicken_repository_imp.dart | 142 +++-- .../pages/out_of_province/logic.dart | 1 + .../lib/presentation/pages/root/logic.dart | 19 +- .../pages/sales_out_of_province/logic.dart | 176 +++++- .../pages/sales_out_of_province/view.dart | 588 +++++++++++++++--- packages/core/lib/core.dart | 6 +- .../lib/presentation/utils/image_utils.dart | 8 + .../core/lib/presentation/utils/utils.dart | 5 +- .../draggable_bottom_sheet2.dart | 1 - .../presentation/widget/inputs/r_input.dart | 4 +- .../widget/overlay_dropdown_widget/view.dart | 1 + packages/core/lib/utils/date_time_utils.dart | 32 +- packages/core/lib/utils/map_utils.dart | 5 + packages/core/lib/utils/network/network.dart | 2 + packages/core/lib/utils/network/resource.dart | 46 ++ .../utils/{ => network}/safe_call_utils.dart | 2 +- packages/core/pubspec.lock | 112 ++++ packages/core/pubspec.yaml | 3 + pubspec.lock | 112 ++++ 28 files changed, 1270 insertions(+), 489 deletions(-) create mode 100644 packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.dart create mode 100644 packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.dart create mode 100644 packages/chicken/lib/data/models/response/pagination_model/pagination_model.dart create mode 100644 packages/core/lib/presentation/utils/image_utils.dart create mode 100644 packages/core/lib/utils/network/network.dart create mode 100644 packages/core/lib/utils/network/resource.dart rename packages/core/lib/utils/{ => network}/safe_call_utils.dart (98%) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0258a40..7c7e1d7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + setupChickenDI() async { var tokenService = Get.find(); - diAuth.registerLazySingleton( - () => DioRemote(baseUrl: tokenService.baseurl.value), - ); + diAuth.registerLazySingleton(() => DioRemote(baseUrl: tokenService.baseurl.value)); final dioRemote = diAuth.get(); await dioRemote.init(); - diAuth.registerLazySingleton( - () => ChickenRepositoryImpl(dioRemote), - ); + diAuth.registerLazySingleton(() => ChickenRepositoryImpl(dioRemote)); + + diChicken.registerSingleton(ImagePicker()); } diff --git a/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.dart b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.dart new file mode 100644 index 0000000..85a32aa --- /dev/null +++ b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.dart @@ -0,0 +1,21 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'create_steward_free_bar.freezed.dart'; +part 'create_steward_free_bar.g.dart'; + +@freezed +abstract class CreateStewardFreeBar with _$CreateStewardFreeBar { + const factory CreateStewardFreeBar({ + String? productKey, + String? killHouseName, + String? killHouseMobile, + String? province, + String? city, + int? weightOfCarcasses, + String? date, + String? barImage, + }) = _CreateStewardFreeBar; + + factory CreateStewardFreeBar.fromJson(Map json) => + _$CreateStewardFreeBarFromJson(json); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.dart b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.dart new file mode 100644 index 0000000..f46a8f5 --- /dev/null +++ b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'iran_province_city_model.freezed.dart'; +part 'iran_province_city_model.g.dart'; + + +@freezed +abstract class IranProvinceCityModel with _$IranProvinceCityModel { + const factory IranProvinceCityModel({ + int? id, + String? name, + }) = _IranProvinceCityModel; + + factory IranProvinceCityModel.fromJson(Map json) => + _$IranProvinceCityModelFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/pagination_model/pagination_model.dart b/packages/chicken/lib/data/models/response/pagination_model/pagination_model.dart new file mode 100644 index 0000000..61edb74 --- /dev/null +++ b/packages/chicken/lib/data/models/response/pagination_model/pagination_model.dart @@ -0,0 +1,19 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'pagination_model.freezed.dart'; +part 'pagination_model.g.dart'; + +@Freezed(genericArgumentFactories: true) +abstract class PaginationModel with _$PaginationModel { + const factory PaginationModel({ + int? count, + String? next, + String? previous, + List? results, + }) = _PaginationModel; + + factory PaginationModel.fromJson( + Map json, + T Function(Object?) fromJsonT, + ) => _$PaginationModelFromJson(json, fromJsonT); +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart index 9247f9f..d09c3a0 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.dart @@ -6,19 +6,6 @@ part 'steward_free_bar.g.dart'; @freezed abstract class StewardFreeBar with _$StewardFreeBar { const factory StewardFreeBar({ - int? count, - String? next, - String? previous, - List? results, - }) = _StewardFreeBar; - - factory StewardFreeBar.fromJson(Map json) => - _$StewardFreeBarFromJson(json); -} - -@freezed -abstract class Result with _$Result { - const factory Result({ int? id, Steward? steward, dynamic guild, @@ -45,9 +32,10 @@ abstract class Result with _$Result { bool? temporaryDeleted, String? createdBy, String? modifiedBy, - }) = _Result; + }) = _StewardFreeBar; - factory Result.fromJson(Map json) => _$ResultFromJson(json); + factory StewardFreeBar.fromJson(Map json) => + _$StewardFreeBarFromJson(json); } @freezed diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart index 1e99c86..8e11281 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$StewardFreeBar { - int? get count; String? get next; String? get previous; List? get results; + int? get id; Steward? get steward; dynamic get guild; Product? get product; String? get key; String? get createDate; String? get modifyDate; bool? get trash; String? get killHouseName; String? get killHouseMobile; String? get killHouseVetName; String? get killHouseVetMobile; String? get province; String? get city; String? get driverName; String? get driverMobile; dynamic get car; String? get pelak; int? get numberOfCarcasses; double? get weightOfCarcasses; String? get barImage; String? get date; bool? get temporaryTrash; bool? get temporaryDeleted; String? get createdBy; String? get modifiedBy; /// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $StewardFreeBarCopyWith get copyWith => _$StewardFreeBarCopyWith @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardFreeBar&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardFreeBar&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.killHouseVetName, killHouseVetName) || other.killHouseVetName == killHouseVetName)&&(identical(other.killHouseVetMobile, killHouseVetMobile) || other.killHouseVetMobile == killHouseVetMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); +int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,createDate,modifyDate,trash,killHouseName,killHouseMobile,killHouseVetName,killHouseVetMobile,province,city,driverName,driverMobile,const DeepCollectionEquality().hash(car),pelak,numberOfCarcasses,weightOfCarcasses,barImage,date,temporaryTrash,temporaryDeleted,createdBy,modifiedBy]); @override String toString() { - return 'StewardFreeBar(count: $count, next: $next, previous: $previous, results: $results)'; + return 'StewardFreeBar(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, killHouseVetName: $killHouseVetName, killHouseVetMobile: $killHouseVetMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, car: $car, pelak: $pelak, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, barImage: $barImage, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy)'; } @@ -49,11 +49,11 @@ abstract mixin class $StewardFreeBarCopyWith<$Res> { factory $StewardFreeBarCopyWith(StewardFreeBar value, $Res Function(StewardFreeBar) _then) = _$StewardFreeBarCopyWithImpl; @useResult $Res call({ - int? count, String? next, String? previous, List? results + int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy }); - +$StewardCopyWith<$Res>? get steward;$ProductCopyWith<$Res>? get product; } /// @nodoc @@ -66,156 +66,6 @@ class _$StewardFreeBarCopyWithImpl<$Res> /// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { - return _then(_self.copyWith( -count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: freezed == results ? _self.results : results // ignore: cast_nullable_to_non_nullable -as List?, - )); -} - -} - - -/// @nodoc -@JsonSerializable() - -class _StewardFreeBar implements StewardFreeBar { - const _StewardFreeBar({this.count, this.next, this.previous, final List? results}): _results = results; - factory _StewardFreeBar.fromJson(Map json) => _$StewardFreeBarFromJson(json); - -@override final int? count; -@override final String? next; -@override final String? previous; - final List? _results; -@override List? get results { - final value = _results; - if (value == null) return null; - if (_results is EqualUnmodifiableListView) return _results; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); -} - - -/// Create a copy of StewardFreeBar -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$StewardFreeBarCopyWith<_StewardFreeBar> get copyWith => __$StewardFreeBarCopyWithImpl<_StewardFreeBar>(this, _$identity); - -@override -Map toJson() { - return _$StewardFreeBarToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardFreeBar&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); - -@override -String toString() { - return 'StewardFreeBar(count: $count, next: $next, previous: $previous, results: $results)'; -} - - -} - -/// @nodoc -abstract mixin class _$StewardFreeBarCopyWith<$Res> implements $StewardFreeBarCopyWith<$Res> { - factory _$StewardFreeBarCopyWith(_StewardFreeBar value, $Res Function(_StewardFreeBar) _then) = __$StewardFreeBarCopyWithImpl; -@override @useResult -$Res call({ - int? count, String? next, String? previous, List? results -}); - - - - -} -/// @nodoc -class __$StewardFreeBarCopyWithImpl<$Res> - implements _$StewardFreeBarCopyWith<$Res> { - __$StewardFreeBarCopyWithImpl(this._self, this._then); - - final _StewardFreeBar _self; - final $Res Function(_StewardFreeBar) _then; - -/// Create a copy of StewardFreeBar -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { - return _then(_StewardFreeBar( -count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: freezed == results ? _self._results : results // ignore: cast_nullable_to_non_nullable -as List?, - )); -} - - -} - - -/// @nodoc -mixin _$Result { - - int? get id; Steward? get steward; dynamic get guild; Product? get product; String? get key; String? get createDate; String? get modifyDate; bool? get trash; String? get killHouseName; String? get killHouseMobile; String? get killHouseVetName; String? get killHouseVetMobile; String? get province; String? get city; String? get driverName; String? get driverMobile; dynamic get car; String? get pelak; int? get numberOfCarcasses; double? get weightOfCarcasses; String? get barImage; String? get date; bool? get temporaryTrash; bool? get temporaryDeleted; String? get createdBy; String? get modifiedBy; -/// Create a copy of Result -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$ResultCopyWith get copyWith => _$ResultCopyWithImpl(this as Result, _$identity); - - /// Serializes this Result to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.killHouseVetName, killHouseVetName) || other.killHouseVetName == killHouseVetName)&&(identical(other.killHouseVetMobile, killHouseVetMobile) || other.killHouseVetMobile == killHouseVetMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionEquality().hash(guild),product,key,createDate,modifyDate,trash,killHouseName,killHouseMobile,killHouseVetName,killHouseVetMobile,province,city,driverName,driverMobile,const DeepCollectionEquality().hash(car),pelak,numberOfCarcasses,weightOfCarcasses,barImage,date,temporaryTrash,temporaryDeleted,createdBy,modifiedBy]); - -@override -String toString() { - return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, killHouseVetName: $killHouseVetName, killHouseVetMobile: $killHouseVetMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, car: $car, pelak: $pelak, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, barImage: $barImage, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy)'; -} - - -} - -/// @nodoc -abstract mixin class $ResultCopyWith<$Res> { - factory $ResultCopyWith(Result value, $Res Function(Result) _then) = _$ResultCopyWithImpl; -@useResult -$Res call({ - int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy -}); - - -$StewardCopyWith<$Res>? get steward;$ProductCopyWith<$Res>? get product; - -} -/// @nodoc -class _$ResultCopyWithImpl<$Res> - implements $ResultCopyWith<$Res> { - _$ResultCopyWithImpl(this._self, this._then); - - final Result _self; - final $Res Function(Result) _then; - -/// Create a copy of Result -/// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? killHouseName = freezed,Object? killHouseMobile = freezed,Object? killHouseVetName = freezed,Object? killHouseVetMobile = freezed,Object? province = freezed,Object? city = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? barImage = freezed,Object? date = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable @@ -247,7 +97,7 @@ as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // as String?, )); } -/// Create a copy of Result +/// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -259,7 +109,7 @@ $StewardCopyWith<$Res>? get steward { return $StewardCopyWith<$Res>(_self.steward!, (value) { return _then(_self.copyWith(steward: value)); }); -}/// Create a copy of Result +}/// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -278,9 +128,9 @@ $ProductCopyWith<$Res>? get product { /// @nodoc @JsonSerializable() -class _Result implements Result { - const _Result({this.id, this.steward, this.guild, this.product, this.key, this.createDate, this.modifyDate, this.trash, this.killHouseName, this.killHouseMobile, this.killHouseVetName, this.killHouseVetMobile, this.province, this.city, this.driverName, this.driverMobile, this.car, this.pelak, this.numberOfCarcasses, this.weightOfCarcasses, this.barImage, this.date, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy}); - factory _Result.fromJson(Map json) => _$ResultFromJson(json); +class _StewardFreeBar implements StewardFreeBar { + const _StewardFreeBar({this.id, this.steward, this.guild, this.product, this.key, this.createDate, this.modifyDate, this.trash, this.killHouseName, this.killHouseMobile, this.killHouseVetName, this.killHouseVetMobile, this.province, this.city, this.driverName, this.driverMobile, this.car, this.pelak, this.numberOfCarcasses, this.weightOfCarcasses, this.barImage, this.date, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy}); + factory _StewardFreeBar.fromJson(Map json) => _$StewardFreeBarFromJson(json); @override final int? id; @override final Steward? steward; @@ -309,20 +159,20 @@ class _Result implements Result { @override final String? createdBy; @override final String? modifiedBy; -/// Create a copy of Result +/// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -_$ResultCopyWith<_Result> get copyWith => __$ResultCopyWithImpl<_Result>(this, _$identity); +_$StewardFreeBarCopyWith<_StewardFreeBar> get copyWith => __$StewardFreeBarCopyWithImpl<_StewardFreeBar>(this, _$identity); @override Map toJson() { - return _$ResultToJson(this, ); + return _$StewardFreeBarToJson(this, ); } @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Result&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.killHouseVetName, killHouseVetName) || other.killHouseVetName == killHouseVetName)&&(identical(other.killHouseVetMobile, killHouseVetMobile) || other.killHouseVetMobile == killHouseVetMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardFreeBar&&(identical(other.id, id) || other.id == id)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&(identical(other.product, product) || other.product == product)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.killHouseVetName, killHouseVetName) || other.killHouseVetName == killHouseVetName)&&(identical(other.killHouseVetMobile, killHouseVetMobile) || other.killHouseVetMobile == killHouseVetMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&const DeepCollectionEquality().equals(other.car, car)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.barImage, barImage) || other.barImage == barImage)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)); } @JsonKey(includeFromJson: false, includeToJson: false) @@ -331,15 +181,15 @@ int get hashCode => Object.hashAll([runtimeType,id,steward,const DeepCollectionE @override String toString() { - return 'Result(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, killHouseVetName: $killHouseVetName, killHouseVetMobile: $killHouseVetMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, car: $car, pelak: $pelak, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, barImage: $barImage, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy)'; + return 'StewardFreeBar(id: $id, steward: $steward, guild: $guild, product: $product, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, killHouseVetName: $killHouseVetName, killHouseVetMobile: $killHouseVetMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, car: $car, pelak: $pelak, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, barImage: $barImage, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy)'; } } /// @nodoc -abstract mixin class _$ResultCopyWith<$Res> implements $ResultCopyWith<$Res> { - factory _$ResultCopyWith(_Result value, $Res Function(_Result) _then) = __$ResultCopyWithImpl; +abstract mixin class _$StewardFreeBarCopyWith<$Res> implements $StewardFreeBarCopyWith<$Res> { + factory _$StewardFreeBarCopyWith(_StewardFreeBar value, $Res Function(_StewardFreeBar) _then) = __$StewardFreeBarCopyWithImpl; @override @useResult $Res call({ int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy @@ -350,17 +200,17 @@ $Res call({ } /// @nodoc -class __$ResultCopyWithImpl<$Res> - implements _$ResultCopyWith<$Res> { - __$ResultCopyWithImpl(this._self, this._then); +class __$StewardFreeBarCopyWithImpl<$Res> + implements _$StewardFreeBarCopyWith<$Res> { + __$StewardFreeBarCopyWithImpl(this._self, this._then); - final _Result _self; - final $Res Function(_Result) _then; + final _StewardFreeBar _self; + final $Res Function(_StewardFreeBar) _then; -/// Create a copy of Result +/// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? killHouseName = freezed,Object? killHouseMobile = freezed,Object? killHouseVetName = freezed,Object? killHouseVetMobile = freezed,Object? province = freezed,Object? city = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? car = freezed,Object? pelak = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? barImage = freezed,Object? date = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,}) { - return _then(_Result( + return _then(_StewardFreeBar( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable as Steward?,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable @@ -391,7 +241,7 @@ as String?, )); } -/// Create a copy of Result +/// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -403,7 +253,7 @@ $StewardCopyWith<$Res>? get steward { return $StewardCopyWith<$Res>(_self.steward!, (value) { return _then(_self.copyWith(steward: value)); }); -}/// Create a copy of Result +}/// Create a copy of StewardFreeBar /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart index b895764..8a9d5bd 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.g.dart @@ -8,84 +8,68 @@ part of 'steward_free_bar.dart'; _StewardFreeBar _$StewardFreeBarFromJson(Map json) => _StewardFreeBar( - count: (json['count'] as num?)?.toInt(), - next: json['next'] as String?, - previous: json['previous'] as String?, - results: (json['results'] as List?) - ?.map((e) => Result.fromJson(e as Map)) - .toList(), + id: (json['id'] as num?)?.toInt(), + steward: json['steward'] == null + ? null + : Steward.fromJson(json['steward'] as Map), + guild: json['guild'], + product: json['product'] == null + ? null + : Product.fromJson(json['product'] as Map), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + killHouseName: json['kill_house_name'] as String?, + killHouseMobile: json['kill_house_mobile'] as String?, + killHouseVetName: json['kill_house_vet_name'] as String?, + killHouseVetMobile: json['kill_house_vet_mobile'] as String?, + province: json['province'] as String?, + city: json['city'] as String?, + driverName: json['driver_name'] as String?, + driverMobile: json['driver_mobile'] as String?, + car: json['car'], + pelak: json['pelak'] as String?, + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toDouble(), + barImage: json['bar_image'] as String?, + date: json['date'] as String?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + createdBy: json['created_by'] as String?, + modifiedBy: json['modified_by'] as String?, ); Map _$StewardFreeBarToJson(_StewardFreeBar instance) => { - 'count': instance.count, - 'next': instance.next, - 'previous': instance.previous, - 'results': instance.results, + 'id': instance.id, + 'steward': instance.steward, + 'guild': instance.guild, + 'product': instance.product, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'kill_house_name': instance.killHouseName, + 'kill_house_mobile': instance.killHouseMobile, + 'kill_house_vet_name': instance.killHouseVetName, + 'kill_house_vet_mobile': instance.killHouseVetMobile, + 'province': instance.province, + 'city': instance.city, + 'driver_name': instance.driverName, + 'driver_mobile': instance.driverMobile, + 'car': instance.car, + 'pelak': instance.pelak, + 'number_of_carcasses': instance.numberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'bar_image': instance.barImage, + 'date': instance.date, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, }; -_Result _$ResultFromJson(Map json) => _Result( - id: (json['id'] as num?)?.toInt(), - steward: json['steward'] == null - ? null - : Steward.fromJson(json['steward'] as Map), - guild: json['guild'], - product: json['product'] == null - ? null - : Product.fromJson(json['product'] as Map), - key: json['key'] as String?, - createDate: json['create_date'] as String?, - modifyDate: json['modify_date'] as String?, - trash: json['trash'] as bool?, - killHouseName: json['kill_house_name'] as String?, - killHouseMobile: json['kill_house_mobile'] as String?, - killHouseVetName: json['kill_house_vet_name'] as String?, - killHouseVetMobile: json['kill_house_vet_mobile'] as String?, - province: json['province'] as String?, - city: json['city'] as String?, - driverName: json['driver_name'] as String?, - driverMobile: json['driver_mobile'] as String?, - car: json['car'], - pelak: json['pelak'] as String?, - numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), - weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toDouble(), - barImage: json['bar_image'] as String?, - date: json['date'] as String?, - temporaryTrash: json['temporary_trash'] as bool?, - temporaryDeleted: json['temporary_deleted'] as bool?, - createdBy: json['created_by'] as String?, - modifiedBy: json['modified_by'] as String?, -); - -Map _$ResultToJson(_Result instance) => { - 'id': instance.id, - 'steward': instance.steward, - 'guild': instance.guild, - 'product': instance.product, - 'key': instance.key, - 'create_date': instance.createDate, - 'modify_date': instance.modifyDate, - 'trash': instance.trash, - 'kill_house_name': instance.killHouseName, - 'kill_house_mobile': instance.killHouseMobile, - 'kill_house_vet_name': instance.killHouseVetName, - 'kill_house_vet_mobile': instance.killHouseVetMobile, - 'province': instance.province, - 'city': instance.city, - 'driver_name': instance.driverName, - 'driver_mobile': instance.driverMobile, - 'car': instance.car, - 'pelak': instance.pelak, - 'number_of_carcasses': instance.numberOfCarcasses, - 'weight_of_carcasses': instance.weightOfCarcasses, - 'bar_image': instance.barImage, - 'date': instance.date, - 'temporary_trash': instance.temporaryTrash, - 'temporary_deleted': instance.temporaryDeleted, - 'created_by': instance.createdBy, - 'modified_by': instance.modifiedBy, -}; - _Steward _$StewardFromJson(Map json) => _Steward( user: json['user'] == null ? null diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index a3b6eef..a880f85 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -6,79 +6,67 @@ import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/pagination_model/pagination_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; -import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' - hide ProductModel; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; + +import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { Future?> getInventory({required String token}); - Future getIKillHouseDistributionInfo({ - required String token, - }); + Future getIKillHouseDistributionInfo({required String token}); - Future getGeneralBarInformation({required String token,Map? queryParameters}); + Future getGeneralBarInformation({required String token, Map? queryParameters}); - Future getWaitingArrivals({ - required String token, - int? page, - }); + Future getWaitingArrivals({required String token, int? page}); - Future setSateForArrivals({ - required String token, - required Map request, - }); + Future setSateForArrivals({required String token, required Map request}); - Future getImportedLoadsModel({ - required String token, - required int page, - }); + Future getImportedLoadsModel({required String token, required int page}); - Future getAllocatedMade({ - required String token, - required int page, - }); + Future getAllocatedMade({required String token, required int page}); - Future confirmAllocation({ - required String token, - required Map allocation, - }); + Future confirmAllocation({required String token, required Map allocation}); - Future denyAllocation({ - required String token, - required String allocationToken, - }); + Future denyAllocation({required String token, required String allocationToken}); - Future confirmAllAllocation({ - required String token, - required List allocationTokens, - }); + Future confirmAllAllocation({required String token, required List allocationTokens}); Future?> getRolesProducts({required String token}); - Future?> getGuilds({ - required String token, - required bool isFree, - }); + Future?> getGuilds({required String token, required bool isFree}); Future getProfile({required String token}); - Future postSubmitStewardAllocation({ - required String token, - required SubmitStewardAllocation request, - }); + Future postSubmitStewardAllocation({required String token, required SubmitStewardAllocation request}); - Future getStewardDashboard({ + Future getStewardDashboard({ required String token, required String stratDate, required String endDate, }); - Future getDashboardKillHouseFreeBar({ + Future getDashboardKillHouseFreeBar({ required String token, required String stratDate, required String endDate, }); + + Future?> getStewardPurchasesOutSideOfTheProvince({ + required String token, + Map? queryParameters, + }); + + Future createStewardPurchasesOutSideOfTheProvince({required String token, required CreateStewardFreeBar body}); + + Future deleteStewardPurchasesOutSideOfTheProvince({required String token, required String stewardFreeBarKey}); + + Future?> getProvince(); + + Future?> getCity({required String provinceName}); } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 8cc819b..e1a59e9 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; @@ -6,11 +7,13 @@ import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/pagination_model/pagination_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; -import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' - hide ProductModel; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; import 'package:rasadyar_core/core.dart'; import 'chicken_repository.dart'; @@ -25,18 +28,14 @@ class ChickenRepositoryImpl implements ChickenRepository { var res = await _httpClient.get( '/roles-products/?role=Steward', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => (json) - .map((item) => InventoryModel.fromJson(item as Map)) - .toList(), + fromJsonList: (json) => (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), ); return res.data; } @override - Future getIKillHouseDistributionInfo({ - required String token, - }) async { + Future getIKillHouseDistributionInfo({required String token}) async { var res = await _httpClient.get( '/kill-house-distribution-info/?role=Steward', headers: {'Authorization': 'Bearer $token'}, @@ -49,7 +48,7 @@ class ChickenRepositoryImpl implements ChickenRepository { @override Future getGeneralBarInformation({ required String token, - Map? queryParameters + Map? queryParameters, }) async { var res = await _httpClient.get( '/bars_for_kill_house_dashboard/?role=Steward', @@ -61,10 +60,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getWaitingArrivals({ - required String token, - int? page, - }) async { + Future getWaitingArrivals({required String token, int? page}) async { var res = await _httpClient.get( '/steward-allocation/?search=filter&value=&role=Steward&page=${page ?? 1}&page_size=10&type=not_entered', headers: {'Authorization': 'Bearer $token'}, @@ -74,22 +70,12 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future setSateForArrivals({ - required String token, - required Map request, - }) async { - await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - data: request, - ); + Future setSateForArrivals({required String token, required Map request}) async { + await _httpClient.put('/steward-allocation/0/', headers: {'Authorization': 'Bearer $token'}, data: request); } @override - Future getImportedLoadsModel({ - required String token, - required int page, - }) async { + Future getImportedLoadsModel({required String token, required int page}) async { var res = await _httpClient.get( '/steward-allocation/?role=Steward&search=filter&page=$page&page_size=10&value=&type=entered', headers: {'Authorization': 'Bearer $token'}, @@ -99,10 +85,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getAllocatedMade({ - required String token, - required int page, - }) async { + Future getAllocatedMade({required String token, required int page}) async { var res = await _httpClient.get( '/steward-allocation/?search=filter&value=&role=Steward&page=$page&page_size=100', headers: {'Authorization': 'Bearer $token'}, @@ -112,10 +95,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future confirmAllocation({ - required String token, - required Map allocation, - }) async { + Future confirmAllocation({required String token, required Map allocation}) async { var res = await _httpClient.put( '/steward-allocation/0/', headers: {'Authorization': 'Bearer $token'}, @@ -124,10 +104,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future denyAllocation({ - required String token, - required String allocationToken, - }) async { + Future denyAllocation({required String token, required String allocationToken}) async { await _httpClient.delete( '/steward-allocation/0/?steward_allocation_key=$allocationToken', headers: {'Authorization': 'Bearer $token'}, @@ -135,10 +112,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future confirmAllAllocation({ - required String token, - required List allocationTokens, - }) async { + Future confirmAllAllocation({required String token, required List allocationTokens}) async { await _httpClient.put( '/steward-allocation/0/', headers: {'Authorization': 'Bearer $token'}, @@ -151,25 +125,18 @@ class ChickenRepositoryImpl implements ChickenRepository { var res = await _httpClient.get( '/roles-products/?role=Steward', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => json - .map((item) => ProductModel.fromJson(item as Map)) - .toList(), + fromJsonList: (json) => json.map((item) => ProductModel.fromJson(item as Map)).toList(), ); return res.data; } @override - Future?> getGuilds({ - required String token, - required bool isFree, - }) async { + Future?> getGuilds({required String token, required bool isFree}) async { var res = await _httpClient.get( '/guilds/?role=Steward&free=$isFree', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => json - .map((item) => GuildModel.fromJson(item as Map)) - .toList(), + fromJsonList: (json) => json.map((item) => GuildModel.fromJson(item as Map)).toList(), ); return res.data; } @@ -185,15 +152,8 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future postSubmitStewardAllocation({ - required String token, - required SubmitStewardAllocation request, - }) async { - await _httpClient.post( - '/steward-allocation/', - headers: {'Authorization': 'Bearer $token'}, - data: request.toJson(), - ); + Future postSubmitStewardAllocation({required String token, required SubmitStewardAllocation request}) async { + await _httpClient.post('/steward-allocation/', headers: {'Authorization': 'Bearer $token'}, data: request.toJson()); } @override @@ -223,4 +183,64 @@ class ChickenRepositoryImpl implements ChickenRepository { ); return res.data; } + + @override + Future?> getStewardPurchasesOutSideOfTheProvince({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward_free_bar/?', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => StewardFreeBar.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future?> getCity({required String provinceName}) async { + var res = await _httpClient.get( + '/iran_city/?', + queryParameters: {'name': provinceName}, + fromJsonList: (json) => json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future?> getProvince() async { + var res = await _httpClient.get( + '/iran_province/', + fromJsonList: (json) => json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future createStewardPurchasesOutSideOfTheProvince({ + required String token, + required CreateStewardFreeBar body, + }) async { + var res = await _httpClient.post( + '/steward_free_bar/', + headers: {'Authorization': 'Bearer $token'}, + data: body.toJson(), + ); + } + + @override + Future deleteStewardPurchasesOutSideOfTheProvince({ + required String token, + required String stewardFreeBarKey, + }) async { + await _httpClient.delete( + '/steward_free_bar/0/?', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: {'key': stewardFreeBarKey}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart index 35fd35c..d39eb9e 100644 --- a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart @@ -22,6 +22,7 @@ class OutOfProvinceLogic extends GetxController { void onInit() { super.onInit(); getStewardDashBord(); + getRolesProducts(); } Future getAllocatedMade() async { diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 7a24a03..352f0e9 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart' show Colors; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; @@ -28,8 +29,6 @@ class RootLogic extends GetxController { GlobalKey(), ]; - - late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; @@ -37,6 +36,8 @@ class RootLogic extends GetxController { RxList errorLocationType = RxList(); RxMap inventoryExpandedList = RxMap(); + RxList provinces = [].obs; + @override void onInit() { super.onInit(); @@ -44,6 +45,8 @@ class RootLogic extends GetxController { dioRemote.init(); chickenRepository = ChickenRepositoryImpl(dioRemote); + getProvinces(); + /*getInventory(); getKillHouseDistributionInfo();*/ } @@ -65,4 +68,16 @@ class RootLogic extends GetxController { void changePage(int index) { currentPage.value = index; } + + Future getProvinces() async { + try { + final res = await chickenRepository.getProvince(); + if (res != null) { + provinces.clear(); + provinces.value = res; + } + } catch (e) { + provinces.clear(); + } + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 4e6359d..ccb35a8 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,29 +1,191 @@ +import 'package:flutter/cupertino.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { RxBool isExpanded = false.obs; + RxBool isSubmitButtonEnabled = false.obs; RxList isExpandedList = [].obs; + RxBool searchIsSelected = false.obs; + + //TODO add this to Di + ImagePicker imagePicker = ImagePicker(); + + Rx>> purchaseOutOfProvinceList = Resource>.loading().obs; + Rxn selectedProduct = Rxn(); + + RxList cites = [].obs; + Rxn selectedProvince = Rxn(); + Rxn selectedCity = Rxn(); + Rxn selectedImage = Rxn(); + RxnString _base64Image = RxnString(); + RxnString editImageUrl = RxnString(); RootLogic get rootLogic => Get.find(); + OutOfProvinceLogic get outOfTheProvinceLogic => Get.find(); + TextEditingController sellerNameController = TextEditingController(); + TextEditingController sellerPhoneController = TextEditingController(); + TextEditingController carcassVolumeController = TextEditingController(); + TextEditingController carcassWeightController = TextEditingController(); - - - - - + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); @override void onReady() { - // TODO: implement onReady super.onReady(); + getStewardPurchaseOutOfProvince(); + selectedProvince.listen((p0) => getCites()); + setupListeners(); + debounce(searchedValue, (callback) => getStewardPurchaseOutOfProvince(), time: Duration(milliseconds: 2000)); + ever(searchIsSelected, (data) { + if (data == false) { + searchedValue.value = null; + } + }); } @override void onClose() { - // TODO: implement onClose + sellerNameController.dispose(); + sellerPhoneController.dispose(); + carcassVolumeController.dispose(); + carcassWeightController.dispose(); super.onClose(); } + + Future getStewardPurchaseOutOfProvince() async { + await safeCall( + call: () => rootLogic.chickenRepository.getStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 10, + page: 1, + search: 'filter', + role: 'Steward', + value: searchedValue.value, + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), + onSuccess: (res) { + if ((res?.count ?? 0) == 0) { + purchaseOutOfProvinceList.value = Resource>.empty(); + } else { + purchaseOutOfProvinceList.value = Resource>.success(res!.results!); + } + }, + ); + } + + Future getCites() async { + await safeCall( + call: () => rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), + onSuccess: (result) { + if (result != null && result.isNotEmpty) { + cites.value = result; + } + }, + ); + } + + void setupListeners() { + sellerNameController.addListener(checkFormValid); + sellerPhoneController.addListener(checkFormValid); + carcassVolumeController.addListener(checkFormValid); + carcassWeightController.addListener(checkFormValid); + + ever(selectedProvince, (_) => checkFormValid()); + ever(selectedCity, (_) => checkFormValid()); + ever(selectedProduct, (_) => checkFormValid()); + ever(selectedImage, (data) async { + checkFormValid(); + if (data?.path != null) { + _base64Image.value = await convertImageToBase64(data!.path); + } + }); + } + + void checkFormValid() { + isSubmitButtonEnabled.value = + sellerNameController.text.isNotEmpty && + sellerPhoneController.text.isNotEmpty && + carcassVolumeController.text.isNotEmpty && + carcassWeightController.text.isNotEmpty && + selectedProvince.value != null && + selectedCity.value != null && + selectedProduct.value != null && + selectedImage.value != null; + } + + Future createStewardPurchaseOutOfProvince() async => await safeCall( + call: () async { + CreateStewardFreeBar createStewardFreeBar = CreateStewardFreeBar( + productKey: selectedProduct.value!.key, + killHouseName: sellerNameController.text, + killHouseMobile: sellerPhoneController.text, + province: selectedProvince.value!.name, + city: selectedCity.value!.name, + weightOfCarcasses: int.parse(carcassWeightController.text), + barImage: _base64Image.value, + date: DateTime.now().formattedYHMS, + ); + final res = await rootLogic.chickenRepository.createStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + body: createStewardFreeBar, + ); + }, + onSuccess: (result) { + getStewardPurchaseOutOfProvince(); + resetSubmitForm(); + }, + ); + + void resetSubmitForm() { + sellerNameController.clear(); + sellerPhoneController.clear(); + carcassVolumeController.clear(); + carcassWeightController.clear(); + selectedProvince.value = null; + selectedCity.value = null; + selectedProduct.value = null; + selectedImage.value = null; + _base64Image.value = null; + editImageUrl.value = null; + + isSubmitButtonEnabled.value = false; + } + + void setEditData(StewardFreeBar item) { + iLog(item.barImage); + editImageUrl.value = item.barImage; + sellerNameController.text = item.killHouseName ?? ''; + sellerPhoneController.text = item.killHouseMobile ?? ''; + carcassVolumeController.text = item.weightOfCarcasses?.toString() ?? ''; + carcassWeightController.text = item.weightOfCarcasses?.toString() ?? ''; + selectedProvince.value = IranProvinceCityModel(name: item.province); + selectedCity.value = IranProvinceCityModel(name: item.city); + selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.firstWhere( + (element) => element.key == item.product!.key, + ); + isSubmitButtonEnabled.value = true; + } + + Future deleteStewardPurchaseOutOfProvince(String key) async { + await safeCall( + call: () => rootLogic.chickenRepository.deleteStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + stewardFreeBarKey: key, + ), + ); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index b5cc18b..f3d7a77 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -1,5 +1,10 @@ +import 'dart:io'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -25,28 +30,34 @@ class SalesOutOfProvincePage extends GetView { Assets.vec.chickenSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - Text( - 'رصدطیور', - style: AppFonts.yekan16Bold.copyWith(color: Colors.white), + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), + Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), ], ), additionalActions: [ - Assets.vec.searchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + GestureDetector( + onTap: (){ + + controller.searchIsSelected.value = !controller.searchIsSelected.value; + + }, + child: Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), SizedBox(width: 8), - Assets.vec.filterOutlineSvg.svg( - width: 20, - height: 20, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + GestureDetector( + onTap: () { + Get.bottomSheet(filterBottomSheet()); + }, + child: Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), SizedBox(width: 8), ], @@ -55,43 +66,62 @@ class SalesOutOfProvincePage extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ routePageWidget(), + _buildSearchWidget(), Expanded(child: saleListWidget()), ], ), - floatingActionButton: RFab.add(onPressed: () {}), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet(addPurchasedInformationBottomSheet(), isScrollControlled: true); + }, + ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } - ListView saleListWidget() { - return ListView.separated( - shrinkWrap: true, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) { - return ObxValue( - (data) => saleListItem(data, index), - controller.isExpandedList, - ); - }, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemCount: 5, - ); + Widget saleListWidget() { + return ObxValue((data) { + switch (data.value.status) { + case Status.initial: + case Status.loading: + return Center(child: CupertinoActivityIndicator()); + case Status.success: + return ListView.separated( + shrinkWrap: true, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) { + return ObxValue( + (expandList) => saleListItem(expandList: expandList, index: index, item: data.value.data![index]), + controller.isExpandedList, + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemCount: data.value.data?.length ?? 0, + ); + case Status.error: + return Center( + child: Text( + data.value.message ?? 'خطا در دریافت اطلاعات', + style: AppFonts.yekan16.copyWith(color: AppColor.error), + ), + ); + case Status.empty: + return emptyWidget(); + } + }, controller.purchaseOutOfProvinceList); } Widget emptyWidget() { return Center( - child: Text( - 'داده ای دریافت نشد!', - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover), - ), + child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), ); } - GestureDetector saleListItem(RxList data, int index) { + GestureDetector saleListItem({required RxList expandList, required int index, required StewardFreeBar item}) { return GestureDetector( onTap: () { - if (data.contains(index)) { + if (expandList.contains(index)) { controller.isExpandedList.remove(index); } else { controller.isExpandedList.add(index); @@ -100,7 +130,7 @@ class SalesOutOfProvincePage extends GetView { child: AnimatedContainer( duration: Duration(milliseconds: 400), alignment: Alignment.center, - height: data.contains(index) ? 210 : 56, + height: expandList.contains(index) ? 170 : 56, child: Stack( clipBehavior: Clip.none, alignment: Alignment.centerRight, @@ -108,7 +138,7 @@ class SalesOutOfProvincePage extends GetView { AnimatedContainer( width: Get.width - 30, duration: Duration(milliseconds: 300), - height: data.contains(index) ? 210 : 56, + height: expandList.contains(index) ? 170 : 56, alignment: Alignment.center, decoration: BoxDecoration( color: Colors.transparent, @@ -121,27 +151,23 @@ class SalesOutOfProvincePage extends GetView { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( - '1403/5/5', + item.date?.formattedJalaliDate ?? 'N/A', textAlign: TextAlign.center, style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), ), Text( - 'افلاک', + item.killHouseName ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), Text( - 'kg 200 مرغ گرم ', + 'kg ${item.weightOfCarcasses} ${item.product?.name}', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), Text( - 'لرستان-خرم آباد', + '${item.province}-${item.city}', textAlign: TextAlign.center, style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), ), @@ -152,39 +178,46 @@ class SalesOutOfProvincePage extends GetView { secondChild: Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, + GestureDetector( + onTap: () { + controller.setEditData(item); + Get.bottomSheet( + addPurchasedInformationBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ), Text( - 'لرستان - خرم آباد', + '${item.province}-${item.city}', textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), - Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.error, - BlendMode.srcIn, + GestureDetector( + onTap: () { + buildDeleteDialog( + onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + ); + }, + child: Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), ), ), ], @@ -195,19 +228,15 @@ class SalesOutOfProvincePage extends GetView { decoration: ShapeDecoration( color: AppColor.blueLight, shape: RoundedRectangleBorder( - side: BorderSide( - width: 1, - color: AppColor.blueLightHover, - ), + side: BorderSide(width: 1, color: AppColor.blueLightHover), borderRadius: BorderRadius.circular(8), ), ), - child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), + child: buildRow('تاریخ', item.date?.formattedJalaliDateYHMS ?? 'N/A'), ), - buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), - buildRow('وزن خریداری شده', '200 کیلوگرم'), - buildRow('لاشه خریداری شده', '200 عدد'), + buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), + buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.toInt()} کیلوگرم'), Row( mainAxisAlignment: MainAxisAlignment.end, children: [Icon(CupertinoIcons.chevron_up, size: 12)], @@ -215,9 +244,7 @@ class SalesOutOfProvincePage extends GetView { ], ), ), - crossFadeState: data.contains(index) - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, + crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, duration: Duration(milliseconds: 300), ), ), @@ -230,16 +257,10 @@ class SalesOutOfProvincePage extends GetView { decoration: BoxDecoration( color: AppColor.greenLightHover, borderRadius: BorderRadius.circular(4), - border: Border.all( - width: 0.50, - color: AppColor.greenDarkActive, - ), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), ), alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), + child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), ), ), ], @@ -262,10 +283,7 @@ class SalesOutOfProvincePage extends GetView { Assets.vec.cubeSearchSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), SizedBox(width: 6), ], @@ -293,9 +311,7 @@ class SalesOutOfProvincePage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -303,8 +319,354 @@ class SalesOutOfProvincePage extends GetView { child: Text( value, textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ], + ), + ); + } + + Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + child: SingleChildScrollView( + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + _productTypeWidget(), + RTextField( + controller: controller.sellerNameController, + label: 'نام فروشنده', + borderColor: AppColor.darkGreyLight, + ), + RTextField( + controller: controller.sellerPhoneController, + label: 'تلفن فروشنده', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + ), + _provinceWidget(), + _cityWidget(), + RTextField( + controller: controller.carcassWeightController, + label: 'وزن لاشه', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + ), + RTextField( + controller: controller.carcassVolumeController, + label: 'حجم لاشه', + onChanged: (p0) { + iLog(controller.carcassVolumeController.text); + }, + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + ), + _imageCarcasesWidget(isOnEdit), + submitButtonWidget(isOnEdit), + SizedBox(), + ], + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + text: isOnEdit ? 'ویرایش خرید' : 'ثبت خرید جدید', + onPressed: data.value + ? () async { + await controller.createStewardPurchaseOutOfProvince(); + Get.back(); + } + : null, + height: 40, + ); + }, controller.isSubmitButtonEnabled); + } + + Widget _productTypeWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.outOfTheProvinceLogic.rolesProductsModel, + onChanged: (value) { + controller.selectedProduct.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedProduct.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + ); + }); + } + + Widget _provinceWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rootLogic.provinces, + onChanged: (value) { + controller.selectedProvince.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedProvince.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), + ); + }); + } + + Widget _cityWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: data, + onChanged: (value) { + controller.selectedCity.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedCity.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), + ); + }, controller.cites); + } + + SizedBox _imageCarcasesWidget(bool isOnEdit) { + return SizedBox( + width: Get.width, + height: 250, + child: Card( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Expanded( + child: ObxValue((data) { + return Container( + width: Get.width, + decoration: BoxDecoration(color: AppColor.lightGreyNormal, borderRadius: BorderRadius.circular(8)), + child: Center( + child: isOnEdit + ? Image.network(controller.editImageUrl.value ?? '') + : data.value == null + ? Assets.images.placeHolder.image(height: 150, width: 200) + : Image.file(File(data.value!.path), fit: BoxFit.cover), + ), + ); + }, controller.selectedImage), + ), + SizedBox(height: 15), + Container( + width: Get.width, + height: 40, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('تصویر بار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + Spacer(), + GestureDetector( + onTap: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.camera, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + child: Container( + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('دوربین', style: AppFonts.yekan14.copyWith(color: Colors.white)), + SizedBox(width: 8), + Icon(CupertinoIcons.camera, color: Colors.white), + ], + ), + ), + ), + SizedBox(width: 16), + GestureDetector( + onTap: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.gallery, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + child: Container( + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('گالری', style: AppFonts.yekan14.copyWith(color: Colors.white)), + SizedBox(width: 8), + Icon(CupertinoIcons.photo, color: Colors.white), + ], + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + Future buildDeleteDialog({required Future Function() onConfirm}) async { + await Get.defaultDialog( + title: 'حذف خرید', + middleText: 'آیا از حذف این خرید مطمئن هستید؟', + confirm: ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), + onPressed: () async { + await onConfirm(); + Get.back(); + }, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ).whenComplete(() => controller.getStewardPurchaseOutOfProvince()); + } + + Widget filterBottomSheet() { + return BaseBottomSheet( + height: 250, + child: Column( + spacing: 16, + children: [ + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.fromDateFilter, + onChanged: (jalali) => controller.fromDateFilter.value = jalali, + ), + ), + Expanded( + child: timeFilterWidget( + isFrom: false, + date: controller.toDateFilter, + onChanged: (jalali) => controller.toDateFilter.value = jalali, + ), + ), + ], + ), + SizedBox(height: 2), + RElevated( + text: 'اعمال فیلتر', + onPressed: () { + controller.getStewardPurchaseOutOfProvince(); + Get.back(); + }, + height: 40, + ), + SizedBox(height: 16), + ], + ), + ); + } + + GestureDetector timeFilterWidget({ + isFrom = true, + required Rx date, + required Function(Jalali jalali) onChanged, + }) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blueNormal), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + Expanded( + child: ObxValue((data) { + return Text( + date.value.formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + ); + }, date), + ), + ], + ), + ), + ); + } + + Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + + CupertinoButton( + child: Text('تایید', style: AppFonts.yekan14), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + ), + CupertinoButton( + child: Text('لغو', style: AppFonts.yekan14.copyWith(color: AppColor.error)), + onPressed: () => Get.back(), + ), + ], + ), + ), + Divider(height: 0, thickness: 1), + Expanded( + child: Container( + child: PersianCupertinoDatePicker( + initialDateTime: Jalali.now(), + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, ), ), ), @@ -312,4 +674,36 @@ class SalesOutOfProvincePage extends GetView { ), ); } + + ObxValue _buildSearchWidget() { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + onChanged: (value) { + controller.searchedValue.value = value; + }, + controller: TextEditingController(), + ), + ), + ), + ); + }, controller.searchIsSelected); + } } diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index a2b70e5..cd79f4b 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -39,9 +39,13 @@ export 'infrastructure/remote/dio_form_data.dart'; export 'infrastructure/remote/dio_remote.dart'; export 'infrastructure/remote/dio_response.dart'; export 'injection/di.dart'; + +///image picker +export 'package:image_picker/image_picker.dart'; + //utils export 'utils/logger_utils.dart'; -export 'utils/safe_call_utils.dart'; +export 'utils/network/network.dart'; export 'utils/date_time_utils.dart'; export 'utils/num_utils.dart'; export 'utils/map_utils.dart'; diff --git a/packages/core/lib/presentation/utils/image_utils.dart b/packages/core/lib/presentation/utils/image_utils.dart new file mode 100644 index 0000000..eb5c2b9 --- /dev/null +++ b/packages/core/lib/presentation/utils/image_utils.dart @@ -0,0 +1,8 @@ +import 'dart:convert'; +import 'dart:io'; + +Future convertImageToBase64(String imagePath) async { + final bytes = await File(imagePath).readAsBytes(); + String base64String = base64Encode(bytes); + return base64String; +} diff --git a/packages/core/lib/presentation/utils/utils.dart b/packages/core/lib/presentation/utils/utils.dart index 507c240..88258e2 100644 --- a/packages/core/lib/presentation/utils/utils.dart +++ b/packages/core/lib/presentation/utils/utils.dart @@ -1,3 +1,4 @@ -export 'color_utils.dart'; +export 'color_utils.dart'; +export 'data_time_utils.dart'; +export 'image_utils.dart'; export 'list_extensions.dart'; -export 'data_time_utils.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart index 91826d5..8ba0671 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart @@ -20,7 +20,6 @@ class DraggableBottomSheet2 extends GetView { return ObxValue((data) { return Stack( children: [ - // پس‌زمینه تیره Positioned.fill( child: GestureDetector( onTap: () {}, diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 2780b59..3debe30 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -26,6 +26,7 @@ class RTextField extends StatefulWidget { final RTextFieldVariant variant; final bool filled; final Color? filledColor; + final Color? borderColor; final bool showCounter; final bool isDense; final TextInputType? keyboardType; @@ -67,6 +68,7 @@ class RTextField extends StatefulWidget { this.validator, this.onChanged, this.onSubmitted, + this.borderColor, }); @@ -82,7 +84,7 @@ class RTextField extends StatefulWidget { _noBorder || _passwordNoBorder ? InputBorder.none : OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide( - color: AppColor.lightGreyDarkActive, + color: borderColor ?? AppColor.lightGreyDarkActive, width: 1, ), ); diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index 8d8496d..df217a3 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -134,6 +134,7 @@ class _OverlayDropdownState extends State> { _isOpen.value ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, + size: 14, ), ], ), diff --git a/packages/core/lib/utils/date_time_utils.dart b/packages/core/lib/utils/date_time_utils.dart index 3244f49..32d439d 100644 --- a/packages/core/lib/utils/date_time_utils.dart +++ b/packages/core/lib/utils/date_time_utils.dart @@ -1,10 +1,38 @@ +import 'package:intl/intl.dart'; import 'package:persian_datetime_picker/persian_datetime_picker.dart'; -extension xDateTime on String{ +extension XDateTime on String{ get toDateTime => DateTime.parse(this); + get formattedJalaliDate{ final dateTime = DateTime.parse(this); final jalaliDate = Jalali.fromDateTime(dateTime); return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; } -} \ No newline at end of file + + get formattedJalaliDateYHMS { + final dateTime = DateTime.parse(this); + final jalaliDate = Jalali.fromDateTime(dateTime); + return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')} - ${jalaliDate.hour.toString().padLeft(2, '0')}:${jalaliDate.minute.toString().padLeft(2, '0')}"; + } + + + get formattedYHMS{ + return DateFormat('yyyy-MM-dd HH:mm:ss').format(toDateTime); + } +} + + + +extension XDateTime2 on DateTime{ + + + get formattedJalaliDate{ + final jalaliDate = Jalali.fromDateTime(this); + return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; + } + + get formattedYHMS{ + return DateFormat('yyyy-MM-dd HH:mm:ss').format(this); + } +} diff --git a/packages/core/lib/utils/map_utils.dart b/packages/core/lib/utils/map_utils.dart index 99866c8..943ab2a 100644 --- a/packages/core/lib/utils/map_utils.dart +++ b/packages/core/lib/utils/map_utils.dart @@ -8,6 +8,7 @@ Map buildQueryParams({ int? pageSize, DateTime? fromDate, DateTime? toDate, + String? role, }) { final params = {}; @@ -40,5 +41,9 @@ Map buildQueryParams({ params['page_size'] = pageSize; } + if(role != null && role.isNotEmpty) { + params['role'] = role; + } + return params; } diff --git a/packages/core/lib/utils/network/network.dart b/packages/core/lib/utils/network/network.dart new file mode 100644 index 0000000..0ff8a3c --- /dev/null +++ b/packages/core/lib/utils/network/network.dart @@ -0,0 +1,2 @@ +export 'resource.dart'; +export 'safe_call_utils.dart'; \ No newline at end of file diff --git a/packages/core/lib/utils/network/resource.dart b/packages/core/lib/utils/network/resource.dart new file mode 100644 index 0000000..3d44df0 --- /dev/null +++ b/packages/core/lib/utils/network/resource.dart @@ -0,0 +1,46 @@ +enum Status { + initial, + loading, + success, + error, + empty, +} + + +class Resource { + final Status status; + final T? data; + final String? message; + + const Resource._({ + required this.status, + this.data, + this.message, + }); + + const Resource.initial() : this._(status: Status.initial); + + const Resource.loading() : this._(status: Status.loading); + + const Resource.success(T data) : this._(status: Status.success, data: data); + + const Resource.error(String message) : this._(status: Status.error, message: message); + + const Resource.empty() : this._(status: Status.empty); + + + bool get isInitial => status == Status.initial; + + bool get isLoading => status == Status.loading; + + bool get isSuccess => status == Status.success; + + bool get isError => status == Status.error; + + bool get isEmpty => status == Status.empty; + + @override + String toString() { + return 'Resource{status: $status, data: $data, message: $message}'; + } +} \ No newline at end of file diff --git a/packages/core/lib/utils/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart similarity index 98% rename from packages/core/lib/utils/safe_call_utils.dart rename to packages/core/lib/utils/network/safe_call_utils.dart index c4baa0b..882a549 100644 --- a/packages/core/lib/utils/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -1,6 +1,6 @@ import 'package:flutter/foundation.dart'; -import '../core.dart'; +import '../../core.dart'; typedef AppAsyncCallback = Future Function(); typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace); diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index d023e16..625014b 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -177,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" crypto: dependency: transitive description: @@ -281,6 +289,38 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" + url: "https://pub.dev" + source: hosted + version: "0.9.4+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" fixnum: dependency: transitive description: @@ -339,6 +379,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + url: "https://pub.dev" + source: hosted + version: "2.0.28" flutter_rating_bar: dependency: "direct main" description: @@ -597,6 +645,70 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" + url: "https://pub.dev" + source: hosted + version: "0.8.12+23" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.dev" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" image_size_getter: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 5cd944d..ee443df 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -15,6 +15,9 @@ dependencies: #utils device_info_plus: ^11.4.0 + ##image_picker + image_picker: ^1.1.2 + #UI cupertino_icons: ^1.0.8 diff --git a/pubspec.lock b/pubspec.lock index c2ae1cd..5866c33 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -193,6 +193,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" crypto: dependency: transitive description: @@ -297,6 +305,38 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" + url: "https://pub.dev" + source: hosted + version: "0.9.4+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" fixnum: dependency: transitive description: @@ -363,6 +403,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + url: "https://pub.dev" + source: hosted + version: "2.0.28" flutter_rating_bar: dependency: transitive description: @@ -629,6 +677,70 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.4" + image_picker: + dependency: transitive + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" + url: "https://pub.dev" + source: hosted + version: "0.8.12+23" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.dev" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" image_size_getter: dependency: transitive description: From 4b7ff135d4130408cdb92b473b1d90fce7c91b71 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 21 Jun 2025 17:02:24 +0330 Subject: [PATCH 129/256] feat : sale out of Province --- .../create_steward_free_bar.freezed.dart | 169 ++++++++++++++++++ .../create_steward_free_bar.g.dart | 33 ++++ .../iran_province_city_model.freezed.dart | 151 ++++++++++++++++ .../iran_province_city_model.g.dart | 18 ++ .../pagination_model.freezed.dart | 165 +++++++++++++++++ .../pagination_model/pagination_model.g.dart | 27 +++ 6 files changed, 563 insertions(+) create mode 100644 packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart create mode 100644 packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.g.dart create mode 100644 packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.g.dart create mode 100644 packages/chicken/lib/data/models/response/pagination_model/pagination_model.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/pagination_model/pagination_model.g.dart diff --git a/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart new file mode 100644 index 0000000..c584671 --- /dev/null +++ b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart @@ -0,0 +1,169 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'create_steward_free_bar.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$CreateStewardFreeBar { + + String? get productKey; String? get killHouseName; String? get killHouseMobile; String? get province; String? get city; int? get weightOfCarcasses; String? get date; String? get barImage; +/// Create a copy of CreateStewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CreateStewardFreeBarCopyWith get copyWith => _$CreateStewardFreeBarCopyWithImpl(this as CreateStewardFreeBar, _$identity); + + /// Serializes this CreateStewardFreeBar to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is CreateStewardFreeBar&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.date, date) || other.date == date)&&(identical(other.barImage, barImage) || other.barImage == barImage)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,productKey,killHouseName,killHouseMobile,province,city,weightOfCarcasses,date,barImage); + +@override +String toString() { + return 'CreateStewardFreeBar(productKey: $productKey, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, province: $province, city: $city, weightOfCarcasses: $weightOfCarcasses, date: $date, barImage: $barImage)'; +} + + +} + +/// @nodoc +abstract mixin class $CreateStewardFreeBarCopyWith<$Res> { + factory $CreateStewardFreeBarCopyWith(CreateStewardFreeBar value, $Res Function(CreateStewardFreeBar) _then) = _$CreateStewardFreeBarCopyWithImpl; +@useResult +$Res call({ + String? productKey, String? killHouseName, String? killHouseMobile, String? province, String? city, int? weightOfCarcasses, String? date, String? barImage +}); + + + + +} +/// @nodoc +class _$CreateStewardFreeBarCopyWithImpl<$Res> + implements $CreateStewardFreeBarCopyWith<$Res> { + _$CreateStewardFreeBarCopyWithImpl(this._self, this._then); + + final CreateStewardFreeBar _self; + final $Res Function(CreateStewardFreeBar) _then; + +/// Create a copy of CreateStewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? productKey = freezed,Object? killHouseName = freezed,Object? killHouseMobile = freezed,Object? province = freezed,Object? city = freezed,Object? weightOfCarcasses = freezed,Object? date = freezed,Object? barImage = freezed,}) { + return _then(_self.copyWith( +productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,killHouseName: freezed == killHouseName ? _self.killHouseName : killHouseName // ignore: cast_nullable_to_non_nullable +as String?,killHouseMobile: freezed == killHouseMobile ? _self.killHouseMobile : killHouseMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _CreateStewardFreeBar implements CreateStewardFreeBar { + const _CreateStewardFreeBar({this.productKey, this.killHouseName, this.killHouseMobile, this.province, this.city, this.weightOfCarcasses, this.date, this.barImage}); + factory _CreateStewardFreeBar.fromJson(Map json) => _$CreateStewardFreeBarFromJson(json); + +@override final String? productKey; +@override final String? killHouseName; +@override final String? killHouseMobile; +@override final String? province; +@override final String? city; +@override final int? weightOfCarcasses; +@override final String? date; +@override final String? barImage; + +/// Create a copy of CreateStewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CreateStewardFreeBarCopyWith<_CreateStewardFreeBar> get copyWith => __$CreateStewardFreeBarCopyWithImpl<_CreateStewardFreeBar>(this, _$identity); + +@override +Map toJson() { + return _$CreateStewardFreeBarToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CreateStewardFreeBar&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.killHouseName, killHouseName) || other.killHouseName == killHouseName)&&(identical(other.killHouseMobile, killHouseMobile) || other.killHouseMobile == killHouseMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.date, date) || other.date == date)&&(identical(other.barImage, barImage) || other.barImage == barImage)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,productKey,killHouseName,killHouseMobile,province,city,weightOfCarcasses,date,barImage); + +@override +String toString() { + return 'CreateStewardFreeBar(productKey: $productKey, killHouseName: $killHouseName, killHouseMobile: $killHouseMobile, province: $province, city: $city, weightOfCarcasses: $weightOfCarcasses, date: $date, barImage: $barImage)'; +} + + +} + +/// @nodoc +abstract mixin class _$CreateStewardFreeBarCopyWith<$Res> implements $CreateStewardFreeBarCopyWith<$Res> { + factory _$CreateStewardFreeBarCopyWith(_CreateStewardFreeBar value, $Res Function(_CreateStewardFreeBar) _then) = __$CreateStewardFreeBarCopyWithImpl; +@override @useResult +$Res call({ + String? productKey, String? killHouseName, String? killHouseMobile, String? province, String? city, int? weightOfCarcasses, String? date, String? barImage +}); + + + + +} +/// @nodoc +class __$CreateStewardFreeBarCopyWithImpl<$Res> + implements _$CreateStewardFreeBarCopyWith<$Res> { + __$CreateStewardFreeBarCopyWithImpl(this._self, this._then); + + final _CreateStewardFreeBar _self; + final $Res Function(_CreateStewardFreeBar) _then; + +/// Create a copy of CreateStewardFreeBar +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? productKey = freezed,Object? killHouseName = freezed,Object? killHouseMobile = freezed,Object? province = freezed,Object? city = freezed,Object? weightOfCarcasses = freezed,Object? date = freezed,Object? barImage = freezed,}) { + return _then(_CreateStewardFreeBar( +productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,killHouseName: freezed == killHouseName ? _self.killHouseName : killHouseName // ignore: cast_nullable_to_non_nullable +as String?,killHouseMobile: freezed == killHouseMobile ? _self.killHouseMobile : killHouseMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,barImage: freezed == barImage ? _self.barImage : barImage // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.g.dart b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.g.dart new file mode 100644 index 0000000..50b4a74 --- /dev/null +++ b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'create_steward_free_bar.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_CreateStewardFreeBar _$CreateStewardFreeBarFromJson( + Map json, +) => _CreateStewardFreeBar( + productKey: json['product_key'] as String?, + killHouseName: json['kill_house_name'] as String?, + killHouseMobile: json['kill_house_mobile'] as String?, + province: json['province'] as String?, + city: json['city'] as String?, + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + date: json['date'] as String?, + barImage: json['bar_image'] as String?, +); + +Map _$CreateStewardFreeBarToJson( + _CreateStewardFreeBar instance, +) => { + 'product_key': instance.productKey, + 'kill_house_name': instance.killHouseName, + 'kill_house_mobile': instance.killHouseMobile, + 'province': instance.province, + 'city': instance.city, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'date': instance.date, + 'bar_image': instance.barImage, +}; diff --git a/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart new file mode 100644 index 0000000..d99f6ea --- /dev/null +++ b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart @@ -0,0 +1,151 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'iran_province_city_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$IranProvinceCityModel { + + int? get id; String? get name; +/// Create a copy of IranProvinceCityModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$IranProvinceCityModelCopyWith get copyWith => _$IranProvinceCityModelCopyWithImpl(this as IranProvinceCityModel, _$identity); + + /// Serializes this IranProvinceCityModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is IranProvinceCityModel&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,name); + +@override +String toString() { + return 'IranProvinceCityModel(id: $id, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $IranProvinceCityModelCopyWith<$Res> { + factory $IranProvinceCityModelCopyWith(IranProvinceCityModel value, $Res Function(IranProvinceCityModel) _then) = _$IranProvinceCityModelCopyWithImpl; +@useResult +$Res call({ + int? id, String? name +}); + + + + +} +/// @nodoc +class _$IranProvinceCityModelCopyWithImpl<$Res> + implements $IranProvinceCityModelCopyWith<$Res> { + _$IranProvinceCityModelCopyWithImpl(this._self, this._then); + + final IranProvinceCityModel _self; + final $Res Function(IranProvinceCityModel) _then; + +/// Create a copy of IranProvinceCityModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? name = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _IranProvinceCityModel implements IranProvinceCityModel { + const _IranProvinceCityModel({this.id, this.name}); + factory _IranProvinceCityModel.fromJson(Map json) => _$IranProvinceCityModelFromJson(json); + +@override final int? id; +@override final String? name; + +/// Create a copy of IranProvinceCityModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$IranProvinceCityModelCopyWith<_IranProvinceCityModel> get copyWith => __$IranProvinceCityModelCopyWithImpl<_IranProvinceCityModel>(this, _$identity); + +@override +Map toJson() { + return _$IranProvinceCityModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _IranProvinceCityModel&&(identical(other.id, id) || other.id == id)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,name); + +@override +String toString() { + return 'IranProvinceCityModel(id: $id, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$IranProvinceCityModelCopyWith<$Res> implements $IranProvinceCityModelCopyWith<$Res> { + factory _$IranProvinceCityModelCopyWith(_IranProvinceCityModel value, $Res Function(_IranProvinceCityModel) _then) = __$IranProvinceCityModelCopyWithImpl; +@override @useResult +$Res call({ + int? id, String? name +}); + + + + +} +/// @nodoc +class __$IranProvinceCityModelCopyWithImpl<$Res> + implements _$IranProvinceCityModelCopyWith<$Res> { + __$IranProvinceCityModelCopyWithImpl(this._self, this._then); + + final _IranProvinceCityModel _self; + final $Res Function(_IranProvinceCityModel) _then; + +/// Create a copy of IranProvinceCityModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? name = freezed,}) { + return _then(_IranProvinceCityModel( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.g.dart b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.g.dart new file mode 100644 index 0000000..89f2c4a --- /dev/null +++ b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.g.dart @@ -0,0 +1,18 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'iran_province_city_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_IranProvinceCityModel _$IranProvinceCityModelFromJson( + Map json, +) => _IranProvinceCityModel( + id: (json['id'] as num?)?.toInt(), + name: json['name'] as String?, +); + +Map _$IranProvinceCityModelToJson( + _IranProvinceCityModel instance, +) => {'id': instance.id, 'name': instance.name}; diff --git a/packages/chicken/lib/data/models/response/pagination_model/pagination_model.freezed.dart b/packages/chicken/lib/data/models/response/pagination_model/pagination_model.freezed.dart new file mode 100644 index 0000000..cb35b63 --- /dev/null +++ b/packages/chicken/lib/data/models/response/pagination_model/pagination_model.freezed.dart @@ -0,0 +1,165 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'pagination_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$PaginationModel { + + int? get count; String? get next; String? get previous; List? get results; +/// Create a copy of PaginationModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PaginationModelCopyWith> get copyWith => _$PaginationModelCopyWithImpl>(this as PaginationModel, _$identity); + + /// Serializes this PaginationModel to a JSON map. + Map toJson(Object? Function(T) toJsonT); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PaginationModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); + +@override +String toString() { + return 'PaginationModel<$T>(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class $PaginationModelCopyWith { + factory $PaginationModelCopyWith(PaginationModel value, $Res Function(PaginationModel) _then) = _$PaginationModelCopyWithImpl; +@useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class _$PaginationModelCopyWithImpl + implements $PaginationModelCopyWith { + _$PaginationModelCopyWithImpl(this._self, this._then); + + final PaginationModel _self; + final $Res Function(PaginationModel) _then; + +/// Create a copy of PaginationModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_self.copyWith( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self.results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +} + + +/// @nodoc +@JsonSerializable(genericArgumentFactories: true) + +class _PaginationModel implements PaginationModel { + const _PaginationModel({this.count, this.next, this.previous, final List? results}): _results = results; + factory _PaginationModel.fromJson(Map json,T Function(Object?) fromJsonT) => _$PaginationModelFromJson(json,fromJsonT); + +@override final int? count; +@override final String? next; +@override final String? previous; + final List? _results; +@override List? get results { + final value = _results; + if (value == null) return null; + if (_results is EqualUnmodifiableListView) return _results; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of PaginationModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$PaginationModelCopyWith> get copyWith => __$PaginationModelCopyWithImpl>(this, _$identity); + +@override +Map toJson(Object? Function(T) toJsonT) { + return _$PaginationModelToJson(this, toJsonT); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PaginationModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); + +@override +String toString() { + return 'PaginationModel<$T>(count: $count, next: $next, previous: $previous, results: $results)'; +} + + +} + +/// @nodoc +abstract mixin class _$PaginationModelCopyWith implements $PaginationModelCopyWith { + factory _$PaginationModelCopyWith(_PaginationModel value, $Res Function(_PaginationModel) _then) = __$PaginationModelCopyWithImpl; +@override @useResult +$Res call({ + int? count, String? next, String? previous, List? results +}); + + + + +} +/// @nodoc +class __$PaginationModelCopyWithImpl + implements _$PaginationModelCopyWith { + __$PaginationModelCopyWithImpl(this._self, this._then); + + final _PaginationModel _self; + final $Res Function(_PaginationModel) _then; + +/// Create a copy of PaginationModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { + return _then(_PaginationModel( +count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable +as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable +as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable +as String?,results: freezed == results ? _self._results : results // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/pagination_model/pagination_model.g.dart b/packages/chicken/lib/data/models/response/pagination_model/pagination_model.g.dart new file mode 100644 index 0000000..bc0f5a6 --- /dev/null +++ b/packages/chicken/lib/data/models/response/pagination_model/pagination_model.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'pagination_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_PaginationModel _$PaginationModelFromJson( + Map json, + T Function(Object? json) fromJsonT, +) => _PaginationModel( + count: (json['count'] as num?)?.toInt(), + next: json['next'] as String?, + previous: json['previous'] as String?, + results: (json['results'] as List?)?.map(fromJsonT).toList(), +); + +Map _$PaginationModelToJson( + _PaginationModel instance, + Object? Function(T value) toJsonT, +) => { + 'count': instance.count, + 'next': instance.next, + 'previous': instance.previous, + 'results': instance.results?.map(toJsonT).toList(), +}; From 97fe0f138fe2818ae05c3a84ef6a80d6164fd46a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 22 Jun 2025 11:12:57 +0330 Subject: [PATCH 130/256] feat : sale out of Province --- .../pages/sales_out_of_province/view.dart | 52 ++++++++++++++---- .../widget/buttons/text_button.dart | 2 +- packages/core/lib/utils/date_time_utils.dart | 2 +- packages/core/pubspec.lock | 54 +++++++++---------- packages/core/pubspec.yaml | 6 +-- pubspec.lock | 50 ++++++++--------- 6 files changed, 98 insertions(+), 68 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index f3d7a77..0aa3adf 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -37,10 +37,8 @@ class SalesOutOfProvincePage extends GetView { ), additionalActions: [ GestureDetector( - onTap: (){ - - controller.searchIsSelected.value = !controller.searchIsSelected.value; - + onTap: () { + controller.searchIsSelected.value = !controller.searchIsSelected.value; }, child: Assets.vec.searchSvg.svg( width: 24, @@ -130,7 +128,7 @@ class SalesOutOfProvincePage extends GetView { child: AnimatedContainer( duration: Duration(milliseconds: 400), alignment: Alignment.center, - height: expandList.contains(index) ? 170 : 56, + height: expandList.contains(index) ? 175 : 56, child: Stack( clipBehavior: Clip.none, alignment: Alignment.centerRight, @@ -138,7 +136,7 @@ class SalesOutOfProvincePage extends GetView { AnimatedContainer( width: Get.width - 30, duration: Duration(milliseconds: 300), - height: expandList.contains(index) ? 170 : 56, + height: expandList.contains(index) ? 175 : 56, alignment: Alignment.center, decoration: BoxDecoration( color: Colors.transparent, @@ -238,8 +236,45 @@ class SalesOutOfProvincePage extends GetView { buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.toInt()} کیلوگرم'), Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [Icon(CupertinoIcons.chevron_up, size: 12)], + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + //RTextButton(text: , onPressed: () {}, textStyle: AppFonts.yekan14,height: 20,width: 81,backgroundColor: AppColor.warning,), + GestureDetector( + onTap: () { + Get.bottomSheet( + BaseBottomSheet( + height: 400, + child: Column( + spacing: 16, + children: [ + Text( + 'بارنامه', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Image.network( + item.barImage ?? '', + fit: BoxFit.cover, + height: 300, + errorBuilder: (context, error, stackTrace) { + eLog(error.toString()); + return Center(child: Text('خطایی پیش آمده!')); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + print('Loading progress: $loadingProgress'); + return CupertinoActivityIndicator(); + }, + ), + ], + ), + ), + ); + }, + child: Text('مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + ), + Icon(CupertinoIcons.chevron_up, size: 12), + ], ), ], ), @@ -643,7 +678,6 @@ class SalesOutOfProvincePage extends GetView { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - CupertinoButton( child: Text('تایید', style: AppFonts.yekan14), onPressed: () { diff --git a/packages/core/lib/presentation/widget/buttons/text_button.dart b/packages/core/lib/presentation/widget/buttons/text_button.dart index 5c9bbb7..227e06a 100644 --- a/packages/core/lib/presentation/widget/buttons/text_button.dart +++ b/packages/core/lib/presentation/widget/buttons/text_button.dart @@ -67,7 +67,7 @@ class _RTextButtonState extends State { padding: WidgetStatePropertyAll(EdgeInsets.zero), textStyle: WidgetStatePropertyAll( widget.textStyle ?? - AppFonts.yekan24.copyWith(color: AppColor.blueNormal), + AppFonts.yekan16.copyWith(color: AppColor.blueNormal), ), ), onPressed:widget.onPressed, diff --git a/packages/core/lib/utils/date_time_utils.dart b/packages/core/lib/utils/date_time_utils.dart index 32d439d..30d6bf2 100644 --- a/packages/core/lib/utils/date_time_utils.dart +++ b/packages/core/lib/utils/date_time_utils.dart @@ -13,7 +13,7 @@ extension XDateTime on String{ get formattedJalaliDateYHMS { final dateTime = DateTime.parse(this); final jalaliDate = Jalali.fromDateTime(dateTime); - return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')} - ${jalaliDate.hour.toString().padLeft(2, '0')}:${jalaliDate.minute.toString().padLeft(2, '0')}"; + return "${jalaliDate.hour.toString().padLeft(2, '0')}:${jalaliDate.minute.toString().padLeft(2, '0')} - ${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; } diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 625014b..8b1d774 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: "74273591bd8b7f82eeb1f191c1b65a6576535bbfd5ca3722778b07d5702d33cc" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.3" build_config: dependency: transitive description: @@ -85,26 +85,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + sha256: badce70566085f2e87434531c4a6bc8e833672f755fc51146d612245947e91c9 url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.5.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + sha256: b9070a4127033777c0e63195f6f117ed16a351ed676f6313b095cf4f328c0b82 url: "https://pub.dev" source: hosted - version: "2.4.15" + version: "2.5.3" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + sha256: "1cdfece3eeb3f1263f7dbf5bcc0cba697bd0c22d2c866cb4b578c954dbb09bcf" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "9.1.1" built_collection: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" clock: dependency: transitive description: @@ -229,18 +229,18 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: "0c6396126421b590089447154c5f98a5de423b70cfb15b1578fd018843ee6f53" + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "11.5.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "7.0.3" dio: dependency: "direct main" description: @@ -354,10 +354,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -455,10 +455,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 + sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" flutter_test: dependency: "direct dev" description: flutter @@ -801,10 +801,10 @@ packages: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" lists: dependency: transitive description: @@ -1262,10 +1262,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 url: "https://pub.dev" source: hosted - version: "1.1.18" + version: "1.1.19" vector_graphics_codec: dependency: transitive description: @@ -1302,10 +1302,10 @@ packages: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" web: dependency: transitive description: @@ -1334,10 +1334,10 @@ packages: dependency: transitive description: name: win32 - sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" url: "https://pub.dev" source: hosted - version: "5.13.0" + version: "5.14.0" win32_registry: dependency: transitive description: @@ -1388,4 +1388,4 @@ packages: version: "2.1.0" sdks: dart: ">=3.8.1 <4.0.0" - flutter: ">=3.27.0" + flutter: ">=3.29.0" diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index ee443df..76edb96 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -78,7 +78,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^5.0.0 + flutter_lints: ^6.0.0 ##code generation build_runner: ^2.4.15 hive_ce_generator: ^1.9.1 @@ -95,9 +95,5 @@ dev_dependencies: flutter: uses-material-design: true - assets: - - assets/ - - assets/vec/ - - assets/icons/ diff --git a/pubspec.lock b/pubspec.lock index 5866c33..2221d8b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: "74273591bd8b7f82eeb1f191c1b65a6576535bbfd5ca3722778b07d5702d33cc" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.3" build_config: dependency: transitive description: @@ -85,26 +85,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + sha256: badce70566085f2e87434531c4a6bc8e833672f755fc51146d612245947e91c9 url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.5.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" + sha256: b9070a4127033777c0e63195f6f117ed16a351ed676f6313b095cf4f328c0b82 url: "https://pub.dev" source: hosted - version: "2.4.15" + version: "2.5.3" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + sha256: "1cdfece3eeb3f1263f7dbf5bcc0cba697bd0c22d2c866cb4b578c954dbb09bcf" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "9.1.1" built_collection: dependency: transitive description: @@ -141,10 +141,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" cli_util: dependency: transitive description: @@ -245,18 +245,18 @@ packages: dependency: transitive description: name: device_info_plus - sha256: "0c6396126421b590089447154c5f98a5de423b70cfb15b1578fd018843ee6f53" + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "11.5.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "7.0.3" dio: dependency: transitive description: @@ -370,10 +370,10 @@ packages: dependency: "direct main" description: name: flutter_launcher_icons - sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" url: "https://pub.dev" source: hosted - version: "0.14.3" + version: "0.14.4" flutter_lints: dependency: "direct dev" description: @@ -479,10 +479,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 + sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" flutter_test: dependency: "direct dev" description: flutter @@ -1329,10 +1329,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 url: "https://pub.dev" source: hosted - version: "1.1.18" + version: "1.1.19" vector_graphics_codec: dependency: transitive description: @@ -1369,10 +1369,10 @@ packages: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" web: dependency: transitive description: @@ -1401,10 +1401,10 @@ packages: dependency: transitive description: name: win32 - sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" url: "https://pub.dev" source: hosted - version: "5.13.0" + version: "5.14.0" win32_registry: dependency: transitive description: @@ -1455,4 +1455,4 @@ packages: version: "2.1.0" sdks: dart: ">=3.8.1 <4.0.0" - flutter: ">=3.27.0" + flutter: ">=3.29.0" From 4c22d1666eb59ac12854ba84e637d964674680e8 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 22 Jun 2025 16:51:22 +0330 Subject: [PATCH 131/256] fix : sale out of Province --- assets/icons/hot_chicken.svg | 5 + .../lib/presentation/pages/home/logic.dart | 14 +- .../lib/presentation/pages/home/view.dart | 285 +++------ .../pages/out_of_province/logic.dart | 17 - .../pages/out_of_province/view.dart | 575 +----------------- .../lib/presentation/pages/root/logic.dart | 8 +- .../lib/presentation/pages/root/view.dart | 8 +- .../pages/sales_out_of_province/logic.dart | 69 ++- .../pages/sales_out_of_province/view.dart | 467 ++++++++------ .../lib/presentation/routes/pages.dart | 23 +- packages/core/lib/core.dart | 2 + .../lib/presentation/common/assets.gen.dart | 8 + .../presentation/widget/inputs/r_input.dart | 4 + .../widget/overlay_dropdown_widget/view.dart | 99 ++- packages/core/lib/utils/num_utils.dart | 2 +- .../lib/utils/separator_input_formatter.dart | 27 + packages/core/lib/utils/string_utils.dart | 11 + 17 files changed, 536 insertions(+), 1088 deletions(-) create mode 100644 assets/icons/hot_chicken.svg create mode 100644 packages/core/lib/utils/separator_input_formatter.dart create mode 100644 packages/core/lib/utils/string_utils.dart diff --git a/assets/icons/hot_chicken.svg b/assets/icons/hot_chicken.svg new file mode 100644 index 0000000..17b35aa --- /dev/null +++ b/assets/icons/hot_chicken.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index 4360c92..bb344e2 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -7,7 +7,7 @@ import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class HomeLogic extends GetxController { - RootLogic root = Get.find(); + RootLogic rootLogic = Get.find(); RxnInt totalWeightTodayBars = RxnInt(); Rxn inventoryModel = Rxn(); Rxn killHouseDistributionInfo = Rxn(); @@ -23,8 +23,8 @@ class HomeLogic extends GetxController { Future getTodayBars() async { await safeCall( - call: () async => await root.chickenRepository.getGeneralBarInformation( - token: root.tokenService.accessToken.value!, + call: () async => await rootLogic.chickenRepository.getGeneralBarInformation( + token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams(fromDate: DateTime.now(), toDate: DateTime.now()), ), onSuccess: (result) { @@ -49,7 +49,7 @@ class HomeLogic extends GetxController { Future getInventory() async { await safeCall?>( - call: () async => await root.chickenRepository.getInventory(token: root.tokenService.accessToken.value!), + call: () async => await rootLogic.chickenRepository.getInventory(token: rootLogic.tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { inventoryModel.value = result.first; @@ -72,12 +72,10 @@ class HomeLogic extends GetxController { Future getDistributionInformation() async { await safeCall( - call: () async => await root.chickenRepository.getIKillHouseDistributionInfo(token: root.tokenService.accessToken.value!), + call: () async => await rootLogic.chickenRepository.getIKillHouseDistributionInfo(token: rootLogic.tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { - iLog(result); killHouseDistributionInfo.value = result; - iLog(killHouseDistributionInfo.value); } }, onError: (error, stackTrace) {}, @@ -87,7 +85,7 @@ class HomeLogic extends GetxController { void errorHandler(DioException error) { handleGeneric(error, () { - root.tokenService.deleteTokens(); + rootLogic.tokenService.deleteTokens(); }); } diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index fa00a71..718a0c8 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -104,8 +105,12 @@ class HomePage extends GetView { widelyUsed( title: 'خرید خارج استان', iconPath: Assets.vec.cubeSearchSvg.path, - onTap: () { - // Get.toNamed(ChickenRoutes.enteringTheWarehouse); + onTap:() async{ + iLog('on tap :خرید خارج استان '); + controller.rootLogic.currentPage.value =1; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); }, ), SizedBox(width: 15), @@ -146,7 +151,7 @@ class HomePage extends GetView { child: _informationIconCard( title: 'توزیع داخل استان', isLoading: data.value == null, - description: data.value?.freeSalesWeight.toFormatted ?? '0', + description: data.value?.freeSalesWeight.separatedByComma ?? '0', iconPath: Assets.vec.truckSvg.path, iconColor: const Color.fromRGBO(85, 97, 93, 1), bgDescriptionColor: const Color(0xFFE6FAF5), @@ -157,7 +162,7 @@ class HomePage extends GetView { child: _informationIconCard( title: 'توزیع خارج استان', isLoading: data.value == null, - description: data.value?.stewardAllocationsWeight.toFormatted ?? '0', + description: data.value?.stewardAllocationsWeight.separatedByComma ?? '0', iconPath: Assets.vec.truckFastSvg.path, iconColor: Color(0xFF647379), bgDescriptionColor: const Color(0xFFEAEFFF), @@ -193,8 +198,8 @@ class HomePage extends GetView { isLoading: data.value == null, description: data.value != null ? ((data.value?.provinceGovernmentalCarcassesWeight ?? 0) + - (data.value?.provinceFreeCarcassesWeight ?? 0)) - .toFormatted + (data.value?.provinceFreeCarcassesWeight ?? 0)) + .separatedByComma : '0', iconPath: Assets.vec.a3dCubeSquareSvg.path, iconColor: const Color(0xFF6C5D60), @@ -206,7 +211,7 @@ class HomePage extends GetView { child: _informationLabelCard( title: 'خارج استان', isLoading: data.value == null, - description: data.value?.freeBuyingCarcassesWeight.toFormatted ?? '0', + description: data.value?.freeBuyingCarcassesWeight.separatedByComma ?? '0', iconPath: Assets.vec.cubeSearchSvg.path, iconColor: Color(0xFF2D5FFF), bgLabelColor: const Color(0xFFAFCBFF), @@ -230,7 +235,7 @@ class HomePage extends GetView { child: _informationLabelCard( title: 'مانده انبار', isLoading: data.value == null, - description: data.value?.totalRemainWeight.toFormatted ?? '0', + description: data.value?.totalRemainWeight.separatedByComma ?? '0', iconPath: Assets.vec.cubeSearchSvg.path, iconColor: const Color(0xFF426060), bgDescriptionColor: const Color(0xFFC7DFE0), @@ -241,7 +246,7 @@ class HomePage extends GetView { child: _informationLabelCard( title: 'توزیع شده', isLoading: data.value == null, - description: data.value?.realAllocatedWeight.toFormatted ?? '0', + description: data.value?.realAllocatedWeight.separatedByComma ?? '0', iconPath: Assets.vec.cubeRotateSvg.path, iconColor: Color(0xFF5C4D64), bgLabelColor: Color(0xFFC8B8D1), @@ -290,21 +295,21 @@ class HomePage extends GetView { child: data.value == null ? CupertinoActivityIndicator() : Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - data.value.toFormatted, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.textColor), - ), - Text( - 'کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.textColor), - ), - ], - ), + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + data.value.separatedByComma, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.textColor), + ), + Text( + 'کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.textColor), + ), + ], + ), ), ], ), @@ -362,21 +367,21 @@ class HomePage extends GetView { child: isLoading ? Center(child: CupertinoActivityIndicator()) : Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - description, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), - ), - Text( - unit, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), - ), - ], - ), + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), ), ), ], @@ -425,10 +430,10 @@ class HomePage extends GetView { isLoading ? Center(child: CupertinoActivityIndicator()) : Text( - description, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), - ), + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), Text( unit, textAlign: TextAlign.center, @@ -463,37 +468,39 @@ class HomePage extends GetView { } Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { - return Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - spacing: 4, - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(4), - decoration: ShapeDecoration( - color: const Color(0xFFBECDFF), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + return GestureDetector( + onTap: onTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFBECDFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), ), - child: SvgGenImage.vec(iconPath).svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - fit: BoxFit.cover, - ), - ), - ), - Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), - ], - ); + Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + ], + )); } Widget addWidelyUsed({required VoidCallback onTap}) { @@ -522,112 +529,6 @@ class HomePage extends GetView { ); } - /* Column oldPage() { - return Column( - children: [ - inventoryWidget(), - ObxValue((data) => broadcastInformationWidget(data.value), controller.killHouseDistributionInfo), - SizedBox(height: 20), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - cardWidget( - title: 'ورود به انبار', - iconPath: Assets.icons.whareHouse.path, - onTap: () { - Get.toNamed(ChickenRoutes.enteringTheWarehouse); - }, - ), - cardWidget( - title: 'فروش داخل استان', - iconPath: Assets.icons.inside.path, - onTap: () { - Get.toNamed(ChickenRoutes.salesInProvince); - }, - ), - cardWidget( - title: 'فروش خارج استان', - iconPath: Assets.icons.outside.path, - onTap: () { - Get.toNamed(ChickenRoutes.salesOutOfProvince); - }, - ), - ], - ), - ), - ], - ); - } - - Widget inventoryWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Align( - alignment: Alignment.centerRight, - child: Text('موجودی انبار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), - ), - SizedBox(height: 4), - ObxValue( - (data) => data.isEmpty - ? Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 80, - padding: EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ) - : ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: controller.inventoryList.length, - separatorBuilder: (context, index) => const SizedBox(height: 8), - itemBuilder: (context, index) { - return ObxValue((expand) { - return GestureDetector( - onTap: () { - controller.toggleExpanded(index); - }, - behavior: HitTestBehavior.opaque, - child: AnimatedContainer( - onEnd: () { - controller.inventoryExpandedList[index] = !controller.inventoryExpandedList[index]!; - }, - margin: const EdgeInsets.symmetric(vertical: 2), - padding: EdgeInsets.all(6), - curve: Curves.easeInOut, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 250 : 80, - child: inventoryItem( - isExpanded: expand.keys.contains(index) && expand[index]!, - index: index, - model: controller.inventoryList[index], - ), - ), - ); - }, controller.inventoryExpandedList); - }, - ), - controller.inventoryList, - ), - ], - ), - ); - }*/ - Widget inventoryItem({required bool isExpanded, required int index, required InventoryModel model}) { return Column( mainAxisAlignment: MainAxisAlignment.center, @@ -691,19 +592,19 @@ class HomePage extends GetView { ), child: model != null ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 10, - children: [ - Text( - 'اطلاعات ارسالی', - textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), - ], - ) + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Text( + 'اطلاعات ارسالی', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + const SizedBox(height: 12), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + ], + ) : const Center(child: CircularProgressIndicator()), ); } diff --git a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart index d39eb9e..06c59a4 100644 --- a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart @@ -121,23 +121,6 @@ class OutOfProvinceLogic extends GetxController { ); } -/* Future getKillHouseDashBord() async { - safeCall( - call: () async => - await rootLogic.chickenRepository.getDashboardKillHouseFreeBar( - token: rootLogic.tokenService.accessToken.value!, - stratDate: DateTime.now().formattedDashedGregorian, - endDate: DateTime.now().formattedDashedGregorian, - ), - onSuccess: (result) { - if (result != null) { - killHouseDashboard.value = result; - } - }, - onError: (error, stacktrace) {}, - ); - }*/ - Future submitAllocation() async {} @override diff --git a/packages/chicken/lib/presentation/pages/out_of_province/view.dart b/packages/chicken/lib/presentation/pages/out_of_province/view.dart index 07c369b..4315ca2 100644 --- a/packages/chicken/lib/presentation/pages/out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/out_of_province/view.dart @@ -54,76 +54,12 @@ class OutOfProvincePage extends GetView { title: 'فروش خارج استان', iconPath: Assets.vec.cubeTopRotationSvg.path, foregroundColor: AppColor.greenDark, - onTap: () { - Get.toNamed(ChickenRoutes.buysOutOfProvince,id: 1); - }, + onTap: () {}, ), ), ], ), ), - - /* SizedBox(height: 12), - ObxValue((model) => summaryOfInformation(model.value), controller.stewardFreeDashboard), - Expanded( - child: ListView.separated( - padding: const EdgeInsets.fromLTRB(8, 12, 8, 100), - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemBuilder: (BuildContext context, int index) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 10), - - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - - Text( - 'لرستان - خرم آباد', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - - Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: buildRow('تاریخ', '07:15:00 - 1402/07/01'), - ), - - buildRow('مشخصات فروشنده', 'افلاک - 09203659874'), - buildRow('وزن خریداری شده', '200 کیلوگرم'), - buildRow('لاشه خریداری شده', '200 عدد'), - ], - ), - ); - }, - separatorBuilder: (BuildContext context, int index) => SizedBox(height: 6), - itemCount: 3, - ), - ),*/ ], ), ); @@ -257,513 +193,4 @@ class OutOfProvincePage extends GetView { ), ); } - - /* Widget inventoryWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Align( - alignment: Alignment.centerRight, - child: Text( - 'خرید های خارج استان', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(height: 4), - ObxValue( - (data) => data.isEmpty - ? Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 80, - padding: EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ) - : ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: controller.rootLogic.inventoryList.length, - separatorBuilder: (context, index) => - const SizedBox(height: 8), - itemBuilder: (context, index) { - return ObxValue((expand) { - return GestureDetector( - onTap: () { - controller.rootLogic.toggleExpanded(index); - }, - behavior: HitTestBehavior.opaque, - child: AnimatedContainer( - onEnd: () { - controller - .rootLogic - .inventoryExpandedList[index] = !controller - .rootLogic - .inventoryExpandedList[index]!; - }, - margin: const EdgeInsets.symmetric(vertical: 2), - padding: EdgeInsets.all(6), - curve: Curves.easeInOut, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.blueNormal, - width: 1, - ), - ), - duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 250 : 80, - child: inventoryItem( - isExpanded: - expand.keys.contains(index) && expand[index]!, - index: index, - model: controller.rootLogic.inventoryList[index], - ), - ), - ); - }, controller.rootLogic.inventoryExpandedList); - }, - ), - controller.rootLogic.inventoryList, - ), - ], - ), - ); - }*/ - - /* Widget inventoryItem({ - required bool isExpanded, - required int index, - required InventoryModel model, - }) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - buildRow('نام محصول', model.name ?? ''), - Visibility( - visible: isExpanded, - child: Column( - spacing: 8, - children: [ - buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), - buildRow( - 'وزن خریدهای آزاد داخل استان (کیلوگرم)', - model.receiveFreeCarcassesWeight.toString(), - ), - buildRow( - 'وزن خریدهای خارج استان (کیلوگرم)', - model.freeBuyingCarcassesWeight.toString(), - ), - buildRow( - 'کل ورودی به انبار (کیلوگرم)', - model.totalFreeBarsCarcassesWeight.toString(), - ), - buildRow( - 'کل فروش (کیلوگرم)', - model.realAllocatedWeight.toString(), - ), - buildRow( - 'مانده انبار (کیلوگرم)', - model.totalRemainWeight.toString(), - ), - ], - ), - ), - ], - ); - } - - - - Widget allocationsMade() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'تخصیصات صورت گرفته', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - RElevated( - text: 'تایید یکجا', - height: 30, - onPressed: () { - controller.confirmAllAllocations(); - }, - ), - ], - ), - SizedBox(height: 4), - ObxValue((data) { - if (data.value == null) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ); - } else if (data.value?.results?.isEmpty ?? true) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), - ); - } else { - return Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 700, - padding: const EdgeInsets.all(6), - child: ListView.separated( - padding: const EdgeInsets.all(8.0), - itemCount: data.value?.results?.length ?? 0, - itemBuilder: (BuildContext context, int index) { - final result = data.value!.results![index]; - return Card( - margin: const EdgeInsets.symmetric(vertical: 4.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: const BorderSide( - color: AppColor.blueNormal, - width: 1, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildRow('ردیف', '${index + 1}'), - buildRow( - 'تاریخ ثبت', - result.date!.formattedJalaliDate ?? 'N/A', - ), - buildRow( - 'نوع تخصیص', - result.allocation_type?.faAllocationType ?? 'N/A', - ), - buildRow( - 'مشخصات خریدار', - '${result.to_guilds?.user?.fullname} - ${result.to_guilds?.guilds_name}' ?? - 'N/A', - ), - buildRow( - 'مشخصات فروشنده', - result.steward?.user?.fullname ?? 'N/A', - ), - buildRow( - 'نوع فروش', - result.sell_type?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${result.amount ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${result.total_amount ?? 0} ریال', - ), - buildRow( - 'وزن تخصیصی', - '${result.weight_of_carcasses?.toInt() ?? 0} کیلوگرم', - ), - buildRow( - 'کداحراز', - result.registration_code?.toString() ?? 'N/A', - ), - buildRow( - 'وضعیت کد احراز', - result.system_registration_code == true - ? "ارسال شده" - : "ارسال نشده" ?? 'N/A', - ), - buildRow( - 'افت وزن(کیلوگرم)', - result.weight_loss_of_carcasses - ?.toInt() - .toString() ?? - 'N/A', - ), - buildRow( - 'وضعیت', - result.receiver_state?.faItem ?? 'N/A', - ), - - Row( - spacing: 10, - children: [ - Expanded( - child: RElevated( - height: 40, - text: 'تایید', - onPressed: () { - ConformAllocation confromation = - ConformAllocation( - allocation_key: result.key, - number_of_carcasses: - result.number_of_carcasses, - weight_of_carcasses: result - .weight_of_carcasses - ?.toInt(), - amount: result.amount, - total_amount: result.total_amount, - ); - - controller.confirmAllocation( - confromation, - ); - }, - ), - ), - Expanded( - child: RElevated( - height: 40, - backgroundColor: AppColor.error, - text: 'رد', - onPressed: () { - controller.denyAllocation( - result.key ?? '', - ); - }, - ), - ), - ], - ), - ], - ), - ), - ); - }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), - ), - ); - } - }, controller.allocatedMadeModel), - ], - ), - ); - } - - void showAddBottomSheet() { - Get.bottomSheet( - SafeArea( - child: BaseBottomSheet( - height: 700, - child: Padding( - padding: EdgeInsets.only( - left: 16, - right: 16, - top: 16, - bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'ثبت توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), - ), - const SizedBox(height: 12), - Material( - type: MaterialType.transparency, - child: productDropDown(), - ), - const SizedBox(height: 12), - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش اختصاصی', style: AppFonts.yekan14), - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش آزاد', style: AppFonts.yekan14), - ], - ); - }, controller.saleType), - ), - const SizedBox(height: 12), - - Material( - type: MaterialType.transparency, - child: guildsDropDown(), - ), - - const SizedBox(height: 12), - RTextField( - controller: controller.weightController, - keyboardType: TextInputType.number, - onChanged: (p0) { - controller.weight.value = int.tryParse(p0) ?? 0; - }, - label: 'وزن لاشه', - ), - const SizedBox(height: 12), - RTextField( - controller: controller.pricePerKiloController, - onChanged: (p0) { - controller.pricePerKilo.value = int.tryParse(p0) ?? 0; - }, - keyboardType: TextInputType.number, - label: 'قیمت هر کیلو', - ), - const SizedBox(height: 12), - ObxValue( - (p0) => RTextField( - enabled: false, - keyboardType: TextInputType.number, - initText: controller.totalCost.value.toString(), - controller: controller.totalCostController, - label: 'هزینه کل', - ), - controller.totalCost, - ), - const SizedBox(height: 20), - ObxValue((data) { - return RElevated( - text: 'ثبت', - onPressed: data.value - ? () { - controller.submitAllocation(); - } - : null, - ); - }, controller.isValid), - const SizedBox(height: 20), - ], - ), - ), - ), - ), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ); - } - - Widget guildsDropDown() { - return ObxValue((p0) { - return DropdownButtonFormField( - value: controller.selectedGuildModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب مباشر/صنف', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.guildsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text( - '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user?.fullname} (${guild.user?.mobile})', - ), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedGuild(value); - controller.checkVerfication(); - } - }, - ); - }, controller.guildsModel); - */ /* return GetBuilder( - builder: (controller) { - return DropdownButtonFormField( - value: controller.selectedGuildModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب مباشر/صنف', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.guildsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text( - '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user - ?.fullname} (${guild.user?.mobile})', - ), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedGuild(value); - } - }, - ); - }, - );*/ /* - } - - Widget productDropDown() { - return GetBuilder( - builder: (controller) { - return DropdownButtonFormField( - value: controller.selectedProductModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب محصول', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.rolesProductsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text('${guild.name}'), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedProduct(value); - controller.checkVerfication(); - } - }, - ); - }, - ); - }*/ } diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 352f0e9..26603a0 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -21,13 +21,7 @@ class RootLogic extends GetxController { Container(color: Colors.amber), ]; - final List> navigatorKeys = [ - GlobalKey(), - GlobalKey(), - GlobalKey(), - GlobalKey(), - GlobalKey(), - ]; + late DioRemote dioRemote; var tokenService = Get.find(); diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 81c54f0..32bae60 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -14,7 +14,7 @@ class RootPage extends GetView { body: IndexedStack( children: [ Navigator( - key: controller.navigatorKeys[0], + key: Get.nestedKey(0), onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[0]), ), @@ -33,17 +33,17 @@ class RootPage extends GetView { }, ), Navigator( - key: controller.navigatorKeys[2], + key: Get.nestedKey(2), onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]), ), Navigator( - key: controller.navigatorKeys[3], + key: Get.nestedKey(3), onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[3]), ), Navigator( - key: controller.navigatorKeys[4], + key: Get.nestedKey(4), onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[4]), ), diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index ccb35a8..c22cda4 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -31,9 +31,9 @@ class SalesOutOfProvinceLogic extends GetxController { OutOfProvinceLogic get outOfTheProvinceLogic => Get.find(); + GlobalKey formKey = GlobalKey(); TextEditingController sellerNameController = TextEditingController(); TextEditingController sellerPhoneController = TextEditingController(); - TextEditingController carcassVolumeController = TextEditingController(); TextEditingController carcassWeightController = TextEditingController(); Rx fromDateFilter = Jalali.now().obs; @@ -45,6 +45,11 @@ class SalesOutOfProvinceLogic extends GetxController { super.onReady(); getStewardPurchaseOutOfProvince(); selectedProvince.listen((p0) => getCites()); + tLog(selectedProduct.value); + outOfTheProvinceLogic.rolesProductsModel.listen((lists) { + selectedProduct.value = lists.first; + },); + tLog(selectedProduct.value); setupListeners(); debounce(searchedValue, (callback) => getStewardPurchaseOutOfProvince(), time: Duration(milliseconds: 2000)); ever(searchIsSelected, (data) { @@ -58,8 +63,9 @@ class SalesOutOfProvinceLogic extends GetxController { void onClose() { sellerNameController.dispose(); sellerPhoneController.dispose(); - carcassVolumeController.dispose(); carcassWeightController.dispose(); + isExpandedList.clear(); + super.onClose(); } @@ -101,7 +107,6 @@ class SalesOutOfProvinceLogic extends GetxController { void setupListeners() { sellerNameController.addListener(checkFormValid); sellerPhoneController.addListener(checkFormValid); - carcassVolumeController.addListener(checkFormValid); carcassWeightController.addListener(checkFormValid); ever(selectedProvince, (_) => checkFormValid()); @@ -119,7 +124,6 @@ class SalesOutOfProvinceLogic extends GetxController { isSubmitButtonEnabled.value = sellerNameController.text.isNotEmpty && sellerPhoneController.text.isNotEmpty && - carcassVolumeController.text.isNotEmpty && carcassWeightController.text.isNotEmpty && selectedProvince.value != null && selectedCity.value != null && @@ -127,33 +131,40 @@ class SalesOutOfProvinceLogic extends GetxController { selectedImage.value != null; } - Future createStewardPurchaseOutOfProvince() async => await safeCall( - call: () async { - CreateStewardFreeBar createStewardFreeBar = CreateStewardFreeBar( - productKey: selectedProduct.value!.key, - killHouseName: sellerNameController.text, - killHouseMobile: sellerPhoneController.text, - province: selectedProvince.value!.name, - city: selectedCity.value!.name, - weightOfCarcasses: int.parse(carcassWeightController.text), - barImage: _base64Image.value, - date: DateTime.now().formattedYHMS, - ); - final res = await rootLogic.chickenRepository.createStewardPurchasesOutSideOfTheProvince( - token: rootLogic.tokenService.accessToken.value!, - body: createStewardFreeBar, - ); - }, - onSuccess: (result) { - getStewardPurchaseOutOfProvince(); - resetSubmitForm(); - }, - ); + Future createStewardPurchaseOutOfProvince() async { + bool res = false; + if (!(formKey.currentState?.validate() ?? false)) { + return res; + } + await safeCall( + call: () async { + CreateStewardFreeBar createStewardFreeBar = CreateStewardFreeBar( + productKey: selectedProduct.value!.key, + killHouseName: sellerNameController.text, + killHouseMobile: sellerPhoneController.text, + province: selectedProvince.value!.name, + city: selectedCity.value!.name, + weightOfCarcasses: int.parse(carcassWeightController.text.clearComma), + barImage: _base64Image.value, + date: DateTime.now().formattedYHMS, + ); + final res = await rootLogic.chickenRepository.createStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + body: createStewardFreeBar, + ); + }, + onSuccess: (result) { + getStewardPurchaseOutOfProvince(); + resetSubmitForm(); + res = true; + }, + ); + return res; + } void resetSubmitForm() { sellerNameController.clear(); sellerPhoneController.clear(); - carcassVolumeController.clear(); carcassWeightController.clear(); selectedProvince.value = null; selectedCity.value = null; @@ -166,12 +177,10 @@ class SalesOutOfProvinceLogic extends GetxController { } void setEditData(StewardFreeBar item) { - iLog(item.barImage); editImageUrl.value = item.barImage; sellerNameController.text = item.killHouseName ?? ''; sellerPhoneController.text = item.killHouseMobile ?? ''; - carcassVolumeController.text = item.weightOfCarcasses?.toString() ?? ''; - carcassWeightController.text = item.weightOfCarcasses?.toString() ?? ''; + carcassWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? ''; selectedProvince.value = IranProvinceCityModel(name: item.province); selectedCity.value = IranProvinceCityModel(name: item.city); selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.firstWhere( diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 0aa3adf..d165e09 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; @@ -21,6 +22,7 @@ class SalesOutOfProvincePage extends GetView { hasBack: true, onBackPressed: () { Get.back(id: 1); + }, leadingWidth: 155, leading: Row( @@ -125,162 +127,187 @@ class SalesOutOfProvincePage extends GetView { controller.isExpandedList.add(index); } }, - child: AnimatedContainer( + child: AnimatedSize( duration: Duration(milliseconds: 400), alignment: Alignment.center, - height: expandList.contains(index) ? 175 : 56, child: Stack( clipBehavior: Clip.none, alignment: Alignment.centerRight, children: [ - AnimatedContainer( - width: Get.width - 30, + AnimatedSize( duration: Duration(milliseconds: 300), - height: expandList.contains(index) ? 175 : 56, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), - ), - child: AnimatedCrossFade( + child: Container( + width: Get.width - 30, alignment: Alignment.center, - firstChild: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text( - item.date?.formattedJalaliDate ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - Text( - item.killHouseName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - Text( - 'kg ${item.weightOfCarcasses} ${item.product?.name}', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - - Text( - '${item.province}-${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - - Icon(CupertinoIcons.chevron_down, size: 12), - ], + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - controller.setEditData(item); - Get.bottomSheet( - addPurchasedInformationBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - - Text( - '${item.province}-${item.city}', + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + Expanded( + flex: 2, + child: Text( + item.date?.formattedJalaliDate ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - - GestureDetector( - onTap: () { - buildDeleteDialog( - onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), - ); - }, - child: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), - ), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), ), ), - child: buildRow('تاریخ', item.date?.formattedJalaliDateYHMS ?? 'N/A'), - ), - - buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), - buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.toInt()} کیلوگرم'), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - //RTextButton(text: , onPressed: () {}, textStyle: AppFonts.yekan14,height: 20,width: 81,backgroundColor: AppColor.warning,), - GestureDetector( - onTap: () { - Get.bottomSheet( - BaseBottomSheet( - height: 400, - child: Column( - spacing: 16, - children: [ - Text( - 'بارنامه', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), - ), - - Image.network( - item.barImage ?? '', - fit: BoxFit.cover, - height: 300, - errorBuilder: (context, error, stackTrace) { - eLog(error.toString()); - return Center(child: Text('خطایی پیش آمده!')); - }, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - print('Loading progress: $loadingProgress'); - return CupertinoActivityIndicator(); - }, - ), - ], - ), - ), - ); - }, - child: Text('مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + Expanded( + flex: 3, + child: Text( + item.killHouseName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), - Icon(CupertinoIcons.chevron_up, size: 12), - ], - ), - ], + ), + SizedBox(width: 8,), + Expanded( + flex: 2, + child: Column( + children: [ + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2,), + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg(width: 24,height: 24, colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn))), + + ], + ), + ), + Expanded( + flex: 2, + child: Text( + '${item.province}\n${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + Icon(CupertinoIcons.chevron_down, size: 12), + SizedBox(width: 8), + ], + ), ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + controller.setEditData(item); + Get.bottomSheet( + addPurchasedInformationBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + GestureDetector( + onTap: () { + buildDeleteDialog( + onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + ); + }, + child: Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow('تاریخ', item.date?.formattedJalaliDateYHMS ?? 'N/A'), + ), + + buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), + buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.toInt()} کیلوگرم'), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Get.bottomSheet( + BaseBottomSheet( + height: 400, + child: Column( + spacing: 16, + children: [ + Text( + 'بارنامه', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Image.network( + item.barImage ?? '', + fit: BoxFit.cover, + height: 300, + errorBuilder: (context, error, stackTrace) { + eLog(error.toString()); + return Center(child: Text('خطایی پیش آمده!')); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + print('Loading progress: $loadingProgress'); + return CupertinoActivityIndicator(); + }, + ), + ], + ), + ), + ); + }, + child: Text('مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + ), + Icon(CupertinoIcons.chevron_up, size: 12), + ], + ), + ], + ), + ), + crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), ), - crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), ), ), Positioned( @@ -354,6 +381,7 @@ class SalesOutOfProvincePage extends GetView { child: Text( value, textAlign: TextAlign.left, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), @@ -361,50 +389,89 @@ class SalesOutOfProvincePage extends GetView { ), ); } + Widget buildRow2(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + SizedBox(width: 8,), + Expanded( + child: Container + ( + color: Colors.green, + child: Text( + value, + textAlign: TextAlign.left, + + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ), + ], + ), + ); + } + Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( child: SingleChildScrollView( - child: Column( - spacing: 16, - children: [ - Text( - isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), - ), - _productTypeWidget(), - RTextField( - controller: controller.sellerNameController, - label: 'نام فروشنده', - borderColor: AppColor.darkGreyLight, - ), - RTextField( - controller: controller.sellerPhoneController, - label: 'تلفن فروشنده', - keyboardType: TextInputType.phone, - borderColor: AppColor.darkGreyLight, - ), - _provinceWidget(), - _cityWidget(), - RTextField( - controller: controller.carcassWeightController, - label: 'وزن لاشه', - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - ), - RTextField( - controller: controller.carcassVolumeController, - label: 'حجم لاشه', - onChanged: (p0) { - iLog(controller.carcassVolumeController.text); - }, - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - ), - _imageCarcasesWidget(isOnEdit), - submitButtonWidget(isOnEdit), - SizedBox(), - ], + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + _productTypeWidget(), + RTextField( + controller: controller.sellerNameController, + label: 'نام فروشنده', + borderColor: AppColor.darkGreyLight, + ), + RTextField( + controller: controller.sellerPhoneController, + label: 'تلفن فروشنده', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + maxLength: 11, + validator: (value) { + if (value == null || value.isEmpty) { + return 'لطفاً شماره موبایل را وارد کنید'; + } + // حذف کاماها برای اعتبارسنجی + String cleaned = value.replaceAll(',', ''); + if (cleaned.length != 11) { + return 'شماره موبایل باید ۱۱ رقم باشد'; + } + if (!cleaned.startsWith('09')) { + return 'شماره موبایل باید با 09 شروع شود'; + } + return null; + }, + ), + _provinceWidget(), + _cityWidget(), + RTextField( + controller: controller.carcassWeightController, + label: 'وزن لاشه', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + ), + _imageCarcasesWidget(isOnEdit), + submitButtonWidget(isOnEdit), + SizedBox(), + ], + ), ), ), ); @@ -413,11 +480,13 @@ class SalesOutOfProvincePage extends GetView { Widget submitButtonWidget(bool isOnEdit) { return ObxValue((data) { return RElevated( - text: isOnEdit ? 'ویرایش خرید' : 'ثبت خرید جدید', + text: isOnEdit ? 'ویرایش' : 'ثبت خرید', onPressed: data.value ? () async { - await controller.createStewardPurchaseOutOfProvince(); - Get.back(); + var res = await controller.createStewardPurchaseOutOfProvince(); + if (res) { + Get.back(); + } } : null, height: 40, @@ -426,14 +495,16 @@ class SalesOutOfProvincePage extends GetView { } Widget _productTypeWidget() { + tLog(controller.outOfTheProvinceLogic.rolesProductsModel); + iLog(controller.selectedProduct.value); return Obx(() { return OverlayDropdownWidget( items: controller.outOfTheProvinceLogic.rolesProductsModel, onChanged: (value) { controller.selectedProduct.value = value; - print('Selected Product: ${value.name}'); }, selectedItem: controller.selectedProduct.value, + initialValue: controller.selectedProduct.value, itemBuilder: (item) => Text(item.name ?? 'بدون نام'), labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), ); @@ -676,19 +747,31 @@ class SalesOutOfProvincePage extends GetView { children: [ Container( child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - CupertinoButton( - child: Text('تایید', style: AppFonts.yekan14), + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), onPressed: () { onDateSelected(tempPickedDate ?? Jalali.now()); Get.back(); }, + text: 'تایید', ), - CupertinoButton( - child: Text('لغو', style: AppFonts.yekan14.copyWith(color: AppColor.error)), - onPressed: () => Get.back(), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', ), + SizedBox(width: 20), ], ), ), diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index f86a54f..07f6cc2 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -48,8 +48,8 @@ sealed class ChickenPages { page: () => EnteringTheWarehousePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(EnteringTheWarehouseLogic()); - Get.put(RootLogic()); + Get.lazyPut(()=>EnteringTheWarehouseLogic()); + Get.lazyPut(()=>RootLogic()); }), ), GetPage( @@ -57,8 +57,8 @@ sealed class ChickenPages { page: () => SalesInProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(SalesInProvinceLogic()); - Get.put(RootLogic()); + Get.lazyPut(()=>SalesInProvinceLogic()); + Get.lazyPut(()=>RootLogic()); }), ), @@ -69,9 +69,10 @@ sealed class ChickenPages { page: () => OutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(OutOfProvinceLogic()); - Get.put(SalesOutOfProvinceLogic()); - Get.put(RootLogic()); + Get.lazyPut(()=>OutOfProvinceLogic()); + + Get.lazyPut(()=>SalesOutOfProvinceLogic()); + Get.lazyPut(()=>RootLogic()); }), ), @@ -80,8 +81,8 @@ sealed class ChickenPages { page: () => SalesOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(SalesOutOfProvinceLogic()); - Get.put(RootLogic()); + Get.lazyPut(()=>SalesOutOfProvinceLogic()); + Get.lazyPut(()=>RootLogic()); }), ), @@ -90,8 +91,8 @@ sealed class ChickenPages { page: () => BuysOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(BuysOutOfProvinceLogic()); - Get.put(RootLogic()); + Get.lazyPut(()=>BuysOutOfProvinceLogic()); + Get.lazyPut(()=>RootLogic()); }), ), ]; diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index cd79f4b..35d1a04 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -50,3 +50,5 @@ export 'utils/date_time_utils.dart'; export 'utils/num_utils.dart'; export 'utils/map_utils.dart'; export 'utils/route_utils.dart'; +export 'utils/string_utils.dart'; +export 'utils/separator_input_formatter.dart'; diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index f33b3bb..6af7271 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -87,6 +87,9 @@ class $AssetsIconsGen { /// File path: assets/icons/home.svg SvgGenImage get home => const SvgGenImage('assets/icons/home.svg'); + /// File path: assets/icons/hot_chicken.svg + SvgGenImage get hotChicken => const SvgGenImage('assets/icons/hot_chicken.svg'); + /// File path: assets/icons/information.svg SvgGenImage get information => const SvgGenImage('assets/icons/information.svg'); @@ -209,6 +212,7 @@ class $AssetsIconsGen { filterOutline, gps, home, + hotChicken, information, inside, inspection, @@ -348,6 +352,9 @@ class $AssetsVecGen { /// File path: assets/vec/home.svg.vec SvgGenImage get homeSvg => const SvgGenImage.vec('assets/vec/home.svg.vec'); + /// File path: assets/vec/hot_chicken.svg.vec + SvgGenImage get hotChickenSvg => const SvgGenImage.vec('assets/vec/hot_chicken.svg.vec'); + /// File path: assets/vec/information.svg.vec SvgGenImage get informationSvg => const SvgGenImage.vec('assets/vec/information.svg.vec'); @@ -470,6 +477,7 @@ class $AssetsVecGen { filterOutlineSvg, gpsSvg, homeSvg, + hotChickenSvg, informationSvg, insideSvg, inspectionSvg, diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 3debe30..9ff9aec 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:rasadyar_core/core.dart'; enum RTextFieldVariant { @@ -38,6 +39,7 @@ class RTextField extends StatefulWidget { final FormFieldValidator? validator; final void Function(String)? onChanged; final void Function(String)? onSubmitted; + final List? inputFormatters; const RTextField({ super.key, @@ -69,6 +71,7 @@ class RTextField extends StatefulWidget { this.onChanged, this.onSubmitted, this.borderColor, + this.inputFormatters }); @@ -147,6 +150,7 @@ class _RTextFieldState extends State { maxLines: widget.maxLines, onChanged: widget.onChanged, validator: widget.validator, + inputFormatters: widget.inputFormatters, enabled: widget.enabled, obscureText: obscure, onTapOutside: (_) => FocusScope.of(context).unfocus(), diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index df217a3..629d9c9 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -2,9 +2,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; -import 'package:rasadyar_core/presentation/common/app_fonts.dart'; - - class OverlayDropdownWidget extends StatefulWidget { final List items; @@ -15,7 +12,7 @@ class OverlayDropdownWidget extends StatefulWidget { final void Function(T selected)? onChanged; final EdgeInsets? contentPadding; - const OverlayDropdownWidget({ + const OverlayDropdownWidget({ super.key, required this.items, required this.itemBuilder, @@ -23,7 +20,7 @@ class OverlayDropdownWidget extends StatefulWidget { this.initialValue, this.onChanged, this.selectedItem, - this.contentPadding + this.contentPadding, }); @override @@ -34,7 +31,7 @@ class _OverlayDropdownState extends State> { final GlobalKey _key = GlobalKey(); OverlayEntry? _overlayEntry; final RxBool _isOpen = false.obs; - T? selectedItem ; + T? selectedItem; @override void initState() { @@ -48,51 +45,54 @@ class _OverlayDropdownState extends State> { final offset = renderBox.localToGlobal(Offset.zero); _overlayEntry = OverlayEntry( - builder: - (_) => GestureDetector( - onTap: _removeOverlay, - behavior: HitTestBehavior.translucent, - child: Stack( - children: [ - Positioned( - left: offset.dx, - top: offset.dy + size.height + 4, - width: size.width, - child: Material( - elevation: 4, + builder: (_) => GestureDetector( + onTap: _removeOverlay, + behavior: HitTestBehavior.translucent, + child: Stack( + children: [ + Positioned( + left: offset.dx, + top: offset.dy + size.height + 4, + width: size.width, + child: Material( + elevation: 4, + borderRadius: BorderRadius.circular(8), + child: Container( + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AppColor.darkGreyLight), borderRadius: BorderRadius.circular(8), - child: Container( - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color: AppColor.darkGreyLight), - borderRadius: BorderRadius.circular(8), - ), - child: ListView( - padding: EdgeInsets.zero, - shrinkWrap: true, - children: - widget.items.map((item) { - return InkWell( - onTap: () { - widget.onChanged?.call(item); - setState(() { - selectedItem = item; - }); - _removeOverlay(); - }, - child: Padding( - padding:widget.contentPadding?? const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: widget.itemBuilder(item), - ), - ); - }).toList(), - ), + ), + child: Container( + constraints: BoxConstraints(maxHeight: 300), + child: ListView( + padding: EdgeInsets.only(bottom: 50), + shrinkWrap: true, + physics: BouncingScrollPhysics(), + scrollDirection: Axis.vertical, + children: widget.items.map((item) { + return InkWell( + onTap: () { + widget.onChanged?.call(item); + setState(() { + selectedItem = item; + }); + _removeOverlay(); + }, + child: Padding( + padding: widget.contentPadding ?? const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: widget.itemBuilder(item), + ), + ); + }).toList(), ), ), ), - ], + ), ), - ), + ], + ), + ), ); Overlay.of(context).insert(_overlayEntry!); @@ -130,12 +130,7 @@ class _OverlayDropdownState extends State> { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ widget.labelBuilder(selectedItem), - Icon( - _isOpen.value - ? CupertinoIcons.chevron_up - : CupertinoIcons.chevron_down, - size: 14, - ), + Icon(_isOpen.value ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, size: 14), ], ), ), diff --git a/packages/core/lib/utils/num_utils.dart b/packages/core/lib/utils/num_utils.dart index 4df60b5..880d901 100644 --- a/packages/core/lib/utils/num_utils.dart +++ b/packages/core/lib/utils/num_utils.dart @@ -1,7 +1,7 @@ import 'package:intl/intl.dart'; extension XNumExtension on num? { - String get toFormatted { + String get separatedByComma { final formatter = NumberFormat('#,###', 'fa_IR'); return this == null ? '':formatter.format(this); } diff --git a/packages/core/lib/utils/separator_input_formatter.dart b/packages/core/lib/utils/separator_input_formatter.dart new file mode 100644 index 0000000..cc87a5f --- /dev/null +++ b/packages/core/lib/utils/separator_input_formatter.dart @@ -0,0 +1,27 @@ +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; + +class SeparatorInputFormatter extends TextInputFormatter { + final NumberFormat _formatter; + + SeparatorInputFormatter() : _formatter = NumberFormat('#,###'); + + @override + TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) { + if (newValue.text.isEmpty) { + return newValue; + } + String tmpText = newValue.text; + String cleanedText = tmpText.replaceAll(RegExp(r'\D'), ''); + int? number = int.tryParse(cleanedText); + if (number == null) { + return oldValue; + } + String formattedText = _formatter.format(number); + int selectionIndex = formattedText.length; + return TextEditingValue( + text: formattedText, + selection: TextSelection.collapsed(offset: selectionIndex), + ); + } +} diff --git a/packages/core/lib/utils/string_utils.dart b/packages/core/lib/utils/string_utils.dart new file mode 100644 index 0000000..278e287 --- /dev/null +++ b/packages/core/lib/utils/string_utils.dart @@ -0,0 +1,11 @@ +import 'package:intl/intl.dart'; + +extension XString on String { + get separatedByComma { + final formatter = NumberFormat('#,###'); + return formatter.format(this); + } + get clearComma{ + return replaceAll(RegExp(r'\D'), ''); + } +} From ec0e344e47af0bcc32f2913533cd894412e6c14d Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 22 Jun 2025 16:51:45 +0330 Subject: [PATCH 132/256] fix : sale out of Province --- assets/vec/hot_chicken.svg.vec | Bin 0 -> 706 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/vec/hot_chicken.svg.vec diff --git a/assets/vec/hot_chicken.svg.vec b/assets/vec/hot_chicken.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..71668a90fa454db555309a872fe8d297d3af47ea GIT binary patch literal 706 zcmXxgUr1AN6bJBg?~G;}E?M+)(adzqp)j1NGvt( zi!)b-)b4Q;*4wnowdcg@pA%x@cplq&hZM{8r5jUX>#3)xD?C$d@W@B8c4bxa**O=u zp3QeoihH^q;M=T@@rM&={YA*Pm^k*?fV+MW^O-f}%xREDZXR6M_$sby`?F?m64^x` zGPo>GHVoqLz?yQbh?=P-5q~uhZWkoyvGN9!^}vFNlHUFwkwn(~-kfyB}Nr zIw2m~E1r<3^%Luk4v!C{YrIKeNma> z4x|PO>Kz?Lbo;!zx!!}C>mIDkbmNV;49&$9{w(ulQcN^|1Tnf00{hhy7qjs+ tIRCx2U+URAg+7TRkr8m7<$5-Qc6j|a(AaYT&i%uc{2G>3scoVQ{{hKf_Cx>x literal 0 HcmV?d00001 From 1e3614ed58000cae6f14e89cfa763bcbd5a8aed1 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 23 Jun 2025 10:42:29 +0330 Subject: [PATCH 133/256] fix : add cancel Token --- packages/auth/lib/data/di/auth_di.dart | 34 ++++++-- packages/auth/lib/data/utils/safe_call.dart | 25 +----- .../data/repositories/chicken_repository.dart | 2 +- .../repositories/chicken_repository_imp.dart | 2 +- .../lib/presentation/pages/home/logic.dart | 2 +- packages/core/lib/core.dart | 8 +- .../lib/infrastructure/infrastructure.dart | 14 ++++ .../remote/app_interceptor.dart | 51 ++++++++++++ .../lib/infrastructure/remote/dio_remote.dart | 12 ++- .../lib/utils/network/safe_call_utils.dart | 78 ++++++++----------- 10 files changed, 140 insertions(+), 88 deletions(-) create mode 100644 packages/core/lib/infrastructure/infrastructure.dart create mode 100644 packages/core/lib/infrastructure/remote/app_interceptor.dart diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index e6b40cd..48554de 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -1,6 +1,7 @@ -import 'package:rasadyar_auth/data/common/constant.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; +import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; import '../common/dio_manager.dart'; @@ -9,8 +10,27 @@ GetIt diAuth = GetIt.instance; Future setupAuthDI() async { diAuth.registerLazySingleton(() => DioRemoteManager()); - diAuth.registerLazySingleton(() => DioRemote()); + diAuth.registerLazySingleton( + () => AppInterceptor( + refreshTokenCallback: () async { + var tokenService = Get.find(); + final authRepo = diAuth.get(); + final refreshToken = tokenService.refreshToken.value; + if (refreshToken == null) return null; + + final result = await authRepo.loginWithRefreshToken(authRequest: {"refresh_token": refreshToken}); + + if (result is AuthResponseModel) { + await tokenService.saveAccessToken(result.access!); + return result.access; + } + return null; + }, + ), + ); + + diAuth.registerLazySingleton(() => DioRemote(interceptors: [diAuth.get()])); final dioRemote = diAuth.get(); await dioRemote.init(); @@ -19,11 +39,11 @@ Future setupAuthDI() async { } Future newSetupAuthDI(String newUrl) async { - diAuth.registerLazySingleton(() => DioRemote(baseUrl: newUrl),instanceName: 'newRemote'); + diAuth.registerLazySingleton( + () => DioRemote(baseUrl: newUrl, interceptors: [diAuth.get()]), + instanceName: 'newRemote', + ); final dioRemote = diAuth.get(instanceName: 'newRemote'); await dioRemote.init(); - diAuth.registerSingleton( - AuthRepositoryImpl(dioRemote), - instanceName: 'newUrl', - ); + diAuth.registerSingleton(AuthRepositoryImpl(dioRemote), instanceName: 'newUrl'); } diff --git a/packages/auth/lib/data/utils/safe_call.dart b/packages/auth/lib/data/utils/safe_call.dart index 6d08637..fb14499 100644 --- a/packages/auth/lib/data/utils/safe_call.dart +++ b/packages/auth/lib/data/utils/safe_call.dart @@ -1,11 +1,9 @@ -import 'package:flutter/foundation.dart'; import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; import '../models/response/auth/auth_response_model.dart'; import '../services/token_storage_service.dart'; - Future safeCall({ required AppAsyncCallback call, Function(T result)? onSuccess, @@ -21,9 +19,6 @@ Future safeCall({ Function()? onShowSuccessMessage, Function()? onShowErrorMessage, }) { - final authRepository = diAuth.get(); - TokenStorageService tokenStorageService = Get.find(); - return gSafeCall( call: call, onSuccess: onSuccess, @@ -38,24 +33,6 @@ Future safeCall({ onHideLoading: onHideLoading, onShowSuccessMessage: onShowSuccessMessage, onShowErrorMessage: onShowErrorMessage, - retryOnAuthError: true, - onTokenRefresh: () { - var token = tokenStorageService.refreshToken.value; - authRepository - .loginWithRefreshToken(authRequest: {"refresh_token": token}) - .then((value) async { - if (value is AuthResponseModel) { - await tokenStorageService.saveAccessToken(value.access!); - } else { - throw Exception("Failed to refresh token"); - } - }) - .catchError((error) { - if (kDebugMode) { - print('Error during token refresh: $error'); - } - throw error; - }); - }, ); } + diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index a880f85..250fbd8 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -19,7 +19,7 @@ import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { Future?> getInventory({required String token}); - Future getIKillHouseDistributionInfo({required String token}); + Future getKillHouseDistributionInfo({required String token}); Future getGeneralBarInformation({required String token, Map? queryParameters}); diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index e1a59e9..556c6ba 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -35,7 +35,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getIKillHouseDistributionInfo({required String token}) async { + Future getKillHouseDistributionInfo({required String token}) async { var res = await _httpClient.get( '/kill-house-distribution-info/?role=Steward', headers: {'Authorization': 'Bearer $token'}, diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index bb344e2..bcfe78b 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -72,7 +72,7 @@ class HomeLogic extends GetxController { Future getDistributionInformation() async { await safeCall( - call: () async => await rootLogic.chickenRepository.getIKillHouseDistributionInfo(token: rootLogic.tokenService.accessToken.value!), + call: () async => await rootLogic.chickenRepository.getKillHouseDistributionInfo(token: rootLogic.tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { killHouseDistributionInfo.value = result; diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 35d1a04..6f6f95b 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -33,12 +33,8 @@ export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; -export 'infrastructure/local/hive_local_storage.dart'; -//network -export 'infrastructure/remote/dio_form_data.dart'; -export 'infrastructure/remote/dio_remote.dart'; -export 'infrastructure/remote/dio_response.dart'; -export 'injection/di.dart'; +//infrastructure +export 'infrastructure/infrastructure.dart'; ///image picker export 'package:image_picker/image_picker.dart'; diff --git a/packages/core/lib/infrastructure/infrastructure.dart b/packages/core/lib/infrastructure/infrastructure.dart new file mode 100644 index 0000000..86f93f0 --- /dev/null +++ b/packages/core/lib/infrastructure/infrastructure.dart @@ -0,0 +1,14 @@ +// local +export 'local/hive_local_storage.dart'; +export 'local/i_local_storage.dart'; + +//remote +export 'remote/interfaces/i_form_data.dart'; +export 'remote/interfaces/i_http_client.dart'; +export 'remote/interfaces/i_http_response.dart'; +export 'remote/interfaces/i_remote.dart'; + +export 'remote/app_interceptor.dart'; +export 'remote/dio_form_data.dart'; +export 'remote/dio_remote.dart'; +export 'remote/dio_response.dart'; \ No newline at end of file diff --git a/packages/core/lib/infrastructure/remote/app_interceptor.dart b/packages/core/lib/infrastructure/remote/app_interceptor.dart new file mode 100644 index 0000000..c58cde5 --- /dev/null +++ b/packages/core/lib/infrastructure/remote/app_interceptor.dart @@ -0,0 +1,51 @@ +import 'dart:async'; +import '../../core.dart'; + +typedef RefreshTokenCallback = Future Function(); +class AppInterceptor extends Interceptor { + final RefreshTokenCallback refreshTokenCallback; + + AppInterceptor({required this.refreshTokenCallback}); + + @override + Future onError(DioException err, ErrorInterceptorHandler handler) async { + if (err.response?.statusCode == 401 && !ApiHandler.isRefreshing) { + // اول بقیه درخواست‌ها رو کنسل کن + ApiHandler.cancelAllRequests("Token expired - refreshing"); + + ApiHandler.isRefreshing = true; + + try { + final newToken = await refreshTokenCallback(); + if (newToken == null) throw Exception("Refresh failed"); + + // تولید CancelToken جدید برای درخواست‌های بعدی + ApiHandler.reset(); + + final opts = err.requestOptions; + opts.headers['Authorization'] = 'Bearer $newToken'; + + + final dio = Dio(); + final cloneReq = await dio.fetch(opts); + handler.resolve(cloneReq); + return; + } catch (e) { + if (!ApiHandler.isRedirecting) { + ApiHandler.isRedirecting = true; + ApiHandler.cancelAllRequests("Cancel All Requests - Unauthorized"); + // TODO: Navigate to login + Get.offAllNamed('/login'); + } + handler.reject(err); + } finally { + ApiHandler.isRefreshing = false; + } + } else if (err.type == DioExceptionType.cancel) { + + handler.next(err); + } else { + handler.next(err); + } + } +} \ No newline at end of file diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index bec2bf5..e87c10f 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -1,18 +1,18 @@ import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart'; -import 'interfaces/i_http_client.dart'; class DioRemote implements IHttpClient { String? baseUrl; late final Dio _dio; + final List interceptors; - DioRemote({this.baseUrl}); + DioRemote({this.baseUrl, this.interceptors = const []}); @override Future init() async { final dio = Dio(BaseOptions(baseUrl: baseUrl ?? '')); + dio.interceptors.addAll(interceptors); if (kDebugMode) { dio.interceptors.add( PrettyDioLogger( @@ -39,6 +39,7 @@ class DioRemote implements IHttpClient { queryParameters: queryParameters, options: Options(headers: headers), onReceiveProgress: onReceiveProgress, + cancelToken: ApiHandler.globalCancelToken ); if (fromJsonList != null && response.data is List) { response.data = fromJsonList(response.data); @@ -68,6 +69,7 @@ class DioRemote implements IHttpClient { options: Options(headers: headers), onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, + cancelToken: ApiHandler.globalCancelToken ); if (fromJson != null) { @@ -98,6 +100,7 @@ class DioRemote implements IHttpClient { options: Options(headers: headers), onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, + cancelToken: ApiHandler.globalCancelToken ); return DioResponse(response); } @@ -114,6 +117,7 @@ class DioRemote implements IHttpClient { data: data, queryParameters: queryParameters, options: Options(headers: headers), + cancelToken: ApiHandler.globalCancelToken ); return DioResponse(response); } @@ -127,6 +131,7 @@ class DioRemote implements IHttpClient { url, options: Options(responseType: ResponseType.bytes), onReceiveProgress: onReceiveProgress, + cancelToken: ApiHandler.globalCancelToken ); return DioResponse(response); } @@ -143,6 +148,7 @@ class DioRemote implements IHttpClient { data: (formData as DioFormData).raw, options: Options(headers: headers, contentType: 'multipart/form-data'), onSendProgress: onSendProgress, + cancelToken: ApiHandler.globalCancelToken ); return DioResponse(response); } diff --git a/packages/core/lib/utils/network/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart index 882a549..3b52161 100644 --- a/packages/core/lib/utils/network/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -1,7 +1,32 @@ -import 'package:flutter/foundation.dart'; - import '../../core.dart'; +class ApiHandler { + static bool _isRefreshing = false; + static bool _isRedirecting = false; + static CancelToken globalCancelToken = CancelToken(); + + static Future reset() async { + _isRefreshing = false; + _isRedirecting = false; + globalCancelToken = CancelToken(); + } + + // متد جدید برای کنسل کردن همه درخواست‌ها + static void cancelAllRequests(String reason) { + if (!globalCancelToken.isCancelled) { + globalCancelToken.cancel(reason); + } + // CancelToken جدید بساز برای درخواست‌های بعدی + globalCancelToken = CancelToken(); + } + + static bool get isRefreshing => _isRefreshing; + static set isRefreshing(bool val) => _isRefreshing = val; + + static bool get isRedirecting => _isRedirecting; + static set isRedirecting(bool val) => _isRedirecting = val; +} + typedef AppAsyncCallback = Future Function(); typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace); typedef VoidCallback = void Function(); @@ -9,7 +34,6 @@ typedef VoidCallback = void Function(); /// this is global safe call function /// A utility function to safely cal l an asynchronous function with error /// handling and optional loading, success, and error messages. -/// Future gSafeCall({ required AppAsyncCallback call, Function(T result)? onSuccess, @@ -20,62 +44,26 @@ Future gSafeCall({ bool showSuccess = false, bool showToast = false, bool showSnackBar = false, - bool retryOnAuthError = false, - Function()? onTokenRefresh, Function()? onShowLoading, Function()? onHideLoading, Function()? onShowSuccessMessage, Function()? onShowErrorMessage, }) async { try { - if (showLoading) { - (onShowLoading ?? _defaultShowLoading)(); - } - + if (showLoading) (onShowLoading ?? _defaultShowLoading)(); final result = await call(); - - if (showSuccess) { - (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); - } - + if (showSuccess) (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); onSuccess?.call(result); } catch (error, stackTrace) { - if (retryOnAuthError && isTokenExpiredError(error)) { - try { - await onTokenRefresh?.call(); - final retryResult = await call(); - if (showSuccess) { - (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); - } - onSuccess?.call(retryResult); - return; - } catch (retryError, retryStackTrace) { - if (showError) { - (onShowErrorMessage ?? _defaultShowErrorMessage)(); - } - onError?.call(retryError, retryStackTrace); - if (kDebugMode) { - print('safeCall retry error: $retryError\n$retryStackTrace'); - } - } - } else { - if (showError) { - (onShowErrorMessage ?? _defaultShowErrorMessage)(); - } - onError?.call(error, stackTrace); - if (kDebugMode) { - print('safeCall error: $error\n$stackTrace'); - } - } + if (showError) (onShowErrorMessage ?? _defaultShowErrorMessage)(); + onError?.call(error, stackTrace); } finally { - if (showLoading) { - (onHideLoading ?? _defaultHideLoading)(); - } - + if (showLoading) (onHideLoading ?? _defaultHideLoading)(); onComplete?.call(); } } + void _defaultShowLoading() { // پیاده‌سازی پیش‌فرض } From 078fe9a022a63a2aaf9b6bb846b38bf256159574 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 23 Jun 2025 16:49:12 +0330 Subject: [PATCH 134/256] feat : buyer in sale out of the province --- .../out_province_carcasses_buyer.dart | 60 ++ .../out_province_carcasses_buyer.freezed.dart | 543 ++++++++++++ .../out_province_carcasses_buyer.g.dart | 95 +++ .../data/repositories/chicken_repository.dart | 11 + .../repositories/chicken_repository_imp.dart | 27 + .../pages/buys_out_of_province/logic.dart | 191 ++++- .../pages/buys_out_of_province/view.dart | 792 +++++++++++++++++- .../pages/out_of_province/view.dart | 11 +- .../pages/sales_out_of_province/logic.dart | 119 ++- .../pages/sales_out_of_province/view.dart | 246 +++--- .../widgets/buyers_page.dart | 346 ++++++++ .../widgets/empty_widget.dart | 8 + packages/core/lib/utils/map_utils.dart | 17 +- 13 files changed, 2268 insertions(+), 198 deletions(-) create mode 100644 packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart create mode 100644 packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.g.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart diff --git a/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart new file mode 100644 index 0000000..ea48447 --- /dev/null +++ b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart @@ -0,0 +1,60 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'out_province_carcasses_buyer.freezed.dart'; +part 'out_province_carcasses_buyer.g.dart'; + +@freezed +abstract class OutProvinceCarcassesBuyer with _$OutProvinceCarcassesBuyer { + const factory OutProvinceCarcassesBuyer({ + Buyer? buyer, + RequestsInfo? requestsInfo, + String? key, + bool? trash, + String? fullname, + String? firstName, + String? lastName, + String? mobile, + String? unitName, + String? city, + String? province, + String? role, + bool? active, + String? typeActivity, + dynamic killHouse, + int? steward, + }) = _OutProvinceCarcassesBuyer; + + factory OutProvinceCarcassesBuyer.fromJson(Map json) => + _$OutProvinceCarcassesBuyerFromJson(json); +} + +@freezed +abstract class Buyer with _$Buyer { + const factory Buyer({ + String? key, + bool? trash, + String? fullname, + String? firstName, + String? lastName, + String? mobile, + String? unitName, + String? city, + String? province, + bool? active, + int? user, + }) = _Buyer; + + factory Buyer.fromJson(Map json) => _$BuyerFromJson(json); +} + +@freezed +abstract class RequestsInfo with _$RequestsInfo { + const factory RequestsInfo({ + int? numberOfRequests, + int? totalQuantity, + double? totalWeight, + }) = _RequestsInfo; + + factory RequestsInfo.fromJson(Map json) => + _$RequestsInfoFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart new file mode 100644 index 0000000..9019d66 --- /dev/null +++ b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart @@ -0,0 +1,543 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'out_province_carcasses_buyer.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$OutProvinceCarcassesBuyer { + + Buyer? get buyer; RequestsInfo? get requestsInfo; String? get key; bool? get trash; String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get unitName; String? get city; String? get province; String? get role; bool? get active; String? get typeActivity; dynamic get killHouse; int? get steward; +/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$OutProvinceCarcassesBuyerCopyWith get copyWith => _$OutProvinceCarcassesBuyerCopyWithImpl(this as OutProvinceCarcassesBuyer, _$identity); + + /// Serializes this OutProvinceCarcassesBuyer to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is OutProvinceCarcassesBuyer&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.requestsInfo, requestsInfo) || other.requestsInfo == requestsInfo)&&(identical(other.key, key) || other.key == key)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.role, role) || other.role == role)&&(identical(other.active, active) || other.active == active)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&(identical(other.steward, steward) || other.steward == steward)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,buyer,requestsInfo,key,trash,fullname,firstName,lastName,mobile,unitName,city,province,role,active,typeActivity,const DeepCollectionEquality().hash(killHouse),steward); + +@override +String toString() { + return 'OutProvinceCarcassesBuyer(buyer: $buyer, requestsInfo: $requestsInfo, key: $key, trash: $trash, fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, unitName: $unitName, city: $city, province: $province, role: $role, active: $active, typeActivity: $typeActivity, killHouse: $killHouse, steward: $steward)'; +} + + +} + +/// @nodoc +abstract mixin class $OutProvinceCarcassesBuyerCopyWith<$Res> { + factory $OutProvinceCarcassesBuyerCopyWith(OutProvinceCarcassesBuyer value, $Res Function(OutProvinceCarcassesBuyer) _then) = _$OutProvinceCarcassesBuyerCopyWithImpl; +@useResult +$Res call({ + Buyer? buyer, RequestsInfo? requestsInfo, String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, String? role, bool? active, String? typeActivity, dynamic killHouse, int? steward +}); + + +$BuyerCopyWith<$Res>? get buyer;$RequestsInfoCopyWith<$Res>? get requestsInfo; + +} +/// @nodoc +class _$OutProvinceCarcassesBuyerCopyWithImpl<$Res> + implements $OutProvinceCarcassesBuyerCopyWith<$Res> { + _$OutProvinceCarcassesBuyerCopyWithImpl(this._self, this._then); + + final OutProvinceCarcassesBuyer _self; + final $Res Function(OutProvinceCarcassesBuyer) _then; + +/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? buyer = freezed,Object? requestsInfo = freezed,Object? key = freezed,Object? trash = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? unitName = freezed,Object? city = freezed,Object? province = freezed,Object? role = freezed,Object? active = freezed,Object? typeActivity = freezed,Object? killHouse = freezed,Object? steward = freezed,}) { + return _then(_self.copyWith( +buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,requestsInfo: freezed == requestsInfo ? _self.requestsInfo : requestsInfo // ignore: cast_nullable_to_non_nullable +as RequestsInfo?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as int?, + )); +} +/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerCopyWith<$Res>? get buyer { + if (_self.buyer == null) { + return null; + } + + return $BuyerCopyWith<$Res>(_self.buyer!, (value) { + return _then(_self.copyWith(buyer: value)); + }); +}/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$RequestsInfoCopyWith<$Res>? get requestsInfo { + if (_self.requestsInfo == null) { + return null; + } + + return $RequestsInfoCopyWith<$Res>(_self.requestsInfo!, (value) { + return _then(_self.copyWith(requestsInfo: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _OutProvinceCarcassesBuyer implements OutProvinceCarcassesBuyer { + const _OutProvinceCarcassesBuyer({this.buyer, this.requestsInfo, this.key, this.trash, this.fullname, this.firstName, this.lastName, this.mobile, this.unitName, this.city, this.province, this.role, this.active, this.typeActivity, this.killHouse, this.steward}); + factory _OutProvinceCarcassesBuyer.fromJson(Map json) => _$OutProvinceCarcassesBuyerFromJson(json); + +@override final Buyer? buyer; +@override final RequestsInfo? requestsInfo; +@override final String? key; +@override final bool? trash; +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final String? mobile; +@override final String? unitName; +@override final String? city; +@override final String? province; +@override final String? role; +@override final bool? active; +@override final String? typeActivity; +@override final dynamic killHouse; +@override final int? steward; + +/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$OutProvinceCarcassesBuyerCopyWith<_OutProvinceCarcassesBuyer> get copyWith => __$OutProvinceCarcassesBuyerCopyWithImpl<_OutProvinceCarcassesBuyer>(this, _$identity); + +@override +Map toJson() { + return _$OutProvinceCarcassesBuyerToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _OutProvinceCarcassesBuyer&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.requestsInfo, requestsInfo) || other.requestsInfo == requestsInfo)&&(identical(other.key, key) || other.key == key)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.role, role) || other.role == role)&&(identical(other.active, active) || other.active == active)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&(identical(other.steward, steward) || other.steward == steward)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,buyer,requestsInfo,key,trash,fullname,firstName,lastName,mobile,unitName,city,province,role,active,typeActivity,const DeepCollectionEquality().hash(killHouse),steward); + +@override +String toString() { + return 'OutProvinceCarcassesBuyer(buyer: $buyer, requestsInfo: $requestsInfo, key: $key, trash: $trash, fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, unitName: $unitName, city: $city, province: $province, role: $role, active: $active, typeActivity: $typeActivity, killHouse: $killHouse, steward: $steward)'; +} + + +} + +/// @nodoc +abstract mixin class _$OutProvinceCarcassesBuyerCopyWith<$Res> implements $OutProvinceCarcassesBuyerCopyWith<$Res> { + factory _$OutProvinceCarcassesBuyerCopyWith(_OutProvinceCarcassesBuyer value, $Res Function(_OutProvinceCarcassesBuyer) _then) = __$OutProvinceCarcassesBuyerCopyWithImpl; +@override @useResult +$Res call({ + Buyer? buyer, RequestsInfo? requestsInfo, String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, String? role, bool? active, String? typeActivity, dynamic killHouse, int? steward +}); + + +@override $BuyerCopyWith<$Res>? get buyer;@override $RequestsInfoCopyWith<$Res>? get requestsInfo; + +} +/// @nodoc +class __$OutProvinceCarcassesBuyerCopyWithImpl<$Res> + implements _$OutProvinceCarcassesBuyerCopyWith<$Res> { + __$OutProvinceCarcassesBuyerCopyWithImpl(this._self, this._then); + + final _OutProvinceCarcassesBuyer _self; + final $Res Function(_OutProvinceCarcassesBuyer) _then; + +/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? buyer = freezed,Object? requestsInfo = freezed,Object? key = freezed,Object? trash = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? unitName = freezed,Object? city = freezed,Object? province = freezed,Object? role = freezed,Object? active = freezed,Object? typeActivity = freezed,Object? killHouse = freezed,Object? steward = freezed,}) { + return _then(_OutProvinceCarcassesBuyer( +buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,requestsInfo: freezed == requestsInfo ? _self.requestsInfo : requestsInfo // ignore: cast_nullable_to_non_nullable +as RequestsInfo?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerCopyWith<$Res>? get buyer { + if (_self.buyer == null) { + return null; + } + + return $BuyerCopyWith<$Res>(_self.buyer!, (value) { + return _then(_self.copyWith(buyer: value)); + }); +}/// Create a copy of OutProvinceCarcassesBuyer +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$RequestsInfoCopyWith<$Res>? get requestsInfo { + if (_self.requestsInfo == null) { + return null; + } + + return $RequestsInfoCopyWith<$Res>(_self.requestsInfo!, (value) { + return _then(_self.copyWith(requestsInfo: value)); + }); +} +} + + +/// @nodoc +mixin _$Buyer { + + String? get key; bool? get trash; String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get unitName; String? get city; String? get province; bool? get active; int? get user; +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BuyerCopyWith get copyWith => _$BuyerCopyWithImpl(this as Buyer, _$identity); + + /// Serializes this Buyer to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Buyer&&(identical(other.key, key) || other.key == key)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.active, active) || other.active == active)&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,trash,fullname,firstName,lastName,mobile,unitName,city,province,active,user); + +@override +String toString() { + return 'Buyer(key: $key, trash: $trash, fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, unitName: $unitName, city: $city, province: $province, active: $active, user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class $BuyerCopyWith<$Res> { + factory $BuyerCopyWith(Buyer value, $Res Function(Buyer) _then) = _$BuyerCopyWithImpl; +@useResult +$Res call({ + String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, int? user +}); + + + + +} +/// @nodoc +class _$BuyerCopyWithImpl<$Res> + implements $BuyerCopyWith<$Res> { + _$BuyerCopyWithImpl(this._self, this._then); + + final Buyer _self; + final $Res Function(Buyer) _then; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? trash = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? unitName = freezed,Object? city = freezed,Object? province = freezed,Object? active = freezed,Object? user = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Buyer implements Buyer { + const _Buyer({this.key, this.trash, this.fullname, this.firstName, this.lastName, this.mobile, this.unitName, this.city, this.province, this.active, this.user}); + factory _Buyer.fromJson(Map json) => _$BuyerFromJson(json); + +@override final String? key; +@override final bool? trash; +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final String? mobile; +@override final String? unitName; +@override final String? city; +@override final String? province; +@override final bool? active; +@override final int? user; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$BuyerCopyWith<_Buyer> get copyWith => __$BuyerCopyWithImpl<_Buyer>(this, _$identity); + +@override +Map toJson() { + return _$BuyerToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Buyer&&(identical(other.key, key) || other.key == key)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.active, active) || other.active == active)&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,trash,fullname,firstName,lastName,mobile,unitName,city,province,active,user); + +@override +String toString() { + return 'Buyer(key: $key, trash: $trash, fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, unitName: $unitName, city: $city, province: $province, active: $active, user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class _$BuyerCopyWith<$Res> implements $BuyerCopyWith<$Res> { + factory _$BuyerCopyWith(_Buyer value, $Res Function(_Buyer) _then) = __$BuyerCopyWithImpl; +@override @useResult +$Res call({ + String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, int? user +}); + + + + +} +/// @nodoc +class __$BuyerCopyWithImpl<$Res> + implements _$BuyerCopyWith<$Res> { + __$BuyerCopyWithImpl(this._self, this._then); + + final _Buyer _self; + final $Res Function(_Buyer) _then; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? trash = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? unitName = freezed,Object? city = freezed,Object? province = freezed,Object? active = freezed,Object? user = freezed,}) { + return _then(_Buyer( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + + +/// @nodoc +mixin _$RequestsInfo { + + int? get numberOfRequests; int? get totalQuantity; double? get totalWeight; +/// Create a copy of RequestsInfo +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RequestsInfoCopyWith get copyWith => _$RequestsInfoCopyWithImpl(this as RequestsInfo, _$identity); + + /// Serializes this RequestsInfo to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RequestsInfo&&(identical(other.numberOfRequests, numberOfRequests) || other.numberOfRequests == numberOfRequests)&&(identical(other.totalQuantity, totalQuantity) || other.totalQuantity == totalQuantity)&&(identical(other.totalWeight, totalWeight) || other.totalWeight == totalWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,numberOfRequests,totalQuantity,totalWeight); + +@override +String toString() { + return 'RequestsInfo(numberOfRequests: $numberOfRequests, totalQuantity: $totalQuantity, totalWeight: $totalWeight)'; +} + + +} + +/// @nodoc +abstract mixin class $RequestsInfoCopyWith<$Res> { + factory $RequestsInfoCopyWith(RequestsInfo value, $Res Function(RequestsInfo) _then) = _$RequestsInfoCopyWithImpl; +@useResult +$Res call({ + int? numberOfRequests, int? totalQuantity, double? totalWeight +}); + + + + +} +/// @nodoc +class _$RequestsInfoCopyWithImpl<$Res> + implements $RequestsInfoCopyWith<$Res> { + _$RequestsInfoCopyWithImpl(this._self, this._then); + + final RequestsInfo _self; + final $Res Function(RequestsInfo) _then; + +/// Create a copy of RequestsInfo +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? numberOfRequests = freezed,Object? totalQuantity = freezed,Object? totalWeight = freezed,}) { + return _then(_self.copyWith( +numberOfRequests: freezed == numberOfRequests ? _self.numberOfRequests : numberOfRequests // ignore: cast_nullable_to_non_nullable +as int?,totalQuantity: freezed == totalQuantity ? _self.totalQuantity : totalQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalWeight: freezed == totalWeight ? _self.totalWeight : totalWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _RequestsInfo implements RequestsInfo { + const _RequestsInfo({this.numberOfRequests, this.totalQuantity, this.totalWeight}); + factory _RequestsInfo.fromJson(Map json) => _$RequestsInfoFromJson(json); + +@override final int? numberOfRequests; +@override final int? totalQuantity; +@override final double? totalWeight; + +/// Create a copy of RequestsInfo +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$RequestsInfoCopyWith<_RequestsInfo> get copyWith => __$RequestsInfoCopyWithImpl<_RequestsInfo>(this, _$identity); + +@override +Map toJson() { + return _$RequestsInfoToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _RequestsInfo&&(identical(other.numberOfRequests, numberOfRequests) || other.numberOfRequests == numberOfRequests)&&(identical(other.totalQuantity, totalQuantity) || other.totalQuantity == totalQuantity)&&(identical(other.totalWeight, totalWeight) || other.totalWeight == totalWeight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,numberOfRequests,totalQuantity,totalWeight); + +@override +String toString() { + return 'RequestsInfo(numberOfRequests: $numberOfRequests, totalQuantity: $totalQuantity, totalWeight: $totalWeight)'; +} + + +} + +/// @nodoc +abstract mixin class _$RequestsInfoCopyWith<$Res> implements $RequestsInfoCopyWith<$Res> { + factory _$RequestsInfoCopyWith(_RequestsInfo value, $Res Function(_RequestsInfo) _then) = __$RequestsInfoCopyWithImpl; +@override @useResult +$Res call({ + int? numberOfRequests, int? totalQuantity, double? totalWeight +}); + + + + +} +/// @nodoc +class __$RequestsInfoCopyWithImpl<$Res> + implements _$RequestsInfoCopyWith<$Res> { + __$RequestsInfoCopyWithImpl(this._self, this._then); + + final _RequestsInfo _self; + final $Res Function(_RequestsInfo) _then; + +/// Create a copy of RequestsInfo +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? numberOfRequests = freezed,Object? totalQuantity = freezed,Object? totalWeight = freezed,}) { + return _then(_RequestsInfo( +numberOfRequests: freezed == numberOfRequests ? _self.numberOfRequests : numberOfRequests // ignore: cast_nullable_to_non_nullable +as int?,totalQuantity: freezed == totalQuantity ? _self.totalQuantity : totalQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalWeight: freezed == totalWeight ? _self.totalWeight : totalWeight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.g.dart b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.g.dart new file mode 100644 index 0000000..c042f9f --- /dev/null +++ b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.g.dart @@ -0,0 +1,95 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'out_province_carcasses_buyer.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_OutProvinceCarcassesBuyer _$OutProvinceCarcassesBuyerFromJson( + Map json, +) => _OutProvinceCarcassesBuyer( + buyer: json['buyer'] == null + ? null + : Buyer.fromJson(json['buyer'] as Map), + requestsInfo: json['requests_info'] == null + ? null + : RequestsInfo.fromJson(json['requests_info'] as Map), + key: json['key'] as String?, + trash: json['trash'] as bool?, + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + mobile: json['mobile'] as String?, + unitName: json['unit_name'] as String?, + city: json['city'] as String?, + province: json['province'] as String?, + role: json['role'] as String?, + active: json['active'] as bool?, + typeActivity: json['type_activity'] as String?, + killHouse: json['kill_house'], + steward: (json['steward'] as num?)?.toInt(), +); + +Map _$OutProvinceCarcassesBuyerToJson( + _OutProvinceCarcassesBuyer instance, +) => { + 'buyer': instance.buyer, + 'requests_info': instance.requestsInfo, + 'key': instance.key, + 'trash': instance.trash, + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'mobile': instance.mobile, + 'unit_name': instance.unitName, + 'city': instance.city, + 'province': instance.province, + 'role': instance.role, + 'active': instance.active, + 'type_activity': instance.typeActivity, + 'kill_house': instance.killHouse, + 'steward': instance.steward, +}; + +_Buyer _$BuyerFromJson(Map json) => _Buyer( + key: json['key'] as String?, + trash: json['trash'] as bool?, + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + mobile: json['mobile'] as String?, + unitName: json['unit_name'] as String?, + city: json['city'] as String?, + province: json['province'] as String?, + active: json['active'] as bool?, + user: (json['user'] as num?)?.toInt(), +); + +Map _$BuyerToJson(_Buyer instance) => { + 'key': instance.key, + 'trash': instance.trash, + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'mobile': instance.mobile, + 'unit_name': instance.unitName, + 'city': instance.city, + 'province': instance.province, + 'active': instance.active, + 'user': instance.user, +}; + +_RequestsInfo _$RequestsInfoFromJson(Map json) => + _RequestsInfo( + numberOfRequests: (json['number_of_requests'] as num?)?.toInt(), + totalQuantity: (json['total_quantity'] as num?)?.toInt(), + totalWeight: (json['total_weight'] as num?)?.toDouble(), + ); + +Map _$RequestsInfoToJson(_RequestsInfo instance) => + { + 'number_of_requests': instance.numberOfRequests, + 'total_quantity': instance.totalQuantity, + 'total_weight': instance.totalWeight, + }; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 250fbd8..a6c4e2b 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -8,6 +8,7 @@ import 'package:rasadyar_chicken/data/models/response/imported_loads_model/impor import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/pagination_model/pagination_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; @@ -62,10 +63,20 @@ abstract class ChickenRepository { Map? queryParameters, }); + Future createStewardPurchasesOutSideOfTheProvince({required String token, required CreateStewardFreeBar body}); Future deleteStewardPurchasesOutSideOfTheProvince({required String token, required String stewardFreeBarKey}); + Future?> getOutProvinceCarcassesBuyer({ + required String token, + Map? queryParameters, + }); + + + Future createOutProvinceCarcassesBuyer({required String token, required OutProvinceCarcassesBuyer body}); + + Future?> getProvince(); Future?> getCity({required String provinceName}); diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 556c6ba..2379751 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -9,6 +9,7 @@ import 'package:rasadyar_chicken/data/models/response/imported_loads_model/impor import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/pagination_model/pagination_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; @@ -243,4 +244,30 @@ class ChickenRepositoryImpl implements ChickenRepository { queryParameters: {'key': stewardFreeBarKey}, ); } + + @override + Future?> getOutProvinceCarcassesBuyer({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/out-province-carcasses-buyer/?', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => OutProvinceCarcassesBuyer.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createOutProvinceCarcassesBuyer({required String token, required OutProvinceCarcassesBuyer body}) async { + await _httpClient.post( + '/out-province-carcasses-buyer/', + data: body.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart index 0466222..2787f71 100644 --- a/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart @@ -1,15 +1,200 @@ -import 'package:get/get.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; class BuysOutOfProvinceLogic extends GetxController { + RxBool isExpanded = false.obs; + RxBool isSubmitButtonEnabled = false.obs; + RxList isExpandedList = [].obs; + RxBool searchIsSelected = false.obs; + + //TODO add this to Di + ImagePicker imagePicker = ImagePicker(); + + Rx>> purchaseOutOfProvinceList = Resource>.loading().obs; + Rxn selectedProduct = Rxn(); + + RxList cites = [].obs; + Rxn selectedProvince = Rxn(); + Rxn selectedCity = Rxn(); + Rxn selectedImage = Rxn(); + RxnString _base64Image = RxnString(); + RxnString editImageUrl = RxnString(); + + RootLogic get rootLogic => Get.find(); + + OutOfProvinceLogic get outOfTheProvinceLogic => Get.find(); + + GlobalKey formKey = GlobalKey(); + TextEditingController sellerNameController = TextEditingController(); + TextEditingController sellerPhoneController = TextEditingController(); + TextEditingController carcassWeightController = TextEditingController(); + + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); + @override void onReady() { - // TODO: implement onReady super.onReady(); + getStewardPurchaseOutOfProvince(); + selectedProvince.listen((p0) => getCites()); + tLog(selectedProduct.value); + outOfTheProvinceLogic.rolesProductsModel.listen((lists) { + selectedProduct.value = lists.first; + },); + tLog(selectedProduct.value); + setupListeners(); + debounce(searchedValue, (callback) => getStewardPurchaseOutOfProvince(), time: Duration(milliseconds: 2000)); + ever(searchIsSelected, (data) { + if (data == false) { + searchedValue.value = null; + } + }); } @override void onClose() { - // TODO: implement onClose + sellerNameController.dispose(); + sellerPhoneController.dispose(); + carcassWeightController.dispose(); + isExpandedList.clear(); + super.onClose(); } + + Future getStewardPurchaseOutOfProvince() async { + await safeCall( + call: () => rootLogic.chickenRepository.getStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 10, + page: 1, + search: 'filter', + role: 'Steward', + value: searchedValue.value, + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), + onSuccess: (res) { + if ((res?.count ?? 0) == 0) { + purchaseOutOfProvinceList.value = Resource>.empty(); + } else { + purchaseOutOfProvinceList.value = Resource>.success(res!.results!); + } + }, + ); + } + + Future getCites() async { + await safeCall( + call: () => rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), + onSuccess: (result) { + if (result != null && result.isNotEmpty) { + cites.value = result; + } + }, + ); + } + + void setupListeners() { + sellerNameController.addListener(checkFormValid); + sellerPhoneController.addListener(checkFormValid); + carcassWeightController.addListener(checkFormValid); + + ever(selectedProvince, (_) => checkFormValid()); + ever(selectedCity, (_) => checkFormValid()); + ever(selectedProduct, (_) => checkFormValid()); + ever(selectedImage, (data) async { + checkFormValid(); + if (data?.path != null) { + _base64Image.value = await convertImageToBase64(data!.path); + } + }); + } + + void checkFormValid() { + isSubmitButtonEnabled.value = + sellerNameController.text.isNotEmpty && + sellerPhoneController.text.isNotEmpty && + carcassWeightController.text.isNotEmpty && + selectedProvince.value != null && + selectedCity.value != null && + selectedProduct.value != null && + selectedImage.value != null; + } + + Future createStewardPurchaseOutOfProvince() async { + bool res = false; + if (!(formKey.currentState?.validate() ?? false)) { + return res; + } + await safeCall( + call: () async { + CreateStewardFreeBar createStewardFreeBar = CreateStewardFreeBar( + productKey: selectedProduct.value!.key, + killHouseName: sellerNameController.text, + killHouseMobile: sellerPhoneController.text, + province: selectedProvince.value!.name, + city: selectedCity.value!.name, + weightOfCarcasses: int.parse(carcassWeightController.text.clearComma), + barImage: _base64Image.value, + date: DateTime.now().formattedYHMS, + ); + final res = await rootLogic.chickenRepository.createStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + body: createStewardFreeBar, + ); + }, + onSuccess: (result) { + getStewardPurchaseOutOfProvince(); + resetSubmitForm(); + res = true; + }, + ); + return res; + } + + void resetSubmitForm() { + sellerNameController.clear(); + sellerPhoneController.clear(); + carcassWeightController.clear(); + selectedProvince.value = null; + selectedCity.value = null; + selectedProduct.value = null; + selectedImage.value = null; + _base64Image.value = null; + editImageUrl.value = null; + + isSubmitButtonEnabled.value = false; + } + + void setEditData(StewardFreeBar item) { + editImageUrl.value = item.barImage; + sellerNameController.text = item.killHouseName ?? ''; + sellerPhoneController.text = item.killHouseMobile ?? ''; + carcassWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? ''; + selectedProvince.value = IranProvinceCityModel(name: item.province); + selectedCity.value = IranProvinceCityModel(name: item.city); + selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.firstWhere( + (element) => element.key == item.product!.key, + ); + isSubmitButtonEnabled.value = true; + } + + Future deleteStewardPurchaseOutOfProvince(String key) async { + await safeCall( + call: () => rootLogic.chickenRepository.deleteStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + stewardFreeBarKey: key, + ), + ); + } } diff --git a/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart index d076df7..99b878e 100644 --- a/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart @@ -1,13 +1,799 @@ + +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:flutter/services.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_core/core.dart'; import 'logic.dart'; - class BuysOutOfProvincePage extends GetView { const BuysOutOfProvincePage({super.key}); + @override Widget build(BuildContext context) { - return Container(); + return Scaffold( + appBar: RAppBar( + titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: true, + onBackPressed: () { + Get.back(id: 1); + + }, + leadingWidth: 155, + leading: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, + children: [ + Assets.vec.chickenSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), + ], + ), + additionalActions: [ + GestureDetector( + onTap: () { + controller.searchIsSelected.value = !controller.searchIsSelected.value; + }, + child: Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + SizedBox(width: 8), + GestureDetector( + onTap: () { + Get.bottomSheet(filterBottomSheet()); + }, + child: Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + SizedBox(width: 8), + ], + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + routePageWidget(), + _buildSearchWidget(), + Expanded(child: saleListWidget()), + ], + ), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet(addPurchasedInformationBottomSheet(), isScrollControlled: true); + }, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + Widget saleListWidget() { + return ObxValue((data) { + switch (data.value.status) { + case Status.initial: + case Status.loading: + return Center(child: CupertinoActivityIndicator()); + case Status.success: + return ListView.separated( + shrinkWrap: true, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) { + return ObxValue( + (expandList) => saleListItem(expandList: expandList, index: index, item: data.value.data![index]), + controller.isExpandedList, + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemCount: data.value.data?.length ?? 0, + ); + case Status.error: + return Center( + child: Text( + data.value.message ?? 'خطا در دریافت اطلاعات', + style: AppFonts.yekan16.copyWith(color: AppColor.error), + ), + ); + case Status.empty: + return emptyWidget(); + } + }, controller.purchaseOutOfProvinceList); + } + + Widget emptyWidget() { + return Center( + child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), + ); + } + + GestureDetector saleListItem({required RxList expandList, required int index, required StewardFreeBar item}) { + return GestureDetector( + onTap: () { + if (expandList.contains(index)) { + controller.isExpandedList.remove(index); + } else { + controller.isExpandedList.add(index); + } + }, + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), + ), + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + Expanded( + flex: 2, + child: Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ), + Expanded( + flex: 3, + child: Text( + item.killHouseName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ), + SizedBox(width: 8,), + Expanded( + flex: 2, + child: Column( + children: [ + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2,), + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg(width: 24,height: 24, colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn))), + + ], + ), + ), + Expanded( + flex: 2, + child: Text( + '${item.province}\n${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + Icon(CupertinoIcons.chevron_down, size: 12), + SizedBox(width: 8), + ], + ), + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + controller.setEditData(item); + Get.bottomSheet( + addPurchasedInformationBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + GestureDetector( + onTap: () { + buildDeleteDialog( + onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + ); + }, + child: Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow('تاریخ', item.date?.formattedJalaliDateYHMS ?? 'N/A'), + ), + + buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), + buildRow('محصول', item.product?.name ??'N/A'), + buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.separatedByComma} کیلوگرم'), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Get.bottomSheet( + BaseBottomSheet( + height: 400, + child: Column( + spacing: 16, + children: [ + Text( + 'بارنامه', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Image.network( + item.barImage ?? '', + fit: BoxFit.cover, + height: 300, + errorBuilder: (context, error, stackTrace) { + eLog(error.toString()); + return Center(child: Text('خطایی پیش آمده!')); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + print('Loading progress: $loadingProgress'); + return CupertinoActivityIndicator(); + }, + ), + ], + ), + ), + ); + }, + child: Text('مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + ), + Icon(CupertinoIcons.chevron_up, size: 12), + ], + ), + ], + ), + ), + crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + ), + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), + ), + ), + ], + ), + ), + ); + } + + Row routePageWidget() { + return Row( + children: [ + SizedBox(width: 8), + RichText( + text: TextSpan( + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + children: [ + WidgetSpan( + child: Row( + children: [ + Assets.vec.cubeSearchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + SizedBox(width: 6), + ], + ), + ), + + TextSpan(text: 'خارج استان'), + TextSpan(text: '/'), + TextSpan(text: 'خرید'), + ], + ), + ), + ], + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ], + ), + ); + } + + Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + _productTypeWidget(), + RTextField( + controller: controller.sellerNameController, + label: 'نام فروشنده', + borderColor: AppColor.darkGreyLight, + ), + RTextField( + controller: controller.sellerPhoneController, + label: 'تلفن فروشنده', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + maxLength: 11, + validator: (value) { + if (value == null || value.isEmpty) { + return 'لطفاً شماره موبایل را وارد کنید'; + } + // حذف کاماها برای اعتبارسنجی + String cleaned = value.replaceAll(',', ''); + if (cleaned.length != 11) { + return 'شماره موبایل باید ۱۱ رقم باشد'; + } + if (!cleaned.startsWith('09')) { + return 'شماره موبایل باید با 09 شروع شود'; + } + return null; + }, + ), + _provinceWidget(), + _cityWidget(), + RTextField( + controller: controller.carcassWeightController, + label: 'وزن لاشه', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + ), + _imageCarcasesWidget(isOnEdit), + submitButtonWidget(isOnEdit), + SizedBox(), + ], + ), + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + text: isOnEdit ? 'ویرایش' : 'ثبت خرید', + onPressed: data.value + ? () async { + var res = await controller.createStewardPurchaseOutOfProvince(); + if (res) { + Get.back(); + } + } + : null, + height: 40, + ); + }, controller.isSubmitButtonEnabled); + } + + Widget _productTypeWidget() { + tLog(controller.outOfTheProvinceLogic.rolesProductsModel); + iLog(controller.selectedProduct.value); + return Obx(() { + return OverlayDropdownWidget( + items: controller.outOfTheProvinceLogic.rolesProductsModel, + onChanged: (value) { + controller.selectedProduct.value = value; + }, + selectedItem: controller.selectedProduct.value, + initialValue: controller.selectedProduct.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + ); + }); + } + + Widget _provinceWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rootLogic.provinces, + onChanged: (value) { + controller.selectedProvince.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedProvince.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), + ); + }); + } + + Widget _cityWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: data, + onChanged: (value) { + controller.selectedCity.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedCity.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), + ); + }, controller.cites); + } + + SizedBox _imageCarcasesWidget(bool isOnEdit) { + return SizedBox( + width: Get.width, + height: 250, + child: Card( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Expanded( + child: ObxValue((data) { + return Container( + width: Get.width, + decoration: BoxDecoration(color: AppColor.lightGreyNormal, borderRadius: BorderRadius.circular(8)), + child: Center( + child: isOnEdit + ? Image.network(controller.editImageUrl.value ?? '') + : data.value == null + ? Assets.images.placeHolder.image(height: 150, width: 200) + : Image.file(File(data.value!.path), fit: BoxFit.cover), + ), + ); + }, controller.selectedImage), + ), + SizedBox(height: 15), + Container( + width: Get.width, + height: 40, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('تصویر بار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + Spacer(), + GestureDetector( + onTap: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.camera, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + child: Container( + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('دوربین', style: AppFonts.yekan14.copyWith(color: Colors.white)), + SizedBox(width: 8), + Icon(CupertinoIcons.camera, color: Colors.white), + ], + ), + ), + ), + SizedBox(width: 16), + GestureDetector( + onTap: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.gallery, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + child: Container( + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('گالری', style: AppFonts.yekan14.copyWith(color: Colors.white)), + SizedBox(width: 8), + Icon(CupertinoIcons.photo, color: Colors.white), + ], + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + Future buildDeleteDialog({required Future Function() onConfirm}) async { + await Get.defaultDialog( + title: 'حذف خرید', + middleText: 'آیا از حذف این خرید مطمئن هستید؟', + confirm: ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), + onPressed: () async { + await onConfirm(); + Get.back(); + }, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ).whenComplete(() => controller.getStewardPurchaseOutOfProvince()); + } + + Widget filterBottomSheet() { + return BaseBottomSheet( + height: 250, + child: Column( + spacing: 16, + children: [ + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.fromDateFilter, + onChanged: (jalali) => controller.fromDateFilter.value = jalali, + ), + ), + Expanded( + child: timeFilterWidget( + isFrom: false, + date: controller.toDateFilter, + onChanged: (jalali) => controller.toDateFilter.value = jalali, + ), + ), + ], + ), + SizedBox(height: 2), + RElevated( + text: 'اعمال فیلتر', + onPressed: () { + controller.getStewardPurchaseOutOfProvince(); + Get.back(); + }, + height: 40, + ), + SizedBox(height: 16), + ], + ), + ); + } + + GestureDetector timeFilterWidget({ + isFrom = true, + required Rx date, + required Function(Jalali jalali) onChanged, + }) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blueNormal), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + Expanded( + child: ObxValue((data) { + return Text( + date.value.formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + ); + }, date), + ), + ], + ), + ), + ); + } + + Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'تایید', + ), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', + ), + SizedBox(width: 20), + ], + ), + ), + Divider(height: 0, thickness: 1), + Expanded( + child: Container( + child: PersianCupertinoDatePicker( + initialDateTime: Jalali.now(), + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, + ), + ), + ), + ], + ), + ); + } + + ObxValue _buildSearchWidget() { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + onChanged: (value) { + controller.searchedValue.value = value; + }, + controller: TextEditingController(), + ), + ), + ), + ); + }, controller.searchIsSelected); } } diff --git a/packages/chicken/lib/presentation/pages/out_of_province/view.dart b/packages/chicken/lib/presentation/pages/out_of_province/view.dart index 4315ca2..88e9fd3 100644 --- a/packages/chicken/lib/presentation/pages/out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/out_of_province/view.dart @@ -41,20 +41,23 @@ class OutOfProvincePage extends GetView { children: [ Expanded( child: _typeOuterInfoCard( - title: 'خرید خارج استان', + title: 'خرید', iconPath: Assets.vec.cubeBottomRotationSvg.path, foregroundColor: AppColor.blueNormal, onTap: () { - Get.toNamed(ChickenRoutes.salesOutOfProvince,id:1); + Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 1); }, ), ), Expanded( child: _typeOuterInfoCard( - title: 'فروش خارج استان', + title: 'فروش', iconPath: Assets.vec.cubeTopRotationSvg.path, foregroundColor: AppColor.greenDark, - onTap: () {}, + onTap: () { + iLog('فروش'); + Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); + }, ), ), ], diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index c22cda4..a3f15a0 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,14 +1,16 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { + RxInt currentIndex = 0.obs; + RxBool isExpanded = false.obs; RxBool isSubmitButtonEnabled = false.obs; RxList isExpandedList = [].obs; @@ -17,24 +19,23 @@ class SalesOutOfProvinceLogic extends GetxController { //TODO add this to Di ImagePicker imagePicker = ImagePicker(); - Rx>> purchaseOutOfProvinceList = Resource>.loading().obs; + Rx>> buyerList = Resource>.loading().obs; + Rxn selectedProduct = Rxn(); RxList cites = [].obs; Rxn selectedProvince = Rxn(); Rxn selectedCity = Rxn(); - Rxn selectedImage = Rxn(); - RxnString _base64Image = RxnString(); - RxnString editImageUrl = RxnString(); RootLogic get rootLogic => Get.find(); OutOfProvinceLogic get outOfTheProvinceLogic => Get.find(); GlobalKey formKey = GlobalKey(); - TextEditingController sellerNameController = TextEditingController(); - TextEditingController sellerPhoneController = TextEditingController(); - TextEditingController carcassWeightController = TextEditingController(); + TextEditingController buyerNameController = TextEditingController(); + TextEditingController buyerLastNameController = TextEditingController(); + TextEditingController buyerPhoneController = TextEditingController(); + TextEditingController buyerUnitNameController = TextEditingController(); Rx fromDateFilter = Jalali.now().obs; Rx toDateFilter = Jalali.now().obs; @@ -43,15 +44,14 @@ class SalesOutOfProvinceLogic extends GetxController { @override void onReady() { super.onReady(); - getStewardPurchaseOutOfProvince(); + getOutProvinceCarcassesBuyer(); selectedProvince.listen((p0) => getCites()); tLog(selectedProduct.value); - outOfTheProvinceLogic.rolesProductsModel.listen((lists) { - selectedProduct.value = lists.first; - },); - tLog(selectedProduct.value); + outOfTheProvinceLogic.rolesProductsModel.listen((lists) { + selectedProduct.value = lists.first; + }); setupListeners(); - debounce(searchedValue, (callback) => getStewardPurchaseOutOfProvince(), time: Duration(milliseconds: 2000)); + debounce(searchedValue, (callback) => getOutProvinceCarcassesBuyer(), time: Duration(milliseconds: 2000)); ever(searchIsSelected, (data) { if (data == false) { searchedValue.value = null; @@ -61,33 +61,35 @@ class SalesOutOfProvinceLogic extends GetxController { @override void onClose() { - sellerNameController.dispose(); - sellerPhoneController.dispose(); - carcassWeightController.dispose(); + buyerNameController.dispose(); + buyerLastNameController.dispose(); + buyerPhoneController.dispose(); + buyerUnitNameController.dispose(); + selectedCity.value = null; + selectedProvince.value = null; isExpandedList.clear(); super.onClose(); } - Future getStewardPurchaseOutOfProvince() async { + Future getOutProvinceCarcassesBuyer() async { await safeCall( - call: () => rootLogic.chickenRepository.getStewardPurchasesOutSideOfTheProvince( + call: () => rootLogic.chickenRepository.getOutProvinceCarcassesBuyer( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( pageSize: 10, page: 1, + state: 'buyer-list', search: 'filter', role: 'Steward', - value: searchedValue.value, - fromDate: fromDateFilter.value.toDateTime(), - toDate: toDateFilter.value.toDateTime(), + value: searchedValue.value ?? '', ), ), onSuccess: (res) { if ((res?.count ?? 0) == 0) { - purchaseOutOfProvinceList.value = Resource>.empty(); + buyerList.value = Resource>.empty(); } else { - purchaseOutOfProvinceList.value = Resource>.success(res!.results!); + buyerList.value = Resource>.success(res!.results!); } }, ); @@ -105,56 +107,50 @@ class SalesOutOfProvinceLogic extends GetxController { } void setupListeners() { - sellerNameController.addListener(checkFormValid); - sellerPhoneController.addListener(checkFormValid); - carcassWeightController.addListener(checkFormValid); + buyerNameController.addListener(checkFormValid); + buyerLastNameController.addListener(checkFormValid); + buyerPhoneController.addListener(checkFormValid); + buyerUnitNameController.addListener(checkFormValid); ever(selectedProvince, (_) => checkFormValid()); ever(selectedCity, (_) => checkFormValid()); ever(selectedProduct, (_) => checkFormValid()); - ever(selectedImage, (data) async { - checkFormValid(); - if (data?.path != null) { - _base64Image.value = await convertImageToBase64(data!.path); - } - }); } void checkFormValid() { isSubmitButtonEnabled.value = - sellerNameController.text.isNotEmpty && - sellerPhoneController.text.isNotEmpty && - carcassWeightController.text.isNotEmpty && + buyerNameController.text.isNotEmpty && + buyerLastNameController.text.isNotEmpty && + buyerPhoneController.text.isNotEmpty && + buyerUnitNameController.text.isNotEmpty && selectedProvince.value != null && selectedCity.value != null && - selectedProduct.value != null && - selectedImage.value != null; + selectedProduct.value != null; } - Future createStewardPurchaseOutOfProvince() async { + Future createBuyer() async { bool res = false; if (!(formKey.currentState?.validate() ?? false)) { return res; } await safeCall( call: () async { - CreateStewardFreeBar createStewardFreeBar = CreateStewardFreeBar( - productKey: selectedProduct.value!.key, - killHouseName: sellerNameController.text, - killHouseMobile: sellerPhoneController.text, + OutProvinceCarcassesBuyer buyer = OutProvinceCarcassesBuyer( province: selectedProvince.value!.name, city: selectedCity.value!.name, - weightOfCarcasses: int.parse(carcassWeightController.text.clearComma), - barImage: _base64Image.value, - date: DateTime.now().formattedYHMS, + firstName: buyerNameController.text, + lastName: buyerLastNameController.text, + unitName: buyerUnitNameController.text, + mobile: buyerPhoneController.text, + role: 'Steward', ); - final res = await rootLogic.chickenRepository.createStewardPurchasesOutSideOfTheProvince( + final res = await rootLogic.chickenRepository.createOutProvinceCarcassesBuyer( token: rootLogic.tokenService.accessToken.value!, - body: createStewardFreeBar, + body: buyer, ); }, onSuccess: (result) { - getStewardPurchaseOutOfProvince(); + getOutProvinceCarcassesBuyer(); resetSubmitForm(); res = true; }, @@ -163,29 +159,24 @@ class SalesOutOfProvinceLogic extends GetxController { } void resetSubmitForm() { - sellerNameController.clear(); - sellerPhoneController.clear(); - carcassWeightController.clear(); + buyerNameController.clear(); + buyerLastNameController.clear(); + buyerPhoneController.clear(); + buyerUnitNameController.clear(); selectedProvince.value = null; selectedCity.value = null; selectedProduct.value = null; - selectedImage.value = null; - _base64Image.value = null; - editImageUrl.value = null; isSubmitButtonEnabled.value = false; } - void setEditData(StewardFreeBar item) { - editImageUrl.value = item.barImage; - sellerNameController.text = item.killHouseName ?? ''; - sellerPhoneController.text = item.killHouseMobile ?? ''; - carcassWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? ''; + void setEditData(OutProvinceCarcassesBuyer item) { + buyerNameController.text = item.firstName ?? ''; + buyerLastNameController.text = item.lastName ?? ''; + buyerUnitNameController.text = item.unitName ?? ''; + buyerPhoneController.text = item.mobile ?? ''; selectedProvince.value = IranProvinceCityModel(name: item.province); selectedCity.value = IranProvinceCityModel(name: item.city); - selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.firstWhere( - (element) => element.key == item.product!.key, - ); isSubmitButtonEnabled.value = true; } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index d165e09..79a07a6 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -1,11 +1,11 @@ import 'dart:io'; -import 'package:flutter/cupertino.dart'; + import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/widgets/buyers_page.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -15,70 +15,106 @@ class SalesOutOfProvincePage extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - appBar: RAppBar( - titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: true, - onBackPressed: () { - Get.back(id: 1); + return ObxValue((index) { + return DefaultTabController( + length: 2, + initialIndex: index.value, + child: Scaffold( + appBar: RAppBar( + titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: true, + onBackPressed: () { + Get.back(id: 1); + }, + leadingWidth: 155, + leading: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, + children: [ + Assets.vec.chickenSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), + ], + ), + additionalActions: [ + GestureDetector( + onTap: () { + controller.searchIsSelected.value = !controller.searchIsSelected.value; + }, + child: Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + SizedBox(width: 8), + GestureDetector( + onTap: () { + // Get.bottomSheet(filterBottomSheet()); + }, + child: Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + SizedBox(width: 8), + ], + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + routePageWidget(), + Container( + child: TabBar( + tabs: [ + Tab(text: 'فروش' ), + Tab(text: 'خریداران'), + ], + onTap: (value) { + controller.currentIndex.value= value; + }, + labelColor: AppColor.blueNormal, + unselectedLabelColor: AppColor.mediumGreyDarkHover, + indicatorColor: AppColor.blueNormal, + indicatorSize: TabBarIndicatorSize.tab, + indicator: BoxDecoration( + color: AppColor.blueLight, + border: Border( + bottom: BorderSide( + color:AppColor.blueNormal, + ), + ), + ), + ), + ), + Expanded( + child: TabBarView( + children: [ + salePage(), + BuyersPage() + ], + ), + ), + ], + ), - }, - leadingWidth: 155, - leading: Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, - children: [ - Assets.vec.chickenSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), - ], ), - additionalActions: [ - GestureDetector( - onTap: () { - controller.searchIsSelected.value = !controller.searchIsSelected.value; - }, - child: Assets.vec.searchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - SizedBox(width: 8), - GestureDetector( - onTap: () { - Get.bottomSheet(filterBottomSheet()); - }, - child: Assets.vec.filterOutlineSvg.svg( - width: 20, - height: 20, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - SizedBox(width: 8), - ], - ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - routePageWidget(), - _buildSearchWidget(), - Expanded(child: saleListWidget()), - ], - ), - floatingActionButton: RFab.add( - onPressed: () { - Get.bottomSheet(addPurchasedInformationBottomSheet(), isScrollControlled: true); - }, - ), - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, - ); + ); + }, controller.currentIndex); } + + Widget salePage(){ + return SizedBox(); + } + +/* + Widget saleListWidget() { return ObxValue((data) { switch (data.value.status) { @@ -92,7 +128,7 @@ class SalesOutOfProvincePage extends GetView { padding: EdgeInsets.fromLTRB(8, 8, 18, 80), itemBuilder: (context, index) { return ObxValue( - (expandList) => saleListItem(expandList: expandList, index: index, item: data.value.data![index]), + (expandList) => saleListItem(expandList: expandList, index: index, item: data.value.data![index]), controller.isExpandedList, ); }, @@ -111,14 +147,11 @@ class SalesOutOfProvincePage extends GetView { } }, controller.purchaseOutOfProvinceList); } +*/ - Widget emptyWidget() { - return Center( - child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), - ); - } - GestureDetector saleListItem({required RxList expandList, required int index, required StewardFreeBar item}) { + +/* GestureDetector saleListItem({required RxList expandList, required int index, required StewardFreeBar item}) { return GestureDetector( onTap: () { if (expandList.contains(index)) { @@ -182,7 +215,9 @@ class SalesOutOfProvincePage extends GetView { SizedBox(height: 2,), Visibility( visible: item.product?.name?.contains('مرغ گرم') ?? false, - child: Assets.vec.hotChickenSvg.svg(width: 24,height: 24, colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn))), + child: Assets.vec.hotChickenSvg.svg(width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn))), ], ), @@ -235,9 +270,9 @@ class SalesOutOfProvincePage extends GetView { GestureDetector( onTap: () { - buildDeleteDialog( - onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), - ); + // buildDeleteDialog( + // onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + // ); }, child: Assets.vec.trashSvg.svg( width: 20, @@ -261,7 +296,8 @@ class SalesOutOfProvincePage extends GetView { ), buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), - buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.toInt()} کیلوگرم'), + buildRow('محصول', item.product?.name ?? 'N/A'), + buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.separatedByComma} کیلوگرم'), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -297,7 +333,8 @@ class SalesOutOfProvincePage extends GetView { ), ); }, - child: Text('مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + child: Text( + 'مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), ), Icon(CupertinoIcons.chevron_up, size: 12), ], @@ -329,7 +366,7 @@ class SalesOutOfProvincePage extends GetView { ), ), ); - } + }*/ Row routePageWidget() { return Row( @@ -354,7 +391,7 @@ class SalesOutOfProvincePage extends GetView { TextSpan(text: 'خارج استان'), TextSpan(text: '/'), - TextSpan(text: 'خرید'), + TextSpan(text: 'فروش'), ], ), ), @@ -389,37 +426,8 @@ class SalesOutOfProvincePage extends GetView { ), ); } - Widget buildRow2(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - SizedBox(width: 8,), - Expanded( - child: Container - ( - color: Colors.green, - child: Text( - value, - textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - ), - ], - ), - ); - } - - - Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { +/* Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( child: SingleChildScrollView( child: Form( @@ -475,24 +483,24 @@ class SalesOutOfProvincePage extends GetView { ), ), ); - } + }*/ - Widget submitButtonWidget(bool isOnEdit) { +/* Widget submitButtonWidget(bool isOnEdit) { return ObxValue((data) { return RElevated( text: isOnEdit ? 'ویرایش' : 'ثبت خرید', onPressed: data.value ? () async { - var res = await controller.createStewardPurchaseOutOfProvince(); - if (res) { - Get.back(); - } - } + var res = await controller.createStewardPurchaseOutOfProvince(); + if (res) { + Get.back(); + } + } : null, height: 40, ); }, controller.isSubmitButtonEnabled); - } + }*/ Widget _productTypeWidget() { tLog(controller.outOfTheProvinceLogic.rolesProductsModel); @@ -541,7 +549,7 @@ class SalesOutOfProvincePage extends GetView { }, controller.cites); } - SizedBox _imageCarcasesWidget(bool isOnEdit) { +/* SizedBox _imageCarcasesWidget(bool isOnEdit) { return SizedBox( width: Get.width, height: 250, @@ -634,9 +642,9 @@ class SalesOutOfProvincePage extends GetView { ), ), ); - } + }*/ - Future buildDeleteDialog({required Future Function() onConfirm}) async { +/* Future buildDeleteDialog({required Future Function() onConfirm}) async { await Get.defaultDialog( title: 'حذف خرید', middleText: 'آیا از حذف این خرید مطمئن هستید؟', @@ -695,7 +703,7 @@ class SalesOutOfProvincePage extends GetView { ], ), ); - } + }*/ GestureDetector timeFilterWidget({ isFrom = true, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart new file mode 100644 index 0000000..c61749a --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart @@ -0,0 +1,346 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'empty_widget.dart'; + +class BuyersPage extends GetView { + const BuyersPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: buyerListWidget(), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet(addOrEditBuyerBottomSheet(), isScrollControlled: true); + }, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + Widget buyerListWidget() { + return ObxValue((data) { + switch (data.value.status) { + case Status.initial: + case Status.loading: + return Center(child: CupertinoActivityIndicator()); + case Status.success: + return ListView.separated( + shrinkWrap: true, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) { + return ObxValue( + (expandList) => buyerListItem(expandList: expandList, index: index, item: data.value.data![index]), + controller.isExpandedList, + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemCount: data.value.data?.length ?? 0, + ); + case Status.error: + return Center( + child: Text( + data.value.message ?? 'خطا در دریافت اطلاعات', + style: AppFonts.yekan16.copyWith(color: AppColor.error), + ), + ); + case Status.empty: + return emptyWidget(); + } + }, controller.buyerList); + } + + GestureDetector buyerListItem({ + required RxList expandList, + required int index, + required OutProvinceCarcassesBuyer item, + }) { + return GestureDetector( + onTap: () { + if (expandList.contains(index)) { + controller.isExpandedList.remove(index); + } else { + controller.isExpandedList.add(index); + } + }, + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), + ), + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + + Expanded( + flex: 2, + child: Column( + children: [ + Text( + item.buyer?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2), + Text( + item.buyer?.mobile ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + + SizedBox(width: 8), + Expanded( + flex: 2, + child: Text( + '${item.unitName}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + Expanded( + flex: 1, + child: Text( + '${item.buyer?.province}\n${item.buyer?.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDark), + ), + ), + + Icon(CupertinoIcons.chevron_down, size: 12), + SizedBox(width: 8), + ], + ), + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + controller.setEditData(item); + Get.bottomSheet(addOrEditBuyerBottomSheet(true), isScrollControlled: true).whenComplete( + () { + controller.resetSubmitForm(); + }, + ); + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + SizedBox(), + ], + ), + + buildRow('مشخصات خریدار', item.fullname ?? 'N/A'), + buildRow('نام واحد', item.unitName ?? 'N/A'), + buildRow('تعداد درخواست ها', '${item.requestsInfo?.numberOfRequests.separatedByComma}'), + buildRow('وزن', '${item.requestsInfo?.totalWeight.separatedByComma}'), + ], + ), + ), + crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + ), + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), + ), + ), + ], + ), + ), + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ], + ), + ); + } + + Widget addOrEditBuyerBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + height: 600, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش خریدار' : 'افزودن خریدار', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + RTextField( + controller: controller.buyerPhoneController, + label: 'تلفن خریدار', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + maxLength: 11, + validator: (value) { + if (value == null || value.isEmpty) { + return 'لطفاً شماره موبایل را وارد کنید'; + } + // حذف کاماها برای اعتبارسنجی + String cleaned = value.replaceAll(',', ''); + if (cleaned.length != 11) { + return 'شماره موبایل باید ۱۱ رقم باشد'; + } + if (!cleaned.startsWith('09')) { + return 'شماره موبایل باید با 09 شروع شود'; + } + return null; + }, + ), + RTextField( + controller: controller.buyerNameController, + label: 'نام خریدار', + borderColor: AppColor.darkGreyLight, + ), + RTextField( + controller: controller.buyerLastNameController, + label: 'نام خانوادگی خریدار', + borderColor: AppColor.darkGreyLight, + ), + + RTextField( + controller: controller.buyerUnitNameController, + label: 'نام واحد', + borderColor: AppColor.darkGreyLight, + ), + _provinceWidget(), + _cityWidget(), + submitButtonWidget(isOnEdit), + SizedBox(), + ], + ), + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + text: isOnEdit ? 'ویرایش' : 'ثبت', + onPressed: data.value + ? () async { + var res = await controller.createBuyer(); + if (res) { + Get.back(); + } + } + : null, + height: 40, + ); + }, controller.isSubmitButtonEnabled); + } + + Widget _provinceWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rootLogic.provinces, + onChanged: (value) { + controller.selectedProvince.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedProvince.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), + ); + }); + } + + Widget _cityWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: data, + onChanged: (value) { + controller.selectedCity.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedCity.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), + ); + }, controller.cites); + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart new file mode 100644 index 0000000..4c7c6a9 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +Widget emptyWidget() { + return Center( + child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), + ); +} diff --git a/packages/core/lib/utils/map_utils.dart b/packages/core/lib/utils/map_utils.dart index 943ab2a..39e63c4 100644 --- a/packages/core/lib/utils/map_utils.dart +++ b/packages/core/lib/utils/map_utils.dart @@ -9,13 +9,12 @@ Map buildQueryParams({ DateTime? fromDate, DateTime? toDate, String? role, + String? state, }) { final params = {}; - if (queryParams != null) { - params.addAll(queryParams); - } + if (fromDate != null) { params['date1'] = fromDate.formattedDashedGregorian; @@ -29,7 +28,7 @@ Map buildQueryParams({ params['search'] = search; } - if (value != null && value.isNotEmpty) { + if (value != null) { params['value'] = value; } @@ -41,9 +40,17 @@ Map buildQueryParams({ params['page_size'] = pageSize; } - if(role != null && role.isNotEmpty) { + if (role != null && role.isNotEmpty) { params['role'] = role; } + if (state != null && state.isNotEmpty) { + params['state'] = state; + } + + if (queryParams != null) { + params.addAll(queryParams); + } + return params; } From d4f1e86295d8467d8e1e2c55448ac4741688aee4 Mon Sep 17 00:00:00 2001 From: MrM Date: Tue, 24 Jun 2025 09:29:11 +0330 Subject: [PATCH 135/256] feat : search and filter in buyer out of the province --- lib/res/assets_res.dart | 14 --- lib/res/font_res.dart | 12 -- .../pages/sales_out_of_province/view.dart | 51 ++------- .../widgets/buyers_page.dart | 105 ++++++++++++++---- .../widgets/search_widget.dart | 38 +++++++ 5 files changed, 131 insertions(+), 89 deletions(-) delete mode 100644 lib/res/assets_res.dart delete mode 100644 lib/res/font_res.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart diff --git a/lib/res/assets_res.dart b/lib/res/assets_res.dart deleted file mode 100644 index 18ff89e..0000000 --- a/lib/res/assets_res.dart +++ /dev/null @@ -1,14 +0,0 @@ -// Generated file. Do not edit. -// This file is generated by the iFlutter - -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars -class AssetsRes { - AssetsRes._(); - - static const String PROJECT_NAME = 'rasadyar_app'; - static const String PROJECT_VERSION = '1.2.0+2'; - static const String INSIDE = 'assets/icons/inside.svg'; - static const String OUTSIDE = 'assets/icons/outside.svg'; - static const String WHARE_HOUSE = 'assets/icons/whare_house.svg'; -} diff --git a/lib/res/font_res.dart b/lib/res/font_res.dart deleted file mode 100644 index 38a512e..0000000 --- a/lib/res/font_res.dart +++ /dev/null @@ -1,12 +0,0 @@ -// Generated file. Do not edit. -// This file is generated by the iFlutter - -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars -class FontRes { - FontRes._(); - - static const String PROJECT_NAME = 'rasadyar_app'; - static const String PROJECT_VERSION = '1.2.0+2'; - static const String IRANYEKANREGULARFANUM = 'iranyekanregularfanum'; -} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 79a07a6..8ce5813 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -52,14 +52,17 @@ class SalesOutOfProvincePage extends GetView { ), ), SizedBox(width: 8), - GestureDetector( - onTap: () { - // Get.bottomSheet(filterBottomSheet()); - }, - child: Assets.vec.filterOutlineSvg.svg( - width: 20, - height: 20, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + Visibility( + visible: controller.currentIndex.value==0, + child: GestureDetector( + onTap: () { + // Get.bottomSheet(filterBottomSheet()); + }, + child: Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), ), ), SizedBox(width: 8), @@ -800,35 +803,5 @@ class SalesOutOfProvincePage extends GetView { ); } - ObxValue _buildSearchWidget() { - return ObxValue((data) { - return AnimatedContainer( - duration: Duration(milliseconds: 300), - padding: EdgeInsets.only(top: 5), - curve: Curves.easeInOut, - height: data.value ? 50 : 0, - child: Visibility( - visible: data.value, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: RTextField( - suffixIcon: Padding( - padding: const EdgeInsets.all(12.0), - child: Assets.vec.searchSvg.svg( - width: 10, - height: 10, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - hintText: 'جستجو', - onChanged: (value) { - controller.searchedValue.value = value; - }, - controller: TextEditingController(), - ), - ), - ), - ); - }, controller.searchIsSelected); - } + } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart index c61749a..c196c6c 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/widgets/search_widget.dart'; import 'package:rasadyar_core/core.dart'; import 'empty_widget.dart'; @@ -13,10 +14,22 @@ class BuyersPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - body: buyerListWidget(), + body: Column( + children: [ + searchWidget(controller.searchIsSelected, (data) { + controller.searchedValue.value = data; + controller.getOutProvinceCarcassesBuyer(); + }), + + buyerListWidget(), + ], + ), floatingActionButton: RFab.add( onPressed: () { - Get.bottomSheet(addOrEditBuyerBottomSheet(), isScrollControlled: true); + Get.bottomSheet( + addOrEditBuyerBottomSheet(), + isScrollControlled: true, + ); }, ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, @@ -36,7 +49,11 @@ class BuyersPage extends GetView { padding: EdgeInsets.fromLTRB(8, 8, 18, 80), itemBuilder: (context, index) { return ObxValue( - (expandList) => buyerListItem(expandList: expandList, index: index, item: data.value.data![index]), + (expandList) => buyerListItem( + expandList: expandList, + index: index, + item: data.value.data![index], + ), controller.isExpandedList, ); }, @@ -84,7 +101,10 @@ class BuyersPage extends GetView { decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), + border: Border.all( + width: 0.5, + color: AppColor.darkGreyNormal, + ), ), child: AnimatedCrossFade( alignment: Alignment.center, @@ -102,14 +122,18 @@ class BuyersPage extends GetView { Text( item.buyer?.fullname ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), ), SizedBox(height: 2), Text( item.buyer?.mobile ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), ), ], ), @@ -121,7 +145,9 @@ class BuyersPage extends GetView { child: Text( '${item.unitName}', textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + style: AppFonts.yekan12.copyWith( + color: AppColor.bgDark, + ), ), ), Expanded( @@ -129,7 +155,9 @@ class BuyersPage extends GetView { child: Text( '${item.buyer?.province}\n${item.buyer?.city}', textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDark), + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDark, + ), ), ), @@ -141,7 +169,10 @@ class BuyersPage extends GetView { secondChild: Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), child: Column( spacing: 8, children: [ @@ -151,23 +182,29 @@ class BuyersPage extends GetView { GestureDetector( onTap: () { controller.setEditData(item); - Get.bottomSheet(addOrEditBuyerBottomSheet(true), isScrollControlled: true).whenComplete( - () { - controller.resetSubmitForm(); - }, - ); + Get.bottomSheet( + addOrEditBuyerBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); }, child: Assets.vec.editSvg.svg( width: 20, height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), ), ), Text( '${item.province}-${item.city}', textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, + ), ), SizedBox(), @@ -176,12 +213,20 @@ class BuyersPage extends GetView { buildRow('مشخصات خریدار', item.fullname ?? 'N/A'), buildRow('نام واحد', item.unitName ?? 'N/A'), - buildRow('تعداد درخواست ها', '${item.requestsInfo?.numberOfRequests.separatedByComma}'), - buildRow('وزن', '${item.requestsInfo?.totalWeight.separatedByComma}'), + buildRow( + 'تعداد درخواست ها', + '${item.requestsInfo?.numberOfRequests.separatedByComma}', + ), + buildRow( + 'وزن', + '${item.requestsInfo?.totalWeight.separatedByComma}', + ), ], ), ), - crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, + crossFadeState: expandList.contains(index) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, duration: Duration(milliseconds: 300), ), ), @@ -195,10 +240,16 @@ class BuyersPage extends GetView { decoration: BoxDecoration( color: AppColor.greenLightHover, borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + border: Border.all( + width: 0.50, + color: AppColor.greenDarkActive, + ), ), alignment: Alignment.center, - child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), ), ), ], @@ -218,7 +269,9 @@ class BuyersPage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), ), Flexible( @@ -227,7 +280,9 @@ class BuyersPage extends GetView { value, textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), ), ], @@ -246,7 +301,9 @@ class BuyersPage extends GetView { children: [ Text( isOnEdit ? 'ویرایش خریدار' : 'افزودن خریدار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), RTextField( diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart new file mode 100644 index 0000000..ca5518d --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +ObxValue searchWidget( + RxBool searchIsSelected, + void Function(String) onChanged, +) { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), + hintText: 'جستجو', + onChanged: onChanged, + controller: TextEditingController(), + ), + ), + ), + ); + }, searchIsSelected); +} From 701e8e0fbe98aa6db16f14702d8537970348fc76 Mon Sep 17 00:00:00 2001 From: MrM Date: Tue, 24 Jun 2025 16:59:23 +0330 Subject: [PATCH 136/256] feat : search and filter in buyer out of the province --- .../steward_free_sale_bar_request.dart | 20 + ...steward_free_sale_bar_request.freezed.dart | 166 ++++ .../steward_free_sale_bar_request.g.dart | 31 + .../steward_free_sale_bar.dart | 87 ++ .../steward_free_sale_bar.freezed.dart | 751 ++++++++++++++++++ .../steward_free_sale_bar.g.dart | 139 ++++ .../data/repositories/chicken_repository.dart | 99 ++- .../repositories/chicken_repository_imp.dart | 156 +++- .../pages/buys_out_of_province/view.dart | 2 - .../pages/sales_out_of_province/logic.dart | 241 +++++- .../{widgets => pages}/buyers_page.dart | 6 +- .../pages/sales_page.dart | 596 ++++++++++++++ .../pages/sales_out_of_province/view.dart | 13 +- .../widgets/empty_widget.dart | 6 +- .../lib/utils/network/safe_call_utils.dart | 2 +- packages/core/lib/utils/string_utils.dart | 2 +- 16 files changed, 2217 insertions(+), 100 deletions(-) create mode 100644 packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart create mode 100644 packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart create mode 100644 packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.g.dart create mode 100644 packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart create mode 100644 packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.g.dart rename packages/chicken/lib/presentation/pages/sales_out_of_province/{widgets => pages}/buyers_page.dart (98%) create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart diff --git a/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart new file mode 100644 index 0000000..dd99fab --- /dev/null +++ b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart @@ -0,0 +1,20 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'steward_free_sale_bar_request.freezed.dart'; +part 'steward_free_sale_bar_request.g.dart'; + +@freezed +abstract class StewardFreeSaleBarRequest with _$StewardFreeSaleBarRequest { + const factory StewardFreeSaleBarRequest({ + String? buyerKey, + int? numberOfCarcasses, + int? weightOfCarcasses, + String? date, + String? clearanceCode, + String? productKey, + String? key, + }) = _StewardFreeSaleBarRequest; + + factory StewardFreeSaleBarRequest.fromJson(Map json) => + _$StewardFreeSaleBarRequestFromJson(json); +} diff --git a/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart new file mode 100644 index 0000000..f91b780 --- /dev/null +++ b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart @@ -0,0 +1,166 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'steward_free_sale_bar_request.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$StewardFreeSaleBarRequest { + + String? get buyerKey; int? get numberOfCarcasses; int? get weightOfCarcasses; String? get date; String? get clearanceCode; String? get productKey; String? get key; +/// Create a copy of StewardFreeSaleBarRequest +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StewardFreeSaleBarRequestCopyWith get copyWith => _$StewardFreeSaleBarRequestCopyWithImpl(this as StewardFreeSaleBarRequest, _$identity); + + /// Serializes this StewardFreeSaleBarRequest to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardFreeSaleBarRequest&&(identical(other.buyerKey, buyerKey) || other.buyerKey == buyerKey)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.date, date) || other.date == date)&&(identical(other.clearanceCode, clearanceCode) || other.clearanceCode == clearanceCode)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.key, key) || other.key == key)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,buyerKey,numberOfCarcasses,weightOfCarcasses,date,clearanceCode,productKey,key); + +@override +String toString() { + return 'StewardFreeSaleBarRequest(buyerKey: $buyerKey, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, date: $date, clearanceCode: $clearanceCode, productKey: $productKey, key: $key)'; +} + + +} + +/// @nodoc +abstract mixin class $StewardFreeSaleBarRequestCopyWith<$Res> { + factory $StewardFreeSaleBarRequestCopyWith(StewardFreeSaleBarRequest value, $Res Function(StewardFreeSaleBarRequest) _then) = _$StewardFreeSaleBarRequestCopyWithImpl; +@useResult +$Res call({ + String? buyerKey, int? numberOfCarcasses, int? weightOfCarcasses, String? date, String? clearanceCode, String? productKey, String? key +}); + + + + +} +/// @nodoc +class _$StewardFreeSaleBarRequestCopyWithImpl<$Res> + implements $StewardFreeSaleBarRequestCopyWith<$Res> { + _$StewardFreeSaleBarRequestCopyWithImpl(this._self, this._then); + + final StewardFreeSaleBarRequest _self; + final $Res Function(StewardFreeSaleBarRequest) _then; + +/// Create a copy of StewardFreeSaleBarRequest +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? buyerKey = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? date = freezed,Object? clearanceCode = freezed,Object? productKey = freezed,Object? key = freezed,}) { + return _then(_self.copyWith( +buyerKey: freezed == buyerKey ? _self.buyerKey : buyerKey // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,clearanceCode: freezed == clearanceCode ? _self.clearanceCode : clearanceCode // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _StewardFreeSaleBarRequest implements StewardFreeSaleBarRequest { + const _StewardFreeSaleBarRequest({this.buyerKey, this.numberOfCarcasses, this.weightOfCarcasses, this.date, this.clearanceCode, this.productKey, this.key}); + factory _StewardFreeSaleBarRequest.fromJson(Map json) => _$StewardFreeSaleBarRequestFromJson(json); + +@override final String? buyerKey; +@override final int? numberOfCarcasses; +@override final int? weightOfCarcasses; +@override final String? date; +@override final String? clearanceCode; +@override final String? productKey; +@override final String? key; + +/// Create a copy of StewardFreeSaleBarRequest +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$StewardFreeSaleBarRequestCopyWith<_StewardFreeSaleBarRequest> get copyWith => __$StewardFreeSaleBarRequestCopyWithImpl<_StewardFreeSaleBarRequest>(this, _$identity); + +@override +Map toJson() { + return _$StewardFreeSaleBarRequestToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardFreeSaleBarRequest&&(identical(other.buyerKey, buyerKey) || other.buyerKey == buyerKey)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.date, date) || other.date == date)&&(identical(other.clearanceCode, clearanceCode) || other.clearanceCode == clearanceCode)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.key, key) || other.key == key)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,buyerKey,numberOfCarcasses,weightOfCarcasses,date,clearanceCode,productKey,key); + +@override +String toString() { + return 'StewardFreeSaleBarRequest(buyerKey: $buyerKey, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, date: $date, clearanceCode: $clearanceCode, productKey: $productKey, key: $key)'; +} + + +} + +/// @nodoc +abstract mixin class _$StewardFreeSaleBarRequestCopyWith<$Res> implements $StewardFreeSaleBarRequestCopyWith<$Res> { + factory _$StewardFreeSaleBarRequestCopyWith(_StewardFreeSaleBarRequest value, $Res Function(_StewardFreeSaleBarRequest) _then) = __$StewardFreeSaleBarRequestCopyWithImpl; +@override @useResult +$Res call({ + String? buyerKey, int? numberOfCarcasses, int? weightOfCarcasses, String? date, String? clearanceCode, String? productKey, String? key +}); + + + + +} +/// @nodoc +class __$StewardFreeSaleBarRequestCopyWithImpl<$Res> + implements _$StewardFreeSaleBarRequestCopyWith<$Res> { + __$StewardFreeSaleBarRequestCopyWithImpl(this._self, this._then); + + final _StewardFreeSaleBarRequest _self; + final $Res Function(_StewardFreeSaleBarRequest) _then; + +/// Create a copy of StewardFreeSaleBarRequest +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? buyerKey = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? date = freezed,Object? clearanceCode = freezed,Object? productKey = freezed,Object? key = freezed,}) { + return _then(_StewardFreeSaleBarRequest( +buyerKey: freezed == buyerKey ? _self.buyerKey : buyerKey // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,clearanceCode: freezed == clearanceCode ? _self.clearanceCode : clearanceCode // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.g.dart b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.g.dart new file mode 100644 index 0000000..51b2faf --- /dev/null +++ b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.g.dart @@ -0,0 +1,31 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'steward_free_sale_bar_request.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_StewardFreeSaleBarRequest _$StewardFreeSaleBarRequestFromJson( + Map json, +) => _StewardFreeSaleBarRequest( + buyerKey: json['buyer_key'] as String?, + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + date: json['date'] as String?, + clearanceCode: json['clearance_code'] as String?, + productKey: json['product_key'] as String?, + key: json['key'] as String?, +); + +Map _$StewardFreeSaleBarRequestToJson( + _StewardFreeSaleBarRequest instance, +) => { + 'buyer_key': instance.buyerKey, + 'number_of_carcasses': instance.numberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'date': instance.date, + 'clearance_code': instance.clearanceCode, + 'product_key': instance.productKey, + 'key': instance.key, +}; diff --git a/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart new file mode 100644 index 0000000..537a54e --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart @@ -0,0 +1,87 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'steward_free_sale_bar.freezed.dart'; +part 'steward_free_sale_bar.g.dart'; + +@freezed +abstract class StewardFreeSaleBar with _$StewardFreeSaleBar { + const factory StewardFreeSaleBar({ + int? id, + Buyer? buyer, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + String? buyerName, + String? buyerMobile, + String? province, + String? city, + String? driverName, + String? driverMobile, + String? typeCar, + String? pelak, + String? clearanceCode, + int? numberOfCarcasses, + double? weightOfCarcasses, + String? date, + bool? temporaryTrash, + bool? temporaryDeleted, + String? createdBy, + String? modifiedBy, + dynamic steward, + dynamic guild, + dynamic product, + }) = _StewardFreeSaleBar; + + factory StewardFreeSaleBar.fromJson(Map json) => + _$StewardFreeSaleBarFromJson(json); +} + +@freezed +abstract class Buyer with _$Buyer { + const factory Buyer({ + String? key, + String? fullname, + String? firstName, + String? lastName, + String? mobile, + String? unitName, + String? city, + String? province, + bool? active, + BuyerSteward? steward, + }) = _Buyer; + + factory Buyer.fromJson(Map json) => _$BuyerFromJson(json); +} + +@freezed +abstract class BuyerSteward with _$BuyerSteward { + const factory BuyerSteward({ + String? key, + String? guildsName, + BuyerStewardUser? user, + String? typeActivity, + String? areaActivity, + }) = _BuyerSteward; + + factory BuyerSteward.fromJson(Map json) => + _$BuyerStewardFromJson(json); +} + +@freezed +abstract class BuyerStewardUser with _$BuyerStewardUser { + const factory BuyerStewardUser({ + String? fullname, + String? firstName, + String? lastName, + String? mobile, + String? nationalId, + String? provinceName, + String? cityName, + String? password, + }) = _BuyerStewardUser; + + factory BuyerStewardUser.fromJson(Map json) => + _$BuyerStewardUserFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart new file mode 100644 index 0000000..dcc4fe1 --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart @@ -0,0 +1,751 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'steward_free_sale_bar.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$StewardFreeSaleBar { + + int? get id; Buyer? get buyer; String? get key; String? get createDate; String? get modifyDate; bool? get trash; String? get buyerName; String? get buyerMobile; String? get province; String? get city; String? get driverName; String? get driverMobile; String? get typeCar; String? get pelak; String? get clearanceCode; int? get numberOfCarcasses; double? get weightOfCarcasses; String? get date; bool? get temporaryTrash; bool? get temporaryDeleted; String? get createdBy; String? get modifiedBy; dynamic get steward; dynamic get guild; dynamic get product; +/// Create a copy of StewardFreeSaleBar +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StewardFreeSaleBarCopyWith get copyWith => _$StewardFreeSaleBarCopyWithImpl(this as StewardFreeSaleBar, _$identity); + + /// Serializes this StewardFreeSaleBar to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardFreeSaleBar&&(identical(other.id, id) || other.id == id)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.buyerName, buyerName) || other.buyerName == buyerName)&&(identical(other.buyerMobile, buyerMobile) || other.buyerMobile == buyerMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&(identical(other.typeCar, typeCar) || other.typeCar == typeCar)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.clearanceCode, clearanceCode) || other.clearanceCode == clearanceCode)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&const DeepCollectionEquality().equals(other.steward, steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&const DeepCollectionEquality().equals(other.product, product)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,buyer,key,createDate,modifyDate,trash,buyerName,buyerMobile,province,city,driverName,driverMobile,typeCar,pelak,clearanceCode,numberOfCarcasses,weightOfCarcasses,date,temporaryTrash,temporaryDeleted,createdBy,modifiedBy,const DeepCollectionEquality().hash(steward),const DeepCollectionEquality().hash(guild),const DeepCollectionEquality().hash(product)]); + +@override +String toString() { + return 'StewardFreeSaleBar(id: $id, buyer: $buyer, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, buyerName: $buyerName, buyerMobile: $buyerMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, typeCar: $typeCar, pelak: $pelak, clearanceCode: $clearanceCode, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, steward: $steward, guild: $guild, product: $product)'; +} + + +} + +/// @nodoc +abstract mixin class $StewardFreeSaleBarCopyWith<$Res> { + factory $StewardFreeSaleBarCopyWith(StewardFreeSaleBar value, $Res Function(StewardFreeSaleBar) _then) = _$StewardFreeSaleBarCopyWithImpl; +@useResult +$Res call({ + int? id, Buyer? buyer, String? key, String? createDate, String? modifyDate, bool? trash, String? buyerName, String? buyerMobile, String? province, String? city, String? driverName, String? driverMobile, String? typeCar, String? pelak, String? clearanceCode, int? numberOfCarcasses, double? weightOfCarcasses, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic steward, dynamic guild, dynamic product +}); + + +$BuyerCopyWith<$Res>? get buyer; + +} +/// @nodoc +class _$StewardFreeSaleBarCopyWithImpl<$Res> + implements $StewardFreeSaleBarCopyWith<$Res> { + _$StewardFreeSaleBarCopyWithImpl(this._self, this._then); + + final StewardFreeSaleBar _self; + final $Res Function(StewardFreeSaleBar) _then; + +/// Create a copy of StewardFreeSaleBar +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? buyer = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? buyerName = freezed,Object? buyerMobile = freezed,Object? province = freezed,Object? city = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? typeCar = freezed,Object? pelak = freezed,Object? clearanceCode = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? date = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,buyerName: freezed == buyerName ? _self.buyerName : buyerName // ignore: cast_nullable_to_non_nullable +as String?,buyerMobile: freezed == buyerMobile ? _self.buyerMobile : buyerMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable +as String?,typeCar: freezed == typeCar ? _self.typeCar : typeCar // ignore: cast_nullable_to_non_nullable +as String?,pelak: freezed == pelak ? _self.pelak : pelak // ignore: cast_nullable_to_non_nullable +as String?,clearanceCode: freezed == clearanceCode ? _self.clearanceCode : clearanceCode // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as dynamic,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} +/// Create a copy of StewardFreeSaleBar +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerCopyWith<$Res>? get buyer { + if (_self.buyer == null) { + return null; + } + + return $BuyerCopyWith<$Res>(_self.buyer!, (value) { + return _then(_self.copyWith(buyer: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _StewardFreeSaleBar implements StewardFreeSaleBar { + const _StewardFreeSaleBar({this.id, this.buyer, this.key, this.createDate, this.modifyDate, this.trash, this.buyerName, this.buyerMobile, this.province, this.city, this.driverName, this.driverMobile, this.typeCar, this.pelak, this.clearanceCode, this.numberOfCarcasses, this.weightOfCarcasses, this.date, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy, this.steward, this.guild, this.product}); + factory _StewardFreeSaleBar.fromJson(Map json) => _$StewardFreeSaleBarFromJson(json); + +@override final int? id; +@override final Buyer? buyer; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final String? buyerName; +@override final String? buyerMobile; +@override final String? province; +@override final String? city; +@override final String? driverName; +@override final String? driverMobile; +@override final String? typeCar; +@override final String? pelak; +@override final String? clearanceCode; +@override final int? numberOfCarcasses; +@override final double? weightOfCarcasses; +@override final String? date; +@override final bool? temporaryTrash; +@override final bool? temporaryDeleted; +@override final String? createdBy; +@override final String? modifiedBy; +@override final dynamic steward; +@override final dynamic guild; +@override final dynamic product; + +/// Create a copy of StewardFreeSaleBar +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$StewardFreeSaleBarCopyWith<_StewardFreeSaleBar> get copyWith => __$StewardFreeSaleBarCopyWithImpl<_StewardFreeSaleBar>(this, _$identity); + +@override +Map toJson() { + return _$StewardFreeSaleBarToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardFreeSaleBar&&(identical(other.id, id) || other.id == id)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.buyerName, buyerName) || other.buyerName == buyerName)&&(identical(other.buyerMobile, buyerMobile) || other.buyerMobile == buyerMobile)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.driverName, driverName) || other.driverName == driverName)&&(identical(other.driverMobile, driverMobile) || other.driverMobile == driverMobile)&&(identical(other.typeCar, typeCar) || other.typeCar == typeCar)&&(identical(other.pelak, pelak) || other.pelak == pelak)&&(identical(other.clearanceCode, clearanceCode) || other.clearanceCode == clearanceCode)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.date, date) || other.date == date)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&const DeepCollectionEquality().equals(other.steward, steward)&&const DeepCollectionEquality().equals(other.guild, guild)&&const DeepCollectionEquality().equals(other.product, product)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,buyer,key,createDate,modifyDate,trash,buyerName,buyerMobile,province,city,driverName,driverMobile,typeCar,pelak,clearanceCode,numberOfCarcasses,weightOfCarcasses,date,temporaryTrash,temporaryDeleted,createdBy,modifiedBy,const DeepCollectionEquality().hash(steward),const DeepCollectionEquality().hash(guild),const DeepCollectionEquality().hash(product)]); + +@override +String toString() { + return 'StewardFreeSaleBar(id: $id, buyer: $buyer, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, buyerName: $buyerName, buyerMobile: $buyerMobile, province: $province, city: $city, driverName: $driverName, driverMobile: $driverMobile, typeCar: $typeCar, pelak: $pelak, clearanceCode: $clearanceCode, numberOfCarcasses: $numberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, date: $date, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, steward: $steward, guild: $guild, product: $product)'; +} + + +} + +/// @nodoc +abstract mixin class _$StewardFreeSaleBarCopyWith<$Res> implements $StewardFreeSaleBarCopyWith<$Res> { + factory _$StewardFreeSaleBarCopyWith(_StewardFreeSaleBar value, $Res Function(_StewardFreeSaleBar) _then) = __$StewardFreeSaleBarCopyWithImpl; +@override @useResult +$Res call({ + int? id, Buyer? buyer, String? key, String? createDate, String? modifyDate, bool? trash, String? buyerName, String? buyerMobile, String? province, String? city, String? driverName, String? driverMobile, String? typeCar, String? pelak, String? clearanceCode, int? numberOfCarcasses, double? weightOfCarcasses, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic steward, dynamic guild, dynamic product +}); + + +@override $BuyerCopyWith<$Res>? get buyer; + +} +/// @nodoc +class __$StewardFreeSaleBarCopyWithImpl<$Res> + implements _$StewardFreeSaleBarCopyWith<$Res> { + __$StewardFreeSaleBarCopyWithImpl(this._self, this._then); + + final _StewardFreeSaleBar _self; + final $Res Function(_StewardFreeSaleBar) _then; + +/// Create a copy of StewardFreeSaleBar +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? buyer = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? buyerName = freezed,Object? buyerMobile = freezed,Object? province = freezed,Object? city = freezed,Object? driverName = freezed,Object? driverMobile = freezed,Object? typeCar = freezed,Object? pelak = freezed,Object? clearanceCode = freezed,Object? numberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? date = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? steward = freezed,Object? guild = freezed,Object? product = freezed,}) { + return _then(_StewardFreeSaleBar( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,buyerName: freezed == buyerName ? _self.buyerName : buyerName // ignore: cast_nullable_to_non_nullable +as String?,buyerMobile: freezed == buyerMobile ? _self.buyerMobile : buyerMobile // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,driverName: freezed == driverName ? _self.driverName : driverName // ignore: cast_nullable_to_non_nullable +as String?,driverMobile: freezed == driverMobile ? _self.driverMobile : driverMobile // ignore: cast_nullable_to_non_nullable +as String?,typeCar: freezed == typeCar ? _self.typeCar : typeCar // ignore: cast_nullable_to_non_nullable +as String?,pelak: freezed == pelak ? _self.pelak : pelak // ignore: cast_nullable_to_non_nullable +as String?,clearanceCode: freezed == clearanceCode ? _self.clearanceCode : clearanceCode // ignore: cast_nullable_to_non_nullable +as String?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as double?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as dynamic,guild: freezed == guild ? _self.guild : guild // ignore: cast_nullable_to_non_nullable +as dynamic,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as dynamic, + )); +} + +/// Create a copy of StewardFreeSaleBar +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerCopyWith<$Res>? get buyer { + if (_self.buyer == null) { + return null; + } + + return $BuyerCopyWith<$Res>(_self.buyer!, (value) { + return _then(_self.copyWith(buyer: value)); + }); +} +} + + +/// @nodoc +mixin _$Buyer { + + String? get key; String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get unitName; String? get city; String? get province; bool? get active; BuyerSteward? get steward; +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BuyerCopyWith get copyWith => _$BuyerCopyWithImpl(this as Buyer, _$identity); + + /// Serializes this Buyer to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Buyer&&(identical(other.key, key) || other.key == key)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.active, active) || other.active == active)&&(identical(other.steward, steward) || other.steward == steward)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,fullname,firstName,lastName,mobile,unitName,city,province,active,steward); + +@override +String toString() { + return 'Buyer(key: $key, fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, unitName: $unitName, city: $city, province: $province, active: $active, steward: $steward)'; +} + + +} + +/// @nodoc +abstract mixin class $BuyerCopyWith<$Res> { + factory $BuyerCopyWith(Buyer value, $Res Function(Buyer) _then) = _$BuyerCopyWithImpl; +@useResult +$Res call({ + String? key, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, BuyerSteward? steward +}); + + +$BuyerStewardCopyWith<$Res>? get steward; + +} +/// @nodoc +class _$BuyerCopyWithImpl<$Res> + implements $BuyerCopyWith<$Res> { + _$BuyerCopyWithImpl(this._self, this._then); + + final Buyer _self; + final $Res Function(Buyer) _then; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? unitName = freezed,Object? city = freezed,Object? province = freezed,Object? active = freezed,Object? steward = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as BuyerSteward?, + )); +} +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerStewardCopyWith<$Res>? get steward { + if (_self.steward == null) { + return null; + } + + return $BuyerStewardCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _Buyer implements Buyer { + const _Buyer({this.key, this.fullname, this.firstName, this.lastName, this.mobile, this.unitName, this.city, this.province, this.active, this.steward}); + factory _Buyer.fromJson(Map json) => _$BuyerFromJson(json); + +@override final String? key; +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final String? mobile; +@override final String? unitName; +@override final String? city; +@override final String? province; +@override final bool? active; +@override final BuyerSteward? steward; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$BuyerCopyWith<_Buyer> get copyWith => __$BuyerCopyWithImpl<_Buyer>(this, _$identity); + +@override +Map toJson() { + return _$BuyerToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Buyer&&(identical(other.key, key) || other.key == key)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.active, active) || other.active == active)&&(identical(other.steward, steward) || other.steward == steward)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,fullname,firstName,lastName,mobile,unitName,city,province,active,steward); + +@override +String toString() { + return 'Buyer(key: $key, fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, unitName: $unitName, city: $city, province: $province, active: $active, steward: $steward)'; +} + + +} + +/// @nodoc +abstract mixin class _$BuyerCopyWith<$Res> implements $BuyerCopyWith<$Res> { + factory _$BuyerCopyWith(_Buyer value, $Res Function(_Buyer) _then) = __$BuyerCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, BuyerSteward? steward +}); + + +@override $BuyerStewardCopyWith<$Res>? get steward; + +} +/// @nodoc +class __$BuyerCopyWithImpl<$Res> + implements _$BuyerCopyWith<$Res> { + __$BuyerCopyWithImpl(this._self, this._then); + + final _Buyer _self; + final $Res Function(_Buyer) _then; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? unitName = freezed,Object? city = freezed,Object? province = freezed,Object? active = freezed,Object? steward = freezed,}) { + return _then(_Buyer( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as BuyerSteward?, + )); +} + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerStewardCopyWith<$Res>? get steward { + if (_self.steward == null) { + return null; + } + + return $BuyerStewardCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); + }); +} +} + + +/// @nodoc +mixin _$BuyerSteward { + + String? get key; String? get guildsName; BuyerStewardUser? get user; String? get typeActivity; String? get areaActivity; +/// Create a copy of BuyerSteward +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BuyerStewardCopyWith get copyWith => _$BuyerStewardCopyWithImpl(this as BuyerSteward, _$identity); + + /// Serializes this BuyerSteward to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is BuyerSteward&&(identical(other.key, key) || other.key == key)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.user, user) || other.user == user)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,guildsName,user,typeActivity,areaActivity); + +@override +String toString() { + return 'BuyerSteward(key: $key, guildsName: $guildsName, user: $user, typeActivity: $typeActivity, areaActivity: $areaActivity)'; +} + + +} + +/// @nodoc +abstract mixin class $BuyerStewardCopyWith<$Res> { + factory $BuyerStewardCopyWith(BuyerSteward value, $Res Function(BuyerSteward) _then) = _$BuyerStewardCopyWithImpl; +@useResult +$Res call({ + String? key, String? guildsName, BuyerStewardUser? user, String? typeActivity, String? areaActivity +}); + + +$BuyerStewardUserCopyWith<$Res>? get user; + +} +/// @nodoc +class _$BuyerStewardCopyWithImpl<$Res> + implements $BuyerStewardCopyWith<$Res> { + _$BuyerStewardCopyWithImpl(this._self, this._then); + + final BuyerSteward _self; + final $Res Function(BuyerSteward) _then; + +/// Create a copy of BuyerSteward +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? guildsName = freezed,Object? user = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as BuyerStewardUser?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of BuyerSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerStewardUserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $BuyerStewardUserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _BuyerSteward implements BuyerSteward { + const _BuyerSteward({this.key, this.guildsName, this.user, this.typeActivity, this.areaActivity}); + factory _BuyerSteward.fromJson(Map json) => _$BuyerStewardFromJson(json); + +@override final String? key; +@override final String? guildsName; +@override final BuyerStewardUser? user; +@override final String? typeActivity; +@override final String? areaActivity; + +/// Create a copy of BuyerSteward +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$BuyerStewardCopyWith<_BuyerSteward> get copyWith => __$BuyerStewardCopyWithImpl<_BuyerSteward>(this, _$identity); + +@override +Map toJson() { + return _$BuyerStewardToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _BuyerSteward&&(identical(other.key, key) || other.key == key)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.user, user) || other.user == user)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,guildsName,user,typeActivity,areaActivity); + +@override +String toString() { + return 'BuyerSteward(key: $key, guildsName: $guildsName, user: $user, typeActivity: $typeActivity, areaActivity: $areaActivity)'; +} + + +} + +/// @nodoc +abstract mixin class _$BuyerStewardCopyWith<$Res> implements $BuyerStewardCopyWith<$Res> { + factory _$BuyerStewardCopyWith(_BuyerSteward value, $Res Function(_BuyerSteward) _then) = __$BuyerStewardCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? guildsName, BuyerStewardUser? user, String? typeActivity, String? areaActivity +}); + + +@override $BuyerStewardUserCopyWith<$Res>? get user; + +} +/// @nodoc +class __$BuyerStewardCopyWithImpl<$Res> + implements _$BuyerStewardCopyWith<$Res> { + __$BuyerStewardCopyWithImpl(this._self, this._then); + + final _BuyerSteward _self; + final $Res Function(_BuyerSteward) _then; + +/// Create a copy of BuyerSteward +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? guildsName = freezed,Object? user = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,}) { + return _then(_BuyerSteward( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as BuyerStewardUser?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of BuyerSteward +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerStewardUserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $BuyerStewardUserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +mixin _$BuyerStewardUser { + + String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get nationalId; String? get provinceName; String? get cityName; String? get password; +/// Create a copy of BuyerStewardUser +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BuyerStewardUserCopyWith get copyWith => _$BuyerStewardUserCopyWithImpl(this as BuyerStewardUser, _$identity); + + /// Serializes this BuyerStewardUser to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is BuyerStewardUser&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.password, password) || other.password == password)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,provinceName,cityName,password); + +@override +String toString() { + return 'BuyerStewardUser(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, provinceName: $provinceName, cityName: $cityName, password: $password)'; +} + + +} + +/// @nodoc +abstract mixin class $BuyerStewardUserCopyWith<$Res> { + factory $BuyerStewardUserCopyWith(BuyerStewardUser value, $Res Function(BuyerStewardUser) _then) = _$BuyerStewardUserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? provinceName, String? cityName, String? password +}); + + + + +} +/// @nodoc +class _$BuyerStewardUserCopyWithImpl<$Res> + implements $BuyerStewardUserCopyWith<$Res> { + _$BuyerStewardUserCopyWithImpl(this._self, this._then); + + final BuyerStewardUser _self; + final $Res Function(BuyerStewardUser) _then; + +/// Create a copy of BuyerStewardUser +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? provinceName = freezed,Object? cityName = freezed,Object? password = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _BuyerStewardUser implements BuyerStewardUser { + const _BuyerStewardUser({this.fullname, this.firstName, this.lastName, this.mobile, this.nationalId, this.provinceName, this.cityName, this.password}); + factory _BuyerStewardUser.fromJson(Map json) => _$BuyerStewardUserFromJson(json); + +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final String? mobile; +@override final String? nationalId; +@override final String? provinceName; +@override final String? cityName; +@override final String? password; + +/// Create a copy of BuyerStewardUser +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$BuyerStewardUserCopyWith<_BuyerStewardUser> get copyWith => __$BuyerStewardUserCopyWithImpl<_BuyerStewardUser>(this, _$identity); + +@override +Map toJson() { + return _$BuyerStewardUserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _BuyerStewardUser&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.password, password) || other.password == password)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,provinceName,cityName,password); + +@override +String toString() { + return 'BuyerStewardUser(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, provinceName: $provinceName, cityName: $cityName, password: $password)'; +} + + +} + +/// @nodoc +abstract mixin class _$BuyerStewardUserCopyWith<$Res> implements $BuyerStewardUserCopyWith<$Res> { + factory _$BuyerStewardUserCopyWith(_BuyerStewardUser value, $Res Function(_BuyerStewardUser) _then) = __$BuyerStewardUserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? provinceName, String? cityName, String? password +}); + + + + +} +/// @nodoc +class __$BuyerStewardUserCopyWithImpl<$Res> + implements _$BuyerStewardUserCopyWith<$Res> { + __$BuyerStewardUserCopyWithImpl(this._self, this._then); + + final _BuyerStewardUser _self; + final $Res Function(_BuyerStewardUser) _then; + +/// Create a copy of BuyerStewardUser +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? provinceName = freezed,Object? cityName = freezed,Object? password = freezed,}) { + return _then(_BuyerStewardUser( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.g.dart b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.g.dart new file mode 100644 index 0000000..e8feabc --- /dev/null +++ b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.g.dart @@ -0,0 +1,139 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'steward_free_sale_bar.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_StewardFreeSaleBar _$StewardFreeSaleBarFromJson(Map json) => + _StewardFreeSaleBar( + id: (json['id'] as num?)?.toInt(), + buyer: json['buyer'] == null + ? null + : Buyer.fromJson(json['buyer'] as Map), + key: json['key'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, + trash: json['trash'] as bool?, + buyerName: json['buyer_name'] as String?, + buyerMobile: json['buyer_mobile'] as String?, + province: json['province'] as String?, + city: json['city'] as String?, + driverName: json['driver_name'] as String?, + driverMobile: json['driver_mobile'] as String?, + typeCar: json['type_car'] as String?, + pelak: json['pelak'] as String?, + clearanceCode: json['clearance_code'] as String?, + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toDouble(), + date: json['date'] as String?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + createdBy: json['created_by'] as String?, + modifiedBy: json['modified_by'] as String?, + steward: json['steward'], + guild: json['guild'], + product: json['product'], + ); + +Map _$StewardFreeSaleBarToJson(_StewardFreeSaleBar instance) => + { + 'id': instance.id, + 'buyer': instance.buyer, + 'key': instance.key, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, + 'trash': instance.trash, + 'buyer_name': instance.buyerName, + 'buyer_mobile': instance.buyerMobile, + 'province': instance.province, + 'city': instance.city, + 'driver_name': instance.driverName, + 'driver_mobile': instance.driverMobile, + 'type_car': instance.typeCar, + 'pelak': instance.pelak, + 'clearance_code': instance.clearanceCode, + 'number_of_carcasses': instance.numberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'date': instance.date, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'steward': instance.steward, + 'guild': instance.guild, + 'product': instance.product, + }; + +_Buyer _$BuyerFromJson(Map json) => _Buyer( + key: json['key'] as String?, + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + mobile: json['mobile'] as String?, + unitName: json['unit_name'] as String?, + city: json['city'] as String?, + province: json['province'] as String?, + active: json['active'] as bool?, + steward: json['steward'] == null + ? null + : BuyerSteward.fromJson(json['steward'] as Map), +); + +Map _$BuyerToJson(_Buyer instance) => { + 'key': instance.key, + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'mobile': instance.mobile, + 'unit_name': instance.unitName, + 'city': instance.city, + 'province': instance.province, + 'active': instance.active, + 'steward': instance.steward, +}; + +_BuyerSteward _$BuyerStewardFromJson(Map json) => + _BuyerSteward( + key: json['key'] as String?, + guildsName: json['guilds_name'] as String?, + user: json['user'] == null + ? null + : BuyerStewardUser.fromJson(json['user'] as Map), + typeActivity: json['type_activity'] as String?, + areaActivity: json['area_activity'] as String?, + ); + +Map _$BuyerStewardToJson(_BuyerSteward instance) => + { + 'key': instance.key, + 'guilds_name': instance.guildsName, + 'user': instance.user, + 'type_activity': instance.typeActivity, + 'area_activity': instance.areaActivity, + }; + +_BuyerStewardUser _$BuyerStewardUserFromJson(Map json) => + _BuyerStewardUser( + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + mobile: json['mobile'] as String?, + nationalId: json['national_id'] as String?, + provinceName: json['province_name'] as String?, + cityName: json['city_name'] as String?, + password: json['password'] as String?, + ); + +Map _$BuyerStewardUserToJson(_BuyerStewardUser instance) => + { + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'mobile': instance.mobile, + 'national_id': instance.nationalId, + 'province_name': instance.provinceName, + 'city_name': instance.cityName, + 'password': instance.password, + }; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index a6c4e2b..a141760 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; @@ -13,38 +14,72 @@ import 'package:rasadyar_chicken/data/models/response/pagination_model/paginatio import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; -import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { Future?> getInventory({required String token}); - Future getKillHouseDistributionInfo({required String token}); + Future getKillHouseDistributionInfo({ + required String token, + }); - Future getGeneralBarInformation({required String token, Map? queryParameters}); + Future getGeneralBarInformation({ + required String token, + Map? queryParameters, + }); - Future getWaitingArrivals({required String token, int? page}); + Future getWaitingArrivals({ + required String token, + int? page, + }); - Future setSateForArrivals({required String token, required Map request}); + Future setSateForArrivals({ + required String token, + required Map request, + }); - Future getImportedLoadsModel({required String token, required int page}); + Future getImportedLoadsModel({ + required String token, + required int page, + }); - Future getAllocatedMade({required String token, required int page}); + Future getAllocatedMade({ + required String token, + required int page, + }); - Future confirmAllocation({required String token, required Map allocation}); + Future confirmAllocation({ + required String token, + required Map allocation, + }); - Future denyAllocation({required String token, required String allocationToken}); + Future denyAllocation({ + required String token, + required String allocationToken, + }); - Future confirmAllAllocation({required String token, required List allocationTokens}); + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }); Future?> getRolesProducts({required String token}); - Future?> getGuilds({required String token, required bool isFree}); + Future?> getGuilds({ + required String token, + required bool isFree, + }); Future getProfile({required String token}); - Future postSubmitStewardAllocation({required String token, required SubmitStewardAllocation request}); + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }); Future getStewardDashboard({ required String token, @@ -58,26 +93,50 @@ abstract class ChickenRepository { required String endDate, }); - Future?> getStewardPurchasesOutSideOfTheProvince({ + Future?> + getStewardPurchasesOutSideOfTheProvince({ required String token, Map? queryParameters, }); + Future createStewardPurchasesOutSideOfTheProvince({ + required String token, + required CreateStewardFreeBar body, + }); - Future createStewardPurchasesOutSideOfTheProvince({required String token, required CreateStewardFreeBar body}); + Future deleteStewardPurchasesOutSideOfTheProvince({ + required String token, + required String stewardFreeBarKey, + }); - Future deleteStewardPurchasesOutSideOfTheProvince({required String token, required String stewardFreeBarKey}); - - Future?> getOutProvinceCarcassesBuyer({ + Future?> + getOutProvinceCarcassesBuyer({ required String token, Map? queryParameters, }); - - Future createOutProvinceCarcassesBuyer({required String token, required OutProvinceCarcassesBuyer body}); - + Future createOutProvinceCarcassesBuyer({ + required String token, + required OutProvinceCarcassesBuyer body, + }); Future?> getProvince(); Future?> getCity({required String provinceName}); + + Future?> getStewardFreeSaleBar({ + required String token, + Map? queryParameters, + }); + + Future createOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }); + + Future updateOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }); + } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 2379751..88310be 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,4 +1,5 @@ import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; @@ -14,7 +15,9 @@ import 'package:rasadyar_chicken/data/models/response/pagination_model/paginatio import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; -import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; import 'package:rasadyar_core/core.dart'; import 'chicken_repository.dart'; @@ -29,14 +32,18 @@ class ChickenRepositoryImpl implements ChickenRepository { var res = await _httpClient.get( '/roles-products/?role=Steward', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), + fromJsonList: (json) => (json) + .map((item) => InventoryModel.fromJson(item as Map)) + .toList(), ); return res.data; } @override - Future getKillHouseDistributionInfo({required String token}) async { + Future getKillHouseDistributionInfo({ + required String token, + }) async { var res = await _httpClient.get( '/kill-house-distribution-info/?role=Steward', headers: {'Authorization': 'Bearer $token'}, @@ -61,7 +68,10 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getWaitingArrivals({required String token, int? page}) async { + Future getWaitingArrivals({ + required String token, + int? page, + }) async { var res = await _httpClient.get( '/steward-allocation/?search=filter&value=&role=Steward&page=${page ?? 1}&page_size=10&type=not_entered', headers: {'Authorization': 'Bearer $token'}, @@ -71,12 +81,22 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future setSateForArrivals({required String token, required Map request}) async { - await _httpClient.put('/steward-allocation/0/', headers: {'Authorization': 'Bearer $token'}, data: request); + Future setSateForArrivals({ + required String token, + required Map request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: request, + ); } @override - Future getImportedLoadsModel({required String token, required int page}) async { + Future getImportedLoadsModel({ + required String token, + required int page, + }) async { var res = await _httpClient.get( '/steward-allocation/?role=Steward&search=filter&page=$page&page_size=10&value=&type=entered', headers: {'Authorization': 'Bearer $token'}, @@ -86,7 +106,10 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getAllocatedMade({required String token, required int page}) async { + Future getAllocatedMade({ + required String token, + required int page, + }) async { var res = await _httpClient.get( '/steward-allocation/?search=filter&value=&role=Steward&page=$page&page_size=100', headers: {'Authorization': 'Bearer $token'}, @@ -96,7 +119,10 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future confirmAllocation({required String token, required Map allocation}) async { + Future confirmAllocation({ + required String token, + required Map allocation, + }) async { var res = await _httpClient.put( '/steward-allocation/0/', headers: {'Authorization': 'Bearer $token'}, @@ -105,7 +131,10 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future denyAllocation({required String token, required String allocationToken}) async { + Future denyAllocation({ + required String token, + required String allocationToken, + }) async { await _httpClient.delete( '/steward-allocation/0/?steward_allocation_key=$allocationToken', headers: {'Authorization': 'Bearer $token'}, @@ -113,7 +142,10 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future confirmAllAllocation({required String token, required List allocationTokens}) async { + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }) async { await _httpClient.put( '/steward-allocation/0/', headers: {'Authorization': 'Bearer $token'}, @@ -126,18 +158,25 @@ class ChickenRepositoryImpl implements ChickenRepository { var res = await _httpClient.get( '/roles-products/?role=Steward', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => json.map((item) => ProductModel.fromJson(item as Map)).toList(), + fromJsonList: (json) => json + .map((item) => ProductModel.fromJson(item as Map)) + .toList(), ); return res.data; } @override - Future?> getGuilds({required String token, required bool isFree}) async { + Future?> getGuilds({ + required String token, + required bool isFree, + }) async { var res = await _httpClient.get( '/guilds/?role=Steward&free=$isFree', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => json.map((item) => GuildModel.fromJson(item as Map)).toList(), + fromJsonList: (json) => json + .map((item) => GuildModel.fromJson(item as Map)) + .toList(), ); return res.data; } @@ -153,8 +192,15 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future postSubmitStewardAllocation({required String token, required SubmitStewardAllocation request}) async { - await _httpClient.post('/steward-allocation/', headers: {'Authorization': 'Bearer $token'}, data: request.toJson()); + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }) async { + await _httpClient.post( + '/steward-allocation/', + headers: {'Authorization': 'Bearer $token'}, + data: request.toJson(), + ); } @override @@ -186,7 +232,8 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future?> getStewardPurchasesOutSideOfTheProvince({ + Future?> + getStewardPurchasesOutSideOfTheProvince({ required String token, Map? queryParameters, }) async { @@ -203,11 +250,18 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future?> getCity({required String provinceName}) async { + Future?> getCity({ + required String provinceName, + }) async { var res = await _httpClient.get( '/iran_city/?', queryParameters: {'name': provinceName}, - fromJsonList: (json) => json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + fromJsonList: (json) => json + .map( + (item) => + IranProvinceCityModel.fromJson(item as Map), + ) + .toList(), ); return res.data; } @@ -216,7 +270,12 @@ class ChickenRepositoryImpl implements ChickenRepository { Future?> getProvince() async { var res = await _httpClient.get( '/iran_province/', - fromJsonList: (json) => json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + fromJsonList: (json) => json + .map( + (item) => + IranProvinceCityModel.fromJson(item as Map), + ) + .toList(), ); return res.data; } @@ -246,7 +305,8 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future?> getOutProvinceCarcassesBuyer({ + Future?> + getOutProvinceCarcassesBuyer({ required String token, Map? queryParameters, }) async { @@ -256,18 +316,68 @@ class ChickenRepositoryImpl implements ChickenRepository { headers: {'Authorization': 'Bearer $token'}, fromJson: (json) => PaginationModel.fromJson( json, - (json) => OutProvinceCarcassesBuyer.fromJson(json as Map), + (json) => + OutProvinceCarcassesBuyer.fromJson(json as Map), ), ); return res.data; } @override - Future createOutProvinceCarcassesBuyer({required String token, required OutProvinceCarcassesBuyer body}) async { + Future createOutProvinceCarcassesBuyer({ + required String token, + required OutProvinceCarcassesBuyer body, + }) async { await _httpClient.post( '/out-province-carcasses-buyer/', data: body.toJson()..removeWhere((key, value) => value == null), headers: {'Authorization': 'Bearer $token'}, ); } + + @override + Future?> getStewardFreeSaleBar({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward_free_sale_bar/?', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => StewardFreeSaleBar.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }) async { + await _httpClient.post( + '/steward_free_sale_bar/', + data: body.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future updateOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }) async { + await _httpClient.put( + '/steward_free_sale_bar/0/', + data: body.toJson() + ..removeWhere((key, value) => value == null) + ..addAll({ + 'carcassWeight': body.weightOfCarcasses, + 'carcassCount': body.numberOfCarcasses, + }), + headers: {'Authorization': 'Bearer $token'}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart index 99b878e..74aee1c 100644 --- a/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart @@ -468,8 +468,6 @@ class BuysOutOfProvincePage extends GetView { } Widget _productTypeWidget() { - tLog(controller.outOfTheProvinceLogic.rolesProductsModel); - iLog(controller.selectedProduct.value); return Obx(() { return OverlayDropdownWidget( items: controller.outOfTheProvinceLogic.rolesProductsModel, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index a3f15a0..e0c04d0 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,9 +1,11 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; @@ -12,16 +14,21 @@ class SalesOutOfProvinceLogic extends GetxController { RxInt currentIndex = 0.obs; RxBool isExpanded = false.obs; - RxBool isSubmitButtonEnabled = false.obs; + RxBool isBuyerSubmitButtonEnabled = false.obs; + RxBool isSaleSubmitButtonEnabled = false.obs; RxList isExpandedList = [].obs; RxBool searchIsSelected = false.obs; //TODO add this to Di ImagePicker imagePicker = ImagePicker(); - Rx>> buyerList = Resource>.loading().obs; + Rx>> buyerList = + Resource>.loading().obs; + Rx>> salesList = + Resource>.loading().obs; Rxn selectedProduct = Rxn(); + Rxn selectedBuyer = Rxn(); RxList cites = [].obs; Rxn selectedProvince = Rxn(); @@ -29,7 +36,8 @@ class SalesOutOfProvinceLogic extends GetxController { RootLogic get rootLogic => Get.find(); - OutOfProvinceLogic get outOfTheProvinceLogic => Get.find(); + OutOfProvinceLogic get outOfTheProvinceLogic => + Get.find(); GlobalKey formKey = GlobalKey(); TextEditingController buyerNameController = TextEditingController(); @@ -37,21 +45,39 @@ class SalesOutOfProvinceLogic extends GetxController { TextEditingController buyerPhoneController = TextEditingController(); TextEditingController buyerUnitNameController = TextEditingController(); - Rx fromDateFilter = Jalali.now().obs; - Rx toDateFilter = Jalali.now().obs; + //Sale + TextEditingController quarantineCodeController = TextEditingController(); + TextEditingController saleWeightController = TextEditingController(); + Rx saleDate = Jalali + .now() + .obs; + String? key; + + Rx fromDateFilter = Jalali + .now() + .obs; + Rx toDateFilter = Jalali + .now() + .obs; RxnString searchedValue = RxnString(); @override void onReady() { super.onReady(); getOutProvinceCarcassesBuyer(); + getOutProvinceSales(); + selectedProvince.listen((p0) => getCites()); tLog(selectedProduct.value); outOfTheProvinceLogic.rolesProductsModel.listen((lists) { selectedProduct.value = lists.first; }); setupListeners(); - debounce(searchedValue, (callback) => getOutProvinceCarcassesBuyer(), time: Duration(milliseconds: 2000)); + debounce( + searchedValue, + (callback) => getOutProvinceCarcassesBuyer(), + time: Duration(milliseconds: 2000), + ); ever(searchIsSelected, (data) { if (data == false) { searchedValue.value = null; @@ -74,22 +100,53 @@ class SalesOutOfProvinceLogic extends GetxController { Future getOutProvinceCarcassesBuyer() async { await safeCall( - call: () => rootLogic.chickenRepository.getOutProvinceCarcassesBuyer( - token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - pageSize: 10, - page: 1, - state: 'buyer-list', - search: 'filter', - role: 'Steward', - value: searchedValue.value ?? '', - ), - ), + call: () => + rootLogic.chickenRepository.getOutProvinceCarcassesBuyer( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 10, + page: 1, + state: 'buyer-list', + search: 'filter', + role: 'Steward', + value: searchedValue.value ?? '', + ), + ), onSuccess: (res) { if ((res?.count ?? 0) == 0) { buyerList.value = Resource>.empty(); } else { - buyerList.value = Resource>.success(res!.results!); + buyerList.value = Resource>.success( + res!.results!, + ); + } + }, + ); + } + + Future getOutProvinceSales() async { + await safeCall( + call: () => + rootLogic.chickenRepository.getStewardFreeSaleBar( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 10, + page: 1, + state: 'buyer-list', + search: 'filter', + role: 'Steward', + value: searchedValue.value ?? '', + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), + onSuccess: (res) { + if ((res?.count ?? 0) == 0) { + salesList.value = Resource>.empty(); + } else { + salesList.value = Resource>.success( + res!.results!, + ); } }, ); @@ -97,7 +154,10 @@ class SalesOutOfProvinceLogic extends GetxController { Future getCites() async { await safeCall( - call: () => rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), + call: () => + rootLogic.chickenRepository.getCity( + provinceName: selectedProvince.value?.name ?? '', + ), onSuccess: (result) { if (result != null && result.isNotEmpty) { cites.value = result; @@ -107,25 +167,44 @@ class SalesOutOfProvinceLogic extends GetxController { } void setupListeners() { - buyerNameController.addListener(checkFormValid); - buyerLastNameController.addListener(checkFormValid); - buyerPhoneController.addListener(checkFormValid); - buyerUnitNameController.addListener(checkFormValid); + //buyer form listeners + buyerNameController.addListener(checkBuyerFormValid); + buyerLastNameController.addListener(checkBuyerFormValid); + buyerPhoneController.addListener(checkBuyerFormValid); + buyerUnitNameController.addListener(checkBuyerFormValid); - ever(selectedProvince, (_) => checkFormValid()); - ever(selectedCity, (_) => checkFormValid()); - ever(selectedProduct, (_) => checkFormValid()); + ever(selectedProvince, (_) => checkBuyerFormValid()); + ever(selectedCity, (_) => checkBuyerFormValid()); + ever(selectedProduct, (_) => checkBuyerFormValid()); + + //sales form listeners + saleWeightController.addListener(checkSalesFormValid); + quarantineCodeController.addListener(checkSalesFormValid); + ever(selectedBuyer, (_) => checkSalesFormValid); + ever(selectedProduct, (_) => checkSalesFormValid); + ever(saleDate, (_) => checkSalesFormValid()); } - void checkFormValid() { - isSubmitButtonEnabled.value = + void checkBuyerFormValid() { + isBuyerSubmitButtonEnabled.value = buyerNameController.text.isNotEmpty && - buyerLastNameController.text.isNotEmpty && - buyerPhoneController.text.isNotEmpty && - buyerUnitNameController.text.isNotEmpty && - selectedProvince.value != null && - selectedCity.value != null && - selectedProduct.value != null; + buyerLastNameController.text.isNotEmpty && + buyerPhoneController.text.isNotEmpty && + buyerUnitNameController.text.isNotEmpty && + selectedProvince.value != null && + selectedCity.value != null && + selectedProduct.value != null; + } + + void checkSalesFormValid() { + isSaleSubmitButtonEnabled.value = + saleDate.value + .toString() + .isNotEmpty && + selectedProduct.value != null && + selectedBuyer.value != null && + saleWeightController.text.isNotEmpty && + quarantineCodeController.text.isNotEmpty; } Future createBuyer() async { @@ -144,7 +223,8 @@ class SalesOutOfProvinceLogic extends GetxController { mobile: buyerPhoneController.text, role: 'Steward', ); - final res = await rootLogic.chickenRepository.createOutProvinceCarcassesBuyer( + final res = await rootLogic.chickenRepository + .createOutProvinceCarcassesBuyer( token: rootLogic.tokenService.accessToken.value!, body: buyer, ); @@ -166,26 +246,101 @@ class SalesOutOfProvinceLogic extends GetxController { selectedProvince.value = null; selectedCity.value = null; selectedProduct.value = null; - - isSubmitButtonEnabled.value = false; + key = null; + isBuyerSubmitButtonEnabled.value = false; } - void setEditData(OutProvinceCarcassesBuyer item) { + void setEditDataBuyer(OutProvinceCarcassesBuyer item) { buyerNameController.text = item.firstName ?? ''; buyerLastNameController.text = item.lastName ?? ''; buyerUnitNameController.text = item.unitName ?? ''; buyerPhoneController.text = item.mobile ?? ''; selectedProvince.value = IranProvinceCityModel(name: item.province); selectedCity.value = IranProvinceCityModel(name: item.city); - isSubmitButtonEnabled.value = true; + isBuyerSubmitButtonEnabled.value = true; + } + + void setEditDataSales(StewardFreeSaleBar item) { + quarantineCodeController.text = item.clearanceCode ?? ''; + saleWeightController.text = + item.weightOfCarcasses?.toInt().toString() ?? ''; + saleDate.value = Jalali.fromDateTime(DateTime.parse(item.date!)); + selectedCity.value = IranProvinceCityModel(name: item.city); + selectedBuyer.value = buyerList.value.data?.firstWhere( + (element) => element.key == item.buyer?.key, + ); + selectedProduct.value = + outOfTheProvinceLogic.rolesProductsModel.value.first; + key = item.key; + isSaleSubmitButtonEnabled.value = true; } Future deleteStewardPurchaseOutOfProvince(String key) async { await safeCall( - call: () => rootLogic.chickenRepository.deleteStewardPurchasesOutSideOfTheProvince( - token: rootLogic.tokenService.accessToken.value!, - stewardFreeBarKey: key, - ), + call: () => + rootLogic.chickenRepository + .deleteStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + stewardFreeBarKey: key, + ), ); } + + Future createSale() async { + bool res = false; + StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( + buyerKey: selectedBuyer.value?.key, + numberOfCarcasses: 0, + weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), + date: saleDate.value + .toDateTime() + .formattedDashedGregorian, + clearanceCode: quarantineCodeController.text, + productKey: selectedProduct.value?.key, + ); + await safeCall( + call: () => + rootLogic.chickenRepository.createOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), + onSuccess: (_) { + res = true; + }, + ); + return res; + } + + void clearSaleForm() { + quarantineCodeController.clear(); + saleWeightController.clear(); + saleDate.value = Jalali.now(); + selectedBuyer.value = null; + selectedProduct.value = null; + isBuyerSubmitButtonEnabled.value = false; + } + + Future editSale() async { + bool res = false; + StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( + numberOfCarcasses: 0, + weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), + date: saleDate.value + .toDateTime() + .formattedDashedGregorian, + clearanceCode: quarantineCodeController.text, + key:key + ); + await safeCall( + call: () => + rootLogic.chickenRepository.updateOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), + onSuccess: (_) { + res = true; + }, + ); + return res; + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart similarity index 98% rename from packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart rename to packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart index c196c6c..b2ca1df 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/buyers_page.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic. import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/widgets/search_widget.dart'; import 'package:rasadyar_core/core.dart'; -import 'empty_widget.dart'; +import '../widgets/empty_widget.dart'; class BuyersPage extends GetView { const BuyersPage({super.key}); @@ -181,7 +181,7 @@ class BuyersPage extends GetView { children: [ GestureDetector( onTap: () { - controller.setEditData(item); + controller.setEditDataBuyer(item); Get.bottomSheet( addOrEditBuyerBottomSheet(true), isScrollControlled: true, @@ -368,7 +368,7 @@ class BuyersPage extends GetView { : null, height: 40, ); - }, controller.isSubmitButtonEnabled); + }, controller.isBuyerSubmitButtonEnabled); } Widget _provinceWidget() { diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart new file mode 100644 index 0000000..8f4046b --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart @@ -0,0 +1,596 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/widgets/empty_widget.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../widgets/search_widget.dart'; + +class SalesPage extends GetView { + const SalesPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + searchWidget(controller.searchIsSelected, (data) { + controller.searchedValue.value = data; + + //TODO: Implement search functionality + controller.getOutProvinceSales(); + }), + + salesListWidget(), + ], + ), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); + }, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + Widget salesListWidget() { + return ObxValue((data) { + switch (data.value.status) { + case Status.initial: + case Status.loading: + return Center(child: CupertinoActivityIndicator()); + case Status.success: + return ListView.separated( + shrinkWrap: true, + physics: BouncingScrollPhysics(), + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) { + return ObxValue( + (expandList) => salesListItem( + expandList: expandList, + index: index, + item: data.value.data![index], + ), + controller.isExpandedList, + ); + }, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemCount: data.value.data?.length ?? 0, + ); + case Status.error: + return Center( + child: Text( + data.value.message ?? 'خطا در دریافت اطلاعات', + style: AppFonts.yekan16.copyWith(color: AppColor.error), + ), + ); + case Status.empty: + return emptyWidget(); + } + }, controller.salesList); + } + + GestureDetector salesListItem({ + required RxList expandList, + required int index, + required StewardFreeSaleBar item, + }) { + return GestureDetector( + onTap: () { + if (expandList.contains(index)) { + controller.isExpandedList.remove(index); + } else { + controller.isExpandedList.add(index); + } + }, + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 0.5, + color: AppColor.darkGreyNormal, + ), + ), + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + Expanded( + flex: 3, + child: Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.bgDark, + ), + ), + ), + SizedBox(width: 4), + Expanded( + flex: 5, + child: Column( + children: [ + Text( + item.buyer?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + + SizedBox(height: 2), + Text( + item.buyer?.mobile ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), + ), + ], + ), + ), + SizedBox(width: 4), + Expanded( + flex: 4, + child: Column( + spacing: 8, + children: [ + Text( + item.buyer?.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.bgDark, + ), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma ?? 0}KG', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.bgDark, + ), + ), + ], + ), + ), + Expanded( + flex: 2, + child: Text( + '${item.buyer?.province}\n${item.buyer?.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.bgDark, + ), + ), + ), + SizedBox(width: 8), + Icon(CupertinoIcons.chevron_down, size: 12), + SizedBox(width: 8), + ], + ), + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + controller.setEditDataSales(item); + Get.bottomSheet( + addOrEditSaleBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), + + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, + ), + ), + + GestureDetector( + onTap: () { + buildDeleteDialog( + onConfirm: () => controller + .deleteStewardPurchaseOutOfProvince( + item.key!, + ), + ); + }, + child: Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), + ), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: AppColor.blueLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow( + 'تاریخ', + item.date?.formattedJalaliDateYHMS ?? 'N/A', + ), + ), + buildRow( + 'مشخصات خریدار', + item.buyer?.fullname ?? 'N/A', + ), + buildRow('تلفن خریدار', item.buyer?.mobile ?? 'N/A'), + buildRow('نام واحد', item.buyer?.unitName ?? 'N/A'), + buildRow( + 'وزن لاشه', + '${item.weightOfCarcasses?.separatedByComma}', + ), + ], + ), + ), + crossFadeState: expandList.contains(index) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + ), + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all( + width: 0.50, + color: AppColor.greenDarkActive, + ), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ); + } + + Widget buildRow(String title, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ), + ], + ), + ); + } + + Widget addOrEditSaleBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + height: 600, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش فروش' : 'افزودن فروش', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + _productWidget(), + _buyerWidget(), + RTextField( + controller: controller.saleWeightController, + label: 'وزن لاشه', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + + validator: (value) { + if (value == null) { + return 'لطفاً وزن لاشه را وارد کنید'; + } + return null; + }, + ), + RTextField( + controller: controller.quarantineCodeController, + label: 'کد قرنطینه', + borderColor: AppColor.darkGreyLight, + validator: (value) { + if (value == null) { + return 'لطفاً کد قرنطینه را وارد کنید'; + } + return null; + }, + ), + + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.saleDate, + onChanged: (jalali) => controller.saleDate.value = jalali, + ), + ), + ], + ), + + submitButtonWidget(isOnEdit), + SizedBox(), + ], + ), + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + text: isOnEdit ? 'ویرایش' : 'ثبت', + onPressed: data.value + ? () async { + var res = isOnEdit + ? await controller.editSale() + : await controller.createSale(); + if (res) { + controller.getOutProvinceSales(); + controller.clearSaleForm(); + Get.back(); + } + } + : null, + height: 40, + ); + }, controller.isSaleSubmitButtonEnabled); + } + + Widget _buyerWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.buyerList.value.data ?? [], + onChanged: (value) { + controller.selectedBuyer.value = value; + }, + selectedItem: controller.selectedBuyer.value, + itemBuilder: (item) => Text(item.buyer?.fullname ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.buyer?.fullname ?? 'انتخاب خریدار'), + ); + }); + } + + Widget _productWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: controller.outOfTheProvinceLogic.rolesProductsModel, + onChanged: (value) { + controller.selectedProduct.value = value; + }, + selectedItem: controller.selectedProduct.value, + initialValue: controller.selectedProduct.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + ); + }, controller.selectedProduct); + } + + GestureDetector timeFilterWidget({ + isFrom = true, + required Rx date, + required Function(Jalali jalali) onChanged, + }) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.bgDark), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + AppColor.bgDark, + BlendMode.srcIn, + ), + ), + Text( + 'تاریخ', + style: AppFonts.yekan16.copyWith(color: AppColor.bgDark), + ), + Expanded( + child: ObxValue((data) { + return Text( + date.value.formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDark, + ), + ); + }, date), + ), + ], + ), + ), + ); + } + + Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'تایید', + ), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', + ), + SizedBox(width: 20), + ], + ), + ), + Divider(height: 0, thickness: 1), + Expanded( + child: Container( + child: PersianCupertinoDatePicker( + initialDateTime: controller.saleDate.value, + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, + ), + ), + ), + ], + ), + ); + } + + Future buildDeleteDialog({ + required Future Function() onConfirm, + }) async { + await Get.defaultDialog( + title: 'حذف', + middleText: 'آیا از حذف این مورد مطمئن هستید؟', + confirm: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.error, + foregroundColor: Colors.white, + ), + onPressed: () async { + await onConfirm(); + Get.back(); + }, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ).whenComplete(() => controller.getOutProvinceSales()); + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 8ce5813..1caaf43 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -5,7 +5,8 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/widgets/buyers_page.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/pages/buyers_page.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/pages/sales_page.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -56,7 +57,7 @@ class SalesOutOfProvincePage extends GetView { visible: controller.currentIndex.value==0, child: GestureDetector( onTap: () { - // Get.bottomSheet(filterBottomSheet()); + Get.bottomSheet(filterBottomSheet()); }, child: Assets.vec.filterOutlineSvg.svg( width: 20, @@ -98,7 +99,7 @@ class SalesOutOfProvincePage extends GetView { Expanded( child: TabBarView( children: [ - salePage(), + SalesPage(), BuyersPage() ], ), @@ -668,6 +669,8 @@ class SalesOutOfProvincePage extends GetView { ).whenComplete(() => controller.getStewardPurchaseOutOfProvince()); } +*/ + Widget filterBottomSheet() { return BaseBottomSheet( height: 250, @@ -697,7 +700,7 @@ class SalesOutOfProvincePage extends GetView { RElevated( text: 'اعمال فیلتر', onPressed: () { - controller.getStewardPurchaseOutOfProvince(); + controller.getOutProvinceSales(); Get.back(); }, height: 40, @@ -706,7 +709,7 @@ class SalesOutOfProvincePage extends GetView { ], ), ); - }*/ + } GestureDetector timeFilterWidget({ isFrom = true, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart index 4c7c6a9..d02076d 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart @@ -2,7 +2,9 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; Widget emptyWidget() { - return Center( - child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), + return Expanded( + child: Center( + child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), + ), ); } diff --git a/packages/core/lib/utils/network/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart index 3b52161..7f51264 100644 --- a/packages/core/lib/utils/network/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -28,7 +28,7 @@ class ApiHandler { } typedef AppAsyncCallback = Future Function(); -typedef ErrorCallback = void Function(dynamic error, StackTrace? stackTrace); +typedef ErrorCallback = Function(dynamic error, StackTrace? stackTrace); typedef VoidCallback = void Function(); /// this is global safe call function diff --git a/packages/core/lib/utils/string_utils.dart b/packages/core/lib/utils/string_utils.dart index 278e287..36f527b 100644 --- a/packages/core/lib/utils/string_utils.dart +++ b/packages/core/lib/utils/string_utils.dart @@ -1,7 +1,7 @@ import 'package:intl/intl.dart'; extension XString on String { - get separatedByComma { + String get separatedByComma { final formatter = NumberFormat('#,###'); return formatter.format(this); } From 751d48c02e8de344ec6e85dde6dee3d30e292dfd Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 27 Jun 2025 18:08:53 +0330 Subject: [PATCH 137/256] feat : sale in the province --- .../allocated_made/allocated_made.dart | 245 ++-- .../allocated_made.freezed.dart | 1122 +++++++---------- .../allocated_made/allocated_made.g.dart | 436 +++---- .../data/repositories/chicken_repository.dart | 6 +- .../repositories/chicken_repository_imp.dart | 18 +- .../entering_the_warehouse/string_utils.dart | 10 +- .../pages/out_of_province/logic.dart | 15 +- .../lib/presentation/pages/root/logic.dart | 3 +- .../pages/sales_in_province/logic.dart | 33 +- .../pages/sales_in_province/view.dart | 1035 +++++++++------ .../pages/sales_out_of_province/view.dart | 502 -------- packages/core/lib/utils/map_utils.dart | 5 +- packages/core/lib/utils/string_utils.dart | 8 +- 13 files changed, 1542 insertions(+), 1896 deletions(-) diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart index 78f4f6c..a01d1ed 100644 --- a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart @@ -6,84 +6,71 @@ part 'allocated_made.g.dart'; @freezed abstract class AllocatedMadeModel with _$AllocatedMadeModel { factory AllocatedMadeModel({ - int? count, - String? next, - String? previous, - List? results, + int? id, + Product? product, + dynamic killHouse, + dynamic toKillHouse, + Steward? steward, + dynamic toSteward, + dynamic guilds, + Steward? toGuilds, + dynamic toColdHouse, + int? indexWeight, + int? dateTimestamp, + int? newState, + int? newReceiverState, + int? newAllocationState, + String? key, + String? createDate, + String? modifyDate, + bool? trash, + int? numberOfCarcasses, + int? realNumberOfCarcasses, + int? receiverRealNumberOfCarcasses, + int? weightOfCarcasses, + int? realWeightOfCarcasses, + int? receiverRealWeightOfCarcasses, + int? weightLossOfCarcasses, + bool? finalRegistration, + String? sellType, + String? productName, + String? sellerType, + String? type, + String? saleType, + String? allocationType, + bool? systemRegistrationCode, + int? registrationCode, + int? amount, + int? totalAmount, + int? totalAmountPaid, + int? totalAmountRemain, + String? loggedRegistrationCode, + String? state, + String? receiverState, + String? allocationState, + String? date, + String? role, + String? stewardTempKey, + bool? approvedPriceStatus, + bool? calculateStatus, + bool? temporaryTrash, + bool? temporaryDeleted, + String? createdBy, + String? modifiedBy, + dynamic wareHouse, + dynamic stewardWareHouse, + dynamic car, + dynamic dispenser, }) = _AllocatedMadeModel; factory AllocatedMadeModel.fromJson(Map json) => _$AllocatedMadeModelFromJson(json); } -@freezed -abstract class AllocatedMadeResult with _$AllocatedMadeResult { - factory AllocatedMadeResult({ - int? id, - Product? product, - dynamic kill_house, - dynamic to_kill_house, - Steward? steward, - dynamic to_steward, - dynamic guilds, - Steward? to_guilds, - dynamic to_cold_house, - int? index_weight, - int? date_timestamp, - int? new_state, - int? new_receiver_state, - int? new_allocation_state, - String? key, - String? create_date, - String? modify_date, - bool? trash, - int? number_of_carcasses, - int? real_number_of_carcasses, - int? receiver_real_number_of_carcasses, - int? weight_of_carcasses, - int? real_weight_of_carcasses, - int? receiver_real_weight_of_carcasses, - int? weight_loss_of_carcasses, - bool? final_registration, - String? sell_type, - String? product_name, - String? seller_type, - String? type, - String? sale_type, - String? allocation_type, - bool? system_registration_code, - int? registration_code, - int? amount, - int? total_amount, - int? total_amount_paid, - int? total_amount_remain, - String? logged_registration_code, - String? state, - String? receiver_state, - String? allocation_state, - String? date, - String? role, - String? steward_temp_key, - bool? approved_price_status, - bool? calculate_status, - bool? temporary_trash, - bool? temporary_deleted, - String? created_by, - String? modified_by, - dynamic ware_house, - dynamic steward_ware_house, - dynamic car, - dynamic dispenser, - }) = _AllocatedMadeResult; - - factory AllocatedMadeResult.fromJson(Map json) => - _$AllocatedMadeResultFromJson(json); -} - @freezed abstract class Product with _$Product { factory Product({ - int? weight_average, + int? weightAverage, }) = _Product; factory Product.fromJson(Map json) => @@ -96,68 +83,68 @@ abstract class Steward with _$Steward { int? id, User? user, Address? address, - Activity? guild_area_activity, - Activity? guild_type_activity, - List? kill_house, - List? steward_kill_house, + Activity? guildAreaActivity, + Activity? guildTypeActivity, + List? killHouse, + List? stewardKillHouse, List? stewards, - PosStatus? get_pos_status, + PosStatus? getPosStatus, String? key, - String? create_date, - String? modify_date, + String? createDate, + String? modifyDate, bool? trash, - dynamic user_id_foreign_key, - dynamic address_id_foreign_key, - dynamic user_bank_id_foreign_key, - dynamic wallet_id_foreign_key, - dynamic provincial_government_id_key, - dynamic identity_documents, + dynamic userIdForeignKey, + dynamic addressIdForeignKey, + dynamic userBankIdForeignKey, + dynamic walletIdForeignKey, + dynamic provincialGovernmentIdKey, + dynamic identityDocuments, bool? active, - int? city_number, - String? city_name, - String? guilds_id, - String? license_number, - String? guilds_name, + int? cityNumber, + String? cityName, + String? guildsId, + String? licenseNumber, + String? guildsName, String? phone, - String? type_activity, - String? area_activity, - int? province_number, - String? province_name, + String? typeActivity, + String? areaActivity, + int? provinceNumber, + String? provinceName, bool? steward, - bool? has_pos, - dynamic centers_allocation, - dynamic kill_house_centers_allocation, - dynamic allocation_limit, - bool? limitation_allocation, - String? registerar_role, - String? registerar_fullname, - String? registerar_mobile, - bool? kill_house_register, - bool? steward_register, - bool? guilds_room_register, - bool? pos_company_register, - String? province_accept_state, - String? province_message, + bool? hasPos, + dynamic centersAllocation, + dynamic killHouseCentersAllocation, + dynamic allocationLimit, + bool? limitationAllocation, + String? registerarRole, + String? registerarFullname, + String? registerarMobile, + bool? killHouseRegister, + bool? stewardRegister, + bool? guildsRoomRegister, + bool? posCompanyRegister, + String? provinceAcceptState, + String? provinceMessage, String? condition, - String? description_condition, - bool? steward_active, - dynamic steward_allocation_limit, - bool? steward_limitation_allocation, + String? descriptionCondition, + bool? stewardActive, + dynamic stewardAllocationLimit, + bool? stewardLimitationAllocation, bool? license, - dynamic license_form, - dynamic license_file, - String? reviewer_role, - String? reviewer_fullname, - String? reviewer_mobile, - String? checker_message, - bool? final_accept, - bool? temporary_registration, - String? created_by, - String? modified_by, - dynamic user_bank_info, + dynamic licenseForm, + dynamic licenseFile, + String? reviewerRole, + String? reviewerFullname, + String? reviewerMobile, + String? checkerMessage, + bool? finalAccept, + bool? temporaryRegistration, + String? createdBy, + String? modifiedBy, + dynamic userBankInfo, int? wallet, List? cars, - List? user_level, + List? userLevel, }) = _Steward; factory Steward.fromJson(Map json) => @@ -168,10 +155,10 @@ abstract class Steward with _$Steward { abstract class User with _$User { factory User({ String? fullname, - String? first_name, - String? last_name, + String? firstName, + String? lastName, String? mobile, - String? national_id, + String? nationalId, String? city, }) = _User; @@ -185,7 +172,7 @@ abstract class Address with _$Address { Province? province, Province? city, String? address, - String? postal_code, + String? postalCode, }) = _Address; factory Address.fromJson(Map json) => @@ -217,11 +204,11 @@ abstract class Activity with _$Activity { @freezed abstract class PosStatus with _$PosStatus { factory PosStatus({ - int? len_active_sessions, - bool? has_pons, - bool? has_active_pons, + int? lenActiveSessions, + bool? hasPons, + bool? hasActivePons, }) = _PosStatus; factory PosStatus.fromJson(Map json) => _$PosStatusFromJson(json); -} +} \ No newline at end of file diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart index 72b6981..2a19a6d 100644 --- a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$AllocatedMadeModel { - int? get count; String? get next; String? get previous; List? get results; + int? get id; Product? get product; dynamic get killHouse; dynamic get toKillHouse; Steward? get steward; dynamic get toSteward; dynamic get guilds; Steward? get toGuilds; dynamic get toColdHouse; int? get indexWeight; int? get dateTimestamp; int? get newState; int? get newReceiverState; int? get newAllocationState; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get numberOfCarcasses; int? get realNumberOfCarcasses; int? get receiverRealNumberOfCarcasses; int? get weightOfCarcasses; int? get realWeightOfCarcasses; int? get receiverRealWeightOfCarcasses; int? get weightLossOfCarcasses; bool? get finalRegistration; String? get sellType; String? get productName; String? get sellerType; String? get type; String? get saleType; String? get allocationType; bool? get systemRegistrationCode; int? get registrationCode; int? get amount; int? get totalAmount; int? get totalAmountPaid; int? get totalAmountRemain; String? get loggedRegistrationCode; String? get state; String? get receiverState; String? get allocationState; String? get date; String? get role; String? get stewardTempKey; bool? get approvedPriceStatus; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; String? get createdBy; String? get modifiedBy; dynamic get wareHouse; dynamic get stewardWareHouse; dynamic get car; dynamic get dispenser; /// Create a copy of AllocatedMadeModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $AllocatedMadeModelCopyWith get copyWith => _$AllocatedMadeM @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is AllocatedMadeModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is AllocatedMadeModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.toSteward, toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&(identical(other.toGuilds, toGuilds) || other.toGuilds == toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&(identical(other.loggedRegistrationCode, loggedRegistrationCode) || other.loggedRegistrationCode == loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.stewardTempKey, stewardTempKey) || other.stewardTempKey == stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); +int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(toKillHouse),steward,const DeepCollectionEquality().hash(toSteward),const DeepCollectionEquality().hash(guilds),toGuilds,const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,loggedRegistrationCode,state,receiverState,allocationState,date,role,stewardTempKey,approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,createdBy,modifiedBy,const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); @override String toString() { - return 'AllocatedMadeModel(count: $count, next: $next, previous: $previous, results: $results)'; + return 'AllocatedMadeModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; } @@ -49,11 +49,11 @@ abstract mixin class $AllocatedMadeModelCopyWith<$Res> { factory $AllocatedMadeModelCopyWith(AllocatedMadeModel value, $Res Function(AllocatedMadeModel) _then) = _$AllocatedMadeModelCopyWithImpl; @useResult $Res call({ - int? count, String? next, String? previous, List? results + int? id, Product? product, dynamic killHouse, dynamic toKillHouse, Steward? steward, dynamic toSteward, dynamic guilds, Steward? toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, int? weightOfCarcasses, int? realWeightOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, String? loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, String? role, String? stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser }); - +$ProductCopyWith<$Res>? get product;$StewardCopyWith<$Res>? get steward;$StewardCopyWith<$Res>? get toGuilds; } /// @nodoc @@ -66,16 +66,103 @@ class _$AllocatedMadeModelCopyWithImpl<$Res> /// Create a copy of AllocatedMadeModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { return _then(_self.copyWith( -count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: freezed == results ? _self.results : results // ignore: cast_nullable_to_non_nullable -as List?, +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable +as Product?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable +as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as Steward?,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable +as dynamic,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable +as Steward?,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable +as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable +as int?,dateTimestamp: freezed == dateTimestamp ? _self.dateTimestamp : dateTimestamp // ignore: cast_nullable_to_non_nullable +as int?,newState: freezed == newState ? _self.newState : newState // ignore: cast_nullable_to_non_nullable +as int?,newReceiverState: freezed == newReceiverState ? _self.newReceiverState : newReceiverState // ignore: cast_nullable_to_non_nullable +as int?,newAllocationState: freezed == newAllocationState ? _self.newAllocationState : newAllocationState // ignore: cast_nullable_to_non_nullable +as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realNumberOfCarcasses: freezed == realNumberOfCarcasses ? _self.realNumberOfCarcasses : realNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realWeightOfCarcasses: freezed == realWeightOfCarcasses ? _self.realWeightOfCarcasses : realWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,finalRegistration: freezed == finalRegistration ? _self.finalRegistration : finalRegistration // ignore: cast_nullable_to_non_nullable +as bool?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,productName: freezed == productName ? _self.productName : productName // ignore: cast_nullable_to_non_nullable +as String?,sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,saleType: freezed == saleType ? _self.saleType : saleType // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,systemRegistrationCode: freezed == systemRegistrationCode ? _self.systemRegistrationCode : systemRegistrationCode // ignore: cast_nullable_to_non_nullable +as bool?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable +as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,totalAmountPaid: freezed == totalAmountPaid ? _self.totalAmountPaid : totalAmountPaid // ignore: cast_nullable_to_non_nullable +as int?,totalAmountRemain: freezed == totalAmountRemain ? _self.totalAmountRemain : totalAmountRemain // ignore: cast_nullable_to_non_nullable +as int?,loggedRegistrationCode: freezed == loggedRegistrationCode ? _self.loggedRegistrationCode : loggedRegistrationCode // ignore: cast_nullable_to_non_nullable +as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,receiverState: freezed == receiverState ? _self.receiverState : receiverState // ignore: cast_nullable_to_non_nullable +as String?,allocationState: freezed == allocationState ? _self.allocationState : allocationState // ignore: cast_nullable_to_non_nullable +as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,stewardTempKey: freezed == stewardTempKey ? _self.stewardTempKey : stewardTempKey // ignore: cast_nullable_to_non_nullable +as String?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as String?,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,stewardWareHouse: freezed == stewardWareHouse ? _self.stewardWareHouse : stewardWareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable +as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable +as dynamic, )); } +/// Create a copy of AllocatedMadeModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ProductCopyWith<$Res>? get product { + if (_self.product == null) { + return null; + } + return $ProductCopyWith<$Res>(_self.product!, (value) { + return _then(_self.copyWith(product: value)); + }); +}/// Create a copy of AllocatedMadeModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get steward { + if (_self.steward == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); + }); +}/// Create a copy of AllocatedMadeModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StewardCopyWith<$Res>? get toGuilds { + if (_self.toGuilds == null) { + return null; + } + + return $StewardCopyWith<$Res>(_self.toGuilds!, (value) { + return _then(_self.copyWith(toGuilds: value)); + }); +} } @@ -83,21 +170,64 @@ as List?, @JsonSerializable() class _AllocatedMadeModel implements AllocatedMadeModel { - _AllocatedMadeModel({this.count, this.next, this.previous, final List? results}): _results = results; + _AllocatedMadeModel({this.id, this.product, this.killHouse, this.toKillHouse, this.steward, this.toSteward, this.guilds, this.toGuilds, this.toColdHouse, this.indexWeight, this.dateTimestamp, this.newState, this.newReceiverState, this.newAllocationState, this.key, this.createDate, this.modifyDate, this.trash, this.numberOfCarcasses, this.realNumberOfCarcasses, this.receiverRealNumberOfCarcasses, this.weightOfCarcasses, this.realWeightOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses, this.finalRegistration, this.sellType, this.productName, this.sellerType, this.type, this.saleType, this.allocationType, this.systemRegistrationCode, this.registrationCode, this.amount, this.totalAmount, this.totalAmountPaid, this.totalAmountRemain, this.loggedRegistrationCode, this.state, this.receiverState, this.allocationState, this.date, this.role, this.stewardTempKey, this.approvedPriceStatus, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy, this.wareHouse, this.stewardWareHouse, this.car, this.dispenser}); factory _AllocatedMadeModel.fromJson(Map json) => _$AllocatedMadeModelFromJson(json); -@override final int? count; -@override final String? next; -@override final String? previous; - final List? _results; -@override List? get results { - final value = _results; - if (value == null) return null; - if (_results is EqualUnmodifiableListView) return _results; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); -} - +@override final int? id; +@override final Product? product; +@override final dynamic killHouse; +@override final dynamic toKillHouse; +@override final Steward? steward; +@override final dynamic toSteward; +@override final dynamic guilds; +@override final Steward? toGuilds; +@override final dynamic toColdHouse; +@override final int? indexWeight; +@override final int? dateTimestamp; +@override final int? newState; +@override final int? newReceiverState; +@override final int? newAllocationState; +@override final String? key; +@override final String? createDate; +@override final String? modifyDate; +@override final bool? trash; +@override final int? numberOfCarcasses; +@override final int? realNumberOfCarcasses; +@override final int? receiverRealNumberOfCarcasses; +@override final int? weightOfCarcasses; +@override final int? realWeightOfCarcasses; +@override final int? receiverRealWeightOfCarcasses; +@override final int? weightLossOfCarcasses; +@override final bool? finalRegistration; +@override final String? sellType; +@override final String? productName; +@override final String? sellerType; +@override final String? type; +@override final String? saleType; +@override final String? allocationType; +@override final bool? systemRegistrationCode; +@override final int? registrationCode; +@override final int? amount; +@override final int? totalAmount; +@override final int? totalAmountPaid; +@override final int? totalAmountRemain; +@override final String? loggedRegistrationCode; +@override final String? state; +@override final String? receiverState; +@override final String? allocationState; +@override final String? date; +@override final String? role; +@override final String? stewardTempKey; +@override final bool? approvedPriceStatus; +@override final bool? calculateStatus; +@override final bool? temporaryTrash; +@override final bool? temporaryDeleted; +@override final String? createdBy; +@override final String? modifiedBy; +@override final dynamic wareHouse; +@override final dynamic stewardWareHouse; +@override final dynamic car; +@override final dynamic dispenser; /// Create a copy of AllocatedMadeModel /// with the given fields replaced by the non-null parameter values. @@ -112,16 +242,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _AllocatedMadeModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AllocatedMadeModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.toSteward, toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&(identical(other.toGuilds, toGuilds) || other.toGuilds == toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&(identical(other.loggedRegistrationCode, loggedRegistrationCode) || other.loggedRegistrationCode == loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.stewardTempKey, stewardTempKey) || other.stewardTempKey == stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); +int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(toKillHouse),steward,const DeepCollectionEquality().hash(toSteward),const DeepCollectionEquality().hash(guilds),toGuilds,const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,loggedRegistrationCode,state,receiverState,allocationState,date,role,stewardTempKey,approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,createdBy,modifiedBy,const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); @override String toString() { - return 'AllocatedMadeModel(count: $count, next: $next, previous: $previous, results: $results)'; + return 'AllocatedMadeModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; } @@ -132,11 +262,11 @@ abstract mixin class _$AllocatedMadeModelCopyWith<$Res> implements $AllocatedMad factory _$AllocatedMadeModelCopyWith(_AllocatedMadeModel value, $Res Function(_AllocatedMadeModel) _then) = __$AllocatedMadeModelCopyWithImpl; @override @useResult $Res call({ - int? count, String? next, String? previous, List? results + int? id, Product? product, dynamic killHouse, dynamic toKillHouse, Steward? steward, dynamic toSteward, dynamic guilds, Steward? toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, int? weightOfCarcasses, int? realWeightOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, String? loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, String? role, String? stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser }); - +@override $ProductCopyWith<$Res>? get product;@override $StewardCopyWith<$Res>? get steward;@override $StewardCopyWith<$Res>? get toGuilds; } /// @nodoc @@ -149,134 +279,68 @@ class __$AllocatedMadeModelCopyWithImpl<$Res> /// Create a copy of AllocatedMadeModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { return _then(_AllocatedMadeModel( -count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: freezed == results ? _self._results : results // ignore: cast_nullable_to_non_nullable -as List?, - )); -} - - -} - - -/// @nodoc -mixin _$AllocatedMadeResult { - - int? get id; Product? get product; dynamic get kill_house; dynamic get to_kill_house; Steward? get steward; dynamic get to_steward; dynamic get guilds; Steward? get to_guilds; dynamic get to_cold_house; int? get index_weight; int? get date_timestamp; int? get new_state; int? get new_receiver_state; int? get new_allocation_state; String? get key; String? get create_date; String? get modify_date; bool? get trash; int? get number_of_carcasses; int? get real_number_of_carcasses; int? get receiver_real_number_of_carcasses; int? get weight_of_carcasses; int? get real_weight_of_carcasses; int? get receiver_real_weight_of_carcasses; int? get weight_loss_of_carcasses; bool? get final_registration; String? get sell_type; String? get product_name; String? get seller_type; String? get type; String? get sale_type; String? get allocation_type; bool? get system_registration_code; int? get registration_code; int? get amount; int? get total_amount; int? get total_amount_paid; int? get total_amount_remain; String? get logged_registration_code; String? get state; String? get receiver_state; String? get allocation_state; String? get date; String? get role; String? get steward_temp_key; bool? get approved_price_status; bool? get calculate_status; bool? get temporary_trash; bool? get temporary_deleted; String? get created_by; String? get modified_by; dynamic get ware_house; dynamic get steward_ware_house; dynamic get car; dynamic get dispenser; -/// Create a copy of AllocatedMadeResult -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$AllocatedMadeResultCopyWith get copyWith => _$AllocatedMadeResultCopyWithImpl(this as AllocatedMadeResult, _$identity); - - /// Serializes this AllocatedMadeResult to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is AllocatedMadeResult&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.kill_house, kill_house)&&const DeepCollectionEquality().equals(other.to_kill_house, to_kill_house)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.to_steward, to_steward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&(identical(other.to_guilds, to_guilds) || other.to_guilds == to_guilds)&&const DeepCollectionEquality().equals(other.to_cold_house, to_cold_house)&&(identical(other.index_weight, index_weight) || other.index_weight == index_weight)&&(identical(other.date_timestamp, date_timestamp) || other.date_timestamp == date_timestamp)&&(identical(other.new_state, new_state) || other.new_state == new_state)&&(identical(other.new_receiver_state, new_receiver_state) || other.new_receiver_state == new_receiver_state)&&(identical(other.new_allocation_state, new_allocation_state) || other.new_allocation_state == new_allocation_state)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.real_number_of_carcasses, real_number_of_carcasses) || other.real_number_of_carcasses == real_number_of_carcasses)&&(identical(other.receiver_real_number_of_carcasses, receiver_real_number_of_carcasses) || other.receiver_real_number_of_carcasses == receiver_real_number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.real_weight_of_carcasses, real_weight_of_carcasses) || other.real_weight_of_carcasses == real_weight_of_carcasses)&&(identical(other.receiver_real_weight_of_carcasses, receiver_real_weight_of_carcasses) || other.receiver_real_weight_of_carcasses == receiver_real_weight_of_carcasses)&&(identical(other.weight_loss_of_carcasses, weight_loss_of_carcasses) || other.weight_loss_of_carcasses == weight_loss_of_carcasses)&&(identical(other.final_registration, final_registration) || other.final_registration == final_registration)&&(identical(other.sell_type, sell_type) || other.sell_type == sell_type)&&(identical(other.product_name, product_name) || other.product_name == product_name)&&(identical(other.seller_type, seller_type) || other.seller_type == seller_type)&&(identical(other.type, type) || other.type == type)&&(identical(other.sale_type, sale_type) || other.sale_type == sale_type)&&(identical(other.allocation_type, allocation_type) || other.allocation_type == allocation_type)&&(identical(other.system_registration_code, system_registration_code) || other.system_registration_code == system_registration_code)&&(identical(other.registration_code, registration_code) || other.registration_code == registration_code)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount)&&(identical(other.total_amount_paid, total_amount_paid) || other.total_amount_paid == total_amount_paid)&&(identical(other.total_amount_remain, total_amount_remain) || other.total_amount_remain == total_amount_remain)&&(identical(other.logged_registration_code, logged_registration_code) || other.logged_registration_code == logged_registration_code)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiver_state, receiver_state) || other.receiver_state == receiver_state)&&(identical(other.allocation_state, allocation_state) || other.allocation_state == allocation_state)&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.steward_temp_key, steward_temp_key) || other.steward_temp_key == steward_temp_key)&&(identical(other.approved_price_status, approved_price_status) || other.approved_price_status == approved_price_status)&&(identical(other.calculate_status, calculate_status) || other.calculate_status == calculate_status)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.ware_house, ware_house)&&const DeepCollectionEquality().equals(other.steward_ware_house, steward_ware_house)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(kill_house),const DeepCollectionEquality().hash(to_kill_house),steward,const DeepCollectionEquality().hash(to_steward),const DeepCollectionEquality().hash(guilds),to_guilds,const DeepCollectionEquality().hash(to_cold_house),index_weight,date_timestamp,new_state,new_receiver_state,new_allocation_state,key,create_date,modify_date,trash,number_of_carcasses,real_number_of_carcasses,receiver_real_number_of_carcasses,weight_of_carcasses,real_weight_of_carcasses,receiver_real_weight_of_carcasses,weight_loss_of_carcasses,final_registration,sell_type,product_name,seller_type,type,sale_type,allocation_type,system_registration_code,registration_code,amount,total_amount,total_amount_paid,total_amount_remain,logged_registration_code,state,receiver_state,allocation_state,date,role,steward_temp_key,approved_price_status,calculate_status,temporary_trash,temporary_deleted,created_by,modified_by,const DeepCollectionEquality().hash(ware_house),const DeepCollectionEquality().hash(steward_ware_house),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); - -@override -String toString() { - return 'AllocatedMadeResult(id: $id, product: $product, kill_house: $kill_house, to_kill_house: $to_kill_house, steward: $steward, to_steward: $to_steward, guilds: $guilds, to_guilds: $to_guilds, to_cold_house: $to_cold_house, index_weight: $index_weight, date_timestamp: $date_timestamp, new_state: $new_state, new_receiver_state: $new_receiver_state, new_allocation_state: $new_allocation_state, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, number_of_carcasses: $number_of_carcasses, real_number_of_carcasses: $real_number_of_carcasses, receiver_real_number_of_carcasses: $receiver_real_number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, real_weight_of_carcasses: $real_weight_of_carcasses, receiver_real_weight_of_carcasses: $receiver_real_weight_of_carcasses, weight_loss_of_carcasses: $weight_loss_of_carcasses, final_registration: $final_registration, sell_type: $sell_type, product_name: $product_name, seller_type: $seller_type, type: $type, sale_type: $sale_type, allocation_type: $allocation_type, system_registration_code: $system_registration_code, registration_code: $registration_code, amount: $amount, total_amount: $total_amount, total_amount_paid: $total_amount_paid, total_amount_remain: $total_amount_remain, logged_registration_code: $logged_registration_code, state: $state, receiver_state: $receiver_state, allocation_state: $allocation_state, date: $date, role: $role, steward_temp_key: $steward_temp_key, approved_price_status: $approved_price_status, calculate_status: $calculate_status, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by, ware_house: $ware_house, steward_ware_house: $steward_ware_house, car: $car, dispenser: $dispenser)'; -} - - -} - -/// @nodoc -abstract mixin class $AllocatedMadeResultCopyWith<$Res> { - factory $AllocatedMadeResultCopyWith(AllocatedMadeResult value, $Res Function(AllocatedMadeResult) _then) = _$AllocatedMadeResultCopyWithImpl; -@useResult -$Res call({ - int? id, Product? product, dynamic kill_house, dynamic to_kill_house, Steward? steward, dynamic to_steward, dynamic guilds, Steward? to_guilds, dynamic to_cold_house, int? index_weight, int? date_timestamp, int? new_state, int? new_receiver_state, int? new_allocation_state, String? key, String? create_date, String? modify_date, bool? trash, int? number_of_carcasses, int? real_number_of_carcasses, int? receiver_real_number_of_carcasses, int? weight_of_carcasses, int? real_weight_of_carcasses, int? receiver_real_weight_of_carcasses, int? weight_loss_of_carcasses, bool? final_registration, String? sell_type, String? product_name, String? seller_type, String? type, String? sale_type, String? allocation_type, bool? system_registration_code, int? registration_code, int? amount, int? total_amount, int? total_amount_paid, int? total_amount_remain, String? logged_registration_code, String? state, String? receiver_state, String? allocation_state, String? date, String? role, String? steward_temp_key, bool? approved_price_status, bool? calculate_status, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by, dynamic ware_house, dynamic steward_ware_house, dynamic car, dynamic dispenser -}); - - -$ProductCopyWith<$Res>? get product;$StewardCopyWith<$Res>? get steward;$StewardCopyWith<$Res>? get to_guilds; - -} -/// @nodoc -class _$AllocatedMadeResultCopyWithImpl<$Res> - implements $AllocatedMadeResultCopyWith<$Res> { - _$AllocatedMadeResultCopyWithImpl(this._self, this._then); - - final AllocatedMadeResult _self; - final $Res Function(AllocatedMadeResult) _then; - -/// Create a copy of AllocatedMadeResult -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? kill_house = freezed,Object? to_kill_house = freezed,Object? steward = freezed,Object? to_steward = freezed,Object? guilds = freezed,Object? to_guilds = freezed,Object? to_cold_house = freezed,Object? index_weight = freezed,Object? date_timestamp = freezed,Object? new_state = freezed,Object? new_receiver_state = freezed,Object? new_allocation_state = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? number_of_carcasses = freezed,Object? real_number_of_carcasses = freezed,Object? receiver_real_number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? real_weight_of_carcasses = freezed,Object? receiver_real_weight_of_carcasses = freezed,Object? weight_loss_of_carcasses = freezed,Object? final_registration = freezed,Object? sell_type = freezed,Object? product_name = freezed,Object? seller_type = freezed,Object? type = freezed,Object? sale_type = freezed,Object? allocation_type = freezed,Object? system_registration_code = freezed,Object? registration_code = freezed,Object? amount = freezed,Object? total_amount = freezed,Object? total_amount_paid = freezed,Object? total_amount_remain = freezed,Object? logged_registration_code = freezed,Object? state = freezed,Object? receiver_state = freezed,Object? allocation_state = freezed,Object? date = freezed,Object? role = freezed,Object? steward_temp_key = freezed,Object? approved_price_status = freezed,Object? calculate_status = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? ware_house = freezed,Object? steward_ware_house = freezed,Object? car = freezed,Object? dispenser = freezed,}) { - return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable -as Product?,kill_house: freezed == kill_house ? _self.kill_house : kill_house // ignore: cast_nullable_to_non_nullable -as dynamic,to_kill_house: freezed == to_kill_house ? _self.to_kill_house : to_kill_house // ignore: cast_nullable_to_non_nullable +as Product?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as Steward?,to_steward: freezed == to_steward ? _self.to_steward : to_steward // ignore: cast_nullable_to_non_nullable +as Steward?,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable as dynamic,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable -as dynamic,to_guilds: freezed == to_guilds ? _self.to_guilds : to_guilds // ignore: cast_nullable_to_non_nullable -as Steward?,to_cold_house: freezed == to_cold_house ? _self.to_cold_house : to_cold_house // ignore: cast_nullable_to_non_nullable -as dynamic,index_weight: freezed == index_weight ? _self.index_weight : index_weight // ignore: cast_nullable_to_non_nullable -as int?,date_timestamp: freezed == date_timestamp ? _self.date_timestamp : date_timestamp // ignore: cast_nullable_to_non_nullable -as int?,new_state: freezed == new_state ? _self.new_state : new_state // ignore: cast_nullable_to_non_nullable -as int?,new_receiver_state: freezed == new_receiver_state ? _self.new_receiver_state : new_receiver_state // ignore: cast_nullable_to_non_nullable -as int?,new_allocation_state: freezed == new_allocation_state ? _self.new_allocation_state : new_allocation_state // ignore: cast_nullable_to_non_nullable +as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable +as Steward?,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable +as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable +as int?,dateTimestamp: freezed == dateTimestamp ? _self.dateTimestamp : dateTimestamp // ignore: cast_nullable_to_non_nullable +as int?,newState: freezed == newState ? _self.newState : newState // ignore: cast_nullable_to_non_nullable +as int?,newReceiverState: freezed == newReceiverState ? _self.newReceiverState : newReceiverState // ignore: cast_nullable_to_non_nullable +as int?,newAllocationState: freezed == newAllocationState ? _self.newAllocationState : newAllocationState // ignore: cast_nullable_to_non_nullable as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,real_number_of_carcasses: freezed == real_number_of_carcasses ? _self.real_number_of_carcasses : real_number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,receiver_real_number_of_carcasses: freezed == receiver_real_number_of_carcasses ? _self.receiver_real_number_of_carcasses : receiver_real_number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,real_weight_of_carcasses: freezed == real_weight_of_carcasses ? _self.real_weight_of_carcasses : real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,receiver_real_weight_of_carcasses: freezed == receiver_real_weight_of_carcasses ? _self.receiver_real_weight_of_carcasses : receiver_real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,weight_loss_of_carcasses: freezed == weight_loss_of_carcasses ? _self.weight_loss_of_carcasses : weight_loss_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,final_registration: freezed == final_registration ? _self.final_registration : final_registration // ignore: cast_nullable_to_non_nullable -as bool?,sell_type: freezed == sell_type ? _self.sell_type : sell_type // ignore: cast_nullable_to_non_nullable -as String?,product_name: freezed == product_name ? _self.product_name : product_name // ignore: cast_nullable_to_non_nullable -as String?,seller_type: freezed == seller_type ? _self.seller_type : seller_type // ignore: cast_nullable_to_non_nullable +as bool?,numberOfCarcasses: freezed == numberOfCarcasses ? _self.numberOfCarcasses : numberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realNumberOfCarcasses: freezed == realNumberOfCarcasses ? _self.realNumberOfCarcasses : realNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealNumberOfCarcasses: freezed == receiverRealNumberOfCarcasses ? _self.receiverRealNumberOfCarcasses : receiverRealNumberOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightOfCarcasses: freezed == weightOfCarcasses ? _self.weightOfCarcasses : weightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,realWeightOfCarcasses: freezed == realWeightOfCarcasses ? _self.realWeightOfCarcasses : realWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,receiverRealWeightOfCarcasses: freezed == receiverRealWeightOfCarcasses ? _self.receiverRealWeightOfCarcasses : receiverRealWeightOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,weightLossOfCarcasses: freezed == weightLossOfCarcasses ? _self.weightLossOfCarcasses : weightLossOfCarcasses // ignore: cast_nullable_to_non_nullable +as int?,finalRegistration: freezed == finalRegistration ? _self.finalRegistration : finalRegistration // ignore: cast_nullable_to_non_nullable +as bool?,sellType: freezed == sellType ? _self.sellType : sellType // ignore: cast_nullable_to_non_nullable +as String?,productName: freezed == productName ? _self.productName : productName // ignore: cast_nullable_to_non_nullable +as String?,sellerType: freezed == sellerType ? _self.sellerType : sellerType // ignore: cast_nullable_to_non_nullable as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable -as String?,sale_type: freezed == sale_type ? _self.sale_type : sale_type // ignore: cast_nullable_to_non_nullable -as String?,allocation_type: freezed == allocation_type ? _self.allocation_type : allocation_type // ignore: cast_nullable_to_non_nullable -as String?,system_registration_code: freezed == system_registration_code ? _self.system_registration_code : system_registration_code // ignore: cast_nullable_to_non_nullable -as bool?,registration_code: freezed == registration_code ? _self.registration_code : registration_code // ignore: cast_nullable_to_non_nullable +as String?,saleType: freezed == saleType ? _self.saleType : saleType // ignore: cast_nullable_to_non_nullable +as String?,allocationType: freezed == allocationType ? _self.allocationType : allocationType // ignore: cast_nullable_to_non_nullable +as String?,systemRegistrationCode: freezed == systemRegistrationCode ? _self.systemRegistrationCode : systemRegistrationCode // ignore: cast_nullable_to_non_nullable +as bool?,registrationCode: freezed == registrationCode ? _self.registrationCode : registrationCode // ignore: cast_nullable_to_non_nullable as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable -as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable -as int?,total_amount_paid: freezed == total_amount_paid ? _self.total_amount_paid : total_amount_paid // ignore: cast_nullable_to_non_nullable -as int?,total_amount_remain: freezed == total_amount_remain ? _self.total_amount_remain : total_amount_remain // ignore: cast_nullable_to_non_nullable -as int?,logged_registration_code: freezed == logged_registration_code ? _self.logged_registration_code : logged_registration_code // ignore: cast_nullable_to_non_nullable +as int?,totalAmount: freezed == totalAmount ? _self.totalAmount : totalAmount // ignore: cast_nullable_to_non_nullable +as int?,totalAmountPaid: freezed == totalAmountPaid ? _self.totalAmountPaid : totalAmountPaid // ignore: cast_nullable_to_non_nullable +as int?,totalAmountRemain: freezed == totalAmountRemain ? _self.totalAmountRemain : totalAmountRemain // ignore: cast_nullable_to_non_nullable +as int?,loggedRegistrationCode: freezed == loggedRegistrationCode ? _self.loggedRegistrationCode : loggedRegistrationCode // ignore: cast_nullable_to_non_nullable as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable -as String?,receiver_state: freezed == receiver_state ? _self.receiver_state : receiver_state // ignore: cast_nullable_to_non_nullable -as String?,allocation_state: freezed == allocation_state ? _self.allocation_state : allocation_state // ignore: cast_nullable_to_non_nullable +as String?,receiverState: freezed == receiverState ? _self.receiverState : receiverState // ignore: cast_nullable_to_non_nullable +as String?,allocationState: freezed == allocationState ? _self.allocationState : allocationState // ignore: cast_nullable_to_non_nullable as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable -as String?,steward_temp_key: freezed == steward_temp_key ? _self.steward_temp_key : steward_temp_key // ignore: cast_nullable_to_non_nullable -as String?,approved_price_status: freezed == approved_price_status ? _self.approved_price_status : approved_price_status // ignore: cast_nullable_to_non_nullable -as bool?,calculate_status: freezed == calculate_status ? _self.calculate_status : calculate_status // ignore: cast_nullable_to_non_nullable -as bool?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable -as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable -as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable -as String?,ware_house: freezed == ware_house ? _self.ware_house : ware_house // ignore: cast_nullable_to_non_nullable -as dynamic,steward_ware_house: freezed == steward_ware_house ? _self.steward_ware_house : steward_ware_house // ignore: cast_nullable_to_non_nullable +as String?,stewardTempKey: freezed == stewardTempKey ? _self.stewardTempKey : stewardTempKey // ignore: cast_nullable_to_non_nullable +as String?,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedPriceStatus : approvedPriceStatus // ignore: cast_nullable_to_non_nullable +as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable +as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as String?,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable +as dynamic,stewardWareHouse: freezed == stewardWareHouse ? _self.stewardWareHouse : stewardWareHouse // ignore: cast_nullable_to_non_nullable as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable as dynamic, )); } -/// Create a copy of AllocatedMadeResult + +/// Create a copy of AllocatedMadeModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -288,7 +352,7 @@ $ProductCopyWith<$Res>? get product { return $ProductCopyWith<$Res>(_self.product!, (value) { return _then(_self.copyWith(product: value)); }); -}/// Create a copy of AllocatedMadeResult +}/// Create a copy of AllocatedMadeModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -300,231 +364,17 @@ $StewardCopyWith<$Res>? get steward { return $StewardCopyWith<$Res>(_self.steward!, (value) { return _then(_self.copyWith(steward: value)); }); -}/// Create a copy of AllocatedMadeResult +}/// Create a copy of AllocatedMadeModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$StewardCopyWith<$Res>? get to_guilds { - if (_self.to_guilds == null) { +$StewardCopyWith<$Res>? get toGuilds { + if (_self.toGuilds == null) { return null; } - return $StewardCopyWith<$Res>(_self.to_guilds!, (value) { - return _then(_self.copyWith(to_guilds: value)); - }); -} -} - - -/// @nodoc -@JsonSerializable() - -class _AllocatedMadeResult implements AllocatedMadeResult { - _AllocatedMadeResult({this.id, this.product, this.kill_house, this.to_kill_house, this.steward, this.to_steward, this.guilds, this.to_guilds, this.to_cold_house, this.index_weight, this.date_timestamp, this.new_state, this.new_receiver_state, this.new_allocation_state, this.key, this.create_date, this.modify_date, this.trash, this.number_of_carcasses, this.real_number_of_carcasses, this.receiver_real_number_of_carcasses, this.weight_of_carcasses, this.real_weight_of_carcasses, this.receiver_real_weight_of_carcasses, this.weight_loss_of_carcasses, this.final_registration, this.sell_type, this.product_name, this.seller_type, this.type, this.sale_type, this.allocation_type, this.system_registration_code, this.registration_code, this.amount, this.total_amount, this.total_amount_paid, this.total_amount_remain, this.logged_registration_code, this.state, this.receiver_state, this.allocation_state, this.date, this.role, this.steward_temp_key, this.approved_price_status, this.calculate_status, this.temporary_trash, this.temporary_deleted, this.created_by, this.modified_by, this.ware_house, this.steward_ware_house, this.car, this.dispenser}); - factory _AllocatedMadeResult.fromJson(Map json) => _$AllocatedMadeResultFromJson(json); - -@override final int? id; -@override final Product? product; -@override final dynamic kill_house; -@override final dynamic to_kill_house; -@override final Steward? steward; -@override final dynamic to_steward; -@override final dynamic guilds; -@override final Steward? to_guilds; -@override final dynamic to_cold_house; -@override final int? index_weight; -@override final int? date_timestamp; -@override final int? new_state; -@override final int? new_receiver_state; -@override final int? new_allocation_state; -@override final String? key; -@override final String? create_date; -@override final String? modify_date; -@override final bool? trash; -@override final int? number_of_carcasses; -@override final int? real_number_of_carcasses; -@override final int? receiver_real_number_of_carcasses; -@override final int? weight_of_carcasses; -@override final int? real_weight_of_carcasses; -@override final int? receiver_real_weight_of_carcasses; -@override final int? weight_loss_of_carcasses; -@override final bool? final_registration; -@override final String? sell_type; -@override final String? product_name; -@override final String? seller_type; -@override final String? type; -@override final String? sale_type; -@override final String? allocation_type; -@override final bool? system_registration_code; -@override final int? registration_code; -@override final int? amount; -@override final int? total_amount; -@override final int? total_amount_paid; -@override final int? total_amount_remain; -@override final String? logged_registration_code; -@override final String? state; -@override final String? receiver_state; -@override final String? allocation_state; -@override final String? date; -@override final String? role; -@override final String? steward_temp_key; -@override final bool? approved_price_status; -@override final bool? calculate_status; -@override final bool? temporary_trash; -@override final bool? temporary_deleted; -@override final String? created_by; -@override final String? modified_by; -@override final dynamic ware_house; -@override final dynamic steward_ware_house; -@override final dynamic car; -@override final dynamic dispenser; - -/// Create a copy of AllocatedMadeResult -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$AllocatedMadeResultCopyWith<_AllocatedMadeResult> get copyWith => __$AllocatedMadeResultCopyWithImpl<_AllocatedMadeResult>(this, _$identity); - -@override -Map toJson() { - return _$AllocatedMadeResultToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _AllocatedMadeResult&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.kill_house, kill_house)&&const DeepCollectionEquality().equals(other.to_kill_house, to_kill_house)&&(identical(other.steward, steward) || other.steward == steward)&&const DeepCollectionEquality().equals(other.to_steward, to_steward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&(identical(other.to_guilds, to_guilds) || other.to_guilds == to_guilds)&&const DeepCollectionEquality().equals(other.to_cold_house, to_cold_house)&&(identical(other.index_weight, index_weight) || other.index_weight == index_weight)&&(identical(other.date_timestamp, date_timestamp) || other.date_timestamp == date_timestamp)&&(identical(other.new_state, new_state) || other.new_state == new_state)&&(identical(other.new_receiver_state, new_receiver_state) || other.new_receiver_state == new_receiver_state)&&(identical(other.new_allocation_state, new_allocation_state) || other.new_allocation_state == new_allocation_state)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.number_of_carcasses, number_of_carcasses) || other.number_of_carcasses == number_of_carcasses)&&(identical(other.real_number_of_carcasses, real_number_of_carcasses) || other.real_number_of_carcasses == real_number_of_carcasses)&&(identical(other.receiver_real_number_of_carcasses, receiver_real_number_of_carcasses) || other.receiver_real_number_of_carcasses == receiver_real_number_of_carcasses)&&(identical(other.weight_of_carcasses, weight_of_carcasses) || other.weight_of_carcasses == weight_of_carcasses)&&(identical(other.real_weight_of_carcasses, real_weight_of_carcasses) || other.real_weight_of_carcasses == real_weight_of_carcasses)&&(identical(other.receiver_real_weight_of_carcasses, receiver_real_weight_of_carcasses) || other.receiver_real_weight_of_carcasses == receiver_real_weight_of_carcasses)&&(identical(other.weight_loss_of_carcasses, weight_loss_of_carcasses) || other.weight_loss_of_carcasses == weight_loss_of_carcasses)&&(identical(other.final_registration, final_registration) || other.final_registration == final_registration)&&(identical(other.sell_type, sell_type) || other.sell_type == sell_type)&&(identical(other.product_name, product_name) || other.product_name == product_name)&&(identical(other.seller_type, seller_type) || other.seller_type == seller_type)&&(identical(other.type, type) || other.type == type)&&(identical(other.sale_type, sale_type) || other.sale_type == sale_type)&&(identical(other.allocation_type, allocation_type) || other.allocation_type == allocation_type)&&(identical(other.system_registration_code, system_registration_code) || other.system_registration_code == system_registration_code)&&(identical(other.registration_code, registration_code) || other.registration_code == registration_code)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.total_amount, total_amount) || other.total_amount == total_amount)&&(identical(other.total_amount_paid, total_amount_paid) || other.total_amount_paid == total_amount_paid)&&(identical(other.total_amount_remain, total_amount_remain) || other.total_amount_remain == total_amount_remain)&&(identical(other.logged_registration_code, logged_registration_code) || other.logged_registration_code == logged_registration_code)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiver_state, receiver_state) || other.receiver_state == receiver_state)&&(identical(other.allocation_state, allocation_state) || other.allocation_state == allocation_state)&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.steward_temp_key, steward_temp_key) || other.steward_temp_key == steward_temp_key)&&(identical(other.approved_price_status, approved_price_status) || other.approved_price_status == approved_price_status)&&(identical(other.calculate_status, calculate_status) || other.calculate_status == calculate_status)&&(identical(other.temporary_trash, temporary_trash) || other.temporary_trash == temporary_trash)&&(identical(other.temporary_deleted, temporary_deleted) || other.temporary_deleted == temporary_deleted)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.ware_house, ware_house)&&const DeepCollectionEquality().equals(other.steward_ware_house, steward_ware_house)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(kill_house),const DeepCollectionEquality().hash(to_kill_house),steward,const DeepCollectionEquality().hash(to_steward),const DeepCollectionEquality().hash(guilds),to_guilds,const DeepCollectionEquality().hash(to_cold_house),index_weight,date_timestamp,new_state,new_receiver_state,new_allocation_state,key,create_date,modify_date,trash,number_of_carcasses,real_number_of_carcasses,receiver_real_number_of_carcasses,weight_of_carcasses,real_weight_of_carcasses,receiver_real_weight_of_carcasses,weight_loss_of_carcasses,final_registration,sell_type,product_name,seller_type,type,sale_type,allocation_type,system_registration_code,registration_code,amount,total_amount,total_amount_paid,total_amount_remain,logged_registration_code,state,receiver_state,allocation_state,date,role,steward_temp_key,approved_price_status,calculate_status,temporary_trash,temporary_deleted,created_by,modified_by,const DeepCollectionEquality().hash(ware_house),const DeepCollectionEquality().hash(steward_ware_house),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); - -@override -String toString() { - return 'AllocatedMadeResult(id: $id, product: $product, kill_house: $kill_house, to_kill_house: $to_kill_house, steward: $steward, to_steward: $to_steward, guilds: $guilds, to_guilds: $to_guilds, to_cold_house: $to_cold_house, index_weight: $index_weight, date_timestamp: $date_timestamp, new_state: $new_state, new_receiver_state: $new_receiver_state, new_allocation_state: $new_allocation_state, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, number_of_carcasses: $number_of_carcasses, real_number_of_carcasses: $real_number_of_carcasses, receiver_real_number_of_carcasses: $receiver_real_number_of_carcasses, weight_of_carcasses: $weight_of_carcasses, real_weight_of_carcasses: $real_weight_of_carcasses, receiver_real_weight_of_carcasses: $receiver_real_weight_of_carcasses, weight_loss_of_carcasses: $weight_loss_of_carcasses, final_registration: $final_registration, sell_type: $sell_type, product_name: $product_name, seller_type: $seller_type, type: $type, sale_type: $sale_type, allocation_type: $allocation_type, system_registration_code: $system_registration_code, registration_code: $registration_code, amount: $amount, total_amount: $total_amount, total_amount_paid: $total_amount_paid, total_amount_remain: $total_amount_remain, logged_registration_code: $logged_registration_code, state: $state, receiver_state: $receiver_state, allocation_state: $allocation_state, date: $date, role: $role, steward_temp_key: $steward_temp_key, approved_price_status: $approved_price_status, calculate_status: $calculate_status, temporary_trash: $temporary_trash, temporary_deleted: $temporary_deleted, created_by: $created_by, modified_by: $modified_by, ware_house: $ware_house, steward_ware_house: $steward_ware_house, car: $car, dispenser: $dispenser)'; -} - - -} - -/// @nodoc -abstract mixin class _$AllocatedMadeResultCopyWith<$Res> implements $AllocatedMadeResultCopyWith<$Res> { - factory _$AllocatedMadeResultCopyWith(_AllocatedMadeResult value, $Res Function(_AllocatedMadeResult) _then) = __$AllocatedMadeResultCopyWithImpl; -@override @useResult -$Res call({ - int? id, Product? product, dynamic kill_house, dynamic to_kill_house, Steward? steward, dynamic to_steward, dynamic guilds, Steward? to_guilds, dynamic to_cold_house, int? index_weight, int? date_timestamp, int? new_state, int? new_receiver_state, int? new_allocation_state, String? key, String? create_date, String? modify_date, bool? trash, int? number_of_carcasses, int? real_number_of_carcasses, int? receiver_real_number_of_carcasses, int? weight_of_carcasses, int? real_weight_of_carcasses, int? receiver_real_weight_of_carcasses, int? weight_loss_of_carcasses, bool? final_registration, String? sell_type, String? product_name, String? seller_type, String? type, String? sale_type, String? allocation_type, bool? system_registration_code, int? registration_code, int? amount, int? total_amount, int? total_amount_paid, int? total_amount_remain, String? logged_registration_code, String? state, String? receiver_state, String? allocation_state, String? date, String? role, String? steward_temp_key, bool? approved_price_status, bool? calculate_status, bool? temporary_trash, bool? temporary_deleted, String? created_by, String? modified_by, dynamic ware_house, dynamic steward_ware_house, dynamic car, dynamic dispenser -}); - - -@override $ProductCopyWith<$Res>? get product;@override $StewardCopyWith<$Res>? get steward;@override $StewardCopyWith<$Res>? get to_guilds; - -} -/// @nodoc -class __$AllocatedMadeResultCopyWithImpl<$Res> - implements _$AllocatedMadeResultCopyWith<$Res> { - __$AllocatedMadeResultCopyWithImpl(this._self, this._then); - - final _AllocatedMadeResult _self; - final $Res Function(_AllocatedMadeResult) _then; - -/// Create a copy of AllocatedMadeResult -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? kill_house = freezed,Object? to_kill_house = freezed,Object? steward = freezed,Object? to_steward = freezed,Object? guilds = freezed,Object? to_guilds = freezed,Object? to_cold_house = freezed,Object? index_weight = freezed,Object? date_timestamp = freezed,Object? new_state = freezed,Object? new_receiver_state = freezed,Object? new_allocation_state = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? number_of_carcasses = freezed,Object? real_number_of_carcasses = freezed,Object? receiver_real_number_of_carcasses = freezed,Object? weight_of_carcasses = freezed,Object? real_weight_of_carcasses = freezed,Object? receiver_real_weight_of_carcasses = freezed,Object? weight_loss_of_carcasses = freezed,Object? final_registration = freezed,Object? sell_type = freezed,Object? product_name = freezed,Object? seller_type = freezed,Object? type = freezed,Object? sale_type = freezed,Object? allocation_type = freezed,Object? system_registration_code = freezed,Object? registration_code = freezed,Object? amount = freezed,Object? total_amount = freezed,Object? total_amount_paid = freezed,Object? total_amount_remain = freezed,Object? logged_registration_code = freezed,Object? state = freezed,Object? receiver_state = freezed,Object? allocation_state = freezed,Object? date = freezed,Object? role = freezed,Object? steward_temp_key = freezed,Object? approved_price_status = freezed,Object? calculate_status = freezed,Object? temporary_trash = freezed,Object? temporary_deleted = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? ware_house = freezed,Object? steward_ware_house = freezed,Object? car = freezed,Object? dispenser = freezed,}) { - return _then(_AllocatedMadeResult( -id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable -as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable -as Product?,kill_house: freezed == kill_house ? _self.kill_house : kill_house // ignore: cast_nullable_to_non_nullable -as dynamic,to_kill_house: freezed == to_kill_house ? _self.to_kill_house : to_kill_house // ignore: cast_nullable_to_non_nullable -as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as Steward?,to_steward: freezed == to_steward ? _self.to_steward : to_steward // ignore: cast_nullable_to_non_nullable -as dynamic,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable -as dynamic,to_guilds: freezed == to_guilds ? _self.to_guilds : to_guilds // ignore: cast_nullable_to_non_nullable -as Steward?,to_cold_house: freezed == to_cold_house ? _self.to_cold_house : to_cold_house // ignore: cast_nullable_to_non_nullable -as dynamic,index_weight: freezed == index_weight ? _self.index_weight : index_weight // ignore: cast_nullable_to_non_nullable -as int?,date_timestamp: freezed == date_timestamp ? _self.date_timestamp : date_timestamp // ignore: cast_nullable_to_non_nullable -as int?,new_state: freezed == new_state ? _self.new_state : new_state // ignore: cast_nullable_to_non_nullable -as int?,new_receiver_state: freezed == new_receiver_state ? _self.new_receiver_state : new_receiver_state // ignore: cast_nullable_to_non_nullable -as int?,new_allocation_state: freezed == new_allocation_state ? _self.new_allocation_state : new_allocation_state // ignore: cast_nullable_to_non_nullable -as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable -as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,number_of_carcasses: freezed == number_of_carcasses ? _self.number_of_carcasses : number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,real_number_of_carcasses: freezed == real_number_of_carcasses ? _self.real_number_of_carcasses : real_number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,receiver_real_number_of_carcasses: freezed == receiver_real_number_of_carcasses ? _self.receiver_real_number_of_carcasses : receiver_real_number_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,weight_of_carcasses: freezed == weight_of_carcasses ? _self.weight_of_carcasses : weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,real_weight_of_carcasses: freezed == real_weight_of_carcasses ? _self.real_weight_of_carcasses : real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,receiver_real_weight_of_carcasses: freezed == receiver_real_weight_of_carcasses ? _self.receiver_real_weight_of_carcasses : receiver_real_weight_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,weight_loss_of_carcasses: freezed == weight_loss_of_carcasses ? _self.weight_loss_of_carcasses : weight_loss_of_carcasses // ignore: cast_nullable_to_non_nullable -as int?,final_registration: freezed == final_registration ? _self.final_registration : final_registration // ignore: cast_nullable_to_non_nullable -as bool?,sell_type: freezed == sell_type ? _self.sell_type : sell_type // ignore: cast_nullable_to_non_nullable -as String?,product_name: freezed == product_name ? _self.product_name : product_name // ignore: cast_nullable_to_non_nullable -as String?,seller_type: freezed == seller_type ? _self.seller_type : seller_type // ignore: cast_nullable_to_non_nullable -as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable -as String?,sale_type: freezed == sale_type ? _self.sale_type : sale_type // ignore: cast_nullable_to_non_nullable -as String?,allocation_type: freezed == allocation_type ? _self.allocation_type : allocation_type // ignore: cast_nullable_to_non_nullable -as String?,system_registration_code: freezed == system_registration_code ? _self.system_registration_code : system_registration_code // ignore: cast_nullable_to_non_nullable -as bool?,registration_code: freezed == registration_code ? _self.registration_code : registration_code // ignore: cast_nullable_to_non_nullable -as int?,amount: freezed == amount ? _self.amount : amount // ignore: cast_nullable_to_non_nullable -as int?,total_amount: freezed == total_amount ? _self.total_amount : total_amount // ignore: cast_nullable_to_non_nullable -as int?,total_amount_paid: freezed == total_amount_paid ? _self.total_amount_paid : total_amount_paid // ignore: cast_nullable_to_non_nullable -as int?,total_amount_remain: freezed == total_amount_remain ? _self.total_amount_remain : total_amount_remain // ignore: cast_nullable_to_non_nullable -as int?,logged_registration_code: freezed == logged_registration_code ? _self.logged_registration_code : logged_registration_code // ignore: cast_nullable_to_non_nullable -as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable -as String?,receiver_state: freezed == receiver_state ? _self.receiver_state : receiver_state // ignore: cast_nullable_to_non_nullable -as String?,allocation_state: freezed == allocation_state ? _self.allocation_state : allocation_state // ignore: cast_nullable_to_non_nullable -as String?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable -as String?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable -as String?,steward_temp_key: freezed == steward_temp_key ? _self.steward_temp_key : steward_temp_key // ignore: cast_nullable_to_non_nullable -as String?,approved_price_status: freezed == approved_price_status ? _self.approved_price_status : approved_price_status // ignore: cast_nullable_to_non_nullable -as bool?,calculate_status: freezed == calculate_status ? _self.calculate_status : calculate_status // ignore: cast_nullable_to_non_nullable -as bool?,temporary_trash: freezed == temporary_trash ? _self.temporary_trash : temporary_trash // ignore: cast_nullable_to_non_nullable -as bool?,temporary_deleted: freezed == temporary_deleted ? _self.temporary_deleted : temporary_deleted // ignore: cast_nullable_to_non_nullable -as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable -as String?,ware_house: freezed == ware_house ? _self.ware_house : ware_house // ignore: cast_nullable_to_non_nullable -as dynamic,steward_ware_house: freezed == steward_ware_house ? _self.steward_ware_house : steward_ware_house // ignore: cast_nullable_to_non_nullable -as dynamic,car: freezed == car ? _self.car : car // ignore: cast_nullable_to_non_nullable -as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // ignore: cast_nullable_to_non_nullable -as dynamic, - )); -} - -/// Create a copy of AllocatedMadeResult -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$ProductCopyWith<$Res>? get product { - if (_self.product == null) { - return null; - } - - return $ProductCopyWith<$Res>(_self.product!, (value) { - return _then(_self.copyWith(product: value)); - }); -}/// Create a copy of AllocatedMadeResult -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$StewardCopyWith<$Res>? get steward { - if (_self.steward == null) { - return null; - } - - return $StewardCopyWith<$Res>(_self.steward!, (value) { - return _then(_self.copyWith(steward: value)); - }); -}/// Create a copy of AllocatedMadeResult -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$StewardCopyWith<$Res>? get to_guilds { - if (_self.to_guilds == null) { - return null; - } - - return $StewardCopyWith<$Res>(_self.to_guilds!, (value) { - return _then(_self.copyWith(to_guilds: value)); + return $StewardCopyWith<$Res>(_self.toGuilds!, (value) { + return _then(_self.copyWith(toGuilds: value)); }); } } @@ -533,7 +383,7 @@ $StewardCopyWith<$Res>? get to_guilds { /// @nodoc mixin _$Product { - int? get weight_average; + int? get weightAverage; /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -546,16 +396,16 @@ $ProductCopyWith get copyWith => _$ProductCopyWithImpl(this as @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Product&&(identical(other.weight_average, weight_average) || other.weight_average == weight_average)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,weight_average); +int get hashCode => Object.hash(runtimeType,weightAverage); @override String toString() { - return 'Product(weight_average: $weight_average)'; + return 'Product(weightAverage: $weightAverage)'; } @@ -566,7 +416,7 @@ abstract mixin class $ProductCopyWith<$Res> { factory $ProductCopyWith(Product value, $Res Function(Product) _then) = _$ProductCopyWithImpl; @useResult $Res call({ - int? weight_average + int? weightAverage }); @@ -583,9 +433,9 @@ class _$ProductCopyWithImpl<$Res> /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? weight_average = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? weightAverage = freezed,}) { return _then(_self.copyWith( -weight_average: freezed == weight_average ? _self.weight_average : weight_average // ignore: cast_nullable_to_non_nullable +weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable as int?, )); } @@ -597,10 +447,10 @@ as int?, @JsonSerializable() class _Product implements Product { - _Product({this.weight_average}); + _Product({this.weightAverage}); factory _Product.fromJson(Map json) => _$ProductFromJson(json); -@override final int? weight_average; +@override final int? weightAverage; /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. @@ -615,16 +465,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Product&&(identical(other.weight_average, weight_average) || other.weight_average == weight_average)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,weight_average); +int get hashCode => Object.hash(runtimeType,weightAverage); @override String toString() { - return 'Product(weight_average: $weight_average)'; + return 'Product(weightAverage: $weightAverage)'; } @@ -635,7 +485,7 @@ abstract mixin class _$ProductCopyWith<$Res> implements $ProductCopyWith<$Res> { factory _$ProductCopyWith(_Product value, $Res Function(_Product) _then) = __$ProductCopyWithImpl; @override @useResult $Res call({ - int? weight_average + int? weightAverage }); @@ -652,9 +502,9 @@ class __$ProductCopyWithImpl<$Res> /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? weight_average = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? weightAverage = freezed,}) { return _then(_Product( -weight_average: freezed == weight_average ? _self.weight_average : weight_average // ignore: cast_nullable_to_non_nullable +weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable as int?, )); } @@ -666,7 +516,7 @@ as int?, /// @nodoc mixin _$Steward { - int? get id; User? get user; Address? get address; Activity? get guild_area_activity; Activity? get guild_type_activity; List? get kill_house; List? get steward_kill_house; List? get stewards; PosStatus? get get_pos_status; String? get key; String? get create_date; String? get modify_date; bool? get trash; dynamic get user_id_foreign_key; dynamic get address_id_foreign_key; dynamic get user_bank_id_foreign_key; dynamic get wallet_id_foreign_key; dynamic get provincial_government_id_key; dynamic get identity_documents; bool? get active; int? get city_number; String? get city_name; String? get guilds_id; String? get license_number; String? get guilds_name; String? get phone; String? get type_activity; String? get area_activity; int? get province_number; String? get province_name; bool? get steward; bool? get has_pos; dynamic get centers_allocation; dynamic get kill_house_centers_allocation; dynamic get allocation_limit; bool? get limitation_allocation; String? get registerar_role; String? get registerar_fullname; String? get registerar_mobile; bool? get kill_house_register; bool? get steward_register; bool? get guilds_room_register; bool? get pos_company_register; String? get province_accept_state; String? get province_message; String? get condition; String? get description_condition; bool? get steward_active; dynamic get steward_allocation_limit; bool? get steward_limitation_allocation; bool? get license; dynamic get license_form; dynamic get license_file; String? get reviewer_role; String? get reviewer_fullname; String? get reviewer_mobile; String? get checker_message; bool? get final_accept; bool? get temporary_registration; String? get created_by; String? get modified_by; dynamic get user_bank_info; int? get wallet; List? get cars; List? get user_level; + int? get id; User? get user; Address? get address; Activity? get guildAreaActivity; Activity? get guildTypeActivity; List? get killHouse; List? get stewardKillHouse; List? get stewards; PosStatus? get getPosStatus; String? get key; String? get createDate; String? get modifyDate; bool? get trash; dynamic get userIdForeignKey; dynamic get addressIdForeignKey; dynamic get userBankIdForeignKey; dynamic get walletIdForeignKey; dynamic get provincialGovernmentIdKey; dynamic get identityDocuments; bool? get active; int? get cityNumber; String? get cityName; String? get guildsId; String? get licenseNumber; String? get guildsName; String? get phone; String? get typeActivity; String? get areaActivity; int? get provinceNumber; String? get provinceName; bool? get steward; bool? get hasPos; dynamic get centersAllocation; dynamic get killHouseCentersAllocation; dynamic get allocationLimit; bool? get limitationAllocation; String? get registerarRole; String? get registerarFullname; String? get registerarMobile; bool? get killHouseRegister; bool? get stewardRegister; bool? get guildsRoomRegister; bool? get posCompanyRegister; String? get provinceAcceptState; String? get provinceMessage; String? get condition; String? get descriptionCondition; bool? get stewardActive; dynamic get stewardAllocationLimit; bool? get stewardLimitationAllocation; bool? get license; dynamic get licenseForm; dynamic get licenseFile; String? get reviewerRole; String? get reviewerFullname; String? get reviewerMobile; String? get checkerMessage; bool? get finalAccept; bool? get temporaryRegistration; String? get createdBy; String? get modifiedBy; dynamic get userBankInfo; int? get wallet; List? get cars; List? get userLevel; /// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -679,16 +529,16 @@ $StewardCopyWith get copyWith => _$StewardCopyWithImpl(this as @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Steward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guild_area_activity, guild_area_activity) || other.guild_area_activity == guild_area_activity)&&(identical(other.guild_type_activity, guild_type_activity) || other.guild_type_activity == guild_type_activity)&&const DeepCollectionEquality().equals(other.kill_house, kill_house)&&const DeepCollectionEquality().equals(other.steward_kill_house, steward_kill_house)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.get_pos_status, get_pos_status) || other.get_pos_status == get_pos_status)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.user_id_foreign_key, user_id_foreign_key)&&const DeepCollectionEquality().equals(other.address_id_foreign_key, address_id_foreign_key)&&const DeepCollectionEquality().equals(other.user_bank_id_foreign_key, user_bank_id_foreign_key)&&const DeepCollectionEquality().equals(other.wallet_id_foreign_key, wallet_id_foreign_key)&&const DeepCollectionEquality().equals(other.provincial_government_id_key, provincial_government_id_key)&&const DeepCollectionEquality().equals(other.identity_documents, identity_documents)&&(identical(other.active, active) || other.active == active)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.has_pos, has_pos) || other.has_pos == has_pos)&&const DeepCollectionEquality().equals(other.centers_allocation, centers_allocation)&&const DeepCollectionEquality().equals(other.kill_house_centers_allocation, kill_house_centers_allocation)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.limitation_allocation, limitation_allocation) || other.limitation_allocation == limitation_allocation)&&(identical(other.registerar_role, registerar_role) || other.registerar_role == registerar_role)&&(identical(other.registerar_fullname, registerar_fullname) || other.registerar_fullname == registerar_fullname)&&(identical(other.registerar_mobile, registerar_mobile) || other.registerar_mobile == registerar_mobile)&&(identical(other.kill_house_register, kill_house_register) || other.kill_house_register == kill_house_register)&&(identical(other.steward_register, steward_register) || other.steward_register == steward_register)&&(identical(other.guilds_room_register, guilds_room_register) || other.guilds_room_register == guilds_room_register)&&(identical(other.pos_company_register, pos_company_register) || other.pos_company_register == pos_company_register)&&(identical(other.province_accept_state, province_accept_state) || other.province_accept_state == province_accept_state)&&(identical(other.province_message, province_message) || other.province_message == province_message)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.description_condition, description_condition) || other.description_condition == description_condition)&&(identical(other.steward_active, steward_active) || other.steward_active == steward_active)&&const DeepCollectionEquality().equals(other.steward_allocation_limit, steward_allocation_limit)&&(identical(other.steward_limitation_allocation, steward_limitation_allocation) || other.steward_limitation_allocation == steward_limitation_allocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.license_form, license_form)&&const DeepCollectionEquality().equals(other.license_file, license_file)&&(identical(other.reviewer_role, reviewer_role) || other.reviewer_role == reviewer_role)&&(identical(other.reviewer_fullname, reviewer_fullname) || other.reviewer_fullname == reviewer_fullname)&&(identical(other.reviewer_mobile, reviewer_mobile) || other.reviewer_mobile == reviewer_mobile)&&(identical(other.checker_message, checker_message) || other.checker_message == checker_message)&&(identical(other.final_accept, final_accept) || other.final_accept == final_accept)&&(identical(other.temporary_registration, temporary_registration) || other.temporary_registration == temporary_registration)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.user_bank_info, user_bank_info)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other.cars, cars)&&const DeepCollectionEquality().equals(other.user_level, user_level)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Steward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.stewardKillHouse, stewardKillHouse)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.userIdForeignKey, userIdForeignKey)&&const DeepCollectionEquality().equals(other.addressIdForeignKey, addressIdForeignKey)&&const DeepCollectionEquality().equals(other.userBankIdForeignKey, userBankIdForeignKey)&&const DeepCollectionEquality().equals(other.walletIdForeignKey, walletIdForeignKey)&&const DeepCollectionEquality().equals(other.provincialGovernmentIdKey, provincialGovernmentIdKey)&&const DeepCollectionEquality().equals(other.identityDocuments, identityDocuments)&&(identical(other.active, active) || other.active == active)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&const DeepCollectionEquality().equals(other.centersAllocation, centersAllocation)&&const DeepCollectionEquality().equals(other.killHouseCentersAllocation, killHouseCentersAllocation)&&const DeepCollectionEquality().equals(other.allocationLimit, allocationLimit)&&(identical(other.limitationAllocation, limitationAllocation) || other.limitationAllocation == limitationAllocation)&&(identical(other.registerarRole, registerarRole) || other.registerarRole == registerarRole)&&(identical(other.registerarFullname, registerarFullname) || other.registerarFullname == registerarFullname)&&(identical(other.registerarMobile, registerarMobile) || other.registerarMobile == registerarMobile)&&(identical(other.killHouseRegister, killHouseRegister) || other.killHouseRegister == killHouseRegister)&&(identical(other.stewardRegister, stewardRegister) || other.stewardRegister == stewardRegister)&&(identical(other.guildsRoomRegister, guildsRoomRegister) || other.guildsRoomRegister == guildsRoomRegister)&&(identical(other.posCompanyRegister, posCompanyRegister) || other.posCompanyRegister == posCompanyRegister)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)&&(identical(other.provinceMessage, provinceMessage) || other.provinceMessage == provinceMessage)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.descriptionCondition, descriptionCondition) || other.descriptionCondition == descriptionCondition)&&(identical(other.stewardActive, stewardActive) || other.stewardActive == stewardActive)&&const DeepCollectionEquality().equals(other.stewardAllocationLimit, stewardAllocationLimit)&&(identical(other.stewardLimitationAllocation, stewardLimitationAllocation) || other.stewardLimitationAllocation == stewardLimitationAllocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.licenseForm, licenseForm)&&const DeepCollectionEquality().equals(other.licenseFile, licenseFile)&&(identical(other.reviewerRole, reviewerRole) || other.reviewerRole == reviewerRole)&&(identical(other.reviewerFullname, reviewerFullname) || other.reviewerFullname == reviewerFullname)&&(identical(other.reviewerMobile, reviewerMobile) || other.reviewerMobile == reviewerMobile)&&(identical(other.checkerMessage, checkerMessage) || other.checkerMessage == checkerMessage)&&(identical(other.finalAccept, finalAccept) || other.finalAccept == finalAccept)&&(identical(other.temporaryRegistration, temporaryRegistration) || other.temporaryRegistration == temporaryRegistration)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&const DeepCollectionEquality().equals(other.userBankInfo, userBankInfo)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other.cars, cars)&&const DeepCollectionEquality().equals(other.userLevel, userLevel)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hashAll([runtimeType,id,user,address,guild_area_activity,guild_type_activity,const DeepCollectionEquality().hash(kill_house),const DeepCollectionEquality().hash(steward_kill_house),const DeepCollectionEquality().hash(stewards),get_pos_status,key,create_date,modify_date,trash,const DeepCollectionEquality().hash(user_id_foreign_key),const DeepCollectionEquality().hash(address_id_foreign_key),const DeepCollectionEquality().hash(user_bank_id_foreign_key),const DeepCollectionEquality().hash(wallet_id_foreign_key),const DeepCollectionEquality().hash(provincial_government_id_key),const DeepCollectionEquality().hash(identity_documents),active,city_number,city_name,guilds_id,license_number,guilds_name,phone,type_activity,area_activity,province_number,province_name,steward,has_pos,const DeepCollectionEquality().hash(centers_allocation),const DeepCollectionEquality().hash(kill_house_centers_allocation),const DeepCollectionEquality().hash(allocation_limit),limitation_allocation,registerar_role,registerar_fullname,registerar_mobile,kill_house_register,steward_register,guilds_room_register,pos_company_register,province_accept_state,province_message,condition,description_condition,steward_active,const DeepCollectionEquality().hash(steward_allocation_limit),steward_limitation_allocation,license,const DeepCollectionEquality().hash(license_form),const DeepCollectionEquality().hash(license_file),reviewer_role,reviewer_fullname,reviewer_mobile,checker_message,final_accept,temporary_registration,created_by,modified_by,const DeepCollectionEquality().hash(user_bank_info),wallet,const DeepCollectionEquality().hash(cars),const DeepCollectionEquality().hash(user_level)]); +int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(stewardKillHouse),const DeepCollectionEquality().hash(stewards),getPosStatus,key,createDate,modifyDate,trash,const DeepCollectionEquality().hash(userIdForeignKey),const DeepCollectionEquality().hash(addressIdForeignKey),const DeepCollectionEquality().hash(userBankIdForeignKey),const DeepCollectionEquality().hash(walletIdForeignKey),const DeepCollectionEquality().hash(provincialGovernmentIdKey),const DeepCollectionEquality().hash(identityDocuments),active,cityNumber,cityName,guildsId,licenseNumber,guildsName,phone,typeActivity,areaActivity,provinceNumber,provinceName,steward,hasPos,const DeepCollectionEquality().hash(centersAllocation),const DeepCollectionEquality().hash(killHouseCentersAllocation),const DeepCollectionEquality().hash(allocationLimit),limitationAllocation,registerarRole,registerarFullname,registerarMobile,killHouseRegister,stewardRegister,guildsRoomRegister,posCompanyRegister,provinceAcceptState,provinceMessage,condition,descriptionCondition,stewardActive,const DeepCollectionEquality().hash(stewardAllocationLimit),stewardLimitationAllocation,license,const DeepCollectionEquality().hash(licenseForm),const DeepCollectionEquality().hash(licenseFile),reviewerRole,reviewerFullname,reviewerMobile,checkerMessage,finalAccept,temporaryRegistration,createdBy,modifiedBy,const DeepCollectionEquality().hash(userBankInfo),wallet,const DeepCollectionEquality().hash(cars),const DeepCollectionEquality().hash(userLevel)]); @override String toString() { - return 'Steward(id: $id, user: $user, address: $address, guild_area_activity: $guild_area_activity, guild_type_activity: $guild_type_activity, kill_house: $kill_house, steward_kill_house: $steward_kill_house, stewards: $stewards, get_pos_status: $get_pos_status, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, user_id_foreign_key: $user_id_foreign_key, address_id_foreign_key: $address_id_foreign_key, user_bank_id_foreign_key: $user_bank_id_foreign_key, wallet_id_foreign_key: $wallet_id_foreign_key, provincial_government_id_key: $provincial_government_id_key, identity_documents: $identity_documents, active: $active, city_number: $city_number, city_name: $city_name, guilds_id: $guilds_id, license_number: $license_number, guilds_name: $guilds_name, phone: $phone, type_activity: $type_activity, area_activity: $area_activity, province_number: $province_number, province_name: $province_name, steward: $steward, has_pos: $has_pos, centers_allocation: $centers_allocation, kill_house_centers_allocation: $kill_house_centers_allocation, allocation_limit: $allocation_limit, limitation_allocation: $limitation_allocation, registerar_role: $registerar_role, registerar_fullname: $registerar_fullname, registerar_mobile: $registerar_mobile, kill_house_register: $kill_house_register, steward_register: $steward_register, guilds_room_register: $guilds_room_register, pos_company_register: $pos_company_register, province_accept_state: $province_accept_state, province_message: $province_message, condition: $condition, description_condition: $description_condition, steward_active: $steward_active, steward_allocation_limit: $steward_allocation_limit, steward_limitation_allocation: $steward_limitation_allocation, license: $license, license_form: $license_form, license_file: $license_file, reviewer_role: $reviewer_role, reviewer_fullname: $reviewer_fullname, reviewer_mobile: $reviewer_mobile, checker_message: $checker_message, final_accept: $final_accept, temporary_registration: $temporary_registration, created_by: $created_by, modified_by: $modified_by, user_bank_info: $user_bank_info, wallet: $wallet, cars: $cars, user_level: $user_level)'; + return 'Steward(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, userIdForeignKey: $userIdForeignKey, addressIdForeignKey: $addressIdForeignKey, userBankIdForeignKey: $userBankIdForeignKey, walletIdForeignKey: $walletIdForeignKey, provincialGovernmentIdKey: $provincialGovernmentIdKey, identityDocuments: $identityDocuments, active: $active, cityNumber: $cityNumber, cityName: $cityName, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, phone: $phone, typeActivity: $typeActivity, areaActivity: $areaActivity, provinceNumber: $provinceNumber, provinceName: $provinceName, steward: $steward, hasPos: $hasPos, centersAllocation: $centersAllocation, killHouseCentersAllocation: $killHouseCentersAllocation, allocationLimit: $allocationLimit, limitationAllocation: $limitationAllocation, registerarRole: $registerarRole, registerarFullname: $registerarFullname, registerarMobile: $registerarMobile, killHouseRegister: $killHouseRegister, stewardRegister: $stewardRegister, guildsRoomRegister: $guildsRoomRegister, posCompanyRegister: $posCompanyRegister, provinceAcceptState: $provinceAcceptState, provinceMessage: $provinceMessage, condition: $condition, descriptionCondition: $descriptionCondition, stewardActive: $stewardActive, stewardAllocationLimit: $stewardAllocationLimit, stewardLimitationAllocation: $stewardLimitationAllocation, license: $license, licenseForm: $licenseForm, licenseFile: $licenseFile, reviewerRole: $reviewerRole, reviewerFullname: $reviewerFullname, reviewerMobile: $reviewerMobile, checkerMessage: $checkerMessage, finalAccept: $finalAccept, temporaryRegistration: $temporaryRegistration, createdBy: $createdBy, modifiedBy: $modifiedBy, userBankInfo: $userBankInfo, wallet: $wallet, cars: $cars, userLevel: $userLevel)'; } @@ -699,11 +549,11 @@ abstract mixin class $StewardCopyWith<$Res> { factory $StewardCopyWith(Steward value, $Res Function(Steward) _then) = _$StewardCopyWithImpl; @useResult $Res call({ - int? id, User? user, Address? address, Activity? guild_area_activity, Activity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, PosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, dynamic user_id_foreign_key, dynamic address_id_foreign_key, dynamic user_bank_id_foreign_key, dynamic wallet_id_foreign_key, dynamic provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level + int? id, User? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, String? registerarRole, String? registerarFullname, String? registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, String? provinceMessage, String? condition, String? descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, String? reviewerRole, String? reviewerFullname, String? reviewerMobile, String? checkerMessage, bool? finalAccept, bool? temporaryRegistration, String? createdBy, String? modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel }); -$UserCopyWith<$Res>? get user;$AddressCopyWith<$Res>? get address;$ActivityCopyWith<$Res>? get guild_area_activity;$ActivityCopyWith<$Res>? get guild_type_activity;$PosStatusCopyWith<$Res>? get get_pos_status; +$UserCopyWith<$Res>? get user;$AddressCopyWith<$Res>? get address;$ActivityCopyWith<$Res>? get guildAreaActivity;$ActivityCopyWith<$Res>? get guildTypeActivity;$PosStatusCopyWith<$Res>? get getPosStatus; } /// @nodoc @@ -716,73 +566,73 @@ class _$StewardCopyWithImpl<$Res> /// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guild_area_activity = freezed,Object? guild_type_activity = freezed,Object? kill_house = freezed,Object? steward_kill_house = freezed,Object? stewards = freezed,Object? get_pos_status = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? user_id_foreign_key = freezed,Object? address_id_foreign_key = freezed,Object? user_bank_id_foreign_key = freezed,Object? wallet_id_foreign_key = freezed,Object? provincial_government_id_key = freezed,Object? identity_documents = freezed,Object? active = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? guilds_id = freezed,Object? license_number = freezed,Object? guilds_name = freezed,Object? phone = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? steward = freezed,Object? has_pos = freezed,Object? centers_allocation = freezed,Object? kill_house_centers_allocation = freezed,Object? allocation_limit = freezed,Object? limitation_allocation = freezed,Object? registerar_role = freezed,Object? registerar_fullname = freezed,Object? registerar_mobile = freezed,Object? kill_house_register = freezed,Object? steward_register = freezed,Object? guilds_room_register = freezed,Object? pos_company_register = freezed,Object? province_accept_state = freezed,Object? province_message = freezed,Object? condition = freezed,Object? description_condition = freezed,Object? steward_active = freezed,Object? steward_allocation_limit = freezed,Object? steward_limitation_allocation = freezed,Object? license = freezed,Object? license_form = freezed,Object? license_file = freezed,Object? reviewer_role = freezed,Object? reviewer_fullname = freezed,Object? reviewer_mobile = freezed,Object? checker_message = freezed,Object? final_accept = freezed,Object? temporary_registration = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? user_bank_info = freezed,Object? wallet = freezed,Object? cars = freezed,Object? user_level = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? userIdForeignKey = freezed,Object? addressIdForeignKey = freezed,Object? userBankIdForeignKey = freezed,Object? walletIdForeignKey = freezed,Object? provincialGovernmentIdKey = freezed,Object? identityDocuments = freezed,Object? active = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? phone = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? centersAllocation = freezed,Object? killHouseCentersAllocation = freezed,Object? allocationLimit = freezed,Object? limitationAllocation = freezed,Object? registerarRole = freezed,Object? registerarFullname = freezed,Object? registerarMobile = freezed,Object? killHouseRegister = freezed,Object? stewardRegister = freezed,Object? guildsRoomRegister = freezed,Object? posCompanyRegister = freezed,Object? provinceAcceptState = freezed,Object? provinceMessage = freezed,Object? condition = freezed,Object? descriptionCondition = freezed,Object? stewardActive = freezed,Object? stewardAllocationLimit = freezed,Object? stewardLimitationAllocation = freezed,Object? license = freezed,Object? licenseForm = freezed,Object? licenseFile = freezed,Object? reviewerRole = freezed,Object? reviewerFullname = freezed,Object? reviewerMobile = freezed,Object? checkerMessage = freezed,Object? finalAccept = freezed,Object? temporaryRegistration = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? userBankInfo = freezed,Object? wallet = freezed,Object? cars = freezed,Object? userLevel = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable as User?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as Address?,guild_area_activity: freezed == guild_area_activity ? _self.guild_area_activity : guild_area_activity // ignore: cast_nullable_to_non_nullable -as Activity?,guild_type_activity: freezed == guild_type_activity ? _self.guild_type_activity : guild_type_activity // ignore: cast_nullable_to_non_nullable -as Activity?,kill_house: freezed == kill_house ? _self.kill_house : kill_house // ignore: cast_nullable_to_non_nullable -as List?,steward_kill_house: freezed == steward_kill_house ? _self.steward_kill_house : steward_kill_house // ignore: cast_nullable_to_non_nullable +as Address?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable +as Activity?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as Activity?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as List?,stewardKillHouse: freezed == stewardKillHouse ? _self.stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable as List?,stewards: freezed == stewards ? _self.stewards : stewards // ignore: cast_nullable_to_non_nullable -as List?,get_pos_status: freezed == get_pos_status ? _self.get_pos_status : get_pos_status // ignore: cast_nullable_to_non_nullable +as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable as PosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,user_id_foreign_key: freezed == user_id_foreign_key ? _self.user_id_foreign_key : user_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,address_id_foreign_key: freezed == address_id_foreign_key ? _self.address_id_foreign_key : address_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,user_bank_id_foreign_key: freezed == user_bank_id_foreign_key ? _self.user_bank_id_foreign_key : user_bank_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,wallet_id_foreign_key: freezed == wallet_id_foreign_key ? _self.wallet_id_foreign_key : wallet_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,provincial_government_id_key: freezed == provincial_government_id_key ? _self.provincial_government_id_key : provincial_government_id_key // ignore: cast_nullable_to_non_nullable -as dynamic,identity_documents: freezed == identity_documents ? _self.identity_documents : identity_documents // ignore: cast_nullable_to_non_nullable +as bool?,userIdForeignKey: freezed == userIdForeignKey ? _self.userIdForeignKey : userIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,addressIdForeignKey: freezed == addressIdForeignKey ? _self.addressIdForeignKey : addressIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,userBankIdForeignKey: freezed == userBankIdForeignKey ? _self.userBankIdForeignKey : userBankIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,walletIdForeignKey: freezed == walletIdForeignKey ? _self.walletIdForeignKey : walletIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,provincialGovernmentIdKey: freezed == provincialGovernmentIdKey ? _self.provincialGovernmentIdKey : provincialGovernmentIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,identityDocuments: freezed == identityDocuments ? _self.identityDocuments : identityDocuments // ignore: cast_nullable_to_non_nullable as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable -as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable -as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable -as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable -as String?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable -as String?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable -as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable -as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable -as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable -as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as bool?,has_pos: freezed == has_pos ? _self.has_pos : has_pos // ignore: cast_nullable_to_non_nullable -as bool?,centers_allocation: freezed == centers_allocation ? _self.centers_allocation : centers_allocation // ignore: cast_nullable_to_non_nullable -as dynamic,kill_house_centers_allocation: freezed == kill_house_centers_allocation ? _self.kill_house_centers_allocation : kill_house_centers_allocation // ignore: cast_nullable_to_non_nullable -as dynamic,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable -as dynamic,limitation_allocation: freezed == limitation_allocation ? _self.limitation_allocation : limitation_allocation // ignore: cast_nullable_to_non_nullable -as bool?,registerar_role: freezed == registerar_role ? _self.registerar_role : registerar_role // ignore: cast_nullable_to_non_nullable -as String?,registerar_fullname: freezed == registerar_fullname ? _self.registerar_fullname : registerar_fullname // ignore: cast_nullable_to_non_nullable -as String?,registerar_mobile: freezed == registerar_mobile ? _self.registerar_mobile : registerar_mobile // ignore: cast_nullable_to_non_nullable -as String?,kill_house_register: freezed == kill_house_register ? _self.kill_house_register : kill_house_register // ignore: cast_nullable_to_non_nullable -as bool?,steward_register: freezed == steward_register ? _self.steward_register : steward_register // ignore: cast_nullable_to_non_nullable -as bool?,guilds_room_register: freezed == guilds_room_register ? _self.guilds_room_register : guilds_room_register // ignore: cast_nullable_to_non_nullable -as bool?,pos_company_register: freezed == pos_company_register ? _self.pos_company_register : pos_company_register // ignore: cast_nullable_to_non_nullable -as bool?,province_accept_state: freezed == province_accept_state ? _self.province_accept_state : province_accept_state // ignore: cast_nullable_to_non_nullable -as String?,province_message: freezed == province_message ? _self.province_message : province_message // ignore: cast_nullable_to_non_nullable +as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,centersAllocation: freezed == centersAllocation ? _self.centersAllocation : centersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,killHouseCentersAllocation: freezed == killHouseCentersAllocation ? _self.killHouseCentersAllocation : killHouseCentersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,limitationAllocation: freezed == limitationAllocation ? _self.limitationAllocation : limitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,registerarRole: freezed == registerarRole ? _self.registerarRole : registerarRole // ignore: cast_nullable_to_non_nullable +as String?,registerarFullname: freezed == registerarFullname ? _self.registerarFullname : registerarFullname // ignore: cast_nullable_to_non_nullable +as String?,registerarMobile: freezed == registerarMobile ? _self.registerarMobile : registerarMobile // ignore: cast_nullable_to_non_nullable +as String?,killHouseRegister: freezed == killHouseRegister ? _self.killHouseRegister : killHouseRegister // ignore: cast_nullable_to_non_nullable +as bool?,stewardRegister: freezed == stewardRegister ? _self.stewardRegister : stewardRegister // ignore: cast_nullable_to_non_nullable +as bool?,guildsRoomRegister: freezed == guildsRoomRegister ? _self.guildsRoomRegister : guildsRoomRegister // ignore: cast_nullable_to_non_nullable +as bool?,posCompanyRegister: freezed == posCompanyRegister ? _self.posCompanyRegister : posCompanyRegister // ignore: cast_nullable_to_non_nullable +as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable +as String?,provinceMessage: freezed == provinceMessage ? _self.provinceMessage : provinceMessage // ignore: cast_nullable_to_non_nullable as String?,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable -as String?,description_condition: freezed == description_condition ? _self.description_condition : description_condition // ignore: cast_nullable_to_non_nullable -as String?,steward_active: freezed == steward_active ? _self.steward_active : steward_active // ignore: cast_nullable_to_non_nullable -as bool?,steward_allocation_limit: freezed == steward_allocation_limit ? _self.steward_allocation_limit : steward_allocation_limit // ignore: cast_nullable_to_non_nullable -as dynamic,steward_limitation_allocation: freezed == steward_limitation_allocation ? _self.steward_limitation_allocation : steward_limitation_allocation // ignore: cast_nullable_to_non_nullable +as String?,descriptionCondition: freezed == descriptionCondition ? _self.descriptionCondition : descriptionCondition // ignore: cast_nullable_to_non_nullable +as String?,stewardActive: freezed == stewardActive ? _self.stewardActive : stewardActive // ignore: cast_nullable_to_non_nullable +as bool?,stewardAllocationLimit: freezed == stewardAllocationLimit ? _self.stewardAllocationLimit : stewardAllocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,stewardLimitationAllocation: freezed == stewardLimitationAllocation ? _self.stewardLimitationAllocation : stewardLimitationAllocation // ignore: cast_nullable_to_non_nullable as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable -as bool?,license_form: freezed == license_form ? _self.license_form : license_form // ignore: cast_nullable_to_non_nullable -as dynamic,license_file: freezed == license_file ? _self.license_file : license_file // ignore: cast_nullable_to_non_nullable -as dynamic,reviewer_role: freezed == reviewer_role ? _self.reviewer_role : reviewer_role // ignore: cast_nullable_to_non_nullable -as String?,reviewer_fullname: freezed == reviewer_fullname ? _self.reviewer_fullname : reviewer_fullname // ignore: cast_nullable_to_non_nullable -as String?,reviewer_mobile: freezed == reviewer_mobile ? _self.reviewer_mobile : reviewer_mobile // ignore: cast_nullable_to_non_nullable -as String?,checker_message: freezed == checker_message ? _self.checker_message : checker_message // ignore: cast_nullable_to_non_nullable -as String?,final_accept: freezed == final_accept ? _self.final_accept : final_accept // ignore: cast_nullable_to_non_nullable -as bool?,temporary_registration: freezed == temporary_registration ? _self.temporary_registration : temporary_registration // ignore: cast_nullable_to_non_nullable -as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable -as String?,user_bank_info: freezed == user_bank_info ? _self.user_bank_info : user_bank_info // ignore: cast_nullable_to_non_nullable +as bool?,licenseForm: freezed == licenseForm ? _self.licenseForm : licenseForm // ignore: cast_nullable_to_non_nullable +as dynamic,licenseFile: freezed == licenseFile ? _self.licenseFile : licenseFile // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerRole: freezed == reviewerRole ? _self.reviewerRole : reviewerRole // ignore: cast_nullable_to_non_nullable +as String?,reviewerFullname: freezed == reviewerFullname ? _self.reviewerFullname : reviewerFullname // ignore: cast_nullable_to_non_nullable +as String?,reviewerMobile: freezed == reviewerMobile ? _self.reviewerMobile : reviewerMobile // ignore: cast_nullable_to_non_nullable +as String?,checkerMessage: freezed == checkerMessage ? _self.checkerMessage : checkerMessage // ignore: cast_nullable_to_non_nullable +as String?,finalAccept: freezed == finalAccept ? _self.finalAccept : finalAccept // ignore: cast_nullable_to_non_nullable +as bool?,temporaryRegistration: freezed == temporaryRegistration ? _self.temporaryRegistration : temporaryRegistration // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as String?,userBankInfo: freezed == userBankInfo ? _self.userBankInfo : userBankInfo // ignore: cast_nullable_to_non_nullable as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable as int?,cars: freezed == cars ? _self.cars : cars // ignore: cast_nullable_to_non_nullable -as List?,user_level: freezed == user_level ? _self.user_level : user_level // ignore: cast_nullable_to_non_nullable +as List?,userLevel: freezed == userLevel ? _self.userLevel : userLevel // ignore: cast_nullable_to_non_nullable as List?, )); } @@ -814,37 +664,37 @@ $AddressCopyWith<$Res>? get address { /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ActivityCopyWith<$Res>? get guild_area_activity { - if (_self.guild_area_activity == null) { +$ActivityCopyWith<$Res>? get guildAreaActivity { + if (_self.guildAreaActivity == null) { return null; } - return $ActivityCopyWith<$Res>(_self.guild_area_activity!, (value) { - return _then(_self.copyWith(guild_area_activity: value)); + return $ActivityCopyWith<$Res>(_self.guildAreaActivity!, (value) { + return _then(_self.copyWith(guildAreaActivity: value)); }); }/// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ActivityCopyWith<$Res>? get guild_type_activity { - if (_self.guild_type_activity == null) { +$ActivityCopyWith<$Res>? get guildTypeActivity { + if (_self.guildTypeActivity == null) { return null; } - return $ActivityCopyWith<$Res>(_self.guild_type_activity!, (value) { - return _then(_self.copyWith(guild_type_activity: value)); + return $ActivityCopyWith<$Res>(_self.guildTypeActivity!, (value) { + return _then(_self.copyWith(guildTypeActivity: value)); }); }/// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$PosStatusCopyWith<$Res>? get get_pos_status { - if (_self.get_pos_status == null) { +$PosStatusCopyWith<$Res>? get getPosStatus { + if (_self.getPosStatus == null) { return null; } - return $PosStatusCopyWith<$Res>(_self.get_pos_status!, (value) { - return _then(_self.copyWith(get_pos_status: value)); + return $PosStatusCopyWith<$Res>(_self.getPosStatus!, (value) { + return _then(_self.copyWith(getPosStatus: value)); }); } } @@ -854,28 +704,28 @@ $PosStatusCopyWith<$Res>? get get_pos_status { @JsonSerializable() class _Steward implements Steward { - _Steward({this.id, this.user, this.address, this.guild_area_activity, this.guild_type_activity, final List? kill_house, final List? steward_kill_house, final List? stewards, this.get_pos_status, this.key, this.create_date, this.modify_date, this.trash, this.user_id_foreign_key, this.address_id_foreign_key, this.user_bank_id_foreign_key, this.wallet_id_foreign_key, this.provincial_government_id_key, this.identity_documents, this.active, this.city_number, this.city_name, this.guilds_id, this.license_number, this.guilds_name, this.phone, this.type_activity, this.area_activity, this.province_number, this.province_name, this.steward, this.has_pos, this.centers_allocation, this.kill_house_centers_allocation, this.allocation_limit, this.limitation_allocation, this.registerar_role, this.registerar_fullname, this.registerar_mobile, this.kill_house_register, this.steward_register, this.guilds_room_register, this.pos_company_register, this.province_accept_state, this.province_message, this.condition, this.description_condition, this.steward_active, this.steward_allocation_limit, this.steward_limitation_allocation, this.license, this.license_form, this.license_file, this.reviewer_role, this.reviewer_fullname, this.reviewer_mobile, this.checker_message, this.final_accept, this.temporary_registration, this.created_by, this.modified_by, this.user_bank_info, this.wallet, final List? cars, final List? user_level}): _kill_house = kill_house,_steward_kill_house = steward_kill_house,_stewards = stewards,_cars = cars,_user_level = user_level; + _Steward({this.id, this.user, this.address, this.guildAreaActivity, this.guildTypeActivity, final List? killHouse, final List? stewardKillHouse, final List? stewards, this.getPosStatus, this.key, this.createDate, this.modifyDate, this.trash, this.userIdForeignKey, this.addressIdForeignKey, this.userBankIdForeignKey, this.walletIdForeignKey, this.provincialGovernmentIdKey, this.identityDocuments, this.active, this.cityNumber, this.cityName, this.guildsId, this.licenseNumber, this.guildsName, this.phone, this.typeActivity, this.areaActivity, this.provinceNumber, this.provinceName, this.steward, this.hasPos, this.centersAllocation, this.killHouseCentersAllocation, this.allocationLimit, this.limitationAllocation, this.registerarRole, this.registerarFullname, this.registerarMobile, this.killHouseRegister, this.stewardRegister, this.guildsRoomRegister, this.posCompanyRegister, this.provinceAcceptState, this.provinceMessage, this.condition, this.descriptionCondition, this.stewardActive, this.stewardAllocationLimit, this.stewardLimitationAllocation, this.license, this.licenseForm, this.licenseFile, this.reviewerRole, this.reviewerFullname, this.reviewerMobile, this.checkerMessage, this.finalAccept, this.temporaryRegistration, this.createdBy, this.modifiedBy, this.userBankInfo, this.wallet, final List? cars, final List? userLevel}): _killHouse = killHouse,_stewardKillHouse = stewardKillHouse,_stewards = stewards,_cars = cars,_userLevel = userLevel; factory _Steward.fromJson(Map json) => _$StewardFromJson(json); @override final int? id; @override final User? user; @override final Address? address; -@override final Activity? guild_area_activity; -@override final Activity? guild_type_activity; - final List? _kill_house; -@override List? get kill_house { - final value = _kill_house; +@override final Activity? guildAreaActivity; +@override final Activity? guildTypeActivity; + final List? _killHouse; +@override List? get killHouse { + final value = _killHouse; if (value == null) return null; - if (_kill_house is EqualUnmodifiableListView) return _kill_house; + if (_killHouse is EqualUnmodifiableListView) return _killHouse; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(value); } - final List? _steward_kill_house; -@override List? get steward_kill_house { - final value = _steward_kill_house; + final List? _stewardKillHouse; +@override List? get stewardKillHouse { + final value = _stewardKillHouse; if (value == null) return null; - if (_steward_kill_house is EqualUnmodifiableListView) return _steward_kill_house; + if (_stewardKillHouse is EqualUnmodifiableListView) return _stewardKillHouse; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(value); } @@ -889,60 +739,60 @@ class _Steward implements Steward { return EqualUnmodifiableListView(value); } -@override final PosStatus? get_pos_status; +@override final PosStatus? getPosStatus; @override final String? key; -@override final String? create_date; -@override final String? modify_date; +@override final String? createDate; +@override final String? modifyDate; @override final bool? trash; -@override final dynamic user_id_foreign_key; -@override final dynamic address_id_foreign_key; -@override final dynamic user_bank_id_foreign_key; -@override final dynamic wallet_id_foreign_key; -@override final dynamic provincial_government_id_key; -@override final dynamic identity_documents; +@override final dynamic userIdForeignKey; +@override final dynamic addressIdForeignKey; +@override final dynamic userBankIdForeignKey; +@override final dynamic walletIdForeignKey; +@override final dynamic provincialGovernmentIdKey; +@override final dynamic identityDocuments; @override final bool? active; -@override final int? city_number; -@override final String? city_name; -@override final String? guilds_id; -@override final String? license_number; -@override final String? guilds_name; +@override final int? cityNumber; +@override final String? cityName; +@override final String? guildsId; +@override final String? licenseNumber; +@override final String? guildsName; @override final String? phone; -@override final String? type_activity; -@override final String? area_activity; -@override final int? province_number; -@override final String? province_name; +@override final String? typeActivity; +@override final String? areaActivity; +@override final int? provinceNumber; +@override final String? provinceName; @override final bool? steward; -@override final bool? has_pos; -@override final dynamic centers_allocation; -@override final dynamic kill_house_centers_allocation; -@override final dynamic allocation_limit; -@override final bool? limitation_allocation; -@override final String? registerar_role; -@override final String? registerar_fullname; -@override final String? registerar_mobile; -@override final bool? kill_house_register; -@override final bool? steward_register; -@override final bool? guilds_room_register; -@override final bool? pos_company_register; -@override final String? province_accept_state; -@override final String? province_message; +@override final bool? hasPos; +@override final dynamic centersAllocation; +@override final dynamic killHouseCentersAllocation; +@override final dynamic allocationLimit; +@override final bool? limitationAllocation; +@override final String? registerarRole; +@override final String? registerarFullname; +@override final String? registerarMobile; +@override final bool? killHouseRegister; +@override final bool? stewardRegister; +@override final bool? guildsRoomRegister; +@override final bool? posCompanyRegister; +@override final String? provinceAcceptState; +@override final String? provinceMessage; @override final String? condition; -@override final String? description_condition; -@override final bool? steward_active; -@override final dynamic steward_allocation_limit; -@override final bool? steward_limitation_allocation; +@override final String? descriptionCondition; +@override final bool? stewardActive; +@override final dynamic stewardAllocationLimit; +@override final bool? stewardLimitationAllocation; @override final bool? license; -@override final dynamic license_form; -@override final dynamic license_file; -@override final String? reviewer_role; -@override final String? reviewer_fullname; -@override final String? reviewer_mobile; -@override final String? checker_message; -@override final bool? final_accept; -@override final bool? temporary_registration; -@override final String? created_by; -@override final String? modified_by; -@override final dynamic user_bank_info; +@override final dynamic licenseForm; +@override final dynamic licenseFile; +@override final String? reviewerRole; +@override final String? reviewerFullname; +@override final String? reviewerMobile; +@override final String? checkerMessage; +@override final bool? finalAccept; +@override final bool? temporaryRegistration; +@override final String? createdBy; +@override final String? modifiedBy; +@override final dynamic userBankInfo; @override final int? wallet; final List? _cars; @override List? get cars { @@ -953,11 +803,11 @@ class _Steward implements Steward { return EqualUnmodifiableListView(value); } - final List? _user_level; -@override List? get user_level { - final value = _user_level; + final List? _userLevel; +@override List? get userLevel { + final value = _userLevel; if (value == null) return null; - if (_user_level is EqualUnmodifiableListView) return _user_level; + if (_userLevel is EqualUnmodifiableListView) return _userLevel; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(value); } @@ -976,16 +826,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Steward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guild_area_activity, guild_area_activity) || other.guild_area_activity == guild_area_activity)&&(identical(other.guild_type_activity, guild_type_activity) || other.guild_type_activity == guild_type_activity)&&const DeepCollectionEquality().equals(other._kill_house, _kill_house)&&const DeepCollectionEquality().equals(other._steward_kill_house, _steward_kill_house)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.get_pos_status, get_pos_status) || other.get_pos_status == get_pos_status)&&(identical(other.key, key) || other.key == key)&&(identical(other.create_date, create_date) || other.create_date == create_date)&&(identical(other.modify_date, modify_date) || other.modify_date == modify_date)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.user_id_foreign_key, user_id_foreign_key)&&const DeepCollectionEquality().equals(other.address_id_foreign_key, address_id_foreign_key)&&const DeepCollectionEquality().equals(other.user_bank_id_foreign_key, user_bank_id_foreign_key)&&const DeepCollectionEquality().equals(other.wallet_id_foreign_key, wallet_id_foreign_key)&&const DeepCollectionEquality().equals(other.provincial_government_id_key, provincial_government_id_key)&&const DeepCollectionEquality().equals(other.identity_documents, identity_documents)&&(identical(other.active, active) || other.active == active)&&(identical(other.city_number, city_number) || other.city_number == city_number)&&(identical(other.city_name, city_name) || other.city_name == city_name)&&(identical(other.guilds_id, guilds_id) || other.guilds_id == guilds_id)&&(identical(other.license_number, license_number) || other.license_number == license_number)&&(identical(other.guilds_name, guilds_name) || other.guilds_name == guilds_name)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.type_activity, type_activity) || other.type_activity == type_activity)&&(identical(other.area_activity, area_activity) || other.area_activity == area_activity)&&(identical(other.province_number, province_number) || other.province_number == province_number)&&(identical(other.province_name, province_name) || other.province_name == province_name)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.has_pos, has_pos) || other.has_pos == has_pos)&&const DeepCollectionEquality().equals(other.centers_allocation, centers_allocation)&&const DeepCollectionEquality().equals(other.kill_house_centers_allocation, kill_house_centers_allocation)&&const DeepCollectionEquality().equals(other.allocation_limit, allocation_limit)&&(identical(other.limitation_allocation, limitation_allocation) || other.limitation_allocation == limitation_allocation)&&(identical(other.registerar_role, registerar_role) || other.registerar_role == registerar_role)&&(identical(other.registerar_fullname, registerar_fullname) || other.registerar_fullname == registerar_fullname)&&(identical(other.registerar_mobile, registerar_mobile) || other.registerar_mobile == registerar_mobile)&&(identical(other.kill_house_register, kill_house_register) || other.kill_house_register == kill_house_register)&&(identical(other.steward_register, steward_register) || other.steward_register == steward_register)&&(identical(other.guilds_room_register, guilds_room_register) || other.guilds_room_register == guilds_room_register)&&(identical(other.pos_company_register, pos_company_register) || other.pos_company_register == pos_company_register)&&(identical(other.province_accept_state, province_accept_state) || other.province_accept_state == province_accept_state)&&(identical(other.province_message, province_message) || other.province_message == province_message)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.description_condition, description_condition) || other.description_condition == description_condition)&&(identical(other.steward_active, steward_active) || other.steward_active == steward_active)&&const DeepCollectionEquality().equals(other.steward_allocation_limit, steward_allocation_limit)&&(identical(other.steward_limitation_allocation, steward_limitation_allocation) || other.steward_limitation_allocation == steward_limitation_allocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.license_form, license_form)&&const DeepCollectionEquality().equals(other.license_file, license_file)&&(identical(other.reviewer_role, reviewer_role) || other.reviewer_role == reviewer_role)&&(identical(other.reviewer_fullname, reviewer_fullname) || other.reviewer_fullname == reviewer_fullname)&&(identical(other.reviewer_mobile, reviewer_mobile) || other.reviewer_mobile == reviewer_mobile)&&(identical(other.checker_message, checker_message) || other.checker_message == checker_message)&&(identical(other.final_accept, final_accept) || other.final_accept == final_accept)&&(identical(other.temporary_registration, temporary_registration) || other.temporary_registration == temporary_registration)&&(identical(other.created_by, created_by) || other.created_by == created_by)&&(identical(other.modified_by, modified_by) || other.modified_by == modified_by)&&const DeepCollectionEquality().equals(other.user_bank_info, user_bank_info)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other._cars, _cars)&&const DeepCollectionEquality().equals(other._user_level, _user_level)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Steward&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other._killHouse, _killHouse)&&const DeepCollectionEquality().equals(other._stewardKillHouse, _stewardKillHouse)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&const DeepCollectionEquality().equals(other.userIdForeignKey, userIdForeignKey)&&const DeepCollectionEquality().equals(other.addressIdForeignKey, addressIdForeignKey)&&const DeepCollectionEquality().equals(other.userBankIdForeignKey, userBankIdForeignKey)&&const DeepCollectionEquality().equals(other.walletIdForeignKey, walletIdForeignKey)&&const DeepCollectionEquality().equals(other.provincialGovernmentIdKey, provincialGovernmentIdKey)&&const DeepCollectionEquality().equals(other.identityDocuments, identityDocuments)&&(identical(other.active, active) || other.active == active)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&const DeepCollectionEquality().equals(other.centersAllocation, centersAllocation)&&const DeepCollectionEquality().equals(other.killHouseCentersAllocation, killHouseCentersAllocation)&&const DeepCollectionEquality().equals(other.allocationLimit, allocationLimit)&&(identical(other.limitationAllocation, limitationAllocation) || other.limitationAllocation == limitationAllocation)&&(identical(other.registerarRole, registerarRole) || other.registerarRole == registerarRole)&&(identical(other.registerarFullname, registerarFullname) || other.registerarFullname == registerarFullname)&&(identical(other.registerarMobile, registerarMobile) || other.registerarMobile == registerarMobile)&&(identical(other.killHouseRegister, killHouseRegister) || other.killHouseRegister == killHouseRegister)&&(identical(other.stewardRegister, stewardRegister) || other.stewardRegister == stewardRegister)&&(identical(other.guildsRoomRegister, guildsRoomRegister) || other.guildsRoomRegister == guildsRoomRegister)&&(identical(other.posCompanyRegister, posCompanyRegister) || other.posCompanyRegister == posCompanyRegister)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)&&(identical(other.provinceMessage, provinceMessage) || other.provinceMessage == provinceMessage)&&(identical(other.condition, condition) || other.condition == condition)&&(identical(other.descriptionCondition, descriptionCondition) || other.descriptionCondition == descriptionCondition)&&(identical(other.stewardActive, stewardActive) || other.stewardActive == stewardActive)&&const DeepCollectionEquality().equals(other.stewardAllocationLimit, stewardAllocationLimit)&&(identical(other.stewardLimitationAllocation, stewardLimitationAllocation) || other.stewardLimitationAllocation == stewardLimitationAllocation)&&(identical(other.license, license) || other.license == license)&&const DeepCollectionEquality().equals(other.licenseForm, licenseForm)&&const DeepCollectionEquality().equals(other.licenseFile, licenseFile)&&(identical(other.reviewerRole, reviewerRole) || other.reviewerRole == reviewerRole)&&(identical(other.reviewerFullname, reviewerFullname) || other.reviewerFullname == reviewerFullname)&&(identical(other.reviewerMobile, reviewerMobile) || other.reviewerMobile == reviewerMobile)&&(identical(other.checkerMessage, checkerMessage) || other.checkerMessage == checkerMessage)&&(identical(other.finalAccept, finalAccept) || other.finalAccept == finalAccept)&&(identical(other.temporaryRegistration, temporaryRegistration) || other.temporaryRegistration == temporaryRegistration)&&(identical(other.createdBy, createdBy) || other.createdBy == createdBy)&&(identical(other.modifiedBy, modifiedBy) || other.modifiedBy == modifiedBy)&&const DeepCollectionEquality().equals(other.userBankInfo, userBankInfo)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other._cars, _cars)&&const DeepCollectionEquality().equals(other._userLevel, _userLevel)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hashAll([runtimeType,id,user,address,guild_area_activity,guild_type_activity,const DeepCollectionEquality().hash(_kill_house),const DeepCollectionEquality().hash(_steward_kill_house),const DeepCollectionEquality().hash(_stewards),get_pos_status,key,create_date,modify_date,trash,const DeepCollectionEquality().hash(user_id_foreign_key),const DeepCollectionEquality().hash(address_id_foreign_key),const DeepCollectionEquality().hash(user_bank_id_foreign_key),const DeepCollectionEquality().hash(wallet_id_foreign_key),const DeepCollectionEquality().hash(provincial_government_id_key),const DeepCollectionEquality().hash(identity_documents),active,city_number,city_name,guilds_id,license_number,guilds_name,phone,type_activity,area_activity,province_number,province_name,steward,has_pos,const DeepCollectionEquality().hash(centers_allocation),const DeepCollectionEquality().hash(kill_house_centers_allocation),const DeepCollectionEquality().hash(allocation_limit),limitation_allocation,registerar_role,registerar_fullname,registerar_mobile,kill_house_register,steward_register,guilds_room_register,pos_company_register,province_accept_state,province_message,condition,description_condition,steward_active,const DeepCollectionEquality().hash(steward_allocation_limit),steward_limitation_allocation,license,const DeepCollectionEquality().hash(license_form),const DeepCollectionEquality().hash(license_file),reviewer_role,reviewer_fullname,reviewer_mobile,checker_message,final_accept,temporary_registration,created_by,modified_by,const DeepCollectionEquality().hash(user_bank_info),wallet,const DeepCollectionEquality().hash(_cars),const DeepCollectionEquality().hash(_user_level)]); +int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(_killHouse),const DeepCollectionEquality().hash(_stewardKillHouse),const DeepCollectionEquality().hash(_stewards),getPosStatus,key,createDate,modifyDate,trash,const DeepCollectionEquality().hash(userIdForeignKey),const DeepCollectionEquality().hash(addressIdForeignKey),const DeepCollectionEquality().hash(userBankIdForeignKey),const DeepCollectionEquality().hash(walletIdForeignKey),const DeepCollectionEquality().hash(provincialGovernmentIdKey),const DeepCollectionEquality().hash(identityDocuments),active,cityNumber,cityName,guildsId,licenseNumber,guildsName,phone,typeActivity,areaActivity,provinceNumber,provinceName,steward,hasPos,const DeepCollectionEquality().hash(centersAllocation),const DeepCollectionEquality().hash(killHouseCentersAllocation),const DeepCollectionEquality().hash(allocationLimit),limitationAllocation,registerarRole,registerarFullname,registerarMobile,killHouseRegister,stewardRegister,guildsRoomRegister,posCompanyRegister,provinceAcceptState,provinceMessage,condition,descriptionCondition,stewardActive,const DeepCollectionEquality().hash(stewardAllocationLimit),stewardLimitationAllocation,license,const DeepCollectionEquality().hash(licenseForm),const DeepCollectionEquality().hash(licenseFile),reviewerRole,reviewerFullname,reviewerMobile,checkerMessage,finalAccept,temporaryRegistration,createdBy,modifiedBy,const DeepCollectionEquality().hash(userBankInfo),wallet,const DeepCollectionEquality().hash(_cars),const DeepCollectionEquality().hash(_userLevel)]); @override String toString() { - return 'Steward(id: $id, user: $user, address: $address, guild_area_activity: $guild_area_activity, guild_type_activity: $guild_type_activity, kill_house: $kill_house, steward_kill_house: $steward_kill_house, stewards: $stewards, get_pos_status: $get_pos_status, key: $key, create_date: $create_date, modify_date: $modify_date, trash: $trash, user_id_foreign_key: $user_id_foreign_key, address_id_foreign_key: $address_id_foreign_key, user_bank_id_foreign_key: $user_bank_id_foreign_key, wallet_id_foreign_key: $wallet_id_foreign_key, provincial_government_id_key: $provincial_government_id_key, identity_documents: $identity_documents, active: $active, city_number: $city_number, city_name: $city_name, guilds_id: $guilds_id, license_number: $license_number, guilds_name: $guilds_name, phone: $phone, type_activity: $type_activity, area_activity: $area_activity, province_number: $province_number, province_name: $province_name, steward: $steward, has_pos: $has_pos, centers_allocation: $centers_allocation, kill_house_centers_allocation: $kill_house_centers_allocation, allocation_limit: $allocation_limit, limitation_allocation: $limitation_allocation, registerar_role: $registerar_role, registerar_fullname: $registerar_fullname, registerar_mobile: $registerar_mobile, kill_house_register: $kill_house_register, steward_register: $steward_register, guilds_room_register: $guilds_room_register, pos_company_register: $pos_company_register, province_accept_state: $province_accept_state, province_message: $province_message, condition: $condition, description_condition: $description_condition, steward_active: $steward_active, steward_allocation_limit: $steward_allocation_limit, steward_limitation_allocation: $steward_limitation_allocation, license: $license, license_form: $license_form, license_file: $license_file, reviewer_role: $reviewer_role, reviewer_fullname: $reviewer_fullname, reviewer_mobile: $reviewer_mobile, checker_message: $checker_message, final_accept: $final_accept, temporary_registration: $temporary_registration, created_by: $created_by, modified_by: $modified_by, user_bank_info: $user_bank_info, wallet: $wallet, cars: $cars, user_level: $user_level)'; + return 'Steward(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, userIdForeignKey: $userIdForeignKey, addressIdForeignKey: $addressIdForeignKey, userBankIdForeignKey: $userBankIdForeignKey, walletIdForeignKey: $walletIdForeignKey, provincialGovernmentIdKey: $provincialGovernmentIdKey, identityDocuments: $identityDocuments, active: $active, cityNumber: $cityNumber, cityName: $cityName, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, phone: $phone, typeActivity: $typeActivity, areaActivity: $areaActivity, provinceNumber: $provinceNumber, provinceName: $provinceName, steward: $steward, hasPos: $hasPos, centersAllocation: $centersAllocation, killHouseCentersAllocation: $killHouseCentersAllocation, allocationLimit: $allocationLimit, limitationAllocation: $limitationAllocation, registerarRole: $registerarRole, registerarFullname: $registerarFullname, registerarMobile: $registerarMobile, killHouseRegister: $killHouseRegister, stewardRegister: $stewardRegister, guildsRoomRegister: $guildsRoomRegister, posCompanyRegister: $posCompanyRegister, provinceAcceptState: $provinceAcceptState, provinceMessage: $provinceMessage, condition: $condition, descriptionCondition: $descriptionCondition, stewardActive: $stewardActive, stewardAllocationLimit: $stewardAllocationLimit, stewardLimitationAllocation: $stewardLimitationAllocation, license: $license, licenseForm: $licenseForm, licenseFile: $licenseFile, reviewerRole: $reviewerRole, reviewerFullname: $reviewerFullname, reviewerMobile: $reviewerMobile, checkerMessage: $checkerMessage, finalAccept: $finalAccept, temporaryRegistration: $temporaryRegistration, createdBy: $createdBy, modifiedBy: $modifiedBy, userBankInfo: $userBankInfo, wallet: $wallet, cars: $cars, userLevel: $userLevel)'; } @@ -996,11 +846,11 @@ abstract mixin class _$StewardCopyWith<$Res> implements $StewardCopyWith<$Res> { factory _$StewardCopyWith(_Steward value, $Res Function(_Steward) _then) = __$StewardCopyWithImpl; @override @useResult $Res call({ - int? id, User? user, Address? address, Activity? guild_area_activity, Activity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, PosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, dynamic user_id_foreign_key, dynamic address_id_foreign_key, dynamic user_bank_id_foreign_key, dynamic wallet_id_foreign_key, dynamic provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level + int? id, User? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, String? registerarRole, String? registerarFullname, String? registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, String? provinceMessage, String? condition, String? descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, String? reviewerRole, String? reviewerFullname, String? reviewerMobile, String? checkerMessage, bool? finalAccept, bool? temporaryRegistration, String? createdBy, String? modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel }); -@override $UserCopyWith<$Res>? get user;@override $AddressCopyWith<$Res>? get address;@override $ActivityCopyWith<$Res>? get guild_area_activity;@override $ActivityCopyWith<$Res>? get guild_type_activity;@override $PosStatusCopyWith<$Res>? get get_pos_status; +@override $UserCopyWith<$Res>? get user;@override $AddressCopyWith<$Res>? get address;@override $ActivityCopyWith<$Res>? get guildAreaActivity;@override $ActivityCopyWith<$Res>? get guildTypeActivity;@override $PosStatusCopyWith<$Res>? get getPosStatus; } /// @nodoc @@ -1013,73 +863,73 @@ class __$StewardCopyWithImpl<$Res> /// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guild_area_activity = freezed,Object? guild_type_activity = freezed,Object? kill_house = freezed,Object? steward_kill_house = freezed,Object? stewards = freezed,Object? get_pos_status = freezed,Object? key = freezed,Object? create_date = freezed,Object? modify_date = freezed,Object? trash = freezed,Object? user_id_foreign_key = freezed,Object? address_id_foreign_key = freezed,Object? user_bank_id_foreign_key = freezed,Object? wallet_id_foreign_key = freezed,Object? provincial_government_id_key = freezed,Object? identity_documents = freezed,Object? active = freezed,Object? city_number = freezed,Object? city_name = freezed,Object? guilds_id = freezed,Object? license_number = freezed,Object? guilds_name = freezed,Object? phone = freezed,Object? type_activity = freezed,Object? area_activity = freezed,Object? province_number = freezed,Object? province_name = freezed,Object? steward = freezed,Object? has_pos = freezed,Object? centers_allocation = freezed,Object? kill_house_centers_allocation = freezed,Object? allocation_limit = freezed,Object? limitation_allocation = freezed,Object? registerar_role = freezed,Object? registerar_fullname = freezed,Object? registerar_mobile = freezed,Object? kill_house_register = freezed,Object? steward_register = freezed,Object? guilds_room_register = freezed,Object? pos_company_register = freezed,Object? province_accept_state = freezed,Object? province_message = freezed,Object? condition = freezed,Object? description_condition = freezed,Object? steward_active = freezed,Object? steward_allocation_limit = freezed,Object? steward_limitation_allocation = freezed,Object? license = freezed,Object? license_form = freezed,Object? license_file = freezed,Object? reviewer_role = freezed,Object? reviewer_fullname = freezed,Object? reviewer_mobile = freezed,Object? checker_message = freezed,Object? final_accept = freezed,Object? temporary_registration = freezed,Object? created_by = freezed,Object? modified_by = freezed,Object? user_bank_info = freezed,Object? wallet = freezed,Object? cars = freezed,Object? user_level = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? userIdForeignKey = freezed,Object? addressIdForeignKey = freezed,Object? userBankIdForeignKey = freezed,Object? walletIdForeignKey = freezed,Object? provincialGovernmentIdKey = freezed,Object? identityDocuments = freezed,Object? active = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? phone = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? centersAllocation = freezed,Object? killHouseCentersAllocation = freezed,Object? allocationLimit = freezed,Object? limitationAllocation = freezed,Object? registerarRole = freezed,Object? registerarFullname = freezed,Object? registerarMobile = freezed,Object? killHouseRegister = freezed,Object? stewardRegister = freezed,Object? guildsRoomRegister = freezed,Object? posCompanyRegister = freezed,Object? provinceAcceptState = freezed,Object? provinceMessage = freezed,Object? condition = freezed,Object? descriptionCondition = freezed,Object? stewardActive = freezed,Object? stewardAllocationLimit = freezed,Object? stewardLimitationAllocation = freezed,Object? license = freezed,Object? licenseForm = freezed,Object? licenseFile = freezed,Object? reviewerRole = freezed,Object? reviewerFullname = freezed,Object? reviewerMobile = freezed,Object? checkerMessage = freezed,Object? finalAccept = freezed,Object? temporaryRegistration = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? userBankInfo = freezed,Object? wallet = freezed,Object? cars = freezed,Object? userLevel = freezed,}) { return _then(_Steward( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable as User?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as Address?,guild_area_activity: freezed == guild_area_activity ? _self.guild_area_activity : guild_area_activity // ignore: cast_nullable_to_non_nullable -as Activity?,guild_type_activity: freezed == guild_type_activity ? _self.guild_type_activity : guild_type_activity // ignore: cast_nullable_to_non_nullable -as Activity?,kill_house: freezed == kill_house ? _self._kill_house : kill_house // ignore: cast_nullable_to_non_nullable -as List?,steward_kill_house: freezed == steward_kill_house ? _self._steward_kill_house : steward_kill_house // ignore: cast_nullable_to_non_nullable +as Address?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable +as Activity?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as Activity?,killHouse: freezed == killHouse ? _self._killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as List?,stewardKillHouse: freezed == stewardKillHouse ? _self._stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable as List?,stewards: freezed == stewards ? _self._stewards : stewards // ignore: cast_nullable_to_non_nullable -as List?,get_pos_status: freezed == get_pos_status ? _self.get_pos_status : get_pos_status // ignore: cast_nullable_to_non_nullable +as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable as PosStatus?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,create_date: freezed == create_date ? _self.create_date : create_date // ignore: cast_nullable_to_non_nullable -as String?,modify_date: freezed == modify_date ? _self.modify_date : modify_date // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,user_id_foreign_key: freezed == user_id_foreign_key ? _self.user_id_foreign_key : user_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,address_id_foreign_key: freezed == address_id_foreign_key ? _self.address_id_foreign_key : address_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,user_bank_id_foreign_key: freezed == user_bank_id_foreign_key ? _self.user_bank_id_foreign_key : user_bank_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,wallet_id_foreign_key: freezed == wallet_id_foreign_key ? _self.wallet_id_foreign_key : wallet_id_foreign_key // ignore: cast_nullable_to_non_nullable -as dynamic,provincial_government_id_key: freezed == provincial_government_id_key ? _self.provincial_government_id_key : provincial_government_id_key // ignore: cast_nullable_to_non_nullable -as dynamic,identity_documents: freezed == identity_documents ? _self.identity_documents : identity_documents // ignore: cast_nullable_to_non_nullable +as bool?,userIdForeignKey: freezed == userIdForeignKey ? _self.userIdForeignKey : userIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,addressIdForeignKey: freezed == addressIdForeignKey ? _self.addressIdForeignKey : addressIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,userBankIdForeignKey: freezed == userBankIdForeignKey ? _self.userBankIdForeignKey : userBankIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,walletIdForeignKey: freezed == walletIdForeignKey ? _self.walletIdForeignKey : walletIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,provincialGovernmentIdKey: freezed == provincialGovernmentIdKey ? _self.provincialGovernmentIdKey : provincialGovernmentIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,identityDocuments: freezed == identityDocuments ? _self.identityDocuments : identityDocuments // ignore: cast_nullable_to_non_nullable as dynamic,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable -as bool?,city_number: freezed == city_number ? _self.city_number : city_number // ignore: cast_nullable_to_non_nullable -as int?,city_name: freezed == city_name ? _self.city_name : city_name // ignore: cast_nullable_to_non_nullable -as String?,guilds_id: freezed == guilds_id ? _self.guilds_id : guilds_id // ignore: cast_nullable_to_non_nullable -as String?,license_number: freezed == license_number ? _self.license_number : license_number // ignore: cast_nullable_to_non_nullable -as String?,guilds_name: freezed == guilds_name ? _self.guilds_name : guilds_name // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable -as String?,type_activity: freezed == type_activity ? _self.type_activity : type_activity // ignore: cast_nullable_to_non_nullable -as String?,area_activity: freezed == area_activity ? _self.area_activity : area_activity // ignore: cast_nullable_to_non_nullable -as String?,province_number: freezed == province_number ? _self.province_number : province_number // ignore: cast_nullable_to_non_nullable -as int?,province_name: freezed == province_name ? _self.province_name : province_name // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as bool?,has_pos: freezed == has_pos ? _self.has_pos : has_pos // ignore: cast_nullable_to_non_nullable -as bool?,centers_allocation: freezed == centers_allocation ? _self.centers_allocation : centers_allocation // ignore: cast_nullable_to_non_nullable -as dynamic,kill_house_centers_allocation: freezed == kill_house_centers_allocation ? _self.kill_house_centers_allocation : kill_house_centers_allocation // ignore: cast_nullable_to_non_nullable -as dynamic,allocation_limit: freezed == allocation_limit ? _self.allocation_limit : allocation_limit // ignore: cast_nullable_to_non_nullable -as dynamic,limitation_allocation: freezed == limitation_allocation ? _self.limitation_allocation : limitation_allocation // ignore: cast_nullable_to_non_nullable -as bool?,registerar_role: freezed == registerar_role ? _self.registerar_role : registerar_role // ignore: cast_nullable_to_non_nullable -as String?,registerar_fullname: freezed == registerar_fullname ? _self.registerar_fullname : registerar_fullname // ignore: cast_nullable_to_non_nullable -as String?,registerar_mobile: freezed == registerar_mobile ? _self.registerar_mobile : registerar_mobile // ignore: cast_nullable_to_non_nullable -as String?,kill_house_register: freezed == kill_house_register ? _self.kill_house_register : kill_house_register // ignore: cast_nullable_to_non_nullable -as bool?,steward_register: freezed == steward_register ? _self.steward_register : steward_register // ignore: cast_nullable_to_non_nullable -as bool?,guilds_room_register: freezed == guilds_room_register ? _self.guilds_room_register : guilds_room_register // ignore: cast_nullable_to_non_nullable -as bool?,pos_company_register: freezed == pos_company_register ? _self.pos_company_register : pos_company_register // ignore: cast_nullable_to_non_nullable -as bool?,province_accept_state: freezed == province_accept_state ? _self.province_accept_state : province_accept_state // ignore: cast_nullable_to_non_nullable -as String?,province_message: freezed == province_message ? _self.province_message : province_message // ignore: cast_nullable_to_non_nullable +as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,centersAllocation: freezed == centersAllocation ? _self.centersAllocation : centersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,killHouseCentersAllocation: freezed == killHouseCentersAllocation ? _self.killHouseCentersAllocation : killHouseCentersAllocation // ignore: cast_nullable_to_non_nullable +as dynamic,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,limitationAllocation: freezed == limitationAllocation ? _self.limitationAllocation : limitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,registerarRole: freezed == registerarRole ? _self.registerarRole : registerarRole // ignore: cast_nullable_to_non_nullable +as String?,registerarFullname: freezed == registerarFullname ? _self.registerarFullname : registerarFullname // ignore: cast_nullable_to_non_nullable +as String?,registerarMobile: freezed == registerarMobile ? _self.registerarMobile : registerarMobile // ignore: cast_nullable_to_non_nullable +as String?,killHouseRegister: freezed == killHouseRegister ? _self.killHouseRegister : killHouseRegister // ignore: cast_nullable_to_non_nullable +as bool?,stewardRegister: freezed == stewardRegister ? _self.stewardRegister : stewardRegister // ignore: cast_nullable_to_non_nullable +as bool?,guildsRoomRegister: freezed == guildsRoomRegister ? _self.guildsRoomRegister : guildsRoomRegister // ignore: cast_nullable_to_non_nullable +as bool?,posCompanyRegister: freezed == posCompanyRegister ? _self.posCompanyRegister : posCompanyRegister // ignore: cast_nullable_to_non_nullable +as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable +as String?,provinceMessage: freezed == provinceMessage ? _self.provinceMessage : provinceMessage // ignore: cast_nullable_to_non_nullable as String?,condition: freezed == condition ? _self.condition : condition // ignore: cast_nullable_to_non_nullable -as String?,description_condition: freezed == description_condition ? _self.description_condition : description_condition // ignore: cast_nullable_to_non_nullable -as String?,steward_active: freezed == steward_active ? _self.steward_active : steward_active // ignore: cast_nullable_to_non_nullable -as bool?,steward_allocation_limit: freezed == steward_allocation_limit ? _self.steward_allocation_limit : steward_allocation_limit // ignore: cast_nullable_to_non_nullable -as dynamic,steward_limitation_allocation: freezed == steward_limitation_allocation ? _self.steward_limitation_allocation : steward_limitation_allocation // ignore: cast_nullable_to_non_nullable +as String?,descriptionCondition: freezed == descriptionCondition ? _self.descriptionCondition : descriptionCondition // ignore: cast_nullable_to_non_nullable +as String?,stewardActive: freezed == stewardActive ? _self.stewardActive : stewardActive // ignore: cast_nullable_to_non_nullable +as bool?,stewardAllocationLimit: freezed == stewardAllocationLimit ? _self.stewardAllocationLimit : stewardAllocationLimit // ignore: cast_nullable_to_non_nullable +as dynamic,stewardLimitationAllocation: freezed == stewardLimitationAllocation ? _self.stewardLimitationAllocation : stewardLimitationAllocation // ignore: cast_nullable_to_non_nullable as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable -as bool?,license_form: freezed == license_form ? _self.license_form : license_form // ignore: cast_nullable_to_non_nullable -as dynamic,license_file: freezed == license_file ? _self.license_file : license_file // ignore: cast_nullable_to_non_nullable -as dynamic,reviewer_role: freezed == reviewer_role ? _self.reviewer_role : reviewer_role // ignore: cast_nullable_to_non_nullable -as String?,reviewer_fullname: freezed == reviewer_fullname ? _self.reviewer_fullname : reviewer_fullname // ignore: cast_nullable_to_non_nullable -as String?,reviewer_mobile: freezed == reviewer_mobile ? _self.reviewer_mobile : reviewer_mobile // ignore: cast_nullable_to_non_nullable -as String?,checker_message: freezed == checker_message ? _self.checker_message : checker_message // ignore: cast_nullable_to_non_nullable -as String?,final_accept: freezed == final_accept ? _self.final_accept : final_accept // ignore: cast_nullable_to_non_nullable -as bool?,temporary_registration: freezed == temporary_registration ? _self.temporary_registration : temporary_registration // ignore: cast_nullable_to_non_nullable -as bool?,created_by: freezed == created_by ? _self.created_by : created_by // ignore: cast_nullable_to_non_nullable -as String?,modified_by: freezed == modified_by ? _self.modified_by : modified_by // ignore: cast_nullable_to_non_nullable -as String?,user_bank_info: freezed == user_bank_info ? _self.user_bank_info : user_bank_info // ignore: cast_nullable_to_non_nullable +as bool?,licenseForm: freezed == licenseForm ? _self.licenseForm : licenseForm // ignore: cast_nullable_to_non_nullable +as dynamic,licenseFile: freezed == licenseFile ? _self.licenseFile : licenseFile // ignore: cast_nullable_to_non_nullable +as dynamic,reviewerRole: freezed == reviewerRole ? _self.reviewerRole : reviewerRole // ignore: cast_nullable_to_non_nullable +as String?,reviewerFullname: freezed == reviewerFullname ? _self.reviewerFullname : reviewerFullname // ignore: cast_nullable_to_non_nullable +as String?,reviewerMobile: freezed == reviewerMobile ? _self.reviewerMobile : reviewerMobile // ignore: cast_nullable_to_non_nullable +as String?,checkerMessage: freezed == checkerMessage ? _self.checkerMessage : checkerMessage // ignore: cast_nullable_to_non_nullable +as String?,finalAccept: freezed == finalAccept ? _self.finalAccept : finalAccept // ignore: cast_nullable_to_non_nullable +as bool?,temporaryRegistration: freezed == temporaryRegistration ? _self.temporaryRegistration : temporaryRegistration // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as String?,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as String?,userBankInfo: freezed == userBankInfo ? _self.userBankInfo : userBankInfo // ignore: cast_nullable_to_non_nullable as dynamic,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable as int?,cars: freezed == cars ? _self._cars : cars // ignore: cast_nullable_to_non_nullable -as List?,user_level: freezed == user_level ? _self._user_level : user_level // ignore: cast_nullable_to_non_nullable +as List?,userLevel: freezed == userLevel ? _self._userLevel : userLevel // ignore: cast_nullable_to_non_nullable as List?, )); } @@ -1112,37 +962,37 @@ $AddressCopyWith<$Res>? get address { /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ActivityCopyWith<$Res>? get guild_area_activity { - if (_self.guild_area_activity == null) { +$ActivityCopyWith<$Res>? get guildAreaActivity { + if (_self.guildAreaActivity == null) { return null; } - return $ActivityCopyWith<$Res>(_self.guild_area_activity!, (value) { - return _then(_self.copyWith(guild_area_activity: value)); + return $ActivityCopyWith<$Res>(_self.guildAreaActivity!, (value) { + return _then(_self.copyWith(guildAreaActivity: value)); }); }/// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ActivityCopyWith<$Res>? get guild_type_activity { - if (_self.guild_type_activity == null) { +$ActivityCopyWith<$Res>? get guildTypeActivity { + if (_self.guildTypeActivity == null) { return null; } - return $ActivityCopyWith<$Res>(_self.guild_type_activity!, (value) { - return _then(_self.copyWith(guild_type_activity: value)); + return $ActivityCopyWith<$Res>(_self.guildTypeActivity!, (value) { + return _then(_self.copyWith(guildTypeActivity: value)); }); }/// Create a copy of Steward /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$PosStatusCopyWith<$Res>? get get_pos_status { - if (_self.get_pos_status == null) { +$PosStatusCopyWith<$Res>? get getPosStatus { + if (_self.getPosStatus == null) { return null; } - return $PosStatusCopyWith<$Res>(_self.get_pos_status!, (value) { - return _then(_self.copyWith(get_pos_status: value)); + return $PosStatusCopyWith<$Res>(_self.getPosStatus!, (value) { + return _then(_self.copyWith(getPosStatus: value)); }); } } @@ -1151,7 +1001,7 @@ $PosStatusCopyWith<$Res>? get get_pos_status { /// @nodoc mixin _$User { - String? get fullname; String? get first_name; String? get last_name; String? get mobile; String? get national_id; String? get city; + String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get nationalId; String? get city; /// Create a copy of User /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -1164,16 +1014,16 @@ $UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$ide @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.city, city) || other.city == city)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,mobile,national_id,city); +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); @override String toString() { - return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, mobile: $mobile, national_id: $national_id, city: $city)'; + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; } @@ -1184,7 +1034,7 @@ abstract mixin class $UserCopyWith<$Res> { factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; @useResult $Res call({ - String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city }); @@ -1201,13 +1051,13 @@ class _$UserCopyWithImpl<$Res> /// Create a copy of User /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? city = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { return _then(_self.copyWith( fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable -as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable -as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable -as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable as String?, )); @@ -1220,14 +1070,14 @@ as String?, @JsonSerializable() class _User implements User { - _User({this.fullname, this.first_name, this.last_name, this.mobile, this.national_id, this.city}); + _User({this.fullname, this.firstName, this.lastName, this.mobile, this.nationalId, this.city}); factory _User.fromJson(Map json) => _$UserFromJson(json); @override final String? fullname; -@override final String? first_name; -@override final String? last_name; +@override final String? firstName; +@override final String? lastName; @override final String? mobile; -@override final String? national_id; +@override final String? nationalId; @override final String? city; /// Create a copy of User @@ -1243,16 +1093,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.first_name, first_name) || other.first_name == first_name)&&(identical(other.last_name, last_name) || other.last_name == last_name)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.national_id, national_id) || other.national_id == national_id)&&(identical(other.city, city) || other.city == city)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,fullname,first_name,last_name,mobile,national_id,city); +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); @override String toString() { - return 'User(fullname: $fullname, first_name: $first_name, last_name: $last_name, mobile: $mobile, national_id: $national_id, city: $city)'; + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; } @@ -1263,7 +1113,7 @@ abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; @override @useResult $Res call({ - String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city }); @@ -1280,13 +1130,13 @@ class __$UserCopyWithImpl<$Res> /// Create a copy of User /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? first_name = freezed,Object? last_name = freezed,Object? mobile = freezed,Object? national_id = freezed,Object? city = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { return _then(_User( fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable -as String?,first_name: freezed == first_name ? _self.first_name : first_name // ignore: cast_nullable_to_non_nullable -as String?,last_name: freezed == last_name ? _self.last_name : last_name // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable -as String?,national_id: freezed == national_id ? _self.national_id : national_id // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable as String?, )); @@ -1299,7 +1149,7 @@ as String?, /// @nodoc mixin _$Address { - Province? get province; Province? get city; String? get address; String? get postal_code; + Province? get province; Province? get city; String? get address; String? get postalCode; /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -1312,16 +1162,16 @@ $AddressCopyWith
    get copyWith => _$AddressCopyWithImpl
    (this as @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); @override String toString() { - return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; + return 'Address(province: $province, city: $city, address: $address, postalCode: $postalCode)'; } @@ -1332,7 +1182,7 @@ abstract mixin class $AddressCopyWith<$Res> { factory $AddressCopyWith(Address value, $Res Function(Address) _then) = _$AddressCopyWithImpl; @useResult $Res call({ - Province? province, Province? city, String? address, String? postal_code + Province? province, Province? city, String? address, String? postalCode }); @@ -1349,12 +1199,12 @@ class _$AddressCopyWithImpl<$Res> /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { return _then(_self.copyWith( province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable as Province?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -1390,13 +1240,13 @@ $ProvinceCopyWith<$Res>? get city { @JsonSerializable() class _Address implements Address { - _Address({this.province, this.city, this.address, this.postal_code}); + _Address({this.province, this.city, this.address, this.postalCode}); factory _Address.fromJson(Map json) => _$AddressFromJson(json); @override final Province? province; @override final Province? city; @override final String? address; -@override final String? postal_code; +@override final String? postalCode; /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. @@ -1411,16 +1261,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postal_code, postal_code) || other.postal_code == postal_code)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)&&(identical(other.postalCode, postalCode) || other.postalCode == postalCode)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,province,city,address,postal_code); +int get hashCode => Object.hash(runtimeType,province,city,address,postalCode); @override String toString() { - return 'Address(province: $province, city: $city, address: $address, postal_code: $postal_code)'; + return 'Address(province: $province, city: $city, address: $address, postalCode: $postalCode)'; } @@ -1431,7 +1281,7 @@ abstract mixin class _$AddressCopyWith<$Res> implements $AddressCopyWith<$Res> { factory _$AddressCopyWith(_Address value, $Res Function(_Address) _then) = __$AddressCopyWithImpl; @override @useResult $Res call({ - Province? province, Province? city, String? address, String? postal_code + Province? province, Province? city, String? address, String? postalCode }); @@ -1448,12 +1298,12 @@ class __$AddressCopyWithImpl<$Res> /// Create a copy of Address /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postal_code = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { return _then(_Address( province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable as Province?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable as Province?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as String?,postal_code: freezed == postal_code ? _self.postal_code : postal_code // ignore: cast_nullable_to_non_nullable +as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -1761,7 +1611,7 @@ as String?, /// @nodoc mixin _$PosStatus { - int? get len_active_sessions; bool? get has_pons; bool? get has_active_pons; + int? get lenActiveSessions; bool? get hasPons; bool? get hasActivePons; /// Create a copy of PosStatus /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -1774,16 +1624,16 @@ $PosStatusCopyWith get copyWith => _$PosStatusCopyWithImpl @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is PosStatus&&(identical(other.len_active_sessions, len_active_sessions) || other.len_active_sessions == len_active_sessions)&&(identical(other.has_pons, has_pons) || other.has_pons == has_pons)&&(identical(other.has_active_pons, has_active_pons) || other.has_active_pons == has_active_pons)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosStatus&&(identical(other.lenActiveSessions, lenActiveSessions) || other.lenActiveSessions == lenActiveSessions)&&(identical(other.hasPons, hasPons) || other.hasPons == hasPons)&&(identical(other.hasActivePons, hasActivePons) || other.hasActivePons == hasActivePons)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,len_active_sessions,has_pons,has_active_pons); +int get hashCode => Object.hash(runtimeType,lenActiveSessions,hasPons,hasActivePons); @override String toString() { - return 'PosStatus(len_active_sessions: $len_active_sessions, has_pons: $has_pons, has_active_pons: $has_active_pons)'; + return 'PosStatus(lenActiveSessions: $lenActiveSessions, hasPons: $hasPons, hasActivePons: $hasActivePons)'; } @@ -1794,7 +1644,7 @@ abstract mixin class $PosStatusCopyWith<$Res> { factory $PosStatusCopyWith(PosStatus value, $Res Function(PosStatus) _then) = _$PosStatusCopyWithImpl; @useResult $Res call({ - int? len_active_sessions, bool? has_pons, bool? has_active_pons + int? lenActiveSessions, bool? hasPons, bool? hasActivePons }); @@ -1811,11 +1661,11 @@ class _$PosStatusCopyWithImpl<$Res> /// Create a copy of PosStatus /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? len_active_sessions = freezed,Object? has_pons = freezed,Object? has_active_pons = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? lenActiveSessions = freezed,Object? hasPons = freezed,Object? hasActivePons = freezed,}) { return _then(_self.copyWith( -len_active_sessions: freezed == len_active_sessions ? _self.len_active_sessions : len_active_sessions // ignore: cast_nullable_to_non_nullable -as int?,has_pons: freezed == has_pons ? _self.has_pons : has_pons // ignore: cast_nullable_to_non_nullable -as bool?,has_active_pons: freezed == has_active_pons ? _self.has_active_pons : has_active_pons // ignore: cast_nullable_to_non_nullable +lenActiveSessions: freezed == lenActiveSessions ? _self.lenActiveSessions : lenActiveSessions // ignore: cast_nullable_to_non_nullable +as int?,hasPons: freezed == hasPons ? _self.hasPons : hasPons // ignore: cast_nullable_to_non_nullable +as bool?,hasActivePons: freezed == hasActivePons ? _self.hasActivePons : hasActivePons // ignore: cast_nullable_to_non_nullable as bool?, )); } @@ -1827,12 +1677,12 @@ as bool?, @JsonSerializable() class _PosStatus implements PosStatus { - _PosStatus({this.len_active_sessions, this.has_pons, this.has_active_pons}); + _PosStatus({this.lenActiveSessions, this.hasPons, this.hasActivePons}); factory _PosStatus.fromJson(Map json) => _$PosStatusFromJson(json); -@override final int? len_active_sessions; -@override final bool? has_pons; -@override final bool? has_active_pons; +@override final int? lenActiveSessions; +@override final bool? hasPons; +@override final bool? hasActivePons; /// Create a copy of PosStatus /// with the given fields replaced by the non-null parameter values. @@ -1847,16 +1697,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _PosStatus&&(identical(other.len_active_sessions, len_active_sessions) || other.len_active_sessions == len_active_sessions)&&(identical(other.has_pons, has_pons) || other.has_pons == has_pons)&&(identical(other.has_active_pons, has_active_pons) || other.has_active_pons == has_active_pons)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PosStatus&&(identical(other.lenActiveSessions, lenActiveSessions) || other.lenActiveSessions == lenActiveSessions)&&(identical(other.hasPons, hasPons) || other.hasPons == hasPons)&&(identical(other.hasActivePons, hasActivePons) || other.hasActivePons == hasActivePons)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,len_active_sessions,has_pons,has_active_pons); +int get hashCode => Object.hash(runtimeType,lenActiveSessions,hasPons,hasActivePons); @override String toString() { - return 'PosStatus(len_active_sessions: $len_active_sessions, has_pons: $has_pons, has_active_pons: $has_active_pons)'; + return 'PosStatus(lenActiveSessions: $lenActiveSessions, hasPons: $hasPons, hasActivePons: $hasActivePons)'; } @@ -1867,7 +1717,7 @@ abstract mixin class _$PosStatusCopyWith<$Res> implements $PosStatusCopyWith<$Re factory _$PosStatusCopyWith(_PosStatus value, $Res Function(_PosStatus) _then) = __$PosStatusCopyWithImpl; @override @useResult $Res call({ - int? len_active_sessions, bool? has_pons, bool? has_active_pons + int? lenActiveSessions, bool? hasPons, bool? hasActivePons }); @@ -1884,11 +1734,11 @@ class __$PosStatusCopyWithImpl<$Res> /// Create a copy of PosStatus /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? len_active_sessions = freezed,Object? has_pons = freezed,Object? has_active_pons = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? lenActiveSessions = freezed,Object? hasPons = freezed,Object? hasActivePons = freezed,}) { return _then(_PosStatus( -len_active_sessions: freezed == len_active_sessions ? _self.len_active_sessions : len_active_sessions // ignore: cast_nullable_to_non_nullable -as int?,has_pons: freezed == has_pons ? _self.has_pons : has_pons // ignore: cast_nullable_to_non_nullable -as bool?,has_active_pons: freezed == has_active_pons ? _self.has_active_pons : has_active_pons // ignore: cast_nullable_to_non_nullable +lenActiveSessions: freezed == lenActiveSessions ? _self.lenActiveSessions : lenActiveSessions // ignore: cast_nullable_to_non_nullable +as int?,hasPons: freezed == hasPons ? _self.hasPons : hasPons // ignore: cast_nullable_to_non_nullable +as bool?,hasActivePons: freezed == hasActivePons ? _self.hasActivePons : hasActivePons // ignore: cast_nullable_to_non_nullable as bool?, )); } diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart index 9116ccf..eee0fe3 100644 --- a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart @@ -6,159 +6,139 @@ part of 'allocated_made.dart'; // JsonSerializableGenerator // ************************************************************************** -_AllocatedMadeModel _$AllocatedMadeModelFromJson(Map json) => - _AllocatedMadeModel( - count: (json['count'] as num?)?.toInt(), - next: json['next'] as String?, - previous: json['previous'] as String?, - results: (json['results'] as List?) - ?.map((e) => AllocatedMadeResult.fromJson(e as Map)) - .toList(), - ); - -Map _$AllocatedMadeModelToJson(_AllocatedMadeModel instance) => - { - 'count': instance.count, - 'next': instance.next, - 'previous': instance.previous, - 'results': instance.results, - }; - -_AllocatedMadeResult _$AllocatedMadeResultFromJson( +_AllocatedMadeModel _$AllocatedMadeModelFromJson( Map json, -) => _AllocatedMadeResult( +) => _AllocatedMadeModel( id: (json['id'] as num?)?.toInt(), product: json['product'] == null ? null : Product.fromJson(json['product'] as Map), - kill_house: json['kill_house'], - to_kill_house: json['to_kill_house'], + killHouse: json['kill_house'], + toKillHouse: json['to_kill_house'], steward: json['steward'] == null ? null : Steward.fromJson(json['steward'] as Map), - to_steward: json['to_steward'], + toSteward: json['to_steward'], guilds: json['guilds'], - to_guilds: json['to_guilds'] == null + toGuilds: json['to_guilds'] == null ? null : Steward.fromJson(json['to_guilds'] as Map), - to_cold_house: json['to_cold_house'], - index_weight: (json['index_weight'] as num?)?.toInt(), - date_timestamp: (json['date_timestamp'] as num?)?.toInt(), - new_state: (json['new_state'] as num?)?.toInt(), - new_receiver_state: (json['new_receiver_state'] as num?)?.toInt(), - new_allocation_state: (json['new_allocation_state'] as num?)?.toInt(), + toColdHouse: json['to_cold_house'], + indexWeight: (json['index_weight'] as num?)?.toInt(), + dateTimestamp: (json['date_timestamp'] as num?)?.toInt(), + newState: (json['new_state'] as num?)?.toInt(), + newReceiverState: (json['new_receiver_state'] as num?)?.toInt(), + newAllocationState: (json['new_allocation_state'] as num?)?.toInt(), key: json['key'] as String?, - create_date: json['create_date'] as String?, - modify_date: json['modify_date'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, trash: json['trash'] as bool?, - number_of_carcasses: (json['number_of_carcasses'] as num?)?.toInt(), - real_number_of_carcasses: (json['real_number_of_carcasses'] as num?)?.toInt(), - receiver_real_number_of_carcasses: + numberOfCarcasses: (json['number_of_carcasses'] as num?)?.toInt(), + realNumberOfCarcasses: (json['real_number_of_carcasses'] as num?)?.toInt(), + receiverRealNumberOfCarcasses: (json['receiver_real_number_of_carcasses'] as num?)?.toInt(), - weight_of_carcasses: (json['weight_of_carcasses'] as num?)?.toInt(), - real_weight_of_carcasses: (json['real_weight_of_carcasses'] as num?)?.toInt(), - receiver_real_weight_of_carcasses: + weightOfCarcasses: (json['weight_of_carcasses'] as num?)?.toInt(), + realWeightOfCarcasses: (json['real_weight_of_carcasses'] as num?)?.toInt(), + receiverRealWeightOfCarcasses: (json['receiver_real_weight_of_carcasses'] as num?)?.toInt(), - weight_loss_of_carcasses: (json['weight_loss_of_carcasses'] as num?)?.toInt(), - final_registration: json['final_registration'] as bool?, - sell_type: json['sell_type'] as String?, - product_name: json['product_name'] as String?, - seller_type: json['seller_type'] as String?, + weightLossOfCarcasses: (json['weight_loss_of_carcasses'] as num?)?.toInt(), + finalRegistration: json['final_registration'] as bool?, + sellType: json['sell_type'] as String?, + productName: json['product_name'] as String?, + sellerType: json['seller_type'] as String?, type: json['type'] as String?, - sale_type: json['sale_type'] as String?, - allocation_type: json['allocation_type'] as String?, - system_registration_code: json['system_registration_code'] as bool?, - registration_code: (json['registration_code'] as num?)?.toInt(), + saleType: json['sale_type'] as String?, + allocationType: json['allocation_type'] as String?, + systemRegistrationCode: json['system_registration_code'] as bool?, + registrationCode: (json['registration_code'] as num?)?.toInt(), amount: (json['amount'] as num?)?.toInt(), - total_amount: (json['total_amount'] as num?)?.toInt(), - total_amount_paid: (json['total_amount_paid'] as num?)?.toInt(), - total_amount_remain: (json['total_amount_remain'] as num?)?.toInt(), - logged_registration_code: json['logged_registration_code'] as String?, + totalAmount: (json['total_amount'] as num?)?.toInt(), + totalAmountPaid: (json['total_amount_paid'] as num?)?.toInt(), + totalAmountRemain: (json['total_amount_remain'] as num?)?.toInt(), + loggedRegistrationCode: json['logged_registration_code'] as String?, state: json['state'] as String?, - receiver_state: json['receiver_state'] as String?, - allocation_state: json['allocation_state'] as String?, + receiverState: json['receiver_state'] as String?, + allocationState: json['allocation_state'] as String?, date: json['date'] as String?, role: json['role'] as String?, - steward_temp_key: json['steward_temp_key'] as String?, - approved_price_status: json['approved_price_status'] as bool?, - calculate_status: json['calculate_status'] as bool?, - temporary_trash: json['temporary_trash'] as bool?, - temporary_deleted: json['temporary_deleted'] as bool?, - created_by: json['created_by'] as String?, - modified_by: json['modified_by'] as String?, - ware_house: json['ware_house'], - steward_ware_house: json['steward_ware_house'], + stewardTempKey: json['steward_temp_key'] as String?, + approvedPriceStatus: json['approved_price_status'] as bool?, + calculateStatus: json['calculate_status'] as bool?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + createdBy: json['created_by'] as String?, + modifiedBy: json['modified_by'] as String?, + wareHouse: json['ware_house'], + stewardWareHouse: json['steward_ware_house'], car: json['car'], dispenser: json['dispenser'], ); -Map _$AllocatedMadeResultToJson( - _AllocatedMadeResult instance, +Map _$AllocatedMadeModelToJson( + _AllocatedMadeModel instance, ) => { 'id': instance.id, 'product': instance.product, - 'kill_house': instance.kill_house, - 'to_kill_house': instance.to_kill_house, + 'kill_house': instance.killHouse, + 'to_kill_house': instance.toKillHouse, 'steward': instance.steward, - 'to_steward': instance.to_steward, + 'to_steward': instance.toSteward, 'guilds': instance.guilds, - 'to_guilds': instance.to_guilds, - 'to_cold_house': instance.to_cold_house, - 'index_weight': instance.index_weight, - 'date_timestamp': instance.date_timestamp, - 'new_state': instance.new_state, - 'new_receiver_state': instance.new_receiver_state, - 'new_allocation_state': instance.new_allocation_state, + 'to_guilds': instance.toGuilds, + 'to_cold_house': instance.toColdHouse, + 'index_weight': instance.indexWeight, + 'date_timestamp': instance.dateTimestamp, + 'new_state': instance.newState, + 'new_receiver_state': instance.newReceiverState, + 'new_allocation_state': instance.newAllocationState, 'key': instance.key, - 'create_date': instance.create_date, - 'modify_date': instance.modify_date, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, 'trash': instance.trash, - 'number_of_carcasses': instance.number_of_carcasses, - 'real_number_of_carcasses': instance.real_number_of_carcasses, - 'receiver_real_number_of_carcasses': - instance.receiver_real_number_of_carcasses, - 'weight_of_carcasses': instance.weight_of_carcasses, - 'real_weight_of_carcasses': instance.real_weight_of_carcasses, - 'receiver_real_weight_of_carcasses': - instance.receiver_real_weight_of_carcasses, - 'weight_loss_of_carcasses': instance.weight_loss_of_carcasses, - 'final_registration': instance.final_registration, - 'sell_type': instance.sell_type, - 'product_name': instance.product_name, - 'seller_type': instance.seller_type, + 'number_of_carcasses': instance.numberOfCarcasses, + 'real_number_of_carcasses': instance.realNumberOfCarcasses, + 'receiver_real_number_of_carcasses': instance.receiverRealNumberOfCarcasses, + 'weight_of_carcasses': instance.weightOfCarcasses, + 'real_weight_of_carcasses': instance.realWeightOfCarcasses, + 'receiver_real_weight_of_carcasses': instance.receiverRealWeightOfCarcasses, + 'weight_loss_of_carcasses': instance.weightLossOfCarcasses, + 'final_registration': instance.finalRegistration, + 'sell_type': instance.sellType, + 'product_name': instance.productName, + 'seller_type': instance.sellerType, 'type': instance.type, - 'sale_type': instance.sale_type, - 'allocation_type': instance.allocation_type, - 'system_registration_code': instance.system_registration_code, - 'registration_code': instance.registration_code, + 'sale_type': instance.saleType, + 'allocation_type': instance.allocationType, + 'system_registration_code': instance.systemRegistrationCode, + 'registration_code': instance.registrationCode, 'amount': instance.amount, - 'total_amount': instance.total_amount, - 'total_amount_paid': instance.total_amount_paid, - 'total_amount_remain': instance.total_amount_remain, - 'logged_registration_code': instance.logged_registration_code, + 'total_amount': instance.totalAmount, + 'total_amount_paid': instance.totalAmountPaid, + 'total_amount_remain': instance.totalAmountRemain, + 'logged_registration_code': instance.loggedRegistrationCode, 'state': instance.state, - 'receiver_state': instance.receiver_state, - 'allocation_state': instance.allocation_state, + 'receiver_state': instance.receiverState, + 'allocation_state': instance.allocationState, 'date': instance.date, 'role': instance.role, - 'steward_temp_key': instance.steward_temp_key, - 'approved_price_status': instance.approved_price_status, - 'calculate_status': instance.calculate_status, - 'temporary_trash': instance.temporary_trash, - 'temporary_deleted': instance.temporary_deleted, - 'created_by': instance.created_by, - 'modified_by': instance.modified_by, - 'ware_house': instance.ware_house, - 'steward_ware_house': instance.steward_ware_house, + 'steward_temp_key': instance.stewardTempKey, + 'approved_price_status': instance.approvedPriceStatus, + 'calculate_status': instance.calculateStatus, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'ware_house': instance.wareHouse, + 'steward_ware_house': instance.stewardWareHouse, 'car': instance.car, 'dispenser': instance.dispenser, }; _Product _$ProductFromJson(Map json) => - _Product(weight_average: (json['weight_average'] as num?)?.toInt()); + _Product(weightAverage: (json['weight_average'] as num?)?.toInt()); Map _$ProductToJson(_Product instance) => { - 'weight_average': instance.weight_average, + 'weight_average': instance.weightAverage, }; _Steward _$StewardFromJson(Map json) => _Steward( @@ -169,159 +149,159 @@ _Steward _$StewardFromJson(Map json) => _Steward( address: json['address'] == null ? null : Address.fromJson(json['address'] as Map), - guild_area_activity: json['guild_area_activity'] == null + guildAreaActivity: json['guild_area_activity'] == null ? null : Activity.fromJson(json['guild_area_activity'] as Map), - guild_type_activity: json['guild_type_activity'] == null + guildTypeActivity: json['guild_type_activity'] == null ? null : Activity.fromJson(json['guild_type_activity'] as Map), - kill_house: json['kill_house'] as List?, - steward_kill_house: json['steward_kill_house'] as List?, + killHouse: json['kill_house'] as List?, + stewardKillHouse: json['steward_kill_house'] as List?, stewards: json['stewards'] as List?, - get_pos_status: json['get_pos_status'] == null + getPosStatus: json['get_pos_status'] == null ? null : PosStatus.fromJson(json['get_pos_status'] as Map), key: json['key'] as String?, - create_date: json['create_date'] as String?, - modify_date: json['modify_date'] as String?, + createDate: json['create_date'] as String?, + modifyDate: json['modify_date'] as String?, trash: json['trash'] as bool?, - user_id_foreign_key: json['user_id_foreign_key'], - address_id_foreign_key: json['address_id_foreign_key'], - user_bank_id_foreign_key: json['user_bank_id_foreign_key'], - wallet_id_foreign_key: json['wallet_id_foreign_key'], - provincial_government_id_key: json['provincial_government_id_key'], - identity_documents: json['identity_documents'], + userIdForeignKey: json['user_id_foreign_key'], + addressIdForeignKey: json['address_id_foreign_key'], + userBankIdForeignKey: json['user_bank_id_foreign_key'], + walletIdForeignKey: json['wallet_id_foreign_key'], + provincialGovernmentIdKey: json['provincial_government_id_key'], + identityDocuments: json['identity_documents'], active: json['active'] as bool?, - city_number: (json['city_number'] as num?)?.toInt(), - city_name: json['city_name'] as String?, - guilds_id: json['guilds_id'] as String?, - license_number: json['license_number'] as String?, - guilds_name: json['guilds_name'] as String?, + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, + guildsId: json['guilds_id'] as String?, + licenseNumber: json['license_number'] as String?, + guildsName: json['guilds_name'] as String?, phone: json['phone'] as String?, - type_activity: json['type_activity'] as String?, - area_activity: json['area_activity'] as String?, - province_number: (json['province_number'] as num?)?.toInt(), - province_name: json['province_name'] as String?, + typeActivity: json['type_activity'] as String?, + areaActivity: json['area_activity'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, steward: json['steward'] as bool?, - has_pos: json['has_pos'] as bool?, - centers_allocation: json['centers_allocation'], - kill_house_centers_allocation: json['kill_house_centers_allocation'], - allocation_limit: json['allocation_limit'], - limitation_allocation: json['limitation_allocation'] as bool?, - registerar_role: json['registerar_role'] as String?, - registerar_fullname: json['registerar_fullname'] as String?, - registerar_mobile: json['registerar_mobile'] as String?, - kill_house_register: json['kill_house_register'] as bool?, - steward_register: json['steward_register'] as bool?, - guilds_room_register: json['guilds_room_register'] as bool?, - pos_company_register: json['pos_company_register'] as bool?, - province_accept_state: json['province_accept_state'] as String?, - province_message: json['province_message'] as String?, + hasPos: json['has_pos'] as bool?, + centersAllocation: json['centers_allocation'], + killHouseCentersAllocation: json['kill_house_centers_allocation'], + allocationLimit: json['allocation_limit'], + limitationAllocation: json['limitation_allocation'] as bool?, + registerarRole: json['registerar_role'] as String?, + registerarFullname: json['registerar_fullname'] as String?, + registerarMobile: json['registerar_mobile'] as String?, + killHouseRegister: json['kill_house_register'] as bool?, + stewardRegister: json['steward_register'] as bool?, + guildsRoomRegister: json['guilds_room_register'] as bool?, + posCompanyRegister: json['pos_company_register'] as bool?, + provinceAcceptState: json['province_accept_state'] as String?, + provinceMessage: json['province_message'] as String?, condition: json['condition'] as String?, - description_condition: json['description_condition'] as String?, - steward_active: json['steward_active'] as bool?, - steward_allocation_limit: json['steward_allocation_limit'], - steward_limitation_allocation: json['steward_limitation_allocation'] as bool?, + descriptionCondition: json['description_condition'] as String?, + stewardActive: json['steward_active'] as bool?, + stewardAllocationLimit: json['steward_allocation_limit'], + stewardLimitationAllocation: json['steward_limitation_allocation'] as bool?, license: json['license'] as bool?, - license_form: json['license_form'], - license_file: json['license_file'], - reviewer_role: json['reviewer_role'] as String?, - reviewer_fullname: json['reviewer_fullname'] as String?, - reviewer_mobile: json['reviewer_mobile'] as String?, - checker_message: json['checker_message'] as String?, - final_accept: json['final_accept'] as bool?, - temporary_registration: json['temporary_registration'] as bool?, - created_by: json['created_by'] as String?, - modified_by: json['modified_by'] as String?, - user_bank_info: json['user_bank_info'], + licenseForm: json['license_form'], + licenseFile: json['license_file'], + reviewerRole: json['reviewer_role'] as String?, + reviewerFullname: json['reviewer_fullname'] as String?, + reviewerMobile: json['reviewer_mobile'] as String?, + checkerMessage: json['checker_message'] as String?, + finalAccept: json['final_accept'] as bool?, + temporaryRegistration: json['temporary_registration'] as bool?, + createdBy: json['created_by'] as String?, + modifiedBy: json['modified_by'] as String?, + userBankInfo: json['user_bank_info'], wallet: (json['wallet'] as num?)?.toInt(), cars: json['cars'] as List?, - user_level: json['user_level'] as List?, + userLevel: json['user_level'] as List?, ); Map _$StewardToJson(_Steward instance) => { 'id': instance.id, 'user': instance.user, 'address': instance.address, - 'guild_area_activity': instance.guild_area_activity, - 'guild_type_activity': instance.guild_type_activity, - 'kill_house': instance.kill_house, - 'steward_kill_house': instance.steward_kill_house, + 'guild_area_activity': instance.guildAreaActivity, + 'guild_type_activity': instance.guildTypeActivity, + 'kill_house': instance.killHouse, + 'steward_kill_house': instance.stewardKillHouse, 'stewards': instance.stewards, - 'get_pos_status': instance.get_pos_status, + 'get_pos_status': instance.getPosStatus, 'key': instance.key, - 'create_date': instance.create_date, - 'modify_date': instance.modify_date, + 'create_date': instance.createDate, + 'modify_date': instance.modifyDate, 'trash': instance.trash, - 'user_id_foreign_key': instance.user_id_foreign_key, - 'address_id_foreign_key': instance.address_id_foreign_key, - 'user_bank_id_foreign_key': instance.user_bank_id_foreign_key, - 'wallet_id_foreign_key': instance.wallet_id_foreign_key, - 'provincial_government_id_key': instance.provincial_government_id_key, - 'identity_documents': instance.identity_documents, + 'user_id_foreign_key': instance.userIdForeignKey, + 'address_id_foreign_key': instance.addressIdForeignKey, + 'user_bank_id_foreign_key': instance.userBankIdForeignKey, + 'wallet_id_foreign_key': instance.walletIdForeignKey, + 'provincial_government_id_key': instance.provincialGovernmentIdKey, + 'identity_documents': instance.identityDocuments, 'active': instance.active, - 'city_number': instance.city_number, - 'city_name': instance.city_name, - 'guilds_id': instance.guilds_id, - 'license_number': instance.license_number, - 'guilds_name': instance.guilds_name, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, + 'guilds_id': instance.guildsId, + 'license_number': instance.licenseNumber, + 'guilds_name': instance.guildsName, 'phone': instance.phone, - 'type_activity': instance.type_activity, - 'area_activity': instance.area_activity, - 'province_number': instance.province_number, - 'province_name': instance.province_name, + 'type_activity': instance.typeActivity, + 'area_activity': instance.areaActivity, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, 'steward': instance.steward, - 'has_pos': instance.has_pos, - 'centers_allocation': instance.centers_allocation, - 'kill_house_centers_allocation': instance.kill_house_centers_allocation, - 'allocation_limit': instance.allocation_limit, - 'limitation_allocation': instance.limitation_allocation, - 'registerar_role': instance.registerar_role, - 'registerar_fullname': instance.registerar_fullname, - 'registerar_mobile': instance.registerar_mobile, - 'kill_house_register': instance.kill_house_register, - 'steward_register': instance.steward_register, - 'guilds_room_register': instance.guilds_room_register, - 'pos_company_register': instance.pos_company_register, - 'province_accept_state': instance.province_accept_state, - 'province_message': instance.province_message, + 'has_pos': instance.hasPos, + 'centers_allocation': instance.centersAllocation, + 'kill_house_centers_allocation': instance.killHouseCentersAllocation, + 'allocation_limit': instance.allocationLimit, + 'limitation_allocation': instance.limitationAllocation, + 'registerar_role': instance.registerarRole, + 'registerar_fullname': instance.registerarFullname, + 'registerar_mobile': instance.registerarMobile, + 'kill_house_register': instance.killHouseRegister, + 'steward_register': instance.stewardRegister, + 'guilds_room_register': instance.guildsRoomRegister, + 'pos_company_register': instance.posCompanyRegister, + 'province_accept_state': instance.provinceAcceptState, + 'province_message': instance.provinceMessage, 'condition': instance.condition, - 'description_condition': instance.description_condition, - 'steward_active': instance.steward_active, - 'steward_allocation_limit': instance.steward_allocation_limit, - 'steward_limitation_allocation': instance.steward_limitation_allocation, + 'description_condition': instance.descriptionCondition, + 'steward_active': instance.stewardActive, + 'steward_allocation_limit': instance.stewardAllocationLimit, + 'steward_limitation_allocation': instance.stewardLimitationAllocation, 'license': instance.license, - 'license_form': instance.license_form, - 'license_file': instance.license_file, - 'reviewer_role': instance.reviewer_role, - 'reviewer_fullname': instance.reviewer_fullname, - 'reviewer_mobile': instance.reviewer_mobile, - 'checker_message': instance.checker_message, - 'final_accept': instance.final_accept, - 'temporary_registration': instance.temporary_registration, - 'created_by': instance.created_by, - 'modified_by': instance.modified_by, - 'user_bank_info': instance.user_bank_info, + 'license_form': instance.licenseForm, + 'license_file': instance.licenseFile, + 'reviewer_role': instance.reviewerRole, + 'reviewer_fullname': instance.reviewerFullname, + 'reviewer_mobile': instance.reviewerMobile, + 'checker_message': instance.checkerMessage, + 'final_accept': instance.finalAccept, + 'temporary_registration': instance.temporaryRegistration, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'user_bank_info': instance.userBankInfo, 'wallet': instance.wallet, 'cars': instance.cars, - 'user_level': instance.user_level, + 'user_level': instance.userLevel, }; _User _$UserFromJson(Map json) => _User( fullname: json['fullname'] as String?, - first_name: json['first_name'] as String?, - last_name: json['last_name'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, mobile: json['mobile'] as String?, - national_id: json['national_id'] as String?, + nationalId: json['national_id'] as String?, city: json['city'] as String?, ); Map _$UserToJson(_User instance) => { 'fullname': instance.fullname, - 'first_name': instance.first_name, - 'last_name': instance.last_name, + 'first_name': instance.firstName, + 'last_name': instance.lastName, 'mobile': instance.mobile, - 'national_id': instance.national_id, + 'national_id': instance.nationalId, 'city': instance.city, }; @@ -333,14 +313,14 @@ _Address _$AddressFromJson(Map json) => _Address( ? null : Province.fromJson(json['city'] as Map), address: json['address'] as String?, - postal_code: json['postal_code'] as String?, + postalCode: json['postal_code'] as String?, ); Map _$AddressToJson(_Address instance) => { 'province': instance.province, 'city': instance.city, 'address': instance.address, - 'postal_code': instance.postal_code, + 'postal_code': instance.postalCode, }; _Province _$ProvinceFromJson(Map json) => @@ -360,14 +340,14 @@ Map _$ActivityToJson(_Activity instance) => { }; _PosStatus _$PosStatusFromJson(Map json) => _PosStatus( - len_active_sessions: (json['len_active_sessions'] as num?)?.toInt(), - has_pons: json['has_pons'] as bool?, - has_active_pons: json['has_active_pons'] as bool?, + lenActiveSessions: (json['len_active_sessions'] as num?)?.toInt(), + hasPons: json['has_pons'] as bool?, + hasActivePons: json['has_active_pons'] as bool?, ); Map _$PosStatusToJson(_PosStatus instance) => { - 'len_active_sessions': instance.len_active_sessions, - 'has_pons': instance.has_pons, - 'has_active_pons': instance.has_active_pons, + 'len_active_sessions': instance.lenActiveSessions, + 'has_pons': instance.hasPons, + 'has_active_pons': instance.hasActivePons, }; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index a141760..d86de00 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -47,9 +47,9 @@ abstract class ChickenRepository { required int page, }); - Future getAllocatedMade({ + Future?> getAllocatedMade({ required String token, - required int page, + Map? queryParameters, }); Future confirmAllocation({ @@ -71,7 +71,7 @@ abstract class ChickenRepository { Future?> getGuilds({ required String token, - required bool isFree, + Map? queryParameters, }); Future getProfile({required String token}); diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 88310be..3bf032b 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -106,14 +106,18 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getAllocatedMade({ + Future?> getAllocatedMade({ required String token, - required int page, + Map? queryParameters, }) async { var res = await _httpClient.get( - '/steward-allocation/?search=filter&value=&role=Steward&page=$page&page_size=100', + '/steward-allocation/', + queryParameters:queryParameters, headers: {'Authorization': 'Bearer $token'}, - fromJson: AllocatedMadeModel.fromJson, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => AllocatedMadeModel.fromJson(json as Map), + ), ); return res.data; } @@ -168,12 +172,12 @@ class ChickenRepositoryImpl implements ChickenRepository { @override Future?> getGuilds({ required String token, - required bool isFree, + Map? queryParameters, }) async { var res = await _httpClient.get( - '/guilds/?role=Steward&free=$isFree', + '/guilds/?', + queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => json .map((item) => GuildModel.fromJson(item as Map)) .toList(), diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart index 1fe6819..b7f8473 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart @@ -11,6 +11,14 @@ extension xStringUtils on String { get faItem => utilsMap[this] ?? this; + get buyerIsGuild { + final tmp = split('_'); + if (tmp.length > 1) { + return tmp.last == 'guild'; + } else { + return false; + } + } } Map utilsMap = { @@ -21,5 +29,5 @@ Map utilsMap = { 'free': 'آزاد', 'pending': 'در انتظار', 'accepted': 'تایید شده', - 'guild':'صنف' + 'guild': 'صنف', }; diff --git a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart index 06c59a4..8606a54 100644 --- a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/out_of_province/logic.dart @@ -10,7 +10,8 @@ import 'package:rasadyar_core/core.dart'; class OutOfProvinceLogic extends GetxController { var rootLogic = Get.find(); - Rxn allocatedMadeModel = Rxn(); + Rxn?> allocatedMadeModel = + Rxn?>(); RxList rolesProductsModel = RxList(); RxList guildsModel = [].obs; @@ -29,11 +30,16 @@ class OutOfProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, - page: 1, + queryParameters: buildQueryParams( + page: 1, + pageSize: 20, + search: 'filter', + role: 'Steward', + ), ), onSuccess: (result) { if (result != null) { - allocatedMadeModel.value = result; + allocatedMadeModel.value = result.results; } }, onError: (error, stacktrace) {}, @@ -73,8 +79,7 @@ class OutOfProvinceLogic extends GetxController { call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, allocationTokens: - allocatedMadeModel.value?.results?.map((e) => e.key!).toList() ?? - [], + allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 26603a0..4786e7c 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -6,6 +6,7 @@ import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/out_of_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; @@ -14,7 +15,7 @@ enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { RxInt currentPage = 2.obs; List pages = [ - Container(color: Colors.red), + SalesInProvincePage(), OutOfProvincePage(), HomePage(), Container(color: Colors.blue), diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 90f6164..6a96717 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -11,7 +11,10 @@ import 'package:rasadyar_core/core.dart'; class SalesInProvinceLogic extends GetxController { var rootLogic = Get.find(); - Rxn allocatedMadeModel = Rxn(); + Rxn?> allocatedMadeModel = + Rxn?>(); + RxList isExpandedList = [].obs; + RxList rolesProductsModel = RxList(); RxList guildsModel = [].obs; @@ -86,15 +89,21 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, - page: currentPageAllocationsMade.value, + queryParameters: buildQueryParams( + page: currentPageAllocationsMade.value, + pageSize: 20, + search: 'filter', + role: 'Steward', + ), ), onSuccess: (result) { if (result != null) { if (isLoadingMoreAllocationsMade.value && - allocatedMadeModel.value?.results != null) { - allocatedMadeModel.value?.results?.addAll(result.results!); + allocatedMadeModel.value != null && + (allocatedMadeModel.value?.isNotEmpty ?? false)) { + allocatedMadeModel.value?.addAll(result.results!); } else { - allocatedMadeModel.value = result; + allocatedMadeModel.value = result.results; } } @@ -146,8 +155,7 @@ class SalesInProvinceLogic extends GetxController { call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, allocationTokens: - allocatedMadeModel.value?.results?.map((e) => e.key!).toList() ?? - [], + allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); @@ -164,6 +172,7 @@ class SalesInProvinceLogic extends GetxController { onSuccess: (result) { if (result != null) { rolesProductsModel.value = result; + selectedProductModel.value = result.first; } }, onError: (error, stacktrace) {}, @@ -174,7 +183,10 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getGuilds( token: rootLogic.tokenService.accessToken.value!, - isFree: saleType.value == 2 ? true : false, + queryParameters: buildQueryParams( + queryParams: {'free': saleType.value == 2 ? true : false}, + role: 'Steward', + ), ), onSuccess: (result) { if (result != null) { @@ -242,11 +254,12 @@ class SalesInProvinceLogic extends GetxController { ); } - - @override void dispose() { rootLogic.inventoryExpandedList.clear(); super.dispose(); } + + //TODO + void setEditData(AllocatedMadeModel item) {} } diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index d07bbfa..860201e 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; @@ -14,23 +16,85 @@ class SalesInProvincePage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar(title: 'فروش در استان'), + appBar: RAppBar( + titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: true, + onBackPressed: () { + Get.back(id: 1); + }, + leadingWidth: 155, + leading: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, + children: [ + Assets.vec.chickenSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + Text( + 'رصدطیور', + style: AppFonts.yekan16Bold.copyWith(color: Colors.white), + ), + ], + ), + additionalActions: [ + GestureDetector( + onTap: () { + // controller.searchIsSelected.value = !controller.searchIsSelected.value; + }, + child: Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + ), + SizedBox(width: 8), + GestureDetector( + onTap: () { + // Get.bottomSheet(filterBottomSheet()); + }, + child: Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + ), + SizedBox(width: 8), + ], + ), body: SingleChildScrollView( child: Column( children: [ + routePageWidget(), + inventoryWidget(), allocationsMade(), - SizedBox(height: 20), - RElevated( - text: 'ثبت توزیع/ فروش', - onPressed: () { - showAddBottomSheet(); - }, - ), + SizedBox(height: 40), ], ), ), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet( + showAddBottomSheet(), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); + }, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } @@ -48,7 +112,7 @@ class SalesInProvincePage extends GetView { ), ), SizedBox(height: 4), - /* ObxValue( + /* ObxValue( (data) => data.isEmpty ? Container( margin: const EdgeInsets.symmetric(vertical: 2), @@ -187,12 +251,12 @@ class SalesInProvincePage extends GetView { } Widget allocationsMade() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Row( + return Column( + children: [ + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( @@ -210,378 +274,613 @@ class SalesInProvincePage extends GetView { ), ], ), - SizedBox(height: 4), - ObxValue((data) { - if (data.value == null) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ); - } else if (data.value?.results?.isEmpty ?? true) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), - ); - } else { - return Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 700, - padding: const EdgeInsets.all(6), - child: ListView.separated( - padding: const EdgeInsets.all(8.0), - controller: controller.scrollControllerAllocationsMade, - itemCount: data.value?.results?.length ?? 0, - itemBuilder: (BuildContext context, int index) { - if (index == data.value!.results!.length) { - return Obx( - () => controller.isLoadingMoreAllocationsMade.value - ? const Padding( - padding: EdgeInsets.symmetric(vertical: 16), - child: Center( - child: CircularProgressIndicator(), - ), - ) - : const SizedBox(), - ); - } - final result = data.value!.results![index]; - return Card( - color: Colors.white, - margin: const EdgeInsets.symmetric(vertical: 4.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: const BorderSide( - color: AppColor.blueNormal, - width: 1, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildRow('ردیف', '${index + 1}'), - buildRow( - 'تاریخ ثبت', - result.date!.formattedJalaliDate ?? 'N/A', - ), - buildRow( - 'نوع تخصیص', - result.allocation_type?.faAllocationType ?? 'N/A', - ), - buildRow( - 'مشخصات خریدار', - '${result.to_guilds?.user?.fullname} - ${result.to_guilds?.guilds_name}' ?? - 'N/A', - ), - buildRow( - 'مشخصات فروشنده', - result.steward?.user?.fullname ?? 'N/A', - ), - buildRow( - 'نوع فروش', - result.sell_type?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${result.amount ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${result.total_amount ?? 0} ریال', - ), - buildRow( - 'وزن تخصیصی', - '${result.weight_of_carcasses?.toInt() ?? 0} کیلوگرم', - ), - buildRow( - 'کداحراز', - result.registration_code?.toString() ?? 'N/A', - ), - buildRow( - 'وضعیت کد احراز', - result.system_registration_code == true - ? "ارسال شده" - : "ارسال نشده" ?? 'N/A', - ), - buildRow( - 'افت وزن(کیلوگرم)', - result.weight_loss_of_carcasses - ?.toInt() - .toString() ?? - 'N/A', - ), - buildRow( - 'وضعیت', - result.receiver_state?.faItem ?? 'N/A', - ), - - Row( - spacing: 10, - children: [ - Expanded( - child: RElevated( - height: 40, - text: 'تایید', - onPressed: () { - ConformAllocation confromation = - ConformAllocation( - allocation_key: result.key, - number_of_carcasses: - result.number_of_carcasses, - weight_of_carcasses: result - .weight_of_carcasses - ?.toInt(), - amount: result.amount, - total_amount: result.total_amount, - ); - - controller.confirmAllocation( - confromation, - ); - }, - ), - ), - Expanded( - child: RElevated( - height: 40, - backgroundColor: AppColor.error, - text: 'رد', - onPressed: () { - controller.denyAllocation( - result.key ?? '', - ); - }, - ), - ), - ], - ), - ], - ), - ), + ), + ObxValue((data) { + if (data.value == null) { + return Container( + height: 80, + margin: const EdgeInsets.all(4), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: CircularProgressIndicator()), + ); + } else if (data.value?.isEmpty ?? true) { + return Container( + height: 80, + margin: const EdgeInsets.all(8), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.blueNormal, width: 1), + ), + child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), + ); + } else { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2), + child: ListView.separated( + padding: const EdgeInsets.all(8.0), + shrinkWrap: true, + controller: controller.scrollControllerAllocationsMade, + itemCount: data.value?.length ?? 0, + itemBuilder: (BuildContext context, int index) { + if (index == data.value!.length) { + return Obx( + () => controller.isLoadingMoreAllocationsMade.value + ? const Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: Center(child: CircularProgressIndicator()), + ) + : const SizedBox(), ); - }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), - ), + } + final result = data.value![index]; + return ObxValue((data) { + return allocationsMadeListItem( + expandList: controller.isExpandedList, + index: index, + item: result, + ); + }, controller.isExpandedList); + }, + separatorBuilder: (BuildContext context, int index) => + SizedBox(height: 8), + ), + ); + } + }, controller.allocatedMadeModel), + ], + ); + } + + Widget showAddBottomSheet() { + return BaseBottomSheet( + height: Get.height * 0.75, + child: Padding( + padding: EdgeInsets.only( + left: 16, + right: 16, + top: 16, + bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'ثبت توزیع/ فروش', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material(type: MaterialType.transparency, child: productDropDown()), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + + controller.selectedGuildModel.value = null; + controller.selectedGuildModel.refresh(); + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + guildsDropDown(), + + const SizedBox(height: 12), + RTextField( + controller: controller.weightController, + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + + onChanged: (p0) { + controller.weight.value = int.tryParse(p0.clearComma) ?? 0; + }, + label: 'وزن لاشه', + ), + const SizedBox(height: 12), + RTextField( + controller: controller.pricePerKiloController, + borderColor: AppColor.darkGreyLight, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + + onChanged: (p0) { + controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; + }, + keyboardType: TextInputType.number, + label: 'قیمت هر کیلو', + ), + const SizedBox(height: 12), + ObxValue( + (p0) => RTextField( + enabled: false, + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + borderColor: AppColor.darkGreyLight, + initText: controller.totalCost.value.toString().separatedByComma, + controller: controller.totalCostController, + label: 'هزینه کل', + ), + controller.totalCost, + ), + const SizedBox(height: 20), + ObxValue((data) { + return RElevated( + text: 'ثبت', + onPressed: data.value + ? () async{ + await controller.submitAllocation(); + controller.getAllocatedMade(); + Get.back(); + } + : null, ); - } - }, controller.allocatedMadeModel), + }, controller.isValid), + const SizedBox(height: 20), + ], + ), + ), + ); + } + + Widget guildsDropDown() { + return Obx(() { + final item = controller.selectedGuildModel.value; + return OverlayDropdownWidget( + key: ValueKey(item?.user?.fullname ?? ''), + items: controller.guildsModel, + onChanged: (value) { + controller.selectedGuildModel.value = value; + }, + selectedItem: item, + itemBuilder: (item) => Text( + item.user != null + ? '${item.steward == true ? 'مباشر' : 'صنف'} ${item.user!.fullname} (${item.user!.mobile})' + : 'بدون نام', + ), + labelBuilder: (item) => Text( + item?.user != null + ? '${item?.steward == true ? 'مباشر' : 'صنف'} ${item?.user!.fullname} (${item?.user!.mobile})' + : 'انتخاب مباشر/صنف', + ), + ); + }); + } + + Widget productDropDown() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rolesProductsModel, + onChanged: (value) { + controller.selectedProductModel.value = value; + }, + selectedItem: controller.selectedProductModel.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + ); + }); + } + + Padding routePageWidget() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + children: [ + SizedBox(width: 8), + RichText( + text: TextSpan( + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + children: [ + WidgetSpan( + child: Row( + children: [ + Assets.vec.cubeSearchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + SizedBox(width: 6), + ], + ), + ), + + TextSpan(text: 'داخل استان'), + TextSpan(text: '/'), + TextSpan(text: 'فروش'), + ], + ), + ), ], ), ); } - void showAddBottomSheet() { - Get.bottomSheet( - SafeArea( - child: BaseBottomSheet( - height: 700, - child: Padding( - padding: EdgeInsets.only( - left: 16, - right: 16, - top: 16, - bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'ثبت توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, + Widget allocationsMadeListItem({ + required RxList expandList, + required int index, + required AllocatedMadeModel item, + }) { + return GestureDetector( + onTap: () { + if (expandList.contains(index)) { + controller.isExpandedList.remove(index); + } else { + controller.isExpandedList.add(index); + } + }, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: getTintColor(item), + borderRadius: BorderRadius.circular(8), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 2, color: getTintColor(item)), + ), + child: Row( + children: [ + Expanded( + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + + children: [ + SizedBox(width: 12), + + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + item.steward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + + SizedBox(height: 2), + Text( + item.createDate?.formattedJalaliDate, + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), + ), + ], + ), + ), + + SizedBox(width: 8), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + '${item.weightOfCarcasses.separatedByComma} Kg', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.bgDark, + ), + ), + Text( + '${item.amount.separatedByComma} ریال', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDark, + ), + ), + ], + ), + ), + Expanded( + flex: 1, + child: Text( + '${item.allocationType?.faAllocationType}', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith( + color: AppColor.darkGreyDark, + ), + ), + ), + + SizedBox(width: 8), + ], + ), + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + controller.setEditData(item); + //TODO + /* Get.bottomSheet( + addOrEditBuyerBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + });*/ + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), + + Text( + item.allocationType?.faAllocationType, + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, + ), + ), + + SizedBox(), + ], + ), + + buildRow( + 'تاریخ ثبت', + item.date!.formattedJalaliDate ?? 'N/A', + ), + buildRow( + 'نام و نام خانوادگی خریدار', + getBuyerInformation(item)?.user?.fullname ?? + 'N/A', + ), + buildRow( + 'شماره خریدار', + getBuyerInformation(item)?.user?.mobile ?? + 'N/A', + ), + buildRow( + 'نوع فروش', + item.sellType?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${item.amount.separatedByComma ?? 0} ریال ', + ), + buildRow( + 'قیمت کل', + '${item.totalAmount.separatedByComma ?? 0} ریال', + ), + buildRow( + 'وزن تخصیصی', + '${item.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', + ), + buildRow( + 'کداحراز', + item.registrationCode?.toString() ?? 'N/A', + ), + buildRow( + 'وضعیت کد احراز', + item.systemRegistrationCode == true + ? "ارسال شده" + : "ارسال نشده" ?? 'N/A', + ), + buildRow( + 'افت وزن(کیلوگرم)', + item.weightLossOfCarcasses + ?.toInt() + .toString() ?? + 'N/A', + ), + + Row( + spacing: 10, + children: [ + Expanded( + child: RElevated( + backgroundColor: AppColor.greenNormal, + height: 40, + text: 'تایید', + textStyle: AppFonts.yekan18.copyWith( + color: Colors.white, + ), + onPressed: () { + ConformAllocation confromation = + ConformAllocation( + allocation_key: item.key, + number_of_carcasses: + item.numberOfCarcasses, + weight_of_carcasses: item + .weightOfCarcasses + ?.toInt(), + amount: item.amount, + total_amount: item.totalAmount, + ); + + controller.confirmAllocation( + confromation, + ); + }, + ), + ), + Expanded( + child: ROutlinedElevated( + height: 40, + borderColor: AppColor.error, + text: 'رد', + textStyle: AppFonts.yekan18.copyWith( + color: AppColor.error, + ), + onPressed: () { + controller.denyAllocation( + item.key ?? '', + ); + }, + ), + ), + ], + ), + ], + ), + ), + crossFadeState: expandList.contains(index) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + Container( + width: 20, + child: Center( + child: RotatedBox( + quarterTurns: 3, + child: Text( + item.state?.faItem, + style: AppFonts.yekan8, + textAlign: TextAlign.center, + ), + ), + ), + ), + ], ), ), - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), - ), - const SizedBox(height: 12), - Material( - type: MaterialType.transparency, - child: productDropDown(), - ), - const SizedBox(height: 12), - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش اختصاصی', style: AppFonts.yekan14), - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش آزاد', style: AppFonts.yekan14), - ], - ); - }, controller.saleType), - ), - const SizedBox(height: 12), + ), - Material( - type: MaterialType.transparency, - child: guildsDropDown(), - ), - - const SizedBox(height: 12), - RTextField( - controller: controller.weightController, - keyboardType: TextInputType.number, - onChanged: (p0) { - controller.weight.value = int.tryParse(p0) ?? 0; - }, - label: 'وزن لاشه', - ), - const SizedBox(height: 12), - RTextField( - controller: controller.pricePerKiloController, - onChanged: (p0) { - controller.pricePerKilo.value = int.tryParse(p0) ?? 0; - }, - keyboardType: TextInputType.number, - label: 'قیمت هر کیلو', - ), - const SizedBox(height: 12), - ObxValue( - (p0) => RTextField( - enabled: false, - keyboardType: TextInputType.number, - initText: controller.totalCost.value.toString(), - controller: controller.totalCostController, - label: 'هزینه کل', + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all( + width: 0.50, + color: AppColor.greenDarkActive, + ), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), ), - controller.totalCost, ), - const SizedBox(height: 20), - ObxValue((data) { - return RElevated( - text: 'ثبت', - onPressed: data.value - ? () { - controller.submitAllocation(); - } - : null, - ); - }, controller.isValid), - const SizedBox(height: 20), - ], - ), + ), + ], ), ), ), - isScrollControlled: true, - backgroundColor: Colors.transparent, ); } - Widget guildsDropDown() { - return ObxValue((p0) { - return DropdownButtonFormField( - value: controller.selectedGuildModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب مباشر/صنف', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.guildsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text( - '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user?.fullname} (${guild.user?.mobile})', - ), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedGuild(value); - controller.checkVerfication(); - } - }, - ); - }, controller.guildsModel); - /* return GetBuilder( - builder: (controller) { - return DropdownButtonFormField( - value: controller.selectedGuildModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب مباشر/صنف', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.guildsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text( - '${guild.steward == true ? 'مباشر' : 'صنف'} ${guild.user - ?.fullname} (${guild.user?.mobile})', - ), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedGuild(value); - } - }, - ); - }, - );*/ + Color getTintColor(AllocatedMadeModel model) { + Color res; + + if (model.receiverState == 'pending') { + res = AppColor.yellowNormal; + } else if (model.receiverState == 'approved') { + res = AppColor.greenLightActive; + } else if (model.receiverState == 'rejected') { + res = AppColor.redLight; + } else { + res = AppColor.blueLight; + } + + return res; } - Widget productDropDown() { - return GetBuilder( - builder: (controller) { - return DropdownButtonFormField( - value: controller.selectedProductModel.value, - decoration: const InputDecoration( - labelText: 'انتخاب محصول', - border: OutlineInputBorder(), - ), - isExpanded: true, - items: controller.rolesProductsModel.map((guild) { - return DropdownMenuItem( - value: guild, - child: Text('${guild.name}'), - ); - }).toList(), - onChanged: (value) { - if (value != null) { - controller.setSelectedProduct(value); - controller.checkVerfication(); - } - }, - ); - }, - ); + Steward? getBuyerInformation(AllocatedMadeModel model) { + if (model.allocationType?.buyerIsGuild) { + return model.toGuilds; + } else { + return model.steward; + } } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 1caaf43..1459091 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -106,272 +106,11 @@ class SalesOutOfProvincePage extends GetView { ), ], ), - ), ); }, controller.currentIndex); } - - Widget salePage(){ - return SizedBox(); - } - -/* - - Widget saleListWidget() { - return ObxValue((data) { - switch (data.value.status) { - case Status.initial: - case Status.loading: - return Center(child: CupertinoActivityIndicator()); - case Status.success: - return ListView.separated( - shrinkWrap: true, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) { - return ObxValue( - (expandList) => saleListItem(expandList: expandList, index: index, item: data.value.data![index]), - controller.isExpandedList, - ); - }, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemCount: data.value.data?.length ?? 0, - ); - case Status.error: - return Center( - child: Text( - data.value.message ?? 'خطا در دریافت اطلاعات', - style: AppFonts.yekan16.copyWith(color: AppColor.error), - ), - ); - case Status.empty: - return emptyWidget(); - } - }, controller.purchaseOutOfProvinceList); - } -*/ - - - -/* GestureDetector saleListItem({required RxList expandList, required int index, required StewardFreeBar item}) { - return GestureDetector( - onTap: () { - if (expandList.contains(index)) { - controller.isExpandedList.remove(index); - } else { - controller.isExpandedList.add(index); - } - }, - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - AnimatedSize( - duration: Duration(milliseconds: 300), - child: Container( - width: Get.width - 30, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), - ), - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox(width: 12), - Expanded( - flex: 2, - child: Text( - item.date?.formattedJalaliDate ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - ), - Expanded( - flex: 3, - child: Text( - item.killHouseName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(width: 8,), - Expanded( - flex: 2, - child: Column( - children: [ - Text( - '${item.weightOfCarcasses?.separatedByComma}kg', - textAlign: TextAlign.left, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - - SizedBox(height: 2,), - Visibility( - visible: item.product?.name?.contains('مرغ گرم') ?? false, - child: Assets.vec.hotChickenSvg.svg(width: 24, - height: 24, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn))), - - ], - ), - ), - Expanded( - flex: 2, - child: Text( - '${item.province}\n${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), - ), - ), - Icon(CupertinoIcons.chevron_down, size: 12), - SizedBox(width: 8), - ], - ), - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - controller.setEditData(item); - Get.bottomSheet( - addPurchasedInformationBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - - Text( - '${item.province}-${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - - GestureDetector( - onTap: () { - // buildDeleteDialog( - // onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), - // ); - }, - child: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), - ), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: buildRow('تاریخ', item.date?.formattedJalaliDateYHMS ?? 'N/A'), - ), - - buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), - buildRow('محصول', item.product?.name ?? 'N/A'), - buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.separatedByComma} کیلوگرم'), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - Get.bottomSheet( - BaseBottomSheet( - height: 400, - child: Column( - spacing: 16, - children: [ - Text( - 'بارنامه', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), - ), - - Image.network( - item.barImage ?? '', - fit: BoxFit.cover, - height: 300, - errorBuilder: (context, error, stackTrace) { - eLog(error.toString()); - return Center(child: Text('خطایی پیش آمده!')); - }, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - print('Loading progress: $loadingProgress'); - return CupertinoActivityIndicator(); - }, - ), - ], - ), - ), - ); - }, - child: Text( - 'مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), - ), - Icon(CupertinoIcons.chevron_up, size: 12), - ], - ), - ], - ), - ), - crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - ), - ), - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), - ), - alignment: Alignment.center, - child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), - ), - ), - ], - ), - ), - ); - }*/ - Row routePageWidget() { return Row( children: [ @@ -431,246 +170,6 @@ class SalesOutOfProvincePage extends GetView { ); } -/* Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { - return BaseBottomSheet( - child: SingleChildScrollView( - child: Form( - key: controller.formKey, - child: Column( - spacing: 16, - children: [ - Text( - isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), - ), - _productTypeWidget(), - RTextField( - controller: controller.sellerNameController, - label: 'نام فروشنده', - borderColor: AppColor.darkGreyLight, - ), - RTextField( - controller: controller.sellerPhoneController, - label: 'تلفن فروشنده', - keyboardType: TextInputType.phone, - borderColor: AppColor.darkGreyLight, - maxLength: 11, - validator: (value) { - if (value == null || value.isEmpty) { - return 'لطفاً شماره موبایل را وارد کنید'; - } - // حذف کاماها برای اعتبارسنجی - String cleaned = value.replaceAll(',', ''); - if (cleaned.length != 11) { - return 'شماره موبایل باید ۱۱ رقم باشد'; - } - if (!cleaned.startsWith('09')) { - return 'شماره موبایل باید با 09 شروع شود'; - } - return null; - }, - ), - _provinceWidget(), - _cityWidget(), - RTextField( - controller: controller.carcassWeightController, - label: 'وزن لاشه', - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], - ), - _imageCarcasesWidget(isOnEdit), - submitButtonWidget(isOnEdit), - SizedBox(), - ], - ), - ), - ), - ); - }*/ - -/* Widget submitButtonWidget(bool isOnEdit) { - return ObxValue((data) { - return RElevated( - text: isOnEdit ? 'ویرایش' : 'ثبت خرید', - onPressed: data.value - ? () async { - var res = await controller.createStewardPurchaseOutOfProvince(); - if (res) { - Get.back(); - } - } - : null, - height: 40, - ); - }, controller.isSubmitButtonEnabled); - }*/ - - Widget _productTypeWidget() { - tLog(controller.outOfTheProvinceLogic.rolesProductsModel); - iLog(controller.selectedProduct.value); - return Obx(() { - return OverlayDropdownWidget( - items: controller.outOfTheProvinceLogic.rolesProductsModel, - onChanged: (value) { - controller.selectedProduct.value = value; - }, - selectedItem: controller.selectedProduct.value, - initialValue: controller.selectedProduct.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), - ); - }); - } - - Widget _provinceWidget() { - return Obx(() { - return OverlayDropdownWidget( - items: controller.rootLogic.provinces, - onChanged: (value) { - controller.selectedProvince.value = value; - print('Selected Product: ${value.name}'); - }, - selectedItem: controller.selectedProvince.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), - ); - }); - } - - Widget _cityWidget() { - return ObxValue((data) { - return OverlayDropdownWidget( - items: data, - onChanged: (value) { - controller.selectedCity.value = value; - print('Selected Product: ${value.name}'); - }, - selectedItem: controller.selectedCity.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), - ); - }, controller.cites); - } - -/* SizedBox _imageCarcasesWidget(bool isOnEdit) { - return SizedBox( - width: Get.width, - height: 250, - child: Card( - color: Colors.white, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Expanded( - child: ObxValue((data) { - return Container( - width: Get.width, - decoration: BoxDecoration(color: AppColor.lightGreyNormal, borderRadius: BorderRadius.circular(8)), - child: Center( - child: isOnEdit - ? Image.network(controller.editImageUrl.value ?? '') - : data.value == null - ? Assets.images.placeHolder.image(height: 150, width: 200) - : Image.file(File(data.value!.path), fit: BoxFit.cover), - ), - ); - }, controller.selectedImage), - ), - SizedBox(height: 15), - Container( - width: Get.width, - height: 40, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text('تصویر بار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), - Spacer(), - GestureDetector( - onTap: () async { - controller.selectedImage.value = await controller.imagePicker.pickImage( - source: ImageSource.camera, - imageQuality: 60, - maxWidth: 1080, - maxHeight: 720, - ); - }, - child: Container( - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text('دوربین', style: AppFonts.yekan14.copyWith(color: Colors.white)), - SizedBox(width: 8), - Icon(CupertinoIcons.camera, color: Colors.white), - ], - ), - ), - ), - SizedBox(width: 16), - GestureDetector( - onTap: () async { - controller.selectedImage.value = await controller.imagePicker.pickImage( - source: ImageSource.gallery, - imageQuality: 60, - maxWidth: 1080, - maxHeight: 720, - ); - }, - child: Container( - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text('گالری', style: AppFonts.yekan14.copyWith(color: Colors.white)), - SizedBox(width: 8), - Icon(CupertinoIcons.photo, color: Colors.white), - ], - ), - ), - ), - ], - ), - ), - ], - ), - ), - ), - ); - }*/ - -/* Future buildDeleteDialog({required Future Function() onConfirm}) async { - await Get.defaultDialog( - title: 'حذف خرید', - middleText: 'آیا از حذف این خرید مطمئن هستید؟', - confirm: ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), - onPressed: () async { - await onConfirm(); - Get.back(); - }, - child: Text('بله'), - ), - cancel: ElevatedButton( - onPressed: () { - Get.back(); - }, - child: Text('خیر'), - ), - ).whenComplete(() => controller.getStewardPurchaseOutOfProvince()); - } - -*/ - Widget filterBottomSheet() { return BaseBottomSheet( height: 250, @@ -806,5 +305,4 @@ class SalesOutOfProvincePage extends GetView { ); } - } diff --git a/packages/core/lib/utils/map_utils.dart b/packages/core/lib/utils/map_utils.dart index 39e63c4..a313a1e 100644 --- a/packages/core/lib/utils/map_utils.dart +++ b/packages/core/lib/utils/map_utils.dart @@ -28,9 +28,8 @@ Map buildQueryParams({ params['search'] = search; } - if (value != null) { - params['value'] = value; - } + params['value'] = value ?? ''; + if (page != null) { params['page'] = page; diff --git a/packages/core/lib/utils/string_utils.dart b/packages/core/lib/utils/string_utils.dart index 36f527b..555bcbe 100644 --- a/packages/core/lib/utils/string_utils.dart +++ b/packages/core/lib/utils/string_utils.dart @@ -1,11 +1,13 @@ import 'package:intl/intl.dart'; extension XString on String { - String get separatedByComma { + String get separatedByComma { final formatter = NumberFormat('#,###'); - return formatter.format(this); + final number = num.tryParse(this); + return number != null ? formatter.format(number) : this; } - get clearComma{ + + get clearComma { return replaceAll(RegExp(r'\D'), ''); } } From 7bb19a7ffc3048ebb20286c70cf94b0c53ba283e Mon Sep 17 00:00:00 2001 From: MrM Date: Fri, 27 Jun 2025 19:13:06 +0330 Subject: [PATCH 138/256] feat : sale in the province edit and delete --- .../data/repositories/chicken_repository.dart | 14 ++ .../repositories/chicken_repository_imp.dart | 29 ++- .../pages/sales_in_province/logic.dart | 70 ++++++- .../pages/sales_in_province/view.dart | 176 ++++++++++++------ 4 files changed, 226 insertions(+), 63 deletions(-) diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index d86de00..5f5092c 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; @@ -81,6 +82,19 @@ abstract class ChickenRepository { required SubmitStewardAllocation request, }); + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }); + + + Future updateStewardAllocation({ + required String token, + required ConformAllocation request, + }); + + + Future getStewardDashboard({ required String token, required String stratDate, diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 3bf032b..d5d33d8 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; @@ -112,11 +113,11 @@ class ChickenRepositoryImpl implements ChickenRepository { }) async { var res = await _httpClient.get( '/steward-allocation/', - queryParameters:queryParameters, + queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJson: (json) => PaginationModel.fromJson( json, - (json) => AllocatedMadeModel.fromJson(json as Map), + (json) => AllocatedMadeModel.fromJson(json as Map), ), ); return res.data; @@ -207,6 +208,30 @@ class ChickenRepositoryImpl implements ChickenRepository { ); } + @override + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }) async { + await _httpClient.delete( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: queryParameters, + ); + } + + @override + Future updateStewardAllocation({ + required String token, + required ConformAllocation request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: request.toJson(), + ); + } + @override Future getStewardDashboard({ required String token, diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 6a96717..972beb8 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -37,10 +37,13 @@ class SalesInProvinceLogic extends GetxController { final RxBool addPageAllocationsMade = false.obs; final RxBool hasMoreDataAllocationsMade = true.obs; + Rxn selectedAllocationModelForUpdate = + Rxn(); + @override void onInit() { super.onInit(); - //rootLogic.getInventory(); + getAllocatedMade(); getRolesProducts(); getGuilds(); @@ -254,12 +257,73 @@ class SalesInProvinceLogic extends GetxController { ); } + Future deleteAllocation(AllocatedMadeModel model) async { + safeCall( + call: () async => + await rootLogic.chickenRepository.deleteStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: {'steward_allocation_key': model.key}, + ), + + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stackTrace) {}, + ); + } + @override void dispose() { rootLogic.inventoryExpandedList.clear(); super.dispose(); } - //TODO - void setEditData(AllocatedMadeModel item) {} + void setEditData(AllocatedMadeModel item) { + selectedAllocationModelForUpdate.value = item; + selectedProductModel.value = rolesProductsModel.first; + selectedGuildModel.value = GuildModel(guildsName: 'tst'); + weight.value = item.weightOfCarcasses ?? 0; + pricePerKilo.value = item.amount ?? 0; + totalCost.value = item.totalAmount ?? 0; + weightController.text = weight.value.toString().separatedByComma; + pricePerKiloController.text = pricePerKilo.value + .toString() + .separatedByComma; + totalCostController.text = totalCost.value.toString().separatedByComma; + isValid.value = true; + } + + void clearForm() { + selectedGuildModel.value = null; + weight.value = 0; + pricePerKilo.value = 0; + totalCost.value = 0; + weightController.clear(); + pricePerKiloController.clear(); + totalCostController.clear(); + isValid.value = false; + } + + Future updateAllocation() async { + ConformAllocation updatedAllocationModel = ConformAllocation( + allocation_key: selectedAllocationModelForUpdate.value?.key, + amount: pricePerKilo.value, + total_amount: totalCost.value, + number_of_carcasses: 0, + weight_of_carcasses: weight.value, + ); + + safeCall( + call: () async => + await rootLogic.chickenRepository.updateStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: updatedAllocationModel, + ), + + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stackTrace) {}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 860201e..b9c5bbe 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -338,9 +338,9 @@ class SalesInProvincePage extends GetView { ); } - Widget showAddBottomSheet() { + Widget showAddBottomSheet([bool isEditMode = false]) { return BaseBottomSheet( - height: Get.height * 0.75, + height: Get.height * (isEditMode ? 0.45 : 0.75), child: Padding( padding: EdgeInsets.only( left: 16, @@ -352,52 +352,63 @@ class SalesInProvincePage extends GetView { mainAxisSize: MainAxisSize.min, children: [ Text( - 'ثبت توزیع/ فروش', + '${isEditMode ? 'ویرایش' :'ثبت' } توزیع/ فروش', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), + Visibility( + visible: isEditMode == false, + child: Column( + children: [ + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material( + type: MaterialType.transparency, + child: productDropDown(), + ), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + + controller.selectedGuildModel.value = null; + controller.selectedGuildModel.refresh(); + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + guildsDropDown(), + + + ], + ), ), - const SizedBox(height: 12), - Material(type: MaterialType.transparency, child: productDropDown()), - const SizedBox(height: 12), - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - - controller.selectedGuildModel.value = null; - controller.selectedGuildModel.refresh(); - }, - ), - Text('فروش اختصاصی', style: AppFonts.yekan14), - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش آزاد', style: AppFonts.yekan14), - ], - ); - }, controller.saleType), - ), - const SizedBox(height: 12), - - guildsDropDown(), - const SizedBox(height: 12), RTextField( controller: controller.weightController, @@ -423,7 +434,8 @@ class SalesInProvincePage extends GetView { ], onChanged: (p0) { - controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; + controller.pricePerKilo.value = + int.tryParse(p0.clearComma) ?? 0; }, keyboardType: TextInputType.number, label: 'قیمت هر کیلو', @@ -438,7 +450,9 @@ class SalesInProvincePage extends GetView { SeparatorInputFormatter(), ], borderColor: AppColor.darkGreyLight, - initText: controller.totalCost.value.toString().separatedByComma, + initText: controller.totalCost.value + .toString() + .separatedByComma, controller: controller.totalCostController, label: 'هزینه کل', ), @@ -447,10 +461,16 @@ class SalesInProvincePage extends GetView { const SizedBox(height: 20), ObxValue((data) { return RElevated( - text: 'ثبت', + text:isEditMode? 'ویرایش': 'ثبت', + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + height: 40, onPressed: data.value - ? () async{ - await controller.submitAllocation(); + ? () async { + isEditMode + ? await controller.submitAllocation() + : await controller.updateAllocation(); + + controller.clearForm(); controller.getAllocatedMade(); Get.back(); } @@ -680,13 +700,12 @@ class SalesInProvincePage extends GetView { GestureDetector( onTap: () { controller.setEditData(item); - //TODO - /* Get.bottomSheet( - addOrEditBuyerBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - });*/ + Get.bottomSheet( + showAddBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.clearForm(); + }); }, child: Assets.vec.editSvg.svg( width: 20, @@ -706,7 +725,22 @@ class SalesInProvincePage extends GetView { ), ), - SizedBox(), + GestureDetector( + onTap: () { + buildDeleteDialog( + onConfirm: () => + controller.deleteAllocation(item), + ); + }, + child: Assets.vec.trashSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), + ), + ), ], ), @@ -883,4 +917,30 @@ class SalesInProvincePage extends GetView { return model.steward; } } + + Future buildDeleteDialog({ + required Future Function() onConfirm, + }) async { + await Get.defaultDialog( + title: 'حذف ', + middleText: 'آیا از حذف این مورد مطمئن هستید؟', + confirm: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.error, + foregroundColor: Colors.white, + ), + onPressed: () async { + await onConfirm(); + Get.back(); + }, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ).whenComplete(() => controller.getAllocatedMade()); + } } From 1ab478308e28f1c563f7715df464e8742064e684 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 28 Jun 2025 13:12:17 +0330 Subject: [PATCH 139/256] fix : buyer in sale out of the province --- .../lib/presentation/pages/root/logic.dart | 39 +- .../pages/sales_in_province/logic.dart | 104 +-- .../pages/sales_in_province/view.dart | 833 +++++++++--------- packages/core/lib/utils/date_time_utils.dart | 23 +- packages/core/lib/utils/string_utils.dart | 2 +- 5 files changed, 519 insertions(+), 482 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 4786e7c..a131e66 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart' show Colors; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; @@ -22,15 +24,13 @@ class RootLogic extends GetxController { Container(color: Colors.amber), ]; - - late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; RxList errorLocationType = RxList(); RxMap inventoryExpandedList = RxMap(); - + Rxn inventoryModel = Rxn(); RxList provinces = [].obs; @override @@ -42,8 +42,8 @@ class RootLogic extends GetxController { getProvinces(); - /*getInventory(); - getKillHouseDistributionInfo();*/ + getInventory(); + //getKillHouseDistributionInfo(); } void toggleExpanded(int index) { @@ -54,6 +54,29 @@ class RootLogic extends GetxController { } } + Future getInventory() async { + await safeCall?>( + call: () async => await chickenRepository.getInventory(token: tokenService.accessToken.value!), + onSuccess: (result) { + if (result != null) { + inventoryModel.value = result.first; + } + }, + onError: (error, stackTrace) { + switch (error.response?.statusCode) { + case 401: + errorHandler(error); + break; + case 403: + errorHandler(error); + break; + default: + errorHandler(error); + } + }, + ); + } + void rootErrorHandler(DioException error) { handleGeneric(error, () { tokenService.deleteTokens(); @@ -75,4 +98,10 @@ class RootLogic extends GetxController { provinces.clear(); } } + + void errorHandler(DioException error) { + handleGeneric(error, () { + tokenService.deleteTokens(); + }); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 972beb8..8451ba1 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -11,14 +11,18 @@ import 'package:rasadyar_core/core.dart'; class SalesInProvinceLogic extends GetxController { var rootLogic = Get.find(); - Rxn?> allocatedMadeModel = - Rxn?>(); + Rxn?> allocatedMadeModel = Rxn?>(); RxList isExpandedList = [].obs; RxList rolesProductsModel = RxList(); - + RxBool searchIsSelected = false.obs; + RxnString searchedValue = RxnString(); RxList guildsModel = [].obs; + GlobalKey formKey = GlobalKey(); + + Rxn fromDateFilter = Rxn(null); + Rxn toDateFilter = Rxn(null); Rxn selectedProductModel = Rxn(); Rxn selectedGuildModel = Rxn(); Rxn guildProfile = Rxn(); @@ -37,8 +41,8 @@ class SalesInProvinceLogic extends GetxController { final RxBool addPageAllocationsMade = false.obs; final RxBool hasMoreDataAllocationsMade = true.obs; - Rxn selectedAllocationModelForUpdate = - Rxn(); + Rxn selectedAllocationModelForUpdate = Rxn(); + SubmitStewardAllocation? tmpStewardAllocation; @override void onInit() { @@ -51,17 +55,16 @@ class SalesInProvinceLogic extends GetxController { ever(saleType, (callback) { getGuilds(); }); - - weight.listen((num) { - totalCost.value = num * pricePerKilo.value; + debounce(weight, time: Duration(milliseconds: 110), (callback) { + totalCost.value = callback * weight.value; }); - pricePerKilo.listen((num) { - totalCost.value = num * weight.value; + debounce(pricePerKilo, time: Duration(milliseconds: 100), (callback) { + totalCost.value = callback * weight.value; }); totalCost.listen((data) { - totalCostController.text = data.toString(); + totalCostController.text = data.toString().separatedByComma; isValid.value = weight.value > 0 && @@ -78,15 +81,23 @@ class SalesInProvinceLogic extends GetxController { getAllocatedMade(); } }); + + debounce(searchedValue, (callback) => getAllocatedMade(), time: Duration(milliseconds: 2000)); + ever(searchIsSelected, (data) { + if (data == false) { + searchedValue.value = null; + } + }); } Future getAllocatedMade() async { - if (isLoadingMoreAllocationsMade.value || - !hasMoreDataAllocationsMade.value) { + if (isLoadingMoreAllocationsMade.value || !hasMoreDataAllocationsMade.value) { return; } - if (addPageAllocationsMade.value) { + if (searchIsSelected.value) { + currentPageAllocationsMade.value = 1; + } else if (addPageAllocationsMade.value) { currentPageAllocationsMade.value++; } safeCall( @@ -97,6 +108,7 @@ class SalesInProvinceLogic extends GetxController { pageSize: 20, search: 'filter', role: 'Steward', + value: searchedValue.value, ), ), onSuccess: (result) { @@ -157,8 +169,7 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, - allocationTokens: - allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], + allocationTokens: allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); @@ -169,9 +180,8 @@ class SalesInProvinceLogic extends GetxController { Future getRolesProducts() async { safeCall( - call: () async => await rootLogic.chickenRepository.getRolesProducts( - token: rootLogic.tokenService.accessToken.value!, - ), + call: () async => + await rootLogic.chickenRepository.getRolesProducts(token: rootLogic.tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { rolesProductsModel.value = result; @@ -186,10 +196,7 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getGuilds( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - queryParams: {'free': saleType.value == 2 ? true : false}, - role: 'Steward', - ), + queryParameters: buildQueryParams(queryParams: {'free': saleType.value == 2 ? true : false}, role: 'Steward'), ), onSuccess: (result) { if (result != null) { @@ -215,9 +222,7 @@ class SalesInProvinceLogic extends GetxController { Future getGuildProfile() async { await safeCall( - call: () async => await rootLogic.chickenRepository.getProfile( - token: rootLogic.tokenService.accessToken.value!, - ), + call: () async => await rootLogic.chickenRepository.getProfile(token: rootLogic.tokenService.accessToken.value!), onError: (error, stackTrace) {}, onSuccess: (result) { guildProfile.value = result; @@ -225,30 +230,31 @@ class SalesInProvinceLogic extends GetxController { ); } - Future submitAllocation() async { - SubmitStewardAllocation stewardAllocation = SubmitStewardAllocation( + void setSubmitData() { + tmpStewardAllocation = SubmitStewardAllocation( approvedPriceStatus: false, allocationType: - '${guildProfile.value?.steward == true ? "steward" : "guild"}-${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', + '${guildProfile.value?.steward == true ? "steward" : "guild"}_${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', sellerType: guildProfile.value?.steward == true ? "Steward" : "Guild", - buyerType: selectedGuildModel.value?.steward == true - ? "Steward" - : "Guild", + buyerType: selectedGuildModel.value?.steward == true ? "Steward" : "Guild", amount: pricePerKilo.value, totalAmount: totalCost.value, weightOfCarcasses: weight.value, + sellType:saleType.value ==2 ? "free" :'exclusive', + numberOfCarcasses: 0, guildKey: selectedGuildModel.value?.key, productKey: selectedProductModel.value?.key, - date: DateTime.now().formattedGregorianDate, + date: DateTime.now().formattedDashedGregorian, type: "manual", ); + } + Future submitAllocation() async { safeCall( - call: () async => - await rootLogic.chickenRepository.postSubmitStewardAllocation( - token: rootLogic.tokenService.accessToken.value!, - request: stewardAllocation, - ), + call: () async => await rootLogic.chickenRepository.postSubmitStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: tmpStewardAllocation!, + ), onSuccess: (result) { getAllocatedMade(); @@ -259,11 +265,10 @@ class SalesInProvinceLogic extends GetxController { Future deleteAllocation(AllocatedMadeModel model) async { safeCall( - call: () async => - await rootLogic.chickenRepository.deleteStewardAllocation( - token: rootLogic.tokenService.accessToken.value!, - queryParameters: {'steward_allocation_key': model.key}, - ), + call: () async => await rootLogic.chickenRepository.deleteStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: {'steward_allocation_key': model.key}, + ), onSuccess: (result) { getAllocatedMade(); @@ -286,9 +291,7 @@ class SalesInProvinceLogic extends GetxController { pricePerKilo.value = item.amount ?? 0; totalCost.value = item.totalAmount ?? 0; weightController.text = weight.value.toString().separatedByComma; - pricePerKiloController.text = pricePerKilo.value - .toString() - .separatedByComma; + pricePerKiloController.text = pricePerKilo.value.toString().separatedByComma; totalCostController.text = totalCost.value.toString().separatedByComma; isValid.value = true; } @@ -314,11 +317,10 @@ class SalesInProvinceLogic extends GetxController { ); safeCall( - call: () async => - await rootLogic.chickenRepository.updateStewardAllocation( - token: rootLogic.tokenService.accessToken.value!, - request: updatedAllocationModel, - ), + call: () async => await rootLogic.chickenRepository.updateStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: updatedAllocationModel, + ), onSuccess: (result) { getAllocatedMade(); diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index b9c5bbe..f0b2aeb 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -3,9 +3,9 @@ import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; -import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -18,11 +18,7 @@ class SalesInProvincePage extends GetView { return Scaffold( appBar: RAppBar( titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: true, - onBackPressed: () { - Get.back(id: 1); - }, + hasBack: false, leadingWidth: 155, leading: Row( mainAxisSize: MainAxisSize.min, @@ -31,43 +27,31 @@ class SalesInProvincePage extends GetView { Assets.vec.chickenSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - Text( - 'رصدطیور', - style: AppFonts.yekan16Bold.copyWith(color: Colors.white), + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), + Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), ], ), additionalActions: [ GestureDetector( onTap: () { - // controller.searchIsSelected.value = !controller.searchIsSelected.value; + controller.searchIsSelected.value = !controller.searchIsSelected.value; }, child: Assets.vec.searchSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), ), SizedBox(width: 8), GestureDetector( onTap: () { - // Get.bottomSheet(filterBottomSheet()); + Get.bottomSheet(filterBottomSheet()); }, child: Assets.vec.filterOutlineSvg.svg( width: 20, height: 20, - colorFilter: const ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), ), SizedBox(width: 8), @@ -77,21 +61,16 @@ class SalesInProvincePage extends GetView { child: Column( children: [ routePageWidget(), - + buildSearchWidget(), inventoryWidget(), allocationsMade(), - SizedBox(height: 40), ], ), ), floatingActionButton: RFab.add( onPressed: () { - Get.bottomSheet( - showAddBottomSheet(), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ); + Get.bottomSheet(showAddBottomSheet(), isScrollControlled: true, backgroundColor: Colors.transparent); }, ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, @@ -99,123 +78,18 @@ class SalesInProvincePage extends GetView { } Widget inventoryWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Align( - alignment: Alignment.centerRight, - child: Text( - 'موجودی انبار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(height: 4), - /* ObxValue( - (data) => data.isEmpty - ? Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 80, - padding: EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ) - : ListView.separated( - shrinkWrap: true, - itemCount: controller.rootLogic.inventoryList.length, - separatorBuilder: (context, index) => - const SizedBox(height: 8), - itemBuilder: (context, index) { - return ObxValue((expand) { - return GestureDetector( - onTap: () { - controller.rootLogic.toggleExpanded(index); - }, - behavior: HitTestBehavior.opaque, - child: AnimatedContainer( - onEnd: () { - controller - .rootLogic - .inventoryExpandedList[index] = !controller - .rootLogic - .inventoryExpandedList[index]!; - }, - margin: const EdgeInsets.symmetric(vertical: 2), - padding: EdgeInsets.all(6), - curve: Curves.easeInOut, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.blueNormal, - width: 1, - ), - ), - duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 300 : 80, - child: inventoryItem( - isExpanded: - expand.keys.contains(index) && expand[index]!, - index: index, - model: controller.rootLogic.inventoryList[index], - ), - ), - ); - }, controller.rootLogic.inventoryExpandedList); - }, - ), - controller.rootLogic.inventoryList, - ),*/ - ], - ), - ); - } - - Widget inventoryItem({ - required bool isExpanded, - required int index, - required InventoryModel model, - }) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - buildRow('نام محصول', model.name ?? ''), - Visibility( - visible: isExpanded, - child: Column( - spacing: 8, - children: [ - buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), - buildRow( - 'وزن خریدهای آزاد داخل استان (کیلوگرم)', - model.receiveFreeCarcassesWeight.toString(), - ), - buildRow( - 'وزن خریدهای خارج استان (کیلوگرم)', - model.freeBuyingCarcassesWeight.toString(), - ), - buildRow( - 'کل ورودی به انبار (کیلوگرم)', - model.totalFreeBarsCarcassesWeight.toString(), - ), - buildRow( - 'کل فروش (کیلوگرم)', - model.realAllocatedWeight.toString(), - ), - buildRow( - 'مانده انبار (کیلوگرم)', - model.totalRemainWeight.toString(), - ), - ], - ), - ), - ], + return Container( + width: Get.width, + height: 39, + margin: EdgeInsets.all(4), + decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), + alignment: Alignment.center, + child: ObxValue((data) { + return Text( + ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), + ); + }, controller.rootLogic.inventoryModel), ); } @@ -230,9 +104,7 @@ class SalesInProvincePage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -240,9 +112,7 @@ class SalesInProvincePage extends GetView { child: Text( value, textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), ], @@ -253,21 +123,16 @@ class SalesInProvincePage extends GetView { Widget allocationsMade() { return Column( children: [ - const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 6), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'تخصیصات صورت گرفته', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), + Text('تخصیصات صورت گرفته', style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), RElevated( text: 'تایید یکجا', height: 30, + textStyle: AppFonts.yekan12.copyWith(color: Colors.white), onPressed: () { controller.confirmAllAllocations(); }, @@ -321,15 +186,10 @@ class SalesInProvincePage extends GetView { } final result = data.value![index]; return ObxValue((data) { - return allocationsMadeListItem( - expandList: controller.isExpandedList, - index: index, - item: result, - ); + return allocationsMadeListItem(expandList: controller.isExpandedList, index: index, item: result); }, controller.isExpandedList); }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), + separatorBuilder: (BuildContext context, int index) => SizedBox(height: 8), ), ); } @@ -348,137 +208,139 @@ class SalesInProvincePage extends GetView { top: 16, bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - '${isEditMode ? 'ویرایش' :'ثبت' } توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - Visibility( - visible: isEditMode == false, - child: Column( - children: [ - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), - ), - const SizedBox(height: 12), - Material( - type: MaterialType.transparency, - child: productDropDown(), - ), - const SizedBox(height: 12), - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - - controller.selectedGuildModel.value = null; - controller.selectedGuildModel.refresh(); - }, - ), - Text('فروش اختصاصی', style: AppFonts.yekan14), - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش آزاد', style: AppFonts.yekan14), - ], - ); - }, controller.saleType), - ), - const SizedBox(height: 12), - - guildsDropDown(), - - - ], + child: Form( + key: controller.formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '${isEditMode ? 'ویرایش' : 'ثبت'} توزیع/ فروش', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), - ), - const SizedBox(height: 12), - RTextField( - controller: controller.weightController, - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], + Visibility( + visible: isEditMode == false, + child: Column( + children: [ + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material(type: MaterialType.transparency, child: productDropDown()), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; - onChanged: (p0) { - controller.weight.value = int.tryParse(p0.clearComma) ?? 0; - }, - label: 'وزن لاشه', - ), - const SizedBox(height: 12), - RTextField( - controller: controller.pricePerKiloController, - borderColor: AppColor.darkGreyLight, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], + controller.selectedGuildModel.value = null; + controller.selectedGuildModel.refresh(); + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), - onChanged: (p0) { - controller.pricePerKilo.value = - int.tryParse(p0.clearComma) ?? 0; - }, - keyboardType: TextInputType.number, - label: 'قیمت هر کیلو', - ), - const SizedBox(height: 12), - ObxValue( - (p0) => RTextField( + guildsDropDown(), + ], + ), + ), + const SizedBox(height: 12), + RTextField( + controller: controller.weightController, + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + validator: (value) { + + if (int.parse(value!.clearComma) > (controller.rootLogic.inventoryModel.value?.totalRemainWeight?.toInt() ?? 100) ){ + return 'وزن تخصیصی بیشتر از موجودی انبار است'; + } + return null; + }, + onChanged: (p0) { + controller.weight.value = int.tryParse(p0.clearComma) ?? 0; + }, + label: 'وزن لاشه', + ), + const SizedBox(height: 12), + RTextField( + controller: controller.pricePerKiloController, + borderColor: AppColor.darkGreyLight, + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + + onChanged: (p0) { + controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; + }, + keyboardType: TextInputType.number, + label: 'قیمت هر کیلو', + ), + const SizedBox(height: 12), + RTextField( enabled: false, keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], borderColor: AppColor.darkGreyLight, - initText: controller.totalCost.value - .toString() - .separatedByComma, controller: controller.totalCostController, label: 'هزینه کل', ), - controller.totalCost, - ), - const SizedBox(height: 20), - ObxValue((data) { - return RElevated( - text:isEditMode? 'ویرایش': 'ثبت', - textStyle: AppFonts.yekan16.copyWith(color: Colors.white), - height: 40, - onPressed: data.value - ? () async { - isEditMode - ? await controller.submitAllocation() - : await controller.updateAllocation(); + const SizedBox(height: 20), + ObxValue((data) { + return RElevated( + text: isEditMode ? 'ویرایش' : 'ثبت', + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + height: 40, + onPressed: data.value + ? () async { + if (controller.formKey.currentState?.validate() ?? false) { + iLog("s2"); + controller.setSubmitData(); + iLog("s3"); + Get.bottomSheet(show2StepAddBottomSheet()); + } + /* isEditMode + ? await controller.updateAllocation() + : () { + iLog("s1"); + if (controller.formKey.currentState?.validate() ?? false) { + iLog("s2"); + controller.setSubmitData(); + iLog("s3"); + Get.bottomSheet(show2StepAddBottomSheet()); + } + }; - controller.clearForm(); - controller.getAllocatedMade(); - Get.back(); - } - : null, - ); - }, controller.isValid), - const SizedBox(height: 20), - ], + controller.clearForm(); + controller.getAllocatedMade(); + Get.back();*/ + } + : null, + ); + }, controller.isValid), + const SizedBox(height: 20), + ], + ), ), ), ); @@ -538,10 +400,7 @@ class SalesInProvincePage extends GetView { Assets.vec.cubeSearchSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), SizedBox(width: 6), ], @@ -575,10 +434,7 @@ class SalesInProvincePage extends GetView { child: Container( width: Get.width, margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - decoration: BoxDecoration( - color: getTintColor(item), - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: getTintColor(item), borderRadius: BorderRadius.circular(8)), child: AnimatedSize( duration: Duration(milliseconds: 400), alignment: Alignment.center, @@ -627,18 +483,14 @@ class SalesInProvincePage extends GetView { Text( item.steward?.user?.fullname ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), SizedBox(height: 2), Text( - item.createDate?.formattedJalaliDate, + item.createDate?.formattedJalaliDate ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), ), ], ), @@ -654,16 +506,12 @@ class SalesInProvincePage extends GetView { Text( '${item.weightOfCarcasses.separatedByComma} Kg', textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.bgDark, - ), + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), ), Text( '${item.amount.separatedByComma} ریال', textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDark, - ), + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDark), ), ], ), @@ -673,9 +521,7 @@ class SalesInProvincePage extends GetView { child: Text( '${item.allocationType?.faAllocationType}', textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.darkGreyDark, - ), + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), ), ), @@ -686,16 +532,12 @@ class SalesInProvincePage extends GetView { secondChild: Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, children: [ Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( onTap: () { @@ -710,87 +552,53 @@ class SalesInProvincePage extends GetView { child: Assets.vec.editSvg.svg( width: 20, height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ), Text( item.allocationType?.faAllocationType, textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), GestureDetector( onTap: () { buildDeleteDialog( - onConfirm: () => - controller.deleteAllocation(item), + onConfirm: () { + expandList.remove(index); + return controller.deleteAllocation(item); + }, ); }, child: Assets.vec.trashSvg.svg( width: 16, height: 16, - colorFilter: ColorFilter.mode( - AppColor.error, - BlendMode.srcIn, - ), + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), ), ), ], ), - buildRow( - 'تاریخ ثبت', - item.date!.formattedJalaliDate ?? 'N/A', - ), + buildRow('تاریخ ثبت', item.date!.formattedJalaliDate ?? 'N/A'), buildRow( 'نام و نام خانوادگی خریدار', - getBuyerInformation(item)?.user?.fullname ?? - 'N/A', - ), - buildRow( - 'شماره خریدار', - getBuyerInformation(item)?.user?.mobile ?? - 'N/A', - ), - buildRow( - 'نوع فروش', - item.sellType?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${item.amount.separatedByComma ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${item.totalAmount.separatedByComma ?? 0} ریال', + getBuyerInformation(item)?.user?.fullname ?? 'N/A', ), + buildRow('شماره خریدار', getBuyerInformation(item)?.user?.mobile ?? 'N/A'), + buildRow('نوع فروش', item.sellType?.faItem ?? 'N/A'), + buildRow('قیمت هر کیلو', '${item.amount.separatedByComma ?? 0} ریال '), + buildRow('قیمت کل', '${item.totalAmount.separatedByComma ?? 0} ریال'), buildRow( 'وزن تخصیصی', '${item.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', ), - buildRow( - 'کداحراز', - item.registrationCode?.toString() ?? 'N/A', - ), + buildRow('کداحراز', item.registrationCode?.toString() ?? 'N/A'), buildRow( 'وضعیت کد احراز', - item.systemRegistrationCode == true - ? "ارسال شده" - : "ارسال نشده" ?? 'N/A', - ), - buildRow( - 'افت وزن(کیلوگرم)', - item.weightLossOfCarcasses - ?.toInt() - .toString() ?? - 'N/A', + item.systemRegistrationCode == true ? "ارسال شده" : "ارسال نشده" ?? 'N/A', ), + buildRow('افت وزن(کیلوگرم)', item.weightLossOfCarcasses?.toInt().toString() ?? 'N/A'), Row( spacing: 10, @@ -800,25 +608,17 @@ class SalesInProvincePage extends GetView { backgroundColor: AppColor.greenNormal, height: 40, text: 'تایید', - textStyle: AppFonts.yekan18.copyWith( - color: Colors.white, - ), + textStyle: AppFonts.yekan18.copyWith(color: Colors.white), onPressed: () { - ConformAllocation confromation = - ConformAllocation( - allocation_key: item.key, - number_of_carcasses: - item.numberOfCarcasses, - weight_of_carcasses: item - .weightOfCarcasses - ?.toInt(), - amount: item.amount, - total_amount: item.totalAmount, - ); - - controller.confirmAllocation( - confromation, + ConformAllocation confromation = ConformAllocation( + allocation_key: item.key, + number_of_carcasses: item.numberOfCarcasses, + weight_of_carcasses: item.weightOfCarcasses?.toInt(), + amount: item.amount, + total_amount: item.totalAmount, ); + + controller.confirmAllocation(confromation); }, ), ), @@ -827,13 +627,9 @@ class SalesInProvincePage extends GetView { height: 40, borderColor: AppColor.error, text: 'رد', - textStyle: AppFonts.yekan18.copyWith( - color: AppColor.error, - ), + textStyle: AppFonts.yekan18.copyWith(color: AppColor.error), onPressed: () { - controller.denyAllocation( - item.key ?? '', - ); + controller.denyAllocation(item.key ?? ''); }, ), ), @@ -853,11 +649,7 @@ class SalesInProvincePage extends GetView { child: Center( child: RotatedBox( quarterTurns: 3, - child: Text( - item.state?.faItem, - style: AppFonts.yekan8, - textAlign: TextAlign.center, - ), + child: Text(item.state?.faItem, style: AppFonts.yekan8, textAlign: TextAlign.center), ), ), ), @@ -875,16 +667,10 @@ class SalesInProvincePage extends GetView { decoration: BoxDecoration( color: AppColor.greenLightHover, borderRadius: BorderRadius.circular(4), - border: Border.all( - width: 0.50, - color: AppColor.greenDarkActive, - ), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), ), alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), + child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), ), ), ], @@ -918,17 +704,12 @@ class SalesInProvincePage extends GetView { } } - Future buildDeleteDialog({ - required Future Function() onConfirm, - }) async { + Future buildDeleteDialog({required Future Function() onConfirm}) async { await Get.defaultDialog( title: 'حذف ', middleText: 'آیا از حذف این مورد مطمئن هستید؟', confirm: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: AppColor.error, - foregroundColor: Colors.white, - ), + style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), onPressed: () async { await onConfirm(); Get.back(); @@ -943,4 +724,232 @@ class SalesInProvincePage extends GetView { ), ).whenComplete(() => controller.getAllocatedMade()); } + + ObxValue buildSearchWidget() { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + onChanged: (value) { + controller.searchedValue.value = value; + }, + controller: TextEditingController(), + ), + ), + ), + ); + }, controller.searchIsSelected); + } + + Widget filterBottomSheet() { + return BaseBottomSheet( + height: 250, + child: Column( + spacing: 16, + children: [ + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.fromDateFilter, + onChanged: (jalali) => controller.fromDateFilter.value = jalali, + ), + ), + Expanded( + child: timeFilterWidget( + isFrom: false, + date: controller.toDateFilter, + onChanged: (jalali) => controller.toDateFilter.value = jalali, + ), + ), + ], + ), + SizedBox(height: 2), + RElevated( + text: 'اعمال فیلتر', + onPressed: () { + controller.getAllocatedMade(); + Get.back(); + }, + height: 40, + ), + SizedBox(height: 16), + ], + ), + ); + } + + GestureDetector timeFilterWidget({ + isFrom = true, + required Rxn date, + required Function(Jalali jalali) onChanged, + }) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blueNormal), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + Expanded( + child: ObxValue((data) { + return Text( + date.value?.formatCompactDate() ?? Jalali.now().formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + ); + }, date), + ), + ], + ), + ), + ); + } + + Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'تایید', + ), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', + ), + SizedBox(width: 20), + ], + ), + ), + Divider(height: 0, thickness: 1), + Expanded( + child: Container( + child: PersianCupertinoDatePicker( + initialDateTime: Jalali.now(), + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, + ), + ), + ), + ], + ), + ); + } + + Widget show2StepAddBottomSheet() { + return BaseBottomSheet( + height: Get.height*.35, + child: Column( + spacing: 8, + children: [ + buildRow('تاریخ ثبت', controller.tmpStewardAllocation?.date?.formattedJalaliDate ?? 'N/A'), + buildRow( + 'نام و نام خانوادگی خریدار', + controller.guildsModel + .firstWhere((p0) => p0.key == controller.tmpStewardAllocation?.guildKey) + .user + ?.fullname ?? + 'N/A', + ), + buildRow( + 'شماره خریدار', + controller.guildsModel.firstWhere((p0) => p0.key == controller.tmpStewardAllocation?.guildKey).user?.mobile ?? + 'N/A', + ), + + buildRow('قیمت هر کیلو', '${controller.tmpStewardAllocation?.amount.separatedByComma ?? 0} ریال '), + buildRow( + 'وزن تخصیصی', + '${controller.tmpStewardAllocation?.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', + ), + buildRow('قیمت کل', '${controller.tmpStewardAllocation?.totalAmount.separatedByComma ?? 0} ریال'), + + Row( + spacing: 10, + children: [ + Expanded( + child: RElevated( + backgroundColor: AppColor.greenNormal, + height: 40, + text: 'ثبت', + textStyle: AppFonts.yekan18.copyWith(color: Colors.white), + onPressed: () async { + await controller.submitAllocation(); + Get..back()..back(); + }, + ), + ), + Expanded( + child: ROutlinedElevated( + height: 40, + borderColor: AppColor.error, + text: ' بازگشت', + textStyle: AppFonts.yekan18.copyWith(color: AppColor.error), + onPressed: () { + Get.until((route) => route.settings.name == ChickenRoutes.salesInProvince); + }, + ), + ), + ], + ), + ], + ), + ); + } } diff --git a/packages/core/lib/utils/date_time_utils.dart b/packages/core/lib/utils/date_time_utils.dart index 30d6bf2..7cf2645 100644 --- a/packages/core/lib/utils/date_time_utils.dart +++ b/packages/core/lib/utils/date_time_utils.dart @@ -1,38 +1,35 @@ import 'package:intl/intl.dart'; import 'package:persian_datetime_picker/persian_datetime_picker.dart'; -extension XDateTime on String{ +extension XDateTime on String { get toDateTime => DateTime.parse(this); - get formattedJalaliDate{ - final dateTime = DateTime.parse(this); + String get formattedJalaliDate { + String tmp = contains("/") ? replaceAll("/", "-") : this; + final dateTime = DateTime.parse(tmp); final jalaliDate = Jalali.fromDateTime(dateTime); return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; + } - get formattedJalaliDateYHMS { + String get formattedJalaliDateYHMS { final dateTime = DateTime.parse(this); final jalaliDate = Jalali.fromDateTime(dateTime); return "${jalaliDate.hour.toString().padLeft(2, '0')}:${jalaliDate.minute.toString().padLeft(2, '0')} - ${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; } - - get formattedYHMS{ + String get formattedYHMS { return DateFormat('yyyy-MM-dd HH:mm:ss').format(toDateTime); } } - - -extension XDateTime2 on DateTime{ - - - get formattedJalaliDate{ +extension XDateTime2 on DateTime { + get formattedJalaliDate { final jalaliDate = Jalali.fromDateTime(this); return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; } - get formattedYHMS{ + get formattedYHMS { return DateFormat('yyyy-MM-dd HH:mm:ss').format(this); } } diff --git a/packages/core/lib/utils/string_utils.dart b/packages/core/lib/utils/string_utils.dart index 555bcbe..148434e 100644 --- a/packages/core/lib/utils/string_utils.dart +++ b/packages/core/lib/utils/string_utils.dart @@ -7,7 +7,7 @@ extension XString on String { return number != null ? formatter.format(number) : this; } - get clearComma { + String get clearComma { return replaceAll(RegExp(r'\D'), ''); } } From 9a098acf000bbc99d05b7c5b6cae1e83e52729ab Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 28 Jun 2025 13:12:17 +0330 Subject: [PATCH 140/256] fix : sale in the province --- .../lib/presentation/pages/root/logic.dart | 39 +- .../pages/sales_in_province/logic.dart | 104 +-- .../pages/sales_in_province/view.dart | 833 +++++++++--------- packages/core/lib/utils/date_time_utils.dart | 23 +- packages/core/lib/utils/string_utils.dart | 2 +- 5 files changed, 519 insertions(+), 482 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 4786e7c..a131e66 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart' show Colors; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; @@ -22,15 +24,13 @@ class RootLogic extends GetxController { Container(color: Colors.amber), ]; - - late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; RxList errorLocationType = RxList(); RxMap inventoryExpandedList = RxMap(); - + Rxn inventoryModel = Rxn(); RxList provinces = [].obs; @override @@ -42,8 +42,8 @@ class RootLogic extends GetxController { getProvinces(); - /*getInventory(); - getKillHouseDistributionInfo();*/ + getInventory(); + //getKillHouseDistributionInfo(); } void toggleExpanded(int index) { @@ -54,6 +54,29 @@ class RootLogic extends GetxController { } } + Future getInventory() async { + await safeCall?>( + call: () async => await chickenRepository.getInventory(token: tokenService.accessToken.value!), + onSuccess: (result) { + if (result != null) { + inventoryModel.value = result.first; + } + }, + onError: (error, stackTrace) { + switch (error.response?.statusCode) { + case 401: + errorHandler(error); + break; + case 403: + errorHandler(error); + break; + default: + errorHandler(error); + } + }, + ); + } + void rootErrorHandler(DioException error) { handleGeneric(error, () { tokenService.deleteTokens(); @@ -75,4 +98,10 @@ class RootLogic extends GetxController { provinces.clear(); } } + + void errorHandler(DioException error) { + handleGeneric(error, () { + tokenService.deleteTokens(); + }); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 972beb8..8451ba1 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -11,14 +11,18 @@ import 'package:rasadyar_core/core.dart'; class SalesInProvinceLogic extends GetxController { var rootLogic = Get.find(); - Rxn?> allocatedMadeModel = - Rxn?>(); + Rxn?> allocatedMadeModel = Rxn?>(); RxList isExpandedList = [].obs; RxList rolesProductsModel = RxList(); - + RxBool searchIsSelected = false.obs; + RxnString searchedValue = RxnString(); RxList guildsModel = [].obs; + GlobalKey formKey = GlobalKey(); + + Rxn fromDateFilter = Rxn(null); + Rxn toDateFilter = Rxn(null); Rxn selectedProductModel = Rxn(); Rxn selectedGuildModel = Rxn(); Rxn guildProfile = Rxn(); @@ -37,8 +41,8 @@ class SalesInProvinceLogic extends GetxController { final RxBool addPageAllocationsMade = false.obs; final RxBool hasMoreDataAllocationsMade = true.obs; - Rxn selectedAllocationModelForUpdate = - Rxn(); + Rxn selectedAllocationModelForUpdate = Rxn(); + SubmitStewardAllocation? tmpStewardAllocation; @override void onInit() { @@ -51,17 +55,16 @@ class SalesInProvinceLogic extends GetxController { ever(saleType, (callback) { getGuilds(); }); - - weight.listen((num) { - totalCost.value = num * pricePerKilo.value; + debounce(weight, time: Duration(milliseconds: 110), (callback) { + totalCost.value = callback * weight.value; }); - pricePerKilo.listen((num) { - totalCost.value = num * weight.value; + debounce(pricePerKilo, time: Duration(milliseconds: 100), (callback) { + totalCost.value = callback * weight.value; }); totalCost.listen((data) { - totalCostController.text = data.toString(); + totalCostController.text = data.toString().separatedByComma; isValid.value = weight.value > 0 && @@ -78,15 +81,23 @@ class SalesInProvinceLogic extends GetxController { getAllocatedMade(); } }); + + debounce(searchedValue, (callback) => getAllocatedMade(), time: Duration(milliseconds: 2000)); + ever(searchIsSelected, (data) { + if (data == false) { + searchedValue.value = null; + } + }); } Future getAllocatedMade() async { - if (isLoadingMoreAllocationsMade.value || - !hasMoreDataAllocationsMade.value) { + if (isLoadingMoreAllocationsMade.value || !hasMoreDataAllocationsMade.value) { return; } - if (addPageAllocationsMade.value) { + if (searchIsSelected.value) { + currentPageAllocationsMade.value = 1; + } else if (addPageAllocationsMade.value) { currentPageAllocationsMade.value++; } safeCall( @@ -97,6 +108,7 @@ class SalesInProvinceLogic extends GetxController { pageSize: 20, search: 'filter', role: 'Steward', + value: searchedValue.value, ), ), onSuccess: (result) { @@ -157,8 +169,7 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, - allocationTokens: - allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], + allocationTokens: allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); @@ -169,9 +180,8 @@ class SalesInProvinceLogic extends GetxController { Future getRolesProducts() async { safeCall( - call: () async => await rootLogic.chickenRepository.getRolesProducts( - token: rootLogic.tokenService.accessToken.value!, - ), + call: () async => + await rootLogic.chickenRepository.getRolesProducts(token: rootLogic.tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { rolesProductsModel.value = result; @@ -186,10 +196,7 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getGuilds( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - queryParams: {'free': saleType.value == 2 ? true : false}, - role: 'Steward', - ), + queryParameters: buildQueryParams(queryParams: {'free': saleType.value == 2 ? true : false}, role: 'Steward'), ), onSuccess: (result) { if (result != null) { @@ -215,9 +222,7 @@ class SalesInProvinceLogic extends GetxController { Future getGuildProfile() async { await safeCall( - call: () async => await rootLogic.chickenRepository.getProfile( - token: rootLogic.tokenService.accessToken.value!, - ), + call: () async => await rootLogic.chickenRepository.getProfile(token: rootLogic.tokenService.accessToken.value!), onError: (error, stackTrace) {}, onSuccess: (result) { guildProfile.value = result; @@ -225,30 +230,31 @@ class SalesInProvinceLogic extends GetxController { ); } - Future submitAllocation() async { - SubmitStewardAllocation stewardAllocation = SubmitStewardAllocation( + void setSubmitData() { + tmpStewardAllocation = SubmitStewardAllocation( approvedPriceStatus: false, allocationType: - '${guildProfile.value?.steward == true ? "steward" : "guild"}-${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', + '${guildProfile.value?.steward == true ? "steward" : "guild"}_${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', sellerType: guildProfile.value?.steward == true ? "Steward" : "Guild", - buyerType: selectedGuildModel.value?.steward == true - ? "Steward" - : "Guild", + buyerType: selectedGuildModel.value?.steward == true ? "Steward" : "Guild", amount: pricePerKilo.value, totalAmount: totalCost.value, weightOfCarcasses: weight.value, + sellType:saleType.value ==2 ? "free" :'exclusive', + numberOfCarcasses: 0, guildKey: selectedGuildModel.value?.key, productKey: selectedProductModel.value?.key, - date: DateTime.now().formattedGregorianDate, + date: DateTime.now().formattedDashedGregorian, type: "manual", ); + } + Future submitAllocation() async { safeCall( - call: () async => - await rootLogic.chickenRepository.postSubmitStewardAllocation( - token: rootLogic.tokenService.accessToken.value!, - request: stewardAllocation, - ), + call: () async => await rootLogic.chickenRepository.postSubmitStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: tmpStewardAllocation!, + ), onSuccess: (result) { getAllocatedMade(); @@ -259,11 +265,10 @@ class SalesInProvinceLogic extends GetxController { Future deleteAllocation(AllocatedMadeModel model) async { safeCall( - call: () async => - await rootLogic.chickenRepository.deleteStewardAllocation( - token: rootLogic.tokenService.accessToken.value!, - queryParameters: {'steward_allocation_key': model.key}, - ), + call: () async => await rootLogic.chickenRepository.deleteStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: {'steward_allocation_key': model.key}, + ), onSuccess: (result) { getAllocatedMade(); @@ -286,9 +291,7 @@ class SalesInProvinceLogic extends GetxController { pricePerKilo.value = item.amount ?? 0; totalCost.value = item.totalAmount ?? 0; weightController.text = weight.value.toString().separatedByComma; - pricePerKiloController.text = pricePerKilo.value - .toString() - .separatedByComma; + pricePerKiloController.text = pricePerKilo.value.toString().separatedByComma; totalCostController.text = totalCost.value.toString().separatedByComma; isValid.value = true; } @@ -314,11 +317,10 @@ class SalesInProvinceLogic extends GetxController { ); safeCall( - call: () async => - await rootLogic.chickenRepository.updateStewardAllocation( - token: rootLogic.tokenService.accessToken.value!, - request: updatedAllocationModel, - ), + call: () async => await rootLogic.chickenRepository.updateStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: updatedAllocationModel, + ), onSuccess: (result) { getAllocatedMade(); diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index b9c5bbe..f0b2aeb 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -3,9 +3,9 @@ import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; -import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -18,11 +18,7 @@ class SalesInProvincePage extends GetView { return Scaffold( appBar: RAppBar( titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: true, - onBackPressed: () { - Get.back(id: 1); - }, + hasBack: false, leadingWidth: 155, leading: Row( mainAxisSize: MainAxisSize.min, @@ -31,43 +27,31 @@ class SalesInProvincePage extends GetView { Assets.vec.chickenSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - Text( - 'رصدطیور', - style: AppFonts.yekan16Bold.copyWith(color: Colors.white), + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), + Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), ], ), additionalActions: [ GestureDetector( onTap: () { - // controller.searchIsSelected.value = !controller.searchIsSelected.value; + controller.searchIsSelected.value = !controller.searchIsSelected.value; }, child: Assets.vec.searchSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), ), SizedBox(width: 8), GestureDetector( onTap: () { - // Get.bottomSheet(filterBottomSheet()); + Get.bottomSheet(filterBottomSheet()); }, child: Assets.vec.filterOutlineSvg.svg( width: 20, height: 20, - colorFilter: const ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), ), ), SizedBox(width: 8), @@ -77,21 +61,16 @@ class SalesInProvincePage extends GetView { child: Column( children: [ routePageWidget(), - + buildSearchWidget(), inventoryWidget(), allocationsMade(), - SizedBox(height: 40), ], ), ), floatingActionButton: RFab.add( onPressed: () { - Get.bottomSheet( - showAddBottomSheet(), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ); + Get.bottomSheet(showAddBottomSheet(), isScrollControlled: true, backgroundColor: Colors.transparent); }, ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, @@ -99,123 +78,18 @@ class SalesInProvincePage extends GetView { } Widget inventoryWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Align( - alignment: Alignment.centerRight, - child: Text( - 'موجودی انبار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(height: 4), - /* ObxValue( - (data) => data.isEmpty - ? Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 80, - padding: EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ) - : ListView.separated( - shrinkWrap: true, - itemCount: controller.rootLogic.inventoryList.length, - separatorBuilder: (context, index) => - const SizedBox(height: 8), - itemBuilder: (context, index) { - return ObxValue((expand) { - return GestureDetector( - onTap: () { - controller.rootLogic.toggleExpanded(index); - }, - behavior: HitTestBehavior.opaque, - child: AnimatedContainer( - onEnd: () { - controller - .rootLogic - .inventoryExpandedList[index] = !controller - .rootLogic - .inventoryExpandedList[index]!; - }, - margin: const EdgeInsets.symmetric(vertical: 2), - padding: EdgeInsets.all(6), - curve: Curves.easeInOut, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.blueNormal, - width: 1, - ), - ), - duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 300 : 80, - child: inventoryItem( - isExpanded: - expand.keys.contains(index) && expand[index]!, - index: index, - model: controller.rootLogic.inventoryList[index], - ), - ), - ); - }, controller.rootLogic.inventoryExpandedList); - }, - ), - controller.rootLogic.inventoryList, - ),*/ - ], - ), - ); - } - - Widget inventoryItem({ - required bool isExpanded, - required int index, - required InventoryModel model, - }) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - buildRow('نام محصول', model.name ?? ''), - Visibility( - visible: isExpanded, - child: Column( - spacing: 8, - children: [ - buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), - buildRow( - 'وزن خریدهای آزاد داخل استان (کیلوگرم)', - model.receiveFreeCarcassesWeight.toString(), - ), - buildRow( - 'وزن خریدهای خارج استان (کیلوگرم)', - model.freeBuyingCarcassesWeight.toString(), - ), - buildRow( - 'کل ورودی به انبار (کیلوگرم)', - model.totalFreeBarsCarcassesWeight.toString(), - ), - buildRow( - 'کل فروش (کیلوگرم)', - model.realAllocatedWeight.toString(), - ), - buildRow( - 'مانده انبار (کیلوگرم)', - model.totalRemainWeight.toString(), - ), - ], - ), - ), - ], + return Container( + width: Get.width, + height: 39, + margin: EdgeInsets.all(4), + decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), + alignment: Alignment.center, + child: ObxValue((data) { + return Text( + ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), + ); + }, controller.rootLogic.inventoryModel), ); } @@ -230,9 +104,7 @@ class SalesInProvincePage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -240,9 +112,7 @@ class SalesInProvincePage extends GetView { child: Text( value, textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), ], @@ -253,21 +123,16 @@ class SalesInProvincePage extends GetView { Widget allocationsMade() { return Column( children: [ - const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric(horizontal: 6), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'تخصیصات صورت گرفته', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), + Text('تخصیصات صورت گرفته', style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), RElevated( text: 'تایید یکجا', height: 30, + textStyle: AppFonts.yekan12.copyWith(color: Colors.white), onPressed: () { controller.confirmAllAllocations(); }, @@ -321,15 +186,10 @@ class SalesInProvincePage extends GetView { } final result = data.value![index]; return ObxValue((data) { - return allocationsMadeListItem( - expandList: controller.isExpandedList, - index: index, - item: result, - ); + return allocationsMadeListItem(expandList: controller.isExpandedList, index: index, item: result); }, controller.isExpandedList); }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), + separatorBuilder: (BuildContext context, int index) => SizedBox(height: 8), ), ); } @@ -348,137 +208,139 @@ class SalesInProvincePage extends GetView { top: 16, bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - '${isEditMode ? 'ویرایش' :'ثبت' } توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - Visibility( - visible: isEditMode == false, - child: Column( - children: [ - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), - ), - const SizedBox(height: 12), - Material( - type: MaterialType.transparency, - child: productDropDown(), - ), - const SizedBox(height: 12), - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - - controller.selectedGuildModel.value = null; - controller.selectedGuildModel.refresh(); - }, - ), - Text('فروش اختصاصی', style: AppFonts.yekan14), - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش آزاد', style: AppFonts.yekan14), - ], - ); - }, controller.saleType), - ), - const SizedBox(height: 12), - - guildsDropDown(), - - - ], + child: Form( + key: controller.formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '${isEditMode ? 'ویرایش' : 'ثبت'} توزیع/ فروش', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), - ), - const SizedBox(height: 12), - RTextField( - controller: controller.weightController, - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], + Visibility( + visible: isEditMode == false, + child: Column( + children: [ + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material(type: MaterialType.transparency, child: productDropDown()), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; - onChanged: (p0) { - controller.weight.value = int.tryParse(p0.clearComma) ?? 0; - }, - label: 'وزن لاشه', - ), - const SizedBox(height: 12), - RTextField( - controller: controller.pricePerKiloController, - borderColor: AppColor.darkGreyLight, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], + controller.selectedGuildModel.value = null; + controller.selectedGuildModel.refresh(); + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), - onChanged: (p0) { - controller.pricePerKilo.value = - int.tryParse(p0.clearComma) ?? 0; - }, - keyboardType: TextInputType.number, - label: 'قیمت هر کیلو', - ), - const SizedBox(height: 12), - ObxValue( - (p0) => RTextField( + guildsDropDown(), + ], + ), + ), + const SizedBox(height: 12), + RTextField( + controller: controller.weightController, + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + validator: (value) { + + if (int.parse(value!.clearComma) > (controller.rootLogic.inventoryModel.value?.totalRemainWeight?.toInt() ?? 100) ){ + return 'وزن تخصیصی بیشتر از موجودی انبار است'; + } + return null; + }, + onChanged: (p0) { + controller.weight.value = int.tryParse(p0.clearComma) ?? 0; + }, + label: 'وزن لاشه', + ), + const SizedBox(height: 12), + RTextField( + controller: controller.pricePerKiloController, + borderColor: AppColor.darkGreyLight, + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + + onChanged: (p0) { + controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; + }, + keyboardType: TextInputType.number, + label: 'قیمت هر کیلو', + ), + const SizedBox(height: 12), + RTextField( enabled: false, keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], + inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], borderColor: AppColor.darkGreyLight, - initText: controller.totalCost.value - .toString() - .separatedByComma, controller: controller.totalCostController, label: 'هزینه کل', ), - controller.totalCost, - ), - const SizedBox(height: 20), - ObxValue((data) { - return RElevated( - text:isEditMode? 'ویرایش': 'ثبت', - textStyle: AppFonts.yekan16.copyWith(color: Colors.white), - height: 40, - onPressed: data.value - ? () async { - isEditMode - ? await controller.submitAllocation() - : await controller.updateAllocation(); + const SizedBox(height: 20), + ObxValue((data) { + return RElevated( + text: isEditMode ? 'ویرایش' : 'ثبت', + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + height: 40, + onPressed: data.value + ? () async { + if (controller.formKey.currentState?.validate() ?? false) { + iLog("s2"); + controller.setSubmitData(); + iLog("s3"); + Get.bottomSheet(show2StepAddBottomSheet()); + } + /* isEditMode + ? await controller.updateAllocation() + : () { + iLog("s1"); + if (controller.formKey.currentState?.validate() ?? false) { + iLog("s2"); + controller.setSubmitData(); + iLog("s3"); + Get.bottomSheet(show2StepAddBottomSheet()); + } + }; - controller.clearForm(); - controller.getAllocatedMade(); - Get.back(); - } - : null, - ); - }, controller.isValid), - const SizedBox(height: 20), - ], + controller.clearForm(); + controller.getAllocatedMade(); + Get.back();*/ + } + : null, + ); + }, controller.isValid), + const SizedBox(height: 20), + ], + ), ), ), ); @@ -538,10 +400,7 @@ class SalesInProvincePage extends GetView { Assets.vec.cubeSearchSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), SizedBox(width: 6), ], @@ -575,10 +434,7 @@ class SalesInProvincePage extends GetView { child: Container( width: Get.width, margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - decoration: BoxDecoration( - color: getTintColor(item), - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: getTintColor(item), borderRadius: BorderRadius.circular(8)), child: AnimatedSize( duration: Duration(milliseconds: 400), alignment: Alignment.center, @@ -627,18 +483,14 @@ class SalesInProvincePage extends GetView { Text( item.steward?.user?.fullname ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), SizedBox(height: 2), Text( - item.createDate?.formattedJalaliDate, + item.createDate?.formattedJalaliDate ?? 'N/A', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), ), ], ), @@ -654,16 +506,12 @@ class SalesInProvincePage extends GetView { Text( '${item.weightOfCarcasses.separatedByComma} Kg', textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.bgDark, - ), + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), ), Text( '${item.amount.separatedByComma} ریال', textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDark, - ), + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDark), ), ], ), @@ -673,9 +521,7 @@ class SalesInProvincePage extends GetView { child: Text( '${item.allocationType?.faAllocationType}', textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith( - color: AppColor.darkGreyDark, - ), + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), ), ), @@ -686,16 +532,12 @@ class SalesInProvincePage extends GetView { secondChild: Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, children: [ Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( onTap: () { @@ -710,87 +552,53 @@ class SalesInProvincePage extends GetView { child: Assets.vec.editSvg.svg( width: 20, height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ), Text( item.allocationType?.faAllocationType, textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), GestureDetector( onTap: () { buildDeleteDialog( - onConfirm: () => - controller.deleteAllocation(item), + onConfirm: () { + expandList.remove(index); + return controller.deleteAllocation(item); + }, ); }, child: Assets.vec.trashSvg.svg( width: 16, height: 16, - colorFilter: ColorFilter.mode( - AppColor.error, - BlendMode.srcIn, - ), + colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), ), ), ], ), - buildRow( - 'تاریخ ثبت', - item.date!.formattedJalaliDate ?? 'N/A', - ), + buildRow('تاریخ ثبت', item.date!.formattedJalaliDate ?? 'N/A'), buildRow( 'نام و نام خانوادگی خریدار', - getBuyerInformation(item)?.user?.fullname ?? - 'N/A', - ), - buildRow( - 'شماره خریدار', - getBuyerInformation(item)?.user?.mobile ?? - 'N/A', - ), - buildRow( - 'نوع فروش', - item.sellType?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${item.amount.separatedByComma ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${item.totalAmount.separatedByComma ?? 0} ریال', + getBuyerInformation(item)?.user?.fullname ?? 'N/A', ), + buildRow('شماره خریدار', getBuyerInformation(item)?.user?.mobile ?? 'N/A'), + buildRow('نوع فروش', item.sellType?.faItem ?? 'N/A'), + buildRow('قیمت هر کیلو', '${item.amount.separatedByComma ?? 0} ریال '), + buildRow('قیمت کل', '${item.totalAmount.separatedByComma ?? 0} ریال'), buildRow( 'وزن تخصیصی', '${item.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', ), - buildRow( - 'کداحراز', - item.registrationCode?.toString() ?? 'N/A', - ), + buildRow('کداحراز', item.registrationCode?.toString() ?? 'N/A'), buildRow( 'وضعیت کد احراز', - item.systemRegistrationCode == true - ? "ارسال شده" - : "ارسال نشده" ?? 'N/A', - ), - buildRow( - 'افت وزن(کیلوگرم)', - item.weightLossOfCarcasses - ?.toInt() - .toString() ?? - 'N/A', + item.systemRegistrationCode == true ? "ارسال شده" : "ارسال نشده" ?? 'N/A', ), + buildRow('افت وزن(کیلوگرم)', item.weightLossOfCarcasses?.toInt().toString() ?? 'N/A'), Row( spacing: 10, @@ -800,25 +608,17 @@ class SalesInProvincePage extends GetView { backgroundColor: AppColor.greenNormal, height: 40, text: 'تایید', - textStyle: AppFonts.yekan18.copyWith( - color: Colors.white, - ), + textStyle: AppFonts.yekan18.copyWith(color: Colors.white), onPressed: () { - ConformAllocation confromation = - ConformAllocation( - allocation_key: item.key, - number_of_carcasses: - item.numberOfCarcasses, - weight_of_carcasses: item - .weightOfCarcasses - ?.toInt(), - amount: item.amount, - total_amount: item.totalAmount, - ); - - controller.confirmAllocation( - confromation, + ConformAllocation confromation = ConformAllocation( + allocation_key: item.key, + number_of_carcasses: item.numberOfCarcasses, + weight_of_carcasses: item.weightOfCarcasses?.toInt(), + amount: item.amount, + total_amount: item.totalAmount, ); + + controller.confirmAllocation(confromation); }, ), ), @@ -827,13 +627,9 @@ class SalesInProvincePage extends GetView { height: 40, borderColor: AppColor.error, text: 'رد', - textStyle: AppFonts.yekan18.copyWith( - color: AppColor.error, - ), + textStyle: AppFonts.yekan18.copyWith(color: AppColor.error), onPressed: () { - controller.denyAllocation( - item.key ?? '', - ); + controller.denyAllocation(item.key ?? ''); }, ), ), @@ -853,11 +649,7 @@ class SalesInProvincePage extends GetView { child: Center( child: RotatedBox( quarterTurns: 3, - child: Text( - item.state?.faItem, - style: AppFonts.yekan8, - textAlign: TextAlign.center, - ), + child: Text(item.state?.faItem, style: AppFonts.yekan8, textAlign: TextAlign.center), ), ), ), @@ -875,16 +667,10 @@ class SalesInProvincePage extends GetView { decoration: BoxDecoration( color: AppColor.greenLightHover, borderRadius: BorderRadius.circular(4), - border: Border.all( - width: 0.50, - color: AppColor.greenDarkActive, - ), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), ), alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), + child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), ), ), ], @@ -918,17 +704,12 @@ class SalesInProvincePage extends GetView { } } - Future buildDeleteDialog({ - required Future Function() onConfirm, - }) async { + Future buildDeleteDialog({required Future Function() onConfirm}) async { await Get.defaultDialog( title: 'حذف ', middleText: 'آیا از حذف این مورد مطمئن هستید؟', confirm: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: AppColor.error, - foregroundColor: Colors.white, - ), + style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), onPressed: () async { await onConfirm(); Get.back(); @@ -943,4 +724,232 @@ class SalesInProvincePage extends GetView { ), ).whenComplete(() => controller.getAllocatedMade()); } + + ObxValue buildSearchWidget() { + return ObxValue((data) { + return AnimatedContainer( + duration: Duration(milliseconds: 300), + padding: EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + onChanged: (value) { + controller.searchedValue.value = value; + }, + controller: TextEditingController(), + ), + ), + ), + ); + }, controller.searchIsSelected); + } + + Widget filterBottomSheet() { + return BaseBottomSheet( + height: 250, + child: Column( + spacing: 16, + children: [ + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.fromDateFilter, + onChanged: (jalali) => controller.fromDateFilter.value = jalali, + ), + ), + Expanded( + child: timeFilterWidget( + isFrom: false, + date: controller.toDateFilter, + onChanged: (jalali) => controller.toDateFilter.value = jalali, + ), + ), + ], + ), + SizedBox(height: 2), + RElevated( + text: 'اعمال فیلتر', + onPressed: () { + controller.getAllocatedMade(); + Get.back(); + }, + height: 40, + ), + SizedBox(height: 16), + ], + ), + ); + } + + GestureDetector timeFilterWidget({ + isFrom = true, + required Rxn date, + required Function(Jalali jalali) onChanged, + }) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blueNormal), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + Expanded( + child: ObxValue((data) { + return Text( + date.value?.formatCompactDate() ?? Jalali.now().formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + ); + }, date), + ), + ], + ), + ), + ); + } + + Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'تایید', + ), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', + ), + SizedBox(width: 20), + ], + ), + ), + Divider(height: 0, thickness: 1), + Expanded( + child: Container( + child: PersianCupertinoDatePicker( + initialDateTime: Jalali.now(), + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, + ), + ), + ), + ], + ), + ); + } + + Widget show2StepAddBottomSheet() { + return BaseBottomSheet( + height: Get.height*.35, + child: Column( + spacing: 8, + children: [ + buildRow('تاریخ ثبت', controller.tmpStewardAllocation?.date?.formattedJalaliDate ?? 'N/A'), + buildRow( + 'نام و نام خانوادگی خریدار', + controller.guildsModel + .firstWhere((p0) => p0.key == controller.tmpStewardAllocation?.guildKey) + .user + ?.fullname ?? + 'N/A', + ), + buildRow( + 'شماره خریدار', + controller.guildsModel.firstWhere((p0) => p0.key == controller.tmpStewardAllocation?.guildKey).user?.mobile ?? + 'N/A', + ), + + buildRow('قیمت هر کیلو', '${controller.tmpStewardAllocation?.amount.separatedByComma ?? 0} ریال '), + buildRow( + 'وزن تخصیصی', + '${controller.tmpStewardAllocation?.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', + ), + buildRow('قیمت کل', '${controller.tmpStewardAllocation?.totalAmount.separatedByComma ?? 0} ریال'), + + Row( + spacing: 10, + children: [ + Expanded( + child: RElevated( + backgroundColor: AppColor.greenNormal, + height: 40, + text: 'ثبت', + textStyle: AppFonts.yekan18.copyWith(color: Colors.white), + onPressed: () async { + await controller.submitAllocation(); + Get..back()..back(); + }, + ), + ), + Expanded( + child: ROutlinedElevated( + height: 40, + borderColor: AppColor.error, + text: ' بازگشت', + textStyle: AppFonts.yekan18.copyWith(color: AppColor.error), + onPressed: () { + Get.until((route) => route.settings.name == ChickenRoutes.salesInProvince); + }, + ), + ), + ], + ), + ], + ), + ); + } } diff --git a/packages/core/lib/utils/date_time_utils.dart b/packages/core/lib/utils/date_time_utils.dart index 30d6bf2..7cf2645 100644 --- a/packages/core/lib/utils/date_time_utils.dart +++ b/packages/core/lib/utils/date_time_utils.dart @@ -1,38 +1,35 @@ import 'package:intl/intl.dart'; import 'package:persian_datetime_picker/persian_datetime_picker.dart'; -extension XDateTime on String{ +extension XDateTime on String { get toDateTime => DateTime.parse(this); - get formattedJalaliDate{ - final dateTime = DateTime.parse(this); + String get formattedJalaliDate { + String tmp = contains("/") ? replaceAll("/", "-") : this; + final dateTime = DateTime.parse(tmp); final jalaliDate = Jalali.fromDateTime(dateTime); return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; + } - get formattedJalaliDateYHMS { + String get formattedJalaliDateYHMS { final dateTime = DateTime.parse(this); final jalaliDate = Jalali.fromDateTime(dateTime); return "${jalaliDate.hour.toString().padLeft(2, '0')}:${jalaliDate.minute.toString().padLeft(2, '0')} - ${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; } - - get formattedYHMS{ + String get formattedYHMS { return DateFormat('yyyy-MM-dd HH:mm:ss').format(toDateTime); } } - - -extension XDateTime2 on DateTime{ - - - get formattedJalaliDate{ +extension XDateTime2 on DateTime { + get formattedJalaliDate { final jalaliDate = Jalali.fromDateTime(this); return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; } - get formattedYHMS{ + get formattedYHMS { return DateFormat('yyyy-MM-dd HH:mm:ss').format(this); } } diff --git a/packages/core/lib/utils/string_utils.dart b/packages/core/lib/utils/string_utils.dart index 555bcbe..148434e 100644 --- a/packages/core/lib/utils/string_utils.dart +++ b/packages/core/lib/utils/string_utils.dart @@ -7,7 +7,7 @@ extension XString on String { return number != null ? formatter.format(number) : this; } - get clearComma { + String get clearComma { return replaceAll(RegExp(r'\D'), ''); } } From 5d2e767f99414060b288190f17f64381aa5a85a2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 28 Jun 2025 16:45:28 +0330 Subject: [PATCH 141/256] feat : build list view widget --- .../pages/sales_in_province/logic.dart | 2 +- .../widget/list_view/r_list_view.dart | 219 ++++++++++++++++++ .../list_view/r_paginated_list_view.dart | 97 ++++++++ .../widget/list_view/r_shimmer_list.dart | 45 ++++ .../mixins/pagination_controller_mixin.dart | 64 +++++ packages/core/pubspec.lock | 8 + packages/core/pubspec.yaml | 3 + 7 files changed, 437 insertions(+), 1 deletion(-) create mode 100644 packages/core/lib/presentation/widget/list_view/r_list_view.dart create mode 100644 packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart create mode 100644 packages/core/lib/presentation/widget/list_view/r_shimmer_list.dart create mode 100644 packages/core/lib/utils/mixins/pagination_controller_mixin.dart diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 8451ba1..7c43a7c 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -240,7 +240,7 @@ class SalesInProvinceLogic extends GetxController { amount: pricePerKilo.value, totalAmount: totalCost.value, weightOfCarcasses: weight.value, - sellType:saleType.value ==2 ? "free" :'exclusive', + sellType: saleType.value == 2 ? "free" : 'exclusive', numberOfCarcasses: 0, guildKey: selectedGuildModel.value?.key, productKey: selectedProductModel.value?.key, diff --git a/packages/core/lib/presentation/widget/list_view/r_list_view.dart b/packages/core/lib/presentation/widget/list_view/r_list_view.dart new file mode 100644 index 0000000..9cc1a95 --- /dev/null +++ b/packages/core/lib/presentation/widget/list_view/r_list_view.dart @@ -0,0 +1,219 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:rasadyar_core/utils/network/resource.dart'; + +import 'r_shimmer_list.dart'; + +enum ListType { builder, separated } + +class RListView extends StatelessWidget { + final ListType type; + final Axis scrollDirection; + final bool reverse; + final ScrollController? controller; + final bool? primary; + final ScrollPhysics? physics; + final ScrollBehavior? scrollBehavior; + final bool shrinkWrap; + final Key? center; + final double? cacheExtent; + final int? semanticChildCount; + final int itemCount; + final DragStartBehavior dragStartBehavior; + final ScrollViewKeyboardDismissBehavior? keyboardDismissBehavior; + final String? restorationId; + final Clip clipBehavior; + final HitTestBehavior hitTestBehavior; + final Widget? prototypeItem; + final EdgeInsetsGeometry? padding; + final double? itemExtent; + final ItemExtentBuilder? itemExtentBuilder; + final ChildIndexGetter? findChildIndexCallback; + final NullableIndexedWidgetBuilder itemBuilder; + final IndexedWidgetBuilder? separatorBuilder; + final bool addAutomaticKeepAlives; + final bool addRepaintBoundaries; + final bool addSemanticIndexes; + final Widget loadingWidget; + final Widget emptyWidget; + final Widget errorWidget; + final Resource> resource; + final Future Function()? onRefresh; + + const RListView.builder({ + super.key, + this.scrollDirection = Axis.vertical, + this.reverse = false, + this.controller, + this.primary, + this.physics, + this.scrollBehavior, + this.shrinkWrap = false, + this.center, + this.cacheExtent, + this.semanticChildCount, + required this.itemCount, + this.dragStartBehavior = DragStartBehavior.start, + this.keyboardDismissBehavior, + this.restorationId, + this.clipBehavior = Clip.hardEdge, + this.hitTestBehavior = HitTestBehavior.opaque, + this.prototypeItem, + this.padding, + this.itemExtent, + this.itemExtentBuilder, + this.findChildIndexCallback, + required this.itemBuilder, + this.addAutomaticKeepAlives = true, + this.addRepaintBoundaries = true, + this.addSemanticIndexes = true, + this.loadingWidget = const RShimmerList(isSeparated: true), + this.emptyWidget = const Center(child: Text("هیچ آیتمی یافت نشد")), + this.errorWidget = const Center(child: CircularProgressIndicator()), + required this.resource, + this.onRefresh, + }) : type = ListType.builder, + separatorBuilder = null; + + const RListView.separated({ + super.key, + this.scrollDirection = Axis.vertical, + this.reverse = false, + this.controller, + this.primary, + this.physics, + this.scrollBehavior, + this.shrinkWrap = false, + this.center, + this.cacheExtent, + this.semanticChildCount, + required this.itemCount, + this.dragStartBehavior = DragStartBehavior.start, + this.keyboardDismissBehavior, + this.restorationId, + this.clipBehavior = Clip.hardEdge, + this.hitTestBehavior = HitTestBehavior.opaque, + this.prototypeItem, + this.padding, + this.itemExtent, + this.itemExtentBuilder, + this.findChildIndexCallback, + required this.itemBuilder, + required this.separatorBuilder, + this.addAutomaticKeepAlives = true, + this.addRepaintBoundaries = true, + this.addSemanticIndexes = true, + this.loadingWidget = const Center(child: CircularProgressIndicator()), + this.emptyWidget = const Center(child: Text("هیچ آیتمی یافت نشد")), + this.errorWidget = const Center(child: CircularProgressIndicator()), + required this.resource, + this.onRefresh, + }) : type = ListType.separated; + + @override + Widget build(BuildContext context) { + switch (resource.status) { + case Status.initial: + case Status.loading: + return loadingWidget; + + case Status.error: + return errorWidget; + + case Status.empty: + return emptyWidget; + + case Status.success: + if (resource.data?.isEmpty ?? true) { + return emptyWidget; + } + + final list = type == ListType.builder + ? ListView.builder( + key: key, + scrollDirection: scrollDirection, + reverse: reverse, + controller: controller, + primary: primary, + physics: physics, + shrinkWrap: shrinkWrap, + padding: padding, + itemExtent: itemExtent, + itemBuilder: itemBuilder, + itemCount: itemCount, + prototypeItem: prototypeItem, + itemExtentBuilder: itemExtentBuilder, + findChildIndexCallback: findChildIndexCallback, + addAutomaticKeepAlives: addAutomaticKeepAlives, + addRepaintBoundaries: addRepaintBoundaries, + addSemanticIndexes: addSemanticIndexes, + cacheExtent: cacheExtent, + semanticChildCount: semanticChildCount, + dragStartBehavior: dragStartBehavior, + keyboardDismissBehavior: keyboardDismissBehavior, + restorationId: restorationId, + clipBehavior: clipBehavior, + ) + : ListView.separated( + key: key, + scrollDirection: scrollDirection, + reverse: reverse, + controller: controller, + primary: primary, + physics: physics, + shrinkWrap: shrinkWrap, + padding: padding, + itemBuilder: itemBuilder, + separatorBuilder: separatorBuilder!, + itemCount: itemCount, + findChildIndexCallback: findChildIndexCallback, + addAutomaticKeepAlives: addAutomaticKeepAlives, + addRepaintBoundaries: addRepaintBoundaries, + addSemanticIndexes: addSemanticIndexes, + cacheExtent: cacheExtent, + dragStartBehavior: dragStartBehavior, + keyboardDismissBehavior: keyboardDismissBehavior, + restorationId: restorationId, + clipBehavior: clipBehavior, + ); + + return onRefresh != null ? RefreshIndicator(onRefresh: onRefresh!, child: list) : list; + } + } + + RListView._({ + required this.type, + required this.scrollDirection, + required this.reverse, + required this.controller, + required this.primary, + required this.physics, + required this.scrollBehavior, + required this.shrinkWrap, + required this.center, + required this.cacheExtent, + required this.semanticChildCount, + required this.itemCount, + required this.dragStartBehavior, + required this.keyboardDismissBehavior, + required this.restorationId, + required this.clipBehavior, + required this.hitTestBehavior, + required this.prototypeItem, + required this.padding, + required this.itemExtent, + required this.itemExtentBuilder, + required this.findChildIndexCallback, + required this.itemBuilder, + required this.separatorBuilder, + required this.addAutomaticKeepAlives, + required this.addRepaintBoundaries, + required this.addSemanticIndexes, + required this.loadingWidget, + required this.emptyWidget, + required this.errorWidget, + required this.resource, + required this.onRefresh, + }); +} diff --git a/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart b/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart new file mode 100644 index 0000000..52cdd93 --- /dev/null +++ b/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart @@ -0,0 +1,97 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/utils/network/resource.dart'; + +import 'r_shimmer_list.dart'; + +enum ListType { builder, separated } + +class RPaginatedListView extends StatelessWidget { + const RPaginatedListView({ + super.key, + required this.resource, + required this.itemBuilder, + required this.itemCount, + this.separatorBuilder, + this.onRefresh, + required this.onLoadMore, + this.isPaginating = false, + this.hasMore = true, + this.loadingWidget, + this.emptyWidget, + this.errorWidget, + this.scrollController, + this.listType = ListType.builder, + }); + + final Resource> resource; + final NullableIndexedWidgetBuilder itemBuilder; + final IndexedWidgetBuilder? separatorBuilder; + final Future Function()? onRefresh; + final Future Function() onLoadMore; + final bool isPaginating; + final bool hasMore; + final int itemCount; + final Widget? loadingWidget; + final Widget? emptyWidget; + final Widget? errorWidget; + final ScrollController? scrollController; + final ListType listType; + + @override + Widget build(BuildContext context) { + if (resource.isLoading) { + return loadingWidget ?? RShimmerList(isSeparated: listType == ListType.separated); + } + + if (resource.isError) { + return errorWidget ?? Center(child: Text(resource.message ?? 'خطا')); + } + + if (resource.isEmpty || resource.data?.isEmpty == true) { + return emptyWidget ?? const Center(child: Text('آیتمی یافت نشد')); + } + + final controller = scrollController ?? ScrollController(); + + return NotificationListener( + onNotification: (ScrollNotification scrollInfo) { + if (!isPaginating && hasMore && scrollInfo.metrics.pixels >= scrollInfo.metrics.maxScrollExtent - 100) { + onLoadMore(); + } + return false; + }, + child: RefreshIndicator( + onRefresh: onRefresh ?? () async {}, + child: listType == ListType.separated + ? ListView.separated( + controller: controller, + itemCount: itemCount + (isPaginating ? 1 : 0), + itemBuilder: (context, index) { + if (isPaginating && index == itemCount) { + return const Padding( + padding: EdgeInsets.all(16), + child: Center(child: CupertinoActivityIndicator()), + ); + } + return itemBuilder(context, index); + }, + separatorBuilder: separatorBuilder ?? (_, __) => const SizedBox(height: 8), + ) + : ListView.builder( + controller: controller, + itemCount: itemCount + (isPaginating ? 1 : 0), + itemBuilder: (context, index) { + if (isPaginating && index == itemCount) { + return const Padding( + padding: EdgeInsets.all(16), + child: Center(child: CupertinoActivityIndicator()), + ); + } + return itemBuilder(context, index); + }, + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/list_view/r_shimmer_list.dart b/packages/core/lib/presentation/widget/list_view/r_shimmer_list.dart new file mode 100644 index 0000000..c6fd4e9 --- /dev/null +++ b/packages/core/lib/presentation/widget/list_view/r_shimmer_list.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:shimmer/shimmer.dart'; + +class RShimmerList extends StatelessWidget { + const RShimmerList({super.key, this.itemCount = 6, this.itemBuilder, this.height = 80, this.isSeparated = false}); + + final int itemCount; + final double height; + final bool isSeparated; + final IndexedWidgetBuilder? itemBuilder; + + @override + Widget build(BuildContext context) { + final builder = + itemBuilder ?? + (_, __) => Container( + height: height, + margin: const EdgeInsets.symmetric(vertical: 8), + decoration: BoxDecoration(color: Colors.grey[300], borderRadius: BorderRadius.circular(8)), + ); + + final children = List.generate(itemCount, (index) => builder(context, index)); + + return Shimmer.fromColors( + baseColor: Colors.grey.shade300, + highlightColor: Colors.grey.shade100, + child: isSeparated + ? ListView.separated( + itemCount: itemCount, + padding: const EdgeInsets.all(12), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: builder, + separatorBuilder: (_, __) => const SizedBox(height: 8), + ) + : ListView.builder( + itemCount: itemCount, + padding: const EdgeInsets.all(12), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: builder, + ), + ); + } +} diff --git a/packages/core/lib/utils/mixins/pagination_controller_mixin.dart b/packages/core/lib/utils/mixins/pagination_controller_mixin.dart new file mode 100644 index 0000000..c84b88e --- /dev/null +++ b/packages/core/lib/utils/mixins/pagination_controller_mixin.dart @@ -0,0 +1,64 @@ +import 'dart:async'; + +import 'package:get/get.dart'; +import 'package:rasadyar_core/utils/network/resource.dart'; + +mixin PaginationControllerMixin on GetxController { + final Rx>> resource = Resource>.initial().obs; + final RxBool isPaginating = false.obs; + final RxBool hasMore = true.obs; + int currentPage = 1; + + Timer? _debounceTimer; + Future Function()? _lastTriedOperation; + + Future> fetchPage(int page); + + void retryLastOperation() => _lastTriedOperation?.call(); + + Future refreshData() async { + _lastTriedOperation = refreshData; + try { + currentPage = 1; + resource.value = const Resource.loading(); + final items = await fetchPage(currentPage); + if (items.isEmpty) { + resource.value = const Resource.empty(); + hasMore.value = false; + } else { + resource.value = Resource.success(items); + hasMore.value = true; + } + } catch (e) { + resource.value = Resource.error(e.toString()); + } + } + + Future loadMoreData() async { + _lastTriedOperation = loadMoreData; + + if (_debounceTimer?.isActive ?? false) return; + + _debounceTimer = Timer(const Duration(milliseconds: 300), () async { + if (isPaginating.value || !hasMore.value) return; + + try { + isPaginating.value = true; + final nextPage = currentPage + 1; + final newItems = await fetchPage(nextPage); + if (newItems.isEmpty) { + hasMore.value = false; + } else { + final currentList = List.from(resource.value.data ?? []); + currentList.addAll(newItems); + resource.value = Resource.success(currentList); + currentPage = nextPage; + } + } catch (_) { + // ignore or optionally handle pagination error + } finally { + isPaginating.value = false; + } + }); + } +} diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 8b1d774..f60f4b9 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -1133,6 +1133,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + shimmer: + dependency: "direct main" + description: + name: shimmer + sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" + url: "https://pub.dev" + source: hosted + version: "3.0.0" sky_engine: dependency: transitive description: flutter diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 76edb96..0961bfd 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -42,6 +42,9 @@ dependencies: flutter_svg: ^2.0.17 font_awesome_flutter: ^10.8.0 + #Shimmer + shimmer: ^3.0.0 + #Generator flutter_gen_runner: ^5.10.0 From fa865b42b71a5f87d29bd2a4594ea121d5979cd5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 28 Jun 2025 16:45:55 +0330 Subject: [PATCH 142/256] test : hive_local_storage.dart --- .../core/test/infrastructure/local/hive_local_storage.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/core/test/infrastructure/local/hive_local_storage.dart b/packages/core/test/infrastructure/local/hive_local_storage.dart index 53b7b55..52f98da 100644 --- a/packages/core/test/infrastructure/local/hive_local_storage.dart +++ b/packages/core/test/infrastructure/local/hive_local_storage.dart @@ -1,9 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; -import 'i_local_storage.dart'; - -class HiveLocalStorage implements ILocalStorage { + class HiveLocalStorage implements ILocalStorage { HiveLocalStorage() { Hive.initFlutter(); } From 6d7d12d0328ea9aa5951e4858c06ca8a557bdc9b Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 09:42:50 +0330 Subject: [PATCH 143/256] chore : 1- add empty.svg 2- generate vec file 3- remove auth package from core --- assets/icons/empty.svg | 9 +++++++++ assets/vec/empty.svg.vec | Bin 0 -> 14 bytes .../core/lib/presentation/common/assets.gen.dart | 8 ++++++++ packages/core/pubspec.lock | 7 +++++++ pubspec.lock | 8 ++++++++ 5 files changed, 32 insertions(+) create mode 100644 assets/icons/empty.svg create mode 100644 assets/vec/empty.svg.vec diff --git a/assets/icons/empty.svg b/assets/icons/empty.svg new file mode 100644 index 0000000..910b77f --- /dev/null +++ b/assets/icons/empty.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/vec/empty.svg.vec b/assets/vec/empty.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..37f9ed7eddcca19498ee72143e6a9f0cbabaeec3 GIT binary patch literal 14 VcmYe&?O const SvgGenImage('assets/icons/edit.svg'); + /// File path: assets/icons/empty.svg + SvgGenImage get empty => const SvgGenImage('assets/icons/empty.svg'); + /// File path: assets/icons/excel_download.svg SvgGenImage get excelDownload => const SvgGenImage('assets/icons/excel_download.svg'); @@ -207,6 +210,7 @@ class $AssetsIconsGen { diagram, download, edit, + empty, excelDownload, filter, filterOutline, @@ -337,6 +341,9 @@ class $AssetsVecGen { /// File path: assets/vec/edit.svg.vec SvgGenImage get editSvg => const SvgGenImage.vec('assets/vec/edit.svg.vec'); + /// File path: assets/vec/empty.svg.vec + SvgGenImage get emptySvg => const SvgGenImage.vec('assets/vec/empty.svg.vec'); + /// File path: assets/vec/excel_download.svg.vec SvgGenImage get excelDownloadSvg => const SvgGenImage.vec('assets/vec/excel_download.svg.vec'); @@ -472,6 +479,7 @@ class $AssetsVecGen { diagramSvg, downloadSvg, editSvg, + emptySvg, excelDownloadSvg, filterSvg, filterOutlineSvg, diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index f60f4b9..dcb318d 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -1101,6 +1101,13 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + rasadyar_auth: + dependency: "direct main" + description: + path: "../auth" + relative: true + source: path + version: "0.0.1" rxdart: dependency: "direct main" description: diff --git a/pubspec.lock b/pubspec.lock index 2221d8b..9b07c47 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1200,6 +1200,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + shimmer: + dependency: transitive + description: + name: shimmer + sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" + url: "https://pub.dev" + source: hosted + version: "3.0.0" sky_engine: dependency: transitive description: flutter From 3fc745737dabb875f8e6a129645f9599e7e63b90 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 09:43:30 +0330 Subject: [PATCH 144/256] fix : don't redirect to login --- packages/auth/lib/data/utils/safe_call.dart | 2 -- .../lib/infrastructure/remote/app_interceptor.dart | 11 +++++++---- packages/core/lib/utils/network/safe_call_utils.dart | 3 +-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/auth/lib/data/utils/safe_call.dart b/packages/auth/lib/data/utils/safe_call.dart index fb14499..0e92be5 100644 --- a/packages/auth/lib/data/utils/safe_call.dart +++ b/packages/auth/lib/data/utils/safe_call.dart @@ -2,8 +2,6 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; -import '../models/response/auth/auth_response_model.dart'; -import '../services/token_storage_service.dart'; Future safeCall({ required AppAsyncCallback call, Function(T result)? onSuccess, diff --git a/packages/core/lib/infrastructure/remote/app_interceptor.dart b/packages/core/lib/infrastructure/remote/app_interceptor.dart index c58cde5..7dff63a 100644 --- a/packages/core/lib/infrastructure/remote/app_interceptor.dart +++ b/packages/core/lib/infrastructure/remote/app_interceptor.dart @@ -1,4 +1,6 @@ import 'dart:async'; +import 'package:rasadyar_auth/presentation/routes/pages.dart'; + import '../../core.dart'; typedef RefreshTokenCallback = Future Function(); @@ -10,7 +12,7 @@ class AppInterceptor extends Interceptor { @override Future onError(DioException err, ErrorInterceptorHandler handler) async { if (err.response?.statusCode == 401 && !ApiHandler.isRefreshing) { - // اول بقیه درخواست‌ها رو کنسل کن + ApiHandler.cancelAllRequests("Token expired - refreshing"); ApiHandler.isRefreshing = true; @@ -19,7 +21,7 @@ class AppInterceptor extends Interceptor { final newToken = await refreshTokenCallback(); if (newToken == null) throw Exception("Refresh failed"); - // تولید CancelToken جدید برای درخواست‌های بعدی + ApiHandler.reset(); final opts = err.requestOptions; @@ -34,8 +36,9 @@ class AppInterceptor extends Interceptor { if (!ApiHandler.isRedirecting) { ApiHandler.isRedirecting = true; ApiHandler.cancelAllRequests("Cancel All Requests - Unauthorized"); - // TODO: Navigate to login - Get.offAllNamed('/login'); + if (Get.currentRoute != '/Auth') { + Get.offAllNamed('/Auth'); + } } handler.reject(err); } finally { diff --git a/packages/core/lib/utils/network/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart index 7f51264..fca9f61 100644 --- a/packages/core/lib/utils/network/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -11,12 +11,11 @@ class ApiHandler { globalCancelToken = CancelToken(); } - // متد جدید برای کنسل کردن همه درخواست‌ها + static void cancelAllRequests(String reason) { if (!globalCancelToken.isCancelled) { globalCancelToken.cancel(reason); } - // CancelToken جدید بساز برای درخواست‌های بعدی globalCancelToken = CancelToken(); } From b2dfaad9487fdf1dae068cf74e89651a34bba7c2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 09:44:19 +0330 Subject: [PATCH 145/256] fix : number of captchaKey --- packages/auth/lib/presentation/widget/captcha/logic.dart | 2 +- packages/auth/lib/presentation/widget/captcha/view.dart | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart index ef21e40..4644ca8 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -30,7 +30,7 @@ class CaptchaWidgetLogic extends GetxController with StateMixin { ? clearButton(() => controller.textController.value.clear()) : null, - onSubmitted: (data) {}, validator: (value) { if (value == null || value.isEmpty) { return 'کد امنیتی را وارد کنید'; From 5d5d7f19021ccb2fb5396874ee9e59450a20b01b Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 09:58:36 +0330 Subject: [PATCH 146/256] chore : add loading lottie file --- assets/anim/loading.json | 5755 +++++++++++++++++ .../lib/presentation/common/assets.gen.dart | 11 + packages/core/pubspec.lock | 15 +- packages/core/pubspec.yaml | 1 + pubspec.lock | 8 + pubspec.yaml | 4 +- 6 files changed, 5784 insertions(+), 10 deletions(-) create mode 100644 assets/anim/loading.json diff --git a/assets/anim/loading.json b/assets/anim/loading.json new file mode 100644 index 0000000..03f2643 --- /dev/null +++ b/assets/anim/loading.json @@ -0,0 +1,5755 @@ +{ + "v": "5.5.7", + "meta": { + "g": "LottieFiles AE 0.1.20", + "a": "", + "k": "", + "d": "", + "tc": "" + }, + "fr": 25, + "ip": 0, + "op": 50, + "w": 1000, + "h": 1000, + "nm": "Go Up 4", + "ddd": 0, + "assets": [], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Ball", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 2, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 5, + "s": [ + 100 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 25, + "s": [ + 100 + ] + }, + { + "t": 28, + "s": [ + 0 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 0, + "s": [ + 1134, + -86, + 0 + ], + "to": [ + -78.833, + 112.333, + 0 + ], + "ti": [ + 69, + -554, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 10, + "s": [ + 661, + 588, + 0 + ], + "to": [ + -41, + -194, + 0 + ], + "ti": [ + -13, + -191, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 20, + "s": [ + 431, + 731, + 0 + ], + "to": [ + -453, + -205, + 0 + ], + "ti": [ + 98.5, + 6.333, + 0 + ] + }, + { + "t": 35, + "s": [ + -160, + 693, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 206, + -442, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 68, + 68 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 1, + "k": [ + { + "t": 0, + "s": [ + 0.28, + 0.676, + 1, + 1 + ], + "h": 1 + }, + { + "t": 10, + "s": [ + 0.208, + 0.6392, + 0.992, + 1 + ], + "h": 1 + }, + { + "t": 14, + "s": [ + 0.96, + 0.9813, + 1, + 1 + ], + "h": 1 + }, + { + "t": 20, + "s": [ + 0.208, + 0.6392, + 0.992, + 1 + ], + "h": 1 + }, + { + "t": 35, + "s": [ + 0.28, + 0.676, + 1, + 1 + ], + "h": 1 + } + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 206, + -442 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 3, + "nm": "Ch Female", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 430.49, + 518.068, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -353.776, + 54.159, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 60, + 60, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Stairs", + "parent": 2, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + -257.327, + 448.499, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 501.5, + 768.4, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 135.823, + 135.823, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 75, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 340, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 80, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 184, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 100, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 160, + 208 + ], + [ + 4, + 208 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 125, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -16, + 338.4 + ], + [ + -172, + 338.4 + ] + ], + "c": false + } + ] + }, + { + "t": 130, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -162, + 336 + ], + [ + -166, + 336 + ] + ], + "c": false + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.28, + 0.676, + 1, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 75, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 80, + "s": [ + 50 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 125, + "s": [ + 50 + ] + }, + { + "t": 140, + "s": [ + 0 + ] + } + ], + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 500, + 500 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "5", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 49, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 340, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 55, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 184, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 75, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 160, + 208 + ], + [ + 4, + 208 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 100, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -16, + 338.4 + ], + [ + -172, + 338.4 + ] + ], + "c": false + } + ] + }, + { + "t": 105, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -162, + 336 + ], + [ + -166, + 336 + ] + ], + "c": false + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.28, + 0.676, + 1, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 49, + "s": [ + 0 + ] + }, + { + "t": 55, + "s": [ + 50 + ] + } + ], + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 500, + 500 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "4", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 25, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 340, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 30, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 184, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 49, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 160, + 208 + ], + [ + 4, + 208 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 75, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -16, + 338.4 + ], + [ + -172, + 338.4 + ] + ], + "c": false + } + ] + }, + { + "t": 80, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -162, + 336 + ], + [ + -166, + 336 + ] + ], + "c": false + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 25, + "s": [ + 0.2, + 0.64, + 1, + 1 + ] + }, + { + "t": 49, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + } + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 25, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 30, + "s": [ + 50 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 75, + "s": [ + 50 + ] + }, + { + "t": 88, + "s": [ + 0 + ] + } + ], + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 500, + 500 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "3", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 3, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 0, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 340, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 5, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 184, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 25, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 160, + 208 + ], + [ + 4, + 208 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 49, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -16, + 338.4 + ], + [ + -172, + 338.4 + ] + ], + "c": false + } + ] + }, + { + "t": 55, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -162, + 336 + ], + [ + -166, + 336 + ] + ], + "c": false + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + }, + { + "i": { + "x": [ + 0 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 25, + "s": [ + 0.2, + 0.64, + 1, + 1 + ] + }, + { + "t": 49, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + } + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 0, + "s": [ + 2 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 5, + "s": [ + 50 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 49, + "s": [ + 50 + ] + }, + { + "t": 62, + "s": [ + 0 + ] + } + ], + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 500, + 500 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "2", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 4, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": -25, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 340, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": -20, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 340, + 64 + ], + [ + 184, + 64 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 0, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 160, + 208 + ], + [ + 4, + 208 + ] + ], + "c": false + } + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 25, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -16, + 338.4 + ], + [ + -172, + 338.4 + ] + ], + "c": false + } + ] + }, + { + "t": 30, + "s": [ + { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -162, + 336 + ], + [ + -166, + 336 + ] + ], + "c": false + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + }, + { + "t": 25, + "s": [ + 0.2, + 0.64, + 1, + 1 + ] + } + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 25, + "s": [ + 50 + ] + }, + { + "t": 40, + "s": [ + 0 + ] + } + ], + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 500, + 500 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "1", + "np": 1, + "cix": 2, + "bm": 0, + "ix": 5, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Arrow", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 572.227, + 624.662, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 74, + 74, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 289.773, + -122.662 + ], + [ + 337.773, + -212.662 + ], + [ + 389.773, + -126.662 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.724 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 1.276 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 25, + "s": [ + 0.2, + 0.64, + 1, + 1 + ] + }, + { + "t": 49, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + } + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 40, + "ix": 5 + }, + "lc": 2, + "lj": 2, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 70 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 2", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + -70, + 0 + ], + [ + 0, + 312 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 210, + 0 + ], + [ + 0, + -312 + ] + ], + "v": [ + [ + -533.515, + 362.835 + ], + [ + 208, + 362 + ], + [ + 385.795, + -103.615 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.724 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 1.276 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 25, + "s": [ + 0.2, + 0.64, + 1, + 1 + ] + }, + { + "t": 49, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + } + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 20, + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + -40 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 87.603, + 87.603 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Plants R", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 686.095, + 830.468, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -105.912, + 311.223, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + -50, + 50, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.75, + "y": 1 + }, + "o": { + "x": 0.05, + "y": 0 + }, + "t": 0, + "s": [ + { + "i": [ + [ + 41, + -28 + ], + [ + 10, + 18 + ], + [ + 20, + -32 + ], + [ + 0, + 0 + ], + [ + -28.194, + 10.252 + ], + [ + 12, + 56 + ] + ], + "o": [ + [ + -31.031, + 21.192 + ], + [ + -10, + -18 + ], + [ + -42.36, + 67.776 + ], + [ + 0, + 0 + ], + [ + 22, + -8 + ], + [ + -10.476, + -48.89 + ] + ], + "v": [ + [ + -294, + 64 + ], + [ + -286, + 190 + ], + [ + -358, + 176 + ], + [ + -260, + 332 + ], + [ + -226, + 332 + ], + [ + -225, + 161 + ] + ], + "c": true + } + ] + }, + { + "i": { + "x": 0.75, + "y": 1 + }, + "o": { + "x": 0.05, + "y": 0 + }, + "t": 25, + "s": [ + { + "i": [ + [ + 41, + -28 + ], + [ + 9.634, + 18.198 + ], + [ + 40, + -26 + ], + [ + 0, + 0 + ], + [ + -28.194, + 10.252 + ], + [ + 12, + 56 + ] + ], + "o": [ + [ + -31.031, + 21.192 + ], + [ + -18, + -34 + ], + [ + -58.691, + 38.149 + ], + [ + 0, + 0 + ], + [ + 22, + -8 + ], + [ + -10.476, + -48.89 + ] + ], + "v": [ + [ + -256, + 62 + ], + [ + -276, + 186 + ], + [ + -330, + 132 + ], + [ + -260, + 332 + ], + [ + -226, + 332 + ], + [ + -189, + 159 + ] + ], + "c": true + } + ] + }, + { + "t": 49, + "s": [ + { + "i": [ + [ + 41, + -28 + ], + [ + 10, + 18 + ], + [ + 20, + -32 + ], + [ + 0, + 0 + ], + [ + -28.194, + 10.252 + ], + [ + 12, + 56 + ] + ], + "o": [ + [ + -31.031, + 21.192 + ], + [ + -10, + -18 + ], + [ + -42.36, + 67.776 + ], + [ + 0, + 0 + ], + [ + 22, + -8 + ], + [ + -10.476, + -48.89 + ] + ], + "v": [ + [ + -294, + 64 + ], + [ + -286, + 190 + ], + [ + -358, + 176 + ], + [ + -260, + 332 + ], + [ + -226, + 332 + ], + [ + -225, + 161 + ] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 1.173 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0.28, + 0.676, + 1, + 1 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.827 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 25, + "s": [ + 0, + 0.8667, + 0.702, + 1 + ] + }, + { + "t": 49, + "s": [ + 0.28, + 0.676, + 1, + 1 + ] + } + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 106.667, + -25.333 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Plants L", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 295.905, + 834.468, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -105.912, + 311.223, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 80, + 80, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { + "x": 0.75, + "y": 1 + }, + "o": { + "x": 0.05, + "y": 0 + }, + "t": 0, + "s": [ + { + "i": [ + [ + 41, + -28 + ], + [ + 10, + 18 + ], + [ + 20, + -32 + ], + [ + 0, + 0 + ], + [ + -28.194, + 10.252 + ], + [ + 12, + 56 + ] + ], + "o": [ + [ + -31.031, + 21.192 + ], + [ + -10, + -18 + ], + [ + -42.36, + 67.776 + ], + [ + 0, + 0 + ], + [ + 22, + -8 + ], + [ + -10.476, + -48.89 + ] + ], + "v": [ + [ + -294, + 64 + ], + [ + -286, + 190 + ], + [ + -358, + 176 + ], + [ + -260, + 332 + ], + [ + -226, + 332 + ], + [ + -225, + 161 + ] + ], + "c": true + } + ] + }, + { + "i": { + "x": 0.75, + "y": 1 + }, + "o": { + "x": 0.05, + "y": 0 + }, + "t": 25, + "s": [ + { + "i": [ + [ + 41, + -28 + ], + [ + 9.634, + 18.198 + ], + [ + 40, + -26 + ], + [ + 0, + 0 + ], + [ + -28.194, + 10.252 + ], + [ + 12, + 56 + ] + ], + "o": [ + [ + -31.031, + 21.192 + ], + [ + -18, + -34 + ], + [ + -58.691, + 38.149 + ], + [ + 0, + 0 + ], + [ + 22, + -8 + ], + [ + -10.476, + -48.89 + ] + ], + "v": [ + [ + -256, + 62 + ], + [ + -276, + 186 + ], + [ + -330, + 132 + ], + [ + -260, + 332 + ], + [ + -226, + 332 + ], + [ + -189, + 159 + ] + ], + "c": true + } + ] + }, + { + "t": 49, + "s": [ + { + "i": [ + [ + 41, + -28 + ], + [ + 10, + 18 + ], + [ + 20, + -32 + ], + [ + 0, + 0 + ], + [ + -28.194, + 10.252 + ], + [ + 12, + 56 + ] + ], + "o": [ + [ + -31.031, + 21.192 + ], + [ + -10, + -18 + ], + [ + -42.36, + 67.776 + ], + [ + 0, + 0 + ], + [ + 22, + -8 + ], + [ + -10.476, + -48.89 + ] + ], + "v": [ + [ + -294, + 64 + ], + [ + -286, + 190 + ], + [ + -358, + 176 + ], + [ + -260, + 332 + ], + [ + -226, + 332 + ], + [ + -225, + 161 + ] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.827 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0, + 0.8667, + 0.702, + 1 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 1.173 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 25, + "s": [ + 0.28, + 0.676, + 1, + 1 + ] + }, + { + "t": 49, + "s": [ + 0, + 0.8667, + 0.702, + 1 + ] + } + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 106.667, + -25.333 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Clock", + "parent": 8, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 134, + -131.9, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -2, + -95.9, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -276, + 2 + ], + [ + -236, + 2 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.851, + 0.8784, + 0.902, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 10, + "ix": 5 + }, + "lc": 1, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 508, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 4", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -276, + 2 + ], + [ + -236, + 2 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.851, + 0.8784, + 0.902, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 10, + "ix": 5 + }, + "lc": 1, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 3", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -2, + 2 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -2, + 2 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 90, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 3", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -276, + 2 + ], + [ + -236, + 2 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.851, + 0.8784, + 0.902, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 10, + "ix": 5 + }, + "lc": 1, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 508, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 4", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + -276, + 2 + ], + [ + -236, + 2 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.851, + 0.8784, + 0.902, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 10, + "ix": 5 + }, + "lc": 1, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 3", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -2, + 2 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -2, + 2 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 2", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 0, + -1 + ], + [ + 0, + -243 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 0.851, + 0.8784, + 0.902, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 40, + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 0, + "s": [ + 0 + ] + }, + { + "t": 49, + "s": [ + 720 + ] + } + ], + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 0, + 0 + ] + ], + "v": [ + [ + 0, + -1 + ], + [ + 0, + -127 + ] + ], + "c": false + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "st", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 3 + }, + "o": { + "a": 0, + "k": 100, + "ix": 4 + }, + "w": { + "a": 0, + "k": 60, + "ix": 5 + }, + "lc": 2, + "lj": 1, + "ml": 4, + "bm": 0, + "nm": "Stroke 1", + "mn": "ADBE Vector Graphic - Stroke", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 0, + "s": [ + 0 + ] + }, + { + "t": 49, + "s": [ + 360 + ] + } + ], + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 2", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + -97 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + -122 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 80, + 80 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 3, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Ellipse BG", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.05, + "y": 0 + }, + "t": 0, + "s": [ + 364, + 536, + 0 + ], + "to": [ + 0, + -8.833, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.05, + "y": 0 + }, + "t": 25, + "s": [ + 364, + 483, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + -8.833, + 0 + ] + }, + { + "t": 49, + "s": [ + 364, + 536, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 712, + 712 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 1.276 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 0, + "s": [ + 0.2, + 0.64, + 1, + 1 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.724 + ] + }, + "o": { + "x": [ + 0.05 + ], + "y": [ + 0 + ] + }, + "t": 25, + "s": [ + 0.6314, + 0.6784, + 0.7176, + 1 + ] + }, + { + "t": 49, + "s": [ + 0.2, + 0.64, + 1, + 1 + ] + } + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 136, + -36 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 80.317, + 80.317 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Bottom Shadow", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 10, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 524, + 832.149, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 381.25, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 153.865, + -608.36, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 400, + 12.5 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.1804, + 0.0118, + 0.898, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 381.25 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 50, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} \ No newline at end of file diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 4c40df4..79c8175 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -12,6 +12,16 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.dart' as _svg; import 'package:vector_graphics/vector_graphics.dart' as _vg; +class $AssetsAnimGen { + const $AssetsAnimGen(); + + /// File path: assets/anim/loading.json + String get loading => 'assets/anim/loading.json'; + + /// List of all assets + List get values => [loading]; +} + class $AssetsIconsGen { const $AssetsIconsGen(); @@ -524,6 +534,7 @@ class $AssetsVecGen { class Assets { const Assets._(); + static const $AssetsAnimGen anim = $AssetsAnimGen(); static const $AssetsIconsGen icons = $AssetsIconsGen(); static const $AssetsImagesGen images = $AssetsImagesGen(); static const $AssetsLogosGen logos = $AssetsLogosGen(); diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index dcb318d..bcbeef8 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -829,6 +829,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + lottie: + dependency: "direct main" + description: + name: lottie + sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 + url: "https://pub.dev" + source: hosted + version: "3.3.1" matcher: dependency: transitive description: @@ -1101,13 +1109,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" - rasadyar_auth: - dependency: "direct main" - description: - path: "../auth" - relative: true - source: path - version: "0.0.1" rxdart: dependency: "direct main" description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 0961bfd..dcc9491 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: cupertino_icons: ^1.0.8 flutter_slidable: ^4.0.0 flutter_rating_bar: ^4.0.1 + lottie: ^3.3.1 ##Log logger: ^2.5.0 diff --git a/pubspec.lock b/pubspec.lock index 9b07c47..a0008dc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -861,6 +861,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + lottie: + dependency: transitive + description: + name: lottie + sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 + url: "https://pub.dev" + source: hosted + version: "3.3.1" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5fd14f6..38e5e0f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -61,12 +61,10 @@ flutter: assets: - assets/icons/ - - assets/icons/inside.svg - - assets/icons/outside.svg - - assets/icons/whare_house.svg - assets/images/ - assets/logos/ - assets/vec/ + - assets/anim/ fonts: From 5d27a76f798bda56ee36dc3de564678a902372b3 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 09:59:10 +0330 Subject: [PATCH 147/256] refactor : clean up import --- packages/core/lib/infrastructure/remote/app_interceptor.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/lib/infrastructure/remote/app_interceptor.dart b/packages/core/lib/infrastructure/remote/app_interceptor.dart index 7dff63a..77b745b 100644 --- a/packages/core/lib/infrastructure/remote/app_interceptor.dart +++ b/packages/core/lib/infrastructure/remote/app_interceptor.dart @@ -1,6 +1,4 @@ import 'dart:async'; -import 'package:rasadyar_auth/presentation/routes/pages.dart'; - import '../../core.dart'; typedef RefreshTokenCallback = Future Function(); From 1e0eeac1f02833fe9756a9ff9cb266bd7f65d1f9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 11:54:51 +0330 Subject: [PATCH 148/256] chore : add some svg and lottie library --- assets/icons/buy.svg | 18 ++++++++++++++++++ assets/icons/check.svg | 3 +++ assets/icons/check_square.svg | 4 ++++ assets/icons/close_square.svg | 5 +++++ assets/icons/sale.svg | 20 ++++++++++++++++++++ assets/icons/task.svg | 16 ++++++++++++++++ assets/icons/timer.svg | 3 +++ assets/icons/truck_fast_outlined.svg | 18 ++++++++++++++++++ assets/vec/buy.svg.vec | Bin 0 -> 2059 bytes assets/vec/check.svg.vec | Bin 0 -> 240 bytes assets/vec/check_square.svg.vec | Bin 0 -> 551 bytes assets/vec/close_square.svg.vec | Bin 0 -> 730 bytes assets/vec/sale.svg.vec | Bin 0 -> 2170 bytes assets/vec/task.svg.vec | Bin 0 -> 1389 bytes assets/vec/timer.svg.vec | Bin 0 -> 584 bytes assets/vec/truck_fast_outlined.svg.vec | Bin 0 -> 2813 bytes packages/core/pubspec.lock | 8 ++++++++ packages/core/pubspec.yaml | 1 + pubspec.lock | 8 ++++++++ 19 files changed, 104 insertions(+) create mode 100644 assets/icons/buy.svg create mode 100644 assets/icons/check.svg create mode 100644 assets/icons/check_square.svg create mode 100644 assets/icons/close_square.svg create mode 100644 assets/icons/sale.svg create mode 100644 assets/icons/task.svg create mode 100644 assets/icons/timer.svg create mode 100644 assets/icons/truck_fast_outlined.svg create mode 100644 assets/vec/buy.svg.vec create mode 100644 assets/vec/check.svg.vec create mode 100644 assets/vec/check_square.svg.vec create mode 100644 assets/vec/close_square.svg.vec create mode 100644 assets/vec/sale.svg.vec create mode 100644 assets/vec/task.svg.vec create mode 100644 assets/vec/timer.svg.vec create mode 100644 assets/vec/truck_fast_outlined.svg.vec diff --git a/assets/icons/buy.svg b/assets/icons/buy.svg new file mode 100644 index 0000000..de8f2fe --- /dev/null +++ b/assets/icons/buy.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/assets/icons/check.svg b/assets/icons/check.svg new file mode 100644 index 0000000..d314ce4 --- /dev/null +++ b/assets/icons/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/check_square.svg b/assets/icons/check_square.svg new file mode 100644 index 0000000..316aeb2 --- /dev/null +++ b/assets/icons/check_square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/close_square.svg b/assets/icons/close_square.svg new file mode 100644 index 0000000..3f7c554 --- /dev/null +++ b/assets/icons/close_square.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/sale.svg b/assets/icons/sale.svg new file mode 100644 index 0000000..2b7d939 --- /dev/null +++ b/assets/icons/sale.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/assets/icons/task.svg b/assets/icons/task.svg new file mode 100644 index 0000000..a9595ba --- /dev/null +++ b/assets/icons/task.svg @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/assets/icons/timer.svg b/assets/icons/timer.svg new file mode 100644 index 0000000..cffe360 --- /dev/null +++ b/assets/icons/timer.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/truck_fast_outlined.svg b/assets/icons/truck_fast_outlined.svg new file mode 100644 index 0000000..bb3b4c4 --- /dev/null +++ b/assets/icons/truck_fast_outlined.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/assets/vec/buy.svg.vec b/assets/vec/buy.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..7a54d0841f4ac25219315f9c17e1576a83b9c9be GIT binary patch literal 2059 zcmZ8i2~?C-6n_5r{zEApKtDc_kHi)@4xr|Gs1G2 zGKR5JV9clnIryb0TE?=8F~)C)Bapk8R^k8tzpCk5b!fHytBm#S%{IGmpMjHT_{}r} z`Hww52;Tmu7B{uRyGA4%`Y_`K&oknu6yn;_!j zOeJu}YnZ2G*Zgy7V}yr=xK^Y7okrMy{2J@sTCgDJ01mHcMO5Hk+$nCwM%xYyX>7&H zrVnv-{ADz-sS=aon8Xbq717}Htr#^jl|=lr^ZA7xAJVv0v0D_(Z*eADPt<=N;N#4RO9ek&i%;U-((^pr~ zjj_X2-#teuufd=mKX;Ohi-XkM6)iL?J6P?tw9}Q^V72~LPb8#-s9kO2u*?yn3e5$2 z`_7YCd@>iO`Fh=(>mcH%g=|Cu-(Qx$8Sb2KfzKAq<@}2_m*5OPZ$@&M1IeYu7b$-!nxfD-rkD&rDaerweo&gjTa|4pS8f7URr72$+VML7xjwx{<;m! zh51M!G>W1Tx56*cYFdkMFU*WW$cl74wO2(%d^%b#0S5}x5LX5?rlw-&ETGw#f+N2I z`s2w+uT|lG--_~j6*sO~@$B14IJGAl6@fEw#WxxcH_zZbIT>|XR^H!}(PT)*(94ri za3C3Bq0z{kWJAiqXk3W4;f-U_xU|`Zc07xxCZ`}~sRc7fq(DuJf&EA_Zf%c6*zROl zt71{wG7ZOuC*qd>6#U+8L+=?Y&nE>(S1(6#c^bZbyxifKQ5wH<^DlN3%auW%nt%$kv*tAvSe*MVm#U-dsZb%|HXBQP^$gRzNd09 zaCj)~S^7RMmK*6O{c_a%j-vtI%i%ut35i7>L`8GoM^%3vm8Ao>3gOy94Q>@U$~il%=K*_R%0{9aC-b97vva%$?;;ou|XR#HWT7ABCx;GgwxMOAas`r6XKkBd`twQcAD_$)o^%iHep~zIG;NcYF`e=wRtAA z>B7;HV1hPM5AEw-VB__8@RAo?yS&g-?1{)&9qd~?5ITDh8i%?=;pn>8MdJOADiZdZ z(UmmE(*yR73hJ-hz}(nisSg)L4xo@n(LODDXx}PcTLl$ZbMblO7Zh?g7nP&R=~_k} z+$UC0{nb3Yl(my~kI%=6eU)^TV^49FL{{L!-}U(je3E~U?&M-(m=6BkE8!C81>NnH zP>f#q`Bujn8W{)!EW{PdCxSZ>FQ$+(iBLO$ZhO xI2^%>6Eyr=$t?~4U~3Wiw`{2haS#mqqd&up1{)mwK4=LY5|VH#E~)R5V1iC6Pl^ zCWHlnQ#D0XL_t4-gOH0@Lo^9`yYKOOE{Erwm-l?{cMezgZVP2th;_#7G|Zt1VHhq& z2!}9-qSil6SPMm)H05dKo;;~Izld%IXUj23e>%>gQjEdVT9;(FdPmrAhMfeTM$sV7 zfv5xS&NwA&bI~AtAkKlP1EMZ`$ZO>HWJ=Np4owBf7YUF(S(0@@XLTgP@Oe_YbuZn@(HV82BL_YZeKqo3LJ_TaFY}dD1yj{V&F$|^fy%xCK3>jC z+7>=35$$Jv@r_pA`#9fnNLy#kZ2LH%#GWddD^v)&cKt`mi6rsH4|S|wNWPwAq>j4# z1v{@@4sy!6OVAIin6~( PzhiD(#xUIGe_-Mt(UHpo literal 0 HcmV?d00001 diff --git a/assets/vec/close_square.svg.vec b/assets/vec/close_square.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..57db0a05ef91bca05caf5c439b566c5083c35758 GIT binary patch literal 730 zcmYk4&ubG=6oucL*;E1*g2>P*ajLayrL~)OQz7?)F2qWWTBU9*5B~wX=(b80R^0d( z_zM(^T}W32HLbX?AOsPLE(F&NRk9Y-alYFWoREB(JLjEyPDmJ8a{iQaca?X4UR<$r zd7gUb4!YusBJX_^yW%7A@hGF8(`)kM+c7QI-^#+BJ4Guyt*d6jZ8~}t1|Z_H7?#yY`*W4dhZVGb&9ObAUDpTV_!1Rr}Sx` z=vVr@8?6{$jc3M*vq$YY`_Pkvypa6N=|f-gl;3X(d7dvejPzwrUvfiwFsIjkj?_i& z5W##AlUMAzUwnM77=Lw{4lmE^WxpZt;kCrLduyh8u{Epk*Ll+N8jNH?8W)3zGsl4>=E`(=|mmyd1i@ rL)Ry0??|oi4aJ_I=-}So(9IDPUv%tYKcoj7tMFsxd8PQzg2?a>+|LN} literal 0 HcmV?d00001 diff --git a/assets/vec/sale.svg.vec b/assets/vec/sale.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..432121eac83655254500cccc2e7eaa4b18800b87 GIT binary patch literal 2170 zcmai#2~1Q+7{_P#aif5MBCNQ$um#E?MpJD)-u$1S)ZzuG;Dt9fRPn4tZCs=+haAcg zj}o;aNZQ&;ZLC+7c-0yYR4A>YC@7Euir~SaZf9m8wTVq%cHeKlZ{|B^@@7Fm3Q_qI zQU*eXDFck`kq9vw-T6qRVq*g(gisaJ@mV6N-!d!p=m_byFvw=z7DmbZEwdI(r%@4N z#+(ziO0r=noaBzq<~=ww#~QoVmEeraAM}HQYiN%qOZxrx-gP5#`HUSy=3*7tk7>%B^@NxL|9m;LW>_vBt7Pw#aT4 z>m3Ul!R;sZtpoQLy}cIP|D%nyh)my2FO97QkKfr`1D+2j&yO>Eb}`C=Yr*s9>v=ug zp4Z3y@p`#`tSkkOcj9O%czjNt4=2xWrg`Ol%CD7IXwZfL zCFP51x^{D*@;bDYwww=Ct}U^HGHo?q=F+&d2tWklR)kQa;b?fbO1;T=%^WIsJoV-)2utOC2XS)_7s+tr_ye`Fad5ikBUt^oR^klGC($ zB;;qx)*3xxe6!^5YTOVrE`mBbyCHw*T`=H4sn2uCAV(9&`bXK7=UO9QtrcPJX#{D2KUSW-p z@z3S{vyRYxK6B}a*d*HSdY8)S`E=5CJ!G<*PI>8rL((o9RqO|Kc^>T;;*V+jx6z;z z{^)ga3;iYB59=e+sF#lq^A$;TZs+JXekbYbeRt%ZK4^$#cfWX-On))xK2a?PCPGR` zp&8q!qB=E+x{sJH=;bq0=$i)5#H-{K`d8m{Sb0=XFP99QZKrHN#%`Q=hbhG_Q@0n$#QN%`J3pgDno#HBw`}EqETB z?sZkP_;_zb##d5qXJe?KCO;LF`{niY)U6>_#8I3lew5fTVy8-sq%mB}9y_?2c_L_$ zJ(dsCA^Efez8#~3bgvJpDs{M}31y+O+e&A1Jox!gmakzJ5Pk--he~|caBHLkVHI4GBHhSV%5@d*y@pp_J|PJ zG#FS+C-}~eWj%3V`?O5R4pFge?1bvcvFNJo!?*;=vK?H0UdVc5i&Vr2TDC+BN(tUb zVf{PuxgHa5_d@7>Pj&;E>eUcyV$aKG9TCSyKpMeSP1mzo9XdS7&4F={4z=TR;S#Dt z`^{Wt?};fJ^RVNNCmP%GuqsV27!>9$=vEpnm{%Ty<8ir&y0i#Z{@G~L#=_PsoAogk z_ib0P@2dgthpfbPT_U22SBRbjg_)RoBVNcCE#q<3HIe1AjKwxUzVHcBSWheJ<8V&d zBxtjg_dE{Tr+g3MFtR!rU$-yEZx3bGtJPx9UL~&7tdkb6yIz3t_m1mk=>}2tvA;Pqn5GDN>PI z5|nF5xC{7mi%LF9oQc_G-F+?w+zSW=iP z`sCSddfvazdj;VfN~eYQ3D$WE=+oz^;KD#Tm2ZgznG)Q8>4acxy;k_mScCX06%p(W z+;;SCLVk08)H8D!ZSymaK0Nb<0y|D0m^UqSbOY60rXXx6w3cZ#*O^+@Y zXe)k_8aFca_qWIB**815mJAAR96cnsa->Z7U&&G$V*e}4B{Wl0p&J(psd6KzQ+-7E zUTk}k-amLki+?9shI#)2z3}WOm>Z@Io-6EMU-fACb)`j|`;0i}O5v2~{<&#w<`8Ec za{*$$acADp6B>TzUJ!@-iD=Za?OPhPPzQoNINT+;2=@g$`UHo*%{@<1>O5Y{QkjaE ze2n~QnoreT2%AE^C6)p1X^DG%D5%sB&HGo`KEyiu0gkc^QE%Wm3;f1e5C=q_agG@i z#Qnj~+#}+mY)76bpL>-BeyE$Ok2yry?>>ATG;>nUykPfQF13{ncwu;AIE}nVRY@^- z2mM?O2v*OPQSpHrlome7^SDmw;XRa$U7(7IIWAwJgY4iNJ4`* zGjFE;9SPmN*hRl}HZ}a|XS>O7&_{QFoF_~9*xo@`vq;dAIvvd26ke%5C$5iu@^}y3 eBRtUfdnDfQKDMEbk4kfJCfm-j47d!q1^xln)}B}Z literal 0 HcmV?d00001 diff --git a/assets/vec/timer.svg.vec b/assets/vec/timer.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..9f849a02b87921177fdb299b139e04ddaf4fa3a6 GIT binary patch literal 584 zcmXw$QAkr^7>57tTnw8ao1lT##R$~Ewj}0cN6z;`K{5qLC`GmC+&Ph@x55~Rb`Tv{ zUFC&#Q8=b{mBLiI5uzJGyvZirR3k)4!7c>lc;2-g_<7HN{_lI<_xq38ZYfurQWmYW!p_kserST%k6e?{THpgciuHs`L3l|r2^RiZsx{t{-YpN-|VZhevc$2tS9k% z{(&S4kMZn=E+60Y;%_M~`#W72X`YnywRW6e{Uf~>ws2qk{9brodNL!d|M#v>*uU=e z33;jDib1|60|x!5^rtqihs!#Yx`%wts&U*91N*GgevtEPA_j7YQr)0W=ZP2eElziX zIe5-oXLWHf=h^KTn43J#K|bfJ&il#f{jhxn50~Cb<9-Bto0iPg0ikahsde|^YyPD? zJs3d9pB1T3;L)8$=U&XpJ((4biLIYOhik$*jiBdN0vjzl*ta`pfSfOdD9C-C>i~VK zzMS8`cxaGIrB62M5&G&At->7kQB3YmS@L3ST$pqCepcB3eDqMr<9=`<3ZB!C_4H>y W^DHlUg!#zl+|;UX=sN$tZC?Uq0^q*@ literal 0 HcmV?d00001 diff --git a/assets/vec/truck_fast_outlined.svg.vec b/assets/vec/truck_fast_outlined.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..996ae7c435b05e6400c9b2f267b0f13789eaddc1 GIT binary patch literal 2813 zcmZve32c;A5XZl7mo0}>8$#2=+v2wZVcj+F)_-q?VSX<`?z@&>PWmzj6)tIc8A<<{w>bKkvNupiu(2XEa-(idgD@W z=9I_SNq&(ZQC6Bu2=avu&naV9o%8cFY~TE_#`!6{M0*aI+1JR z4sXN1xin$&32##6cq&}e<~?yKpM1YW(O1>!G~wg^l)XNN1_pi9>$8hq#0Q&=c#g30 zbP@gfOgwY9Ec&zAE%l_(mmU3;k-XieX=I~cXq5GH&j))Dz_0#EThUYfZ*|um7$D7; zC)DBPn?(U0yg5%<*F43RD|qhod>OA0IYsFxj#bXM7Q@c&v)NG`E%Hp8c}m9lV0Zf`0ojM zeU!Xk*=#i1<2&gskB?Wcf1Qe3b2#a8K5c(0Lwok(hG*~TVcdpDPviKDV_DMMIMMr+ z*fWriOzO&uT)i}ZyZ?hfqI=et;h~_ObOI+uox!JBmGg^Hg7n@1Djz(#S84S# z)$VU9htBurrgGBx&{xbmcysA(TI*QK16E{maq9$GSD)yy?mk)19Oc<}vUt@)%-)nV z$u*VNem7WY)sV__r9aRYFL_YyHz&6e{C{saLpvJtI57Vdbs3(^)f<1O+AG;SJn=6o zD9_^(|2fLu`hs$(->+=#JCTi5XQ}*$N&NSth!c=pV225Z>|ZyXvfdrTpJX78PxmZ%y6h2^ zaeiPuL98!WbuF2fuRSF45RrpQoO6(Iu0apN9>jY-vh9}00Xu$xBY7VPRZ>PclgE6q zl*Z+zb9+J!8Acj!3I>(elD8;l)ilynPUC(*e?uwFX`hmrdn4qu!^(!3v!pycGAN%Gh7fgOUBU zvtPFA@6H$gkP#R9JMpXS^{A%qw|rc9WsTV7+I8mg_0nA`W4}NTM)t|%Z6&Hd94xi- zDph~ThEYw>gRpm-&i}0wXAJZp>eyY;mr)<~HyC|-gc5rldJy&?>VO_~!5)M^hQ940Ty~m8w5voDa~0R-IjpSXsTh?kc%> zwFg}#JN7Gr_!3w zit9FAMmH%?dWAdN*-t*=eR0({$@hey7sUGu;(bjhYgEDp^05n_+xlADzE*tUUrVqB z;R`!35*s>8e`m~XM%|Z7O?a{Rgzea2d# Date: Sun, 29 Jun 2025 11:55:33 +0330 Subject: [PATCH 149/256] fix : refresh token Completer in app_interceptor --- .../remote/app_interceptor.dart | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/packages/core/lib/infrastructure/remote/app_interceptor.dart b/packages/core/lib/infrastructure/remote/app_interceptor.dart index 77b745b..725889c 100644 --- a/packages/core/lib/infrastructure/remote/app_interceptor.dart +++ b/packages/core/lib/infrastructure/remote/app_interceptor.dart @@ -4,46 +4,56 @@ import '../../core.dart'; typedef RefreshTokenCallback = Future Function(); class AppInterceptor extends Interceptor { final RefreshTokenCallback refreshTokenCallback; + Completer? _refreshCompleter; AppInterceptor({required this.refreshTokenCallback}); + @override Future onError(DioException err, ErrorInterceptorHandler handler) async { if (err.response?.statusCode == 401 && !ApiHandler.isRefreshing) { - ApiHandler.cancelAllRequests("Token expired - refreshing"); - ApiHandler.isRefreshing = true; + if (_refreshCompleter == null) { + _refreshCompleter = Completer(); + ApiHandler.isRefreshing = true; + + try { + final newToken = await refreshTokenCallback(); + if (newToken == null) throw Exception("Refresh failed"); + + ApiHandler.reset(); + _refreshCompleter?.complete(newToken); + } catch (e) { + _refreshCompleter?.completeError(e); + if (!ApiHandler.isRedirecting) { + ApiHandler.isRedirecting = true; + ApiHandler.cancelAllRequests("Cancel All Requests - Unauthorized"); + if (Get.currentRoute != '/Auth') { + Get.offAllNamed('/Auth'); + } + } + } finally { + ApiHandler.isRefreshing = false; + _refreshCompleter = null; + } + } try { - final newToken = await refreshTokenCallback(); - if (newToken == null) throw Exception("Refresh failed"); + final newToken = await _refreshCompleter!.future; + if (newToken != null) { + final opts = err.requestOptions; + opts.headers['Authorization'] = 'Bearer $newToken'; - - ApiHandler.reset(); - - final opts = err.requestOptions; - opts.headers['Authorization'] = 'Bearer $newToken'; - - - final dio = Dio(); - final cloneReq = await dio.fetch(opts); - handler.resolve(cloneReq); - return; - } catch (e) { - if (!ApiHandler.isRedirecting) { - ApiHandler.isRedirecting = true; - ApiHandler.cancelAllRequests("Cancel All Requests - Unauthorized"); - if (Get.currentRoute != '/Auth') { - Get.offAllNamed('/Auth'); - } + final dio = Dio(); + final cloneReq = await dio.fetch(opts); + handler.resolve(cloneReq); + return; } + } catch (_) { handler.reject(err); - } finally { - ApiHandler.isRefreshing = false; } } else if (err.type == DioExceptionType.cancel) { - handler.next(err); } else { handler.next(err); From 61b74a6648144ed1f002a34cb17a663b9eb9c0f7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 11:55:58 +0330 Subject: [PATCH 150/256] refactor : clean up import --- packages/auth/lib/data/utils/safe_call.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/auth/lib/data/utils/safe_call.dart b/packages/auth/lib/data/utils/safe_call.dart index 0e92be5..edc659f 100644 --- a/packages/auth/lib/data/utils/safe_call.dart +++ b/packages/auth/lib/data/utils/safe_call.dart @@ -1,5 +1,3 @@ -import 'package:rasadyar_auth/auth.dart'; -import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; Future safeCall({ From ffa66157dd39af402023113d087a6b971b6eac42 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 11:56:22 +0330 Subject: [PATCH 151/256] feat : add screen utils for app --- lib/main.dart | 38 +++++++++++++++++++++---------------- packages/core/lib/core.dart | 1 + 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 395decd..543d9ad 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; + import 'infrastructure/di/di.dart'; import 'infrastructure/service/auth_service.dart'; @@ -44,23 +45,28 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return GetMaterialApp( - title: 'رصدیار', - theme: ThemeData( - fontFamily: 'yekan', - colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal), + return ScreenUtilInit( + designSize: const Size(412, 917), + minTextAdapt: true, + splitScreenMode: true, + child: GetMaterialApp( + title: 'رصدیار', + theme: ThemeData( + fontFamily: 'yekan', + colorScheme: ColorScheme.fromSeed(seedColor: AppColor.blueNormal), + ), + initialRoute: AppPages.initRoutes, + getPages: AppPages.pages, + locale: const Locale("fa", "IR"), + supportedLocales: const [Locale("fa", "IR")], + localizationsDelegates: [ + PersianMaterialLocalizations.delegate, + PersianCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], ), - initialRoute: AppPages.initRoutes, - getPages: AppPages.pages, - locale: const Locale("fa", "IR"), - supportedLocales: const [Locale("fa", "IR")], - localizationsDelegates: [ - PersianMaterialLocalizations.delegate, - PersianCupertinoLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], ); } } diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 6f6f95b..bf572c9 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -11,6 +11,7 @@ export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:device_info_plus/device_info_plus.dart'; export 'package:dio/dio.dart' ; export 'package:pretty_dio_logger/pretty_dio_logger.dart'; +export 'package:flutter_screenutil/flutter_screenutil.dart'; //freezed export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; From 5ba4572f144c5c2e38ad80d279d176a2c3d94179 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 12:36:04 +0330 Subject: [PATCH 152/256] feat : assets.gen for new assets --- .../lib/presentation/common/assets.gen.dart | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 79c8175..e19bcf8 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -40,6 +40,9 @@ class $AssetsIconsGen { /// File path: assets/icons/bg_header_user_profile.svg SvgGenImage get bgHeaderUserProfile => const SvgGenImage('assets/icons/bg_header_user_profile.svg'); + /// File path: assets/icons/buy.svg + SvgGenImage get buy => const SvgGenImage('assets/icons/buy.svg'); + /// File path: assets/icons/calendar.svg SvgGenImage get calendar => const SvgGenImage('assets/icons/calendar.svg'); @@ -49,9 +52,18 @@ class $AssetsIconsGen { /// File path: assets/icons/call.svg SvgGenImage get call => const SvgGenImage('assets/icons/call.svg'); + /// File path: assets/icons/check.svg + SvgGenImage get check => const SvgGenImage('assets/icons/check.svg'); + + /// File path: assets/icons/check_square.svg + SvgGenImage get checkSquare => const SvgGenImage('assets/icons/check_square.svg'); + /// File path: assets/icons/chicken.svg SvgGenImage get chicken => const SvgGenImage('assets/icons/chicken.svg'); + /// File path: assets/icons/close_square.svg + SvgGenImage get closeSquare => const SvgGenImage('assets/icons/close_square.svg'); + /// File path: assets/icons/convert_cube.svg SvgGenImage get convertCube => const SvgGenImage('assets/icons/convert_cube.svg'); @@ -151,6 +163,9 @@ class $AssetsIconsGen { /// File path: assets/icons/receipt_discount.svg SvgGenImage get receiptDiscount => const SvgGenImage('assets/icons/receipt_discount.svg'); + /// File path: assets/icons/sale.svg + SvgGenImage get sale => const SvgGenImage('assets/icons/sale.svg'); + /// File path: assets/icons/scan.svg SvgGenImage get scan => const SvgGenImage('assets/icons/scan.svg'); @@ -175,6 +190,12 @@ class $AssetsIconsGen { /// File path: assets/icons/tag_user.svg SvgGenImage get tagUser => const SvgGenImage('assets/icons/tag_user.svg'); + /// File path: assets/icons/task.svg + SvgGenImage get task => const SvgGenImage('assets/icons/task.svg'); + + /// File path: assets/icons/timer.svg + SvgGenImage get timer => const SvgGenImage('assets/icons/timer.svg'); + /// File path: assets/icons/trash.svg SvgGenImage get trash => const SvgGenImage('assets/icons/trash.svg'); @@ -184,6 +205,9 @@ class $AssetsIconsGen { /// File path: assets/icons/truck_fast.svg SvgGenImage get truckFast => const SvgGenImage('assets/icons/truck_fast.svg'); + /// File path: assets/icons/truck_fast_outlined.svg + SvgGenImage get truckFastOutlined => const SvgGenImage('assets/icons/truck_fast_outlined.svg'); + /// File path: assets/icons/user.svg SvgGenImage get user => const SvgGenImage('assets/icons/user.svg'); @@ -206,10 +230,14 @@ class $AssetsIconsGen { arrowLeft, arrowRight, bgHeaderUserProfile, + buy, calendar, calendarSearch, call, + check, + checkSquare, chicken, + closeSquare, convertCube, cube, cubeBottomRotation, @@ -243,6 +271,7 @@ class $AssetsIconsGen { profileCircle, profileUser, receiptDiscount, + sale, scan, scanBarcode, search, @@ -251,9 +280,12 @@ class $AssetsIconsGen { shoppingBasket, tagLabel, tagUser, + task, + timer, trash, truck, truckFast, + truckFastOutlined, user, userRaduis, userSquare, @@ -309,6 +341,9 @@ class $AssetsVecGen { /// File path: assets/vec/bg_header_user_profile.svg.vec SvgGenImage get bgHeaderUserProfileSvg => const SvgGenImage.vec('assets/vec/bg_header_user_profile.svg.vec'); + /// File path: assets/vec/buy.svg.vec + SvgGenImage get buySvg => const SvgGenImage.vec('assets/vec/buy.svg.vec'); + /// File path: assets/vec/calendar.svg.vec SvgGenImage get calendarSvg => const SvgGenImage.vec('assets/vec/calendar.svg.vec'); @@ -318,9 +353,18 @@ class $AssetsVecGen { /// File path: assets/vec/call.svg.vec SvgGenImage get callSvg => const SvgGenImage.vec('assets/vec/call.svg.vec'); + /// File path: assets/vec/check.svg.vec + SvgGenImage get checkSvg => const SvgGenImage.vec('assets/vec/check.svg.vec'); + + /// File path: assets/vec/check_square.svg.vec + SvgGenImage get checkSquareSvg => const SvgGenImage.vec('assets/vec/check_square.svg.vec'); + /// File path: assets/vec/chicken.svg.vec SvgGenImage get chickenSvg => const SvgGenImage.vec('assets/vec/chicken.svg.vec'); + /// File path: assets/vec/close_square.svg.vec + SvgGenImage get closeSquareSvg => const SvgGenImage.vec('assets/vec/close_square.svg.vec'); + /// File path: assets/vec/convert_cube.svg.vec SvgGenImage get convertCubeSvg => const SvgGenImage.vec('assets/vec/convert_cube.svg.vec'); @@ -420,6 +464,9 @@ class $AssetsVecGen { /// File path: assets/vec/receipt_discount.svg.vec SvgGenImage get receiptDiscountSvg => const SvgGenImage.vec('assets/vec/receipt_discount.svg.vec'); + /// File path: assets/vec/sale.svg.vec + SvgGenImage get saleSvg => const SvgGenImage.vec('assets/vec/sale.svg.vec'); + /// File path: assets/vec/scan.svg.vec SvgGenImage get scanSvg => const SvgGenImage.vec('assets/vec/scan.svg.vec'); @@ -444,6 +491,12 @@ class $AssetsVecGen { /// File path: assets/vec/tag_user.svg.vec SvgGenImage get tagUserSvg => const SvgGenImage.vec('assets/vec/tag_user.svg.vec'); + /// File path: assets/vec/task.svg.vec + SvgGenImage get taskSvg => const SvgGenImage.vec('assets/vec/task.svg.vec'); + + /// File path: assets/vec/timer.svg.vec + SvgGenImage get timerSvg => const SvgGenImage.vec('assets/vec/timer.svg.vec'); + /// File path: assets/vec/trash.svg.vec SvgGenImage get trashSvg => const SvgGenImage.vec('assets/vec/trash.svg.vec'); @@ -453,6 +506,9 @@ class $AssetsVecGen { /// File path: assets/vec/truck_fast.svg.vec SvgGenImage get truckFastSvg => const SvgGenImage.vec('assets/vec/truck_fast.svg.vec'); + /// File path: assets/vec/truck_fast_outlined.svg.vec + SvgGenImage get truckFastOutlinedSvg => const SvgGenImage.vec('assets/vec/truck_fast_outlined.svg.vec'); + /// File path: assets/vec/user.svg.vec SvgGenImage get userSvg => const SvgGenImage.vec('assets/vec/user.svg.vec'); @@ -475,10 +531,14 @@ class $AssetsVecGen { arrowLeftSvg, arrowRightSvg, bgHeaderUserProfileSvg, + buySvg, calendarSvg, calendarSearchSvg, callSvg, + checkSvg, + checkSquareSvg, chickenSvg, + closeSquareSvg, convertCubeSvg, cubeSvg, cubeBottomRotationSvg, @@ -512,6 +572,7 @@ class $AssetsVecGen { profileCircleSvg, profileUserSvg, receiptDiscountSvg, + saleSvg, scanSvg, scanBarcodeSvg, searchSvg, @@ -520,9 +581,12 @@ class $AssetsVecGen { shoppingBasketSvg, tagLabelSvg, tagUserSvg, + taskSvg, + timerSvg, trashSvg, truckSvg, truckFastSvg, + truckFastOutlinedSvg, userSvg, userRaduisSvg, userSquareSvg, From ad7305b453d54685a79612a97c4336327c318004 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 12:39:14 +0330 Subject: [PATCH 153/256] fix : add text to bottom sheet --- .../bottom_navigation/wave_bottom_navigation.dart | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart index 3db9ad8..754b2eb 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart @@ -100,7 +100,7 @@ class _WaveBottomNavigationState extends State { value = (value).clamp(-1, 1); double offset = value * 30; if (value.abs() < 0.2 || value.abs() > 0.2) { - offset = -7 * (1 - value.abs() * 2); + offset = -15 * (1 - value.abs() * 2); } return Transform.scale( @@ -110,14 +110,10 @@ class _WaveBottomNavigationState extends State { child: Column( children: [ Tooltip(message: item.title, child: item.icon), - - /* Visibility( + Visibility( visible: (_controller.page ?? 0) == index, - child: Text( - item.title, - style: AppFonts.yekan10.copyWith(color: Colors.white), - ), - ),*/ + child: Text(item.title, style: AppFonts.yekan10.copyWith(color: Colors.white)), + ), ], ), ), From 563a1f357757351d7e6440a2bde801736450eea5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 12:39:42 +0330 Subject: [PATCH 154/256] fix : new bottom sheet item --- packages/chicken/lib/presentation/pages/root/view.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 32bae60..3faa439 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -54,16 +54,16 @@ class RootPage extends GetView { initPage: controller.currentPage.value, items: [ WaveBottomNavigationItem( - title: 'بارها', - icon: Assets.vec.truckFastSvg.svg( + title: 'خرید', + icon: Assets.vec.buySvg.svg( width: 32, height: 32, colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), ), ), WaveBottomNavigationItem( - title: 'خارج استان', - icon: Assets.vec.cubeSearchSvg.svg( + title: 'فروش', + icon: Assets.vec.saleSvg.svg( width: 32, height: 32, colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), From cae4ed4e069581f909006ee499dd99a3bb38c0a4 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 29 Jun 2025 14:36:51 +0330 Subject: [PATCH 155/256] fix : new bottom sheet item --- .../widget/bottom_navigation/wave_bottom_navigation.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart index 754b2eb..8c92900 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart @@ -112,7 +112,7 @@ class _WaveBottomNavigationState extends State { Tooltip(message: item.title, child: item.icon), Visibility( visible: (_controller.page ?? 0) == index, - child: Text(item.title, style: AppFonts.yekan10.copyWith(color: Colors.white)), + child: Text(item.title, style: AppFonts.yekan8.copyWith(color: Colors.white)), ), ], ), From 898f870b549cdc17577a375520276a8e6e1da3ef Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 08:51:11 +0330 Subject: [PATCH 156/256] fix : new bottom sheet --- .../lib/presentation/pages/root/view.dart | 208 ++++++------------ .../lib/presentation/common/app_fonts.dart | 22 +- .../bottom_navigation_1.dart | 82 ------- .../r_bottom_navigation.dart | 69 ++++++ .../core/lib/presentation/widget/widget.dart | 2 +- .../lib/presentation/page/root/view.dart | 8 +- 6 files changed, 157 insertions(+), 234 deletions(-) delete mode 100644 packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart create mode 100644 packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 3faa439..a461e6b 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -14,89 +14,69 @@ class RootPage extends GetView { body: IndexedStack( children: [ Navigator( - key: Get.nestedKey(0), - onGenerateRoute: (settings) => - GetPageRoute(page: () => controller.pages[0]), + key: Get.nestedKey(0), + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[0]), ), Navigator( key: Get.nestedKey(1), onGenerateRoute: (settings) { final page = ChickenPages.pages.firstWhere( - (e) => e.name == settings.name, - orElse: () => ChickenPages.pages.firstWhere( - (e) => e.name == ChickenRoutes.outOfProvince, - ), + (e) => e.name == settings.name, + orElse: () => ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.outOfProvince), ); return buildRouteFromGetPage(page); - }, ), Navigator( key: Get.nestedKey(2), - onGenerateRoute: (settings) => - GetPageRoute(page: () => controller.pages[2]), + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]), ), Navigator( key: Get.nestedKey(3), - onGenerateRoute: (settings) => - GetPageRoute(page: () => controller.pages[3]), + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[3]), ), Navigator( key: Get.nestedKey(4), - onGenerateRoute: (settings) => - GetPageRoute(page: () => controller.pages[4]), + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[4]), ), ], index: data.value, ), - bottomNavigationBar: WaveBottomNavigation( - initPage: controller.currentPage.value, + + bottomNavigationBar: RBottomNavigation( items: [ - WaveBottomNavigationItem( - title: 'خرید', - icon: Assets.vec.buySvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), + RBottomNavigationItem( + label: 'خرید', + icon: Assets.vec.buySvg.path, + isSelected: controller.currentPage.value == 0, + onTap: () => controller.changePage(0), ), - WaveBottomNavigationItem( - title: 'فروش', - icon: Assets.vec.saleSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), + RBottomNavigationItem( + label: 'فروش', + icon: Assets.vec.saleSvg.path, + isSelected: controller.currentPage.value == 1, + onTap: () => controller.changePage(1), ), - WaveBottomNavigationItem( - title: 'خانه', - icon: Assets.vec.homeSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), + RBottomNavigationItem( + label: 'خانه', + icon: Assets.vec.homeSvg.path, + isSelected: controller.currentPage.value == 2, + onTap: () => controller.changePage(2), ), - WaveBottomNavigationItem( - title: 'قطعه بندی', - icon: Assets.vec.convertCubeSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), + RBottomNavigationItem( + label: 'قطعه بندی', + icon: Assets.vec.convertCubeSvg.path, + isSelected: controller.currentPage.value == 3, + onTap: () => controller.changePage(3), ), - WaveBottomNavigationItem( - title: 'پروفایل', - icon: Assets.vec.userSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), + RBottomNavigationItem( + label: 'پروفایل', + icon: Assets.vec.profileCircleSvg.path, + isSelected: controller.currentPage.value == 4, + onTap: () => controller.changePage(4), ), ], - onPageChanged: (index) { - controller.changePage(index); - }, ), ); }, controller.currentPage); @@ -106,10 +86,7 @@ class RootPage extends GetView { return Container( height: 70, width: Get.width / 2, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), clipBehavior: Clip.hardEdge, child: Row( children: [ @@ -130,9 +107,7 @@ class RootPage extends GetView { Text( 'بارهای امروز', textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), ], ), @@ -182,26 +157,19 @@ class RootPage extends GetView { height: 82, decoration: BoxDecoration( color: bgLabelColor, - borderRadius: BorderRadius.only( - topRight: Radius.circular(8), - bottomRight: Radius.circular(8), - ), + borderRadius: BorderRadius.only(topRight: Radius.circular(8), bottomRight: Radius.circular(8)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 4, children: [ - SvgGenImage.vec(iconPath).svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), - ), + SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.mediumGreyDarkActive, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), ), ], ), @@ -212,10 +180,7 @@ class RootPage extends GetView { child: Container( decoration: BoxDecoration( color: bgDescriptionColor, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(8), - bottomLeft: Radius.circular(8), - ), + borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -224,16 +189,12 @@ class RootPage extends GetView { Text( description, textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith( - color: AppColor.mediumGreyDarkActive, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), ), Text( unit, textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.mediumGreyDarkActive, - ), + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), ), ], ), @@ -278,23 +239,17 @@ class RootPage extends GetView { Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.mediumGreyDarkActive, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), ), Text( description, textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith( - color: AppColor.mediumGreyDarkActive, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), ), Text( unit, textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.mediumGreyDarkActive, - ), + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), ), ], ), @@ -313,11 +268,9 @@ class RootPage extends GetView { ), ), child: Center( - child: SvgGenImage.vec(iconPath).svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), - ), + child: SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), ), ), ), @@ -326,11 +279,7 @@ class RootPage extends GetView { ); } - Widget widelyUsed({ - required String title, - required String iconPath, - required VoidCallback onTap, - }) { + Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, @@ -342,18 +291,14 @@ class RootPage extends GetView { padding: EdgeInsets.all(4), decoration: ShapeDecoration( color: const Color(0xFFBECDFF), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: Container( width: 40, height: 40, decoration: ShapeDecoration( color: AppColor.blueNormal, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: SvgGenImage.vec(iconPath).svg( width: 24, @@ -363,10 +308,7 @@ class RootPage extends GetView { ), ), ), - Text( - title, - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), + Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), ], ); } @@ -383,24 +325,16 @@ class RootPage extends GetView { padding: EdgeInsets.all(4), decoration: ShapeDecoration( color: const Color(0xFFD9F7F0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: Assets.vec.messageAddSvg.svg( width: 40, height: 40, - colorFilter: ColorFilter.mode( - AppColor.greenNormal, - BlendMode.srcIn, - ), + colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), fit: BoxFit.cover, ), ), - Text( - 'افزودن', - style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover), - ), + Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), ], ); } @@ -547,9 +481,7 @@ class RootPage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -557,9 +489,7 @@ class RootPage extends GetView { child: Text( value, textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), ], @@ -585,30 +515,18 @@ class RootPage extends GetView { Text( 'اطلاعات ارسالی', textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), const SizedBox(height: 12), - buildRow( - 'فروش و توزیع داخل استان (کیلوگرم)', - model.stewardAllocationsWeight!.toInt().toString(), - ), - buildRow( - 'فروش و توزیع خارج استان (کیلوگرم)', - model.freeSalesWeight!.toInt().toString(), - ), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), ], ) : const Center(child: CircularProgressIndicator()), ); } - Widget cardWidget({ - required String title, - required String iconPath, - required VoidCallback onTap, - }) { + Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { return Container( width: Get.width / 4, height: 130, diff --git a/packages/core/lib/presentation/common/app_fonts.dart b/packages/core/lib/presentation/common/app_fonts.dart index c850c32..a4d3f7c 100644 --- a/packages/core/lib/presentation/common/app_fonts.dart +++ b/packages/core/lib/presentation/common/app_fonts.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; class AppFonts { AppFonts._(); // Private constructor to prevent instantiation @@ -173,6 +174,15 @@ class AppFonts { height: _height, ); + + static const TextStyle yekan14Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 13, + height: _height, + ); + + static const TextStyle yekan13Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight @@ -180,10 +190,18 @@ class AppFonts { height: _height, ); - static const TextStyle yekan10Bold = TextStyle( + static TextStyle yekan12Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 10, + fontSize: 12.sp, + height: _height, + ); + + + static TextStyle yekan10Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 10.sp, height: _height, ); } diff --git a/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart b/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart deleted file mode 100644 index b5c569e..0000000 --- a/packages/core/lib/presentation/widget/bottom_navigation/bottom_navigation_1.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -class BottomNavigation1 extends StatefulWidget { - const BottomNavigation1({super.key, required this.items}); - - final List items; - - @override - State createState() => _BottomNavigation1State(); -} - -class _BottomNavigation1State extends State { - @override - Widget build(BuildContext context) { - return Container( - height: 90, - padding: EdgeInsets.fromLTRB(50, 10, 50, 10), - decoration: BoxDecoration( - color: AppColor.blueNormal, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(50), - topRight: Radius.circular(50), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: widget.items, - ), - ); - } -} - -class BottomNavigation1Item extends StatelessWidget { - final String icon; - final String label; - final bool isSelected; - final Function() onTap; - - const BottomNavigation1Item({ - super.key, - required this.icon, - required this.label, - required this.isSelected, - required this.onTap, - }); - - @override - Widget build(BuildContext context) { - return Container( - width: 80, - height: 80, - padding: const EdgeInsets.symmetric(horizontal: 10), - decoration: BoxDecoration( - color: isSelected ? Colors.white.withAlpha(208) : Colors.transparent, - borderRadius: BorderRadius.circular(10), - ), - child: InkWell( - onTap: onTap, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgGenImage.vec(icon).svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode( - isSelected ? AppColor.blueNormal : Colors.white, - BlendMode.srcIn) - ), - const SizedBox(height: 5), - Text( - label, - style: AppFonts.yekan10.copyWith( - color: isSelected ? AppColor.blueNormal : Colors.white, - ), - ), - ], - ), - ), - ); - } -} diff --git a/packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart new file mode 100644 index 0000000..0d91e27 --- /dev/null +++ b/packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class RBottomNavigation extends StatefulWidget { + const RBottomNavigation({super.key, required this.items}); + + final List items; + + @override + State createState() => _RBottomNavigationState(); +} + +class _RBottomNavigationState extends State { + @override + Widget build(BuildContext context) { + return Container( + height: 100.h, + padding: EdgeInsets.symmetric(horizontal: 11.w, vertical: 18.h), + decoration: BoxDecoration( + color: AppColor.blueNormal, + borderRadius: const BorderRadius.only(topLeft: Radius.circular(32), topRight: Radius.circular(32)), + ), + child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: widget.items), + ); + } +} + +class RBottomNavigationItem extends StatelessWidget { + final String icon; + final String label; + final bool isSelected; + final Function() onTap; + + const RBottomNavigationItem({ + super.key, + required this.icon, + required this.label, + required this.isSelected, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: 70.w, + height: 70.h, + padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + color: isSelected ? Colors.white.withAlpha(208) : Colors.transparent, + borderRadius: BorderRadius.circular(10), + ), + child: InkWell( + onTap: onTap, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgGenImage.vec(icon).svg( + width: 40.w, + height: 40.h, + colorFilter: ColorFilter.mode(isSelected ? AppColor.blueNormal : Colors.white, BlendMode.srcIn), + ), + SizedBox(height: 5.h), + Text(label, style: AppFonts.yekan10.copyWith(color: isSelected ? AppColor.blueNormal : Colors.white)), + ], + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 20d3bdd..5b5cc6c 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -1,5 +1,5 @@ export 'app_bar/r_app_bar.dart'; -export 'bottom_navigation/bottom_navigation_1.dart'; +export 'bottom_navigation/r_bottom_navigation.dart'; export 'bottom_navigation/wave_bottom_navigation.dart'; export 'buttons/elevated.dart'; export 'buttons/outline_elevated.dart'; diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart index f506375..1951ca1 100644 --- a/packages/livestock/lib/presentation/page/root/view.dart +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -44,23 +44,23 @@ class RootPage extends GetView { sizing: StackFit.expand, ), extendBody: true, - bottomNavigationBar: BottomNavigation1( + bottomNavigationBar: RBottomNavigation( items: [ - BottomNavigation1Item( + RBottomNavigationItem( icon: Assets.vec.filterSvg.path, label: 'درخواست‌ها', isSelected: currentIndex.value == 0, onTap: () => controller.changePage(0), ), - BottomNavigation1Item( + RBottomNavigationItem( icon: Assets.vec.mapSvg.path, label: 'نقشه', isSelected: currentIndex.value == 1, onTap: () => controller.changePage(1), ), - BottomNavigation1Item( + RBottomNavigationItem( icon: Assets.vec.profileUserSvg.path, label: 'پروفایل', isSelected: currentIndex.value == 2, From 48f050a122bbefa6fe2cd711d5aa40e340340b72 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 09:11:33 +0330 Subject: [PATCH 157/256] fix : Appbar chicken --- .../lib/presentation/pages/home/view.dart | 13 ++--- .../lib/presentation/widget/app_bar.dart | 57 +++++++++++++++++++ .../widget/app_bar/r_app_bar.dart | 39 +++++++------ 3 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 packages/chicken/lib/presentation/widget/app_bar.dart diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index 718a0c8..a3df02f 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_chicken/presentation/widget/app_bar.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -14,15 +15,11 @@ class HomePage extends GetView { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColor.bgLight, - appBar: RAppBar( - title: 'رصدطیور', - iconTitle: Assets.vec.chickenSvg.path, - titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, + appBar: chickenAppBar( hasBack: false, - leading: Row( - children: [Text('مباشر', style: AppFonts.yekan16Bold.copyWith(color: Colors.white))], - ), + hasFilter: false, + hasSearch: false + ), body: Column( spacing: 8, diff --git a/packages/chicken/lib/presentation/widget/app_bar.dart b/packages/chicken/lib/presentation/widget/app_bar.dart new file mode 100644 index 0000000..bd77879 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/app_bar.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +RAppBar chickenAppBar({ + bool hasBack = true, + bool hasFilter = true, + bool hasSearch = true, + VoidCallback? onBackPressed, + GestureTapCallback? onFilterTap, + GestureTapCallback? onSearchTap, +}) { + return RAppBar( + hasBack: hasBack, + onBackPressed: onBackPressed, + leadingWidth: 155, + leading: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, + children: [ + Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), + Assets.vec.chickenSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ], + ), + additionalActions: [ + if (hasFilter) filterWidget(onFilterTap), + SizedBox(width: 8), + if (hasSearch) searchWidget(onSearchTap), + SizedBox(width: 8), + ], + ); +} + +GestureDetector searchWidget(GestureTapCallback? onSearchTap) { + return GestureDetector( + onTap: onSearchTap, + child: Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ); +} + +GestureDetector filterWidget(GestureTapCallback? onFilterTap) { + return GestureDetector( + onTap: onFilterTap, + child: Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ); +} diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index b14fe91..d6b921b 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; @@ -18,7 +17,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { const RAppBar({ super.key, - this.title, + this.title, this.iconTitle, this.backgroundColor = AppColor.blueNormal, this.iconColor = Colors.white, @@ -41,29 +40,33 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { excludeHeaderSemantics: true, scrolledUnderElevation: 0, centerTitle: centerTitle, - titleTextStyle: titleTextStyle ?? AppFonts.yekan16.copyWith(color: Colors.white), - title:title != null ? Row( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Text(title!), - if (iconTitle != null) ...{const SizedBox(width: 8)}, - if (iconTitle != null) ...{SvgGenImage.vec(iconTitle!).svg(width: 24, height: 24)}, - ], - ): null, + title: title != null + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Text(title!), + if (iconTitle != null) ...{const SizedBox(width: 8)}, + if (iconTitle != null) ...{SvgGenImage.vec(iconTitle!).svg(width: 24, height: 24)}, + ], + ) + : null, leadingWidth: leadingWidth?.toDouble(), leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 6), child: leading) : null, titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, if (hasBack) ...{ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: IconButton( - onPressed: onBackPressed ?? () => Get.back(), - icon: const Icon(CupertinoIcons.chevron_back), - color: iconColor, + GestureDetector( + onTap: onBackPressed ?? () => Get.back(), + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 2, 0), + child: Assets.vec.arrowLeftSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(iconColor ?? Colors.white, BlendMode.srcIn), + ), ), ), }, From 443b9f489c98db89b9b254254e0feed6efa28184 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 09:28:45 +0330 Subject: [PATCH 158/256] feat : expand product in home page --- .../lib/presentation/pages/home/logic.dart | 2 + .../lib/presentation/pages/home/view.dart | 164 +++++++++++------- 2 files changed, 105 insertions(+), 61 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index bcfe78b..d544079 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -12,6 +12,8 @@ class HomeLogic extends GetxController { Rxn inventoryModel = Rxn(); Rxn killHouseDistributionInfo = Rxn(); + RxBool isExpanded = false.obs; + @override void onInit() { diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index a3df02f..f0707c3 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -16,74 +16,116 @@ class HomePage extends GetView { return Scaffold( backgroundColor: AppColor.bgLight, appBar: chickenAppBar( - hasBack: false, - hasFilter: false, - hasSearch: false - + hasBack: false, + hasFilter: false, + hasSearch: false ), body: Column( spacing: 8, children: [ - Card( - margin: EdgeInsetsGeometry.all(6), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - spacing: 8, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - image: DecorationImage(image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), - shape: RoundedRectangleBorder( - side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), - borderRadius: BorderRadius.circular(4), + InkWell( + onTap: () { + controller.isExpanded.value = !controller.isExpanded.value; + }, + child: Card( + margin: EdgeInsetsGeometry.all(6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), + ), + + child: ObxValue((data) { + return AnimatedSize(duration: Duration(milliseconds: 300), + child: data.value ? Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), + shape: RoundedRectangleBorder( + side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ), + Spacer(), + AnimatedRotation( + turns: 180, + duration: Duration(milliseconds: 3000), + child: Icon(CupertinoIcons.chevron_up, size: 18), + ), + ], ), - ), + SizedBox(height: 8), + _todayShipmentWidget(), + + _inventoryWidget(), + + Row( + children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + _informationShipment(), + + Row( + children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + distributionInformationWidget(), + ], ), - Text( - 'مرغ گرم', - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ) : Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), + shape: RoundedRectangleBorder( + side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ), + Spacer(), + Icon(CupertinoIcons.chevron_down, size: 18), + ], + ), + ], ), - Spacer(), - AnimatedRotation( - turns: 180, - duration: Duration(milliseconds: 3000), - child: Icon(CupertinoIcons.chevron_up, size: 18), - ), - ], - ), - SizedBox(height: 8), - _todayShipmentWidget(), + ), - _inventoryWidget(), - - Row( - children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - - _informationShipment(), - - Row( - children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - - distributionInformationWidget(), - ], - ), - ), - ), + ); + }, controller.isExpanded), + )), Padding( padding: EdgeInsetsGeometry.all(6), @@ -102,9 +144,9 @@ class HomePage extends GetView { widelyUsed( title: 'خرید خارج استان', iconPath: Assets.vec.cubeSearchSvg.path, - onTap:() async{ + onTap: () async { iLog('on tap :خرید خارج استان '); - controller.rootLogic.currentPage.value =1; + controller.rootLogic.currentPage.value = 1; controller.rootLogic.currentPage.refresh(); await Future.delayed(Duration(milliseconds: 100)); Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); From 7cec6bd08463837d9e0489d1634243fc7d7ecee2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 09:33:14 +0330 Subject: [PATCH 159/256] feat : Page Route Widget --- .../lib/presentation/pages/home/view.dart | 353 +++++++++--------- .../lib/presentation/widget/page_route.dart | 6 + 2 files changed, 184 insertions(+), 175 deletions(-) create mode 100644 packages/chicken/lib/presentation/widget/page_route.dart diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index f0707c3..ee5abae 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -15,117 +15,119 @@ class HomePage extends GetView { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColor.bgLight, - appBar: chickenAppBar( - hasBack: false, - hasFilter: false, - hasSearch: false - ), + appBar: chickenAppBar(hasBack: false, hasFilter: false, hasSearch: false), body: Column( spacing: 8, children: [ - InkWell( - onTap: () { - controller.isExpanded.value = !controller.isExpanded.value; - }, - child: Card( - margin: EdgeInsetsGeometry.all(6), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), - ), + onTap: () { + controller.isExpanded.value = !controller.isExpanded.value; + }, + child: Card( + margin: EdgeInsetsGeometry.all(6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), + ), - child: ObxValue((data) { - return AnimatedSize(duration: Duration(milliseconds: 300), - child: data.value ? Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - spacing: 8, - crossAxisAlignment: CrossAxisAlignment.center, + child: ObxValue((data) { + return AnimatedSize( + duration: Duration(milliseconds: 300), + child: data.value + ? Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ - Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - image: DecorationImage( - image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), - shape: RoundedRectangleBorder( - side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), - borderRadius: BorderRadius.circular(4), + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage(Assets.images.chicken.path), + fit: BoxFit.cover, + ), + shape: RoundedRectangleBorder( + side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + borderRadius: BorderRadius.circular(4), + ), + ), ), - ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ), + Spacer(), + AnimatedRotation( + turns: 180, + duration: Duration(milliseconds: 3000), + child: Icon(CupertinoIcons.chevron_up, size: 18), + ), + ], ), - Text( - 'مرغ گرم', - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + SizedBox(height: 8), + _todayShipmentWidget(), + + _inventoryWidget(), + + Row( + children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], ), - Spacer(), - AnimatedRotation( - turns: 180, - duration: Duration(milliseconds: 3000), - child: Icon(CupertinoIcons.chevron_up, size: 18), + + _informationShipment(), + + Row( + children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + distributionInformationWidget(), + ], + ), + ) + : Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage(Assets.images.chicken.path), + fit: BoxFit.cover, + ), + shape: RoundedRectangleBorder( + side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ), + Spacer(), + Icon(CupertinoIcons.chevron_down, size: 18), + ], ), ], ), - SizedBox(height: 8), - _todayShipmentWidget(), - - _inventoryWidget(), - - Row( - children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - - _informationShipment(), - - Row( - children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - - distributionInformationWidget(), - ], - ), - ) : Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - spacing: 8, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - image: DecorationImage( - image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), - shape: RoundedRectangleBorder( - side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), - borderRadius: BorderRadius.circular(4), - ), - ), - ), - Text( - 'مرغ گرم', - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), - ), - Spacer(), - Icon(CupertinoIcons.chevron_down, size: 18), - ], - ), - ], - ), - ), - - ); - }, controller.isExpanded), - )), + ), + ); + }, controller.isExpanded), + ), + ), Padding( padding: EdgeInsetsGeometry.all(6), @@ -237,8 +239,8 @@ class HomePage extends GetView { isLoading: data.value == null, description: data.value != null ? ((data.value?.provinceGovernmentalCarcassesWeight ?? 0) + - (data.value?.provinceFreeCarcassesWeight ?? 0)) - .separatedByComma + (data.value?.provinceFreeCarcassesWeight ?? 0)) + .separatedByComma : '0', iconPath: Assets.vec.a3dCubeSquareSvg.path, iconColor: const Color(0xFF6C5D60), @@ -334,21 +336,21 @@ class HomePage extends GetView { child: data.value == null ? CupertinoActivityIndicator() : Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - data.value.separatedByComma, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.textColor), - ), - Text( - 'کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.textColor), - ), - ], - ), + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + data.value.separatedByComma, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.textColor), + ), + Text( + 'کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.textColor), + ), + ], + ), ), ], ), @@ -406,21 +408,21 @@ class HomePage extends GetView { child: isLoading ? Center(child: CupertinoActivityIndicator()) : Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - description, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), - ), - Text( - unit, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), - ), - ], - ), + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), ), ), ], @@ -469,10 +471,10 @@ class HomePage extends GetView { isLoading ? Center(child: CupertinoActivityIndicator()) : Text( - description, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), - ), + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), Text( unit, textAlign: TextAlign.center, @@ -508,38 +510,39 @@ class HomePage extends GetView { Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { return GestureDetector( - onTap: onTap, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - spacing: 4, - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(4), + onTap: onTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFBECDFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Container( + width: 40, + height: 40, decoration: ShapeDecoration( - color: const Color(0xFFBECDFF), + color: AppColor.blueNormal, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), - child: Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: SvgGenImage.vec(iconPath).svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - fit: BoxFit.cover, - ), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + fit: BoxFit.cover, ), ), - Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), - ], - )); + ), + Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + ], + ), + ); } Widget addWidelyUsed({required VoidCallback onTap}) { @@ -631,19 +634,19 @@ class HomePage extends GetView { ), child: model != null ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 10, - children: [ - Text( - 'اطلاعات ارسالی', - textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), - ], - ) + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Text( + 'اطلاعات ارسالی', + textAlign: TextAlign.right, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + const SizedBox(height: 12), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + ], + ) : const Center(child: CircularProgressIndicator()), ); } diff --git a/packages/chicken/lib/presentation/widget/page_route.dart b/packages/chicken/lib/presentation/widget/page_route.dart new file mode 100644 index 0000000..fe64118 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/page_route.dart @@ -0,0 +1,6 @@ +import 'package:flutter/cupertino.dart'; +import 'package:rasadyar_core/core.dart'; + +Text buildPageRoute(List route) { + return Text(route.isEmpty ? 'خانه' : route.join("/"), style: AppFonts.yekan14.copyWith(color: AppColor.bgDark)); +} From 79adab71e3a0bdb001bc1e675087b89368d311cc Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 10:36:30 +0330 Subject: [PATCH 160/256] feat : buy page and widgets --- .../lib/presentation/pages/buy/logic.dart | 15 ++++++++ .../lib/presentation/pages/buy/view.dart | 34 +++++++++++++++++ .../lib/presentation/pages/root/logic.dart | 3 +- .../lib/presentation/routes/pages.dart | 37 ++++++++++--------- .../lib/presentation/routes/routes.dart | 3 +- .../lib/presentation/widget/app_bar.dart | 7 ++-- .../lib/presentation/widget/base_page.dart | 20 ++++++++++ .../lib/presentation/widget/page_route.dart | 7 +++- .../widget/sale_buy_card_item.dart | 34 +++++++++++++++++ packages/core/lib/core.dart | 1 + packages/core/pubspec.yaml | 2 +- 11 files changed, 138 insertions(+), 25 deletions(-) create mode 100644 packages/chicken/lib/presentation/pages/buy/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/buy/view.dart create mode 100644 packages/chicken/lib/presentation/widget/base_page.dart create mode 100644 packages/chicken/lib/presentation/widget/sale_buy_card_item.dart diff --git a/packages/chicken/lib/presentation/pages/buy/logic.dart b/packages/chicken/lib/presentation/pages/buy/logic.dart new file mode 100644 index 0000000..817b6e4 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class BuyLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/buy/view.dart b/packages/chicken/lib/presentation/pages/buy/view.dart new file mode 100644 index 0000000..74ec9c3 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy/view.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/widget/app_bar.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page.dart'; +import 'package:rasadyar_chicken/presentation/widget/sale_buy_card_item.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class BuyPage extends GetView { + const BuyPage({super.key}); + + @override + Widget build(BuildContext context) { + return BasePage( + routes: ['رصدطیور', 'خرید'], + appBar: chickenAppBar(isBase: true), + widgets: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Wrap( + alignment: WrapAlignment.center, + spacing: 14.w, + children: [ + saleOrBuyItemCard(title: 'داخل استان', iconPath: Assets.vec.cubeSvg.path, onTap: () {}), + saleOrBuyItemCard(title: 'خارج استان', iconPath: Assets.vec.truckFastSvg.path, onTap: () {}), + ], + ), + ], + ), + ], + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index a131e66..780803a 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -6,6 +6,7 @@ import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model. import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart'; @@ -17,7 +18,7 @@ enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { RxInt currentPage = 2.obs; List pages = [ - SalesInProvincePage(), + BuyPage(), OutOfProvincePage(), HomePage(), Container(color: Colors.blue), diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 07f6cc2..eacfa8b 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,4 +1,6 @@ import 'package:rasadyar_auth/auth.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/logic.dart'; @@ -26,10 +28,11 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.put(RootLogic()); - Get.lazyPut(()=>HomeLogic()); - Get.lazyPut(()=>SalesInProvinceLogic()); - Get.lazyPut(()=>OutOfProvinceLogic()); - Get.lazyPut(()=>SalesOutOfProvinceLogic()); + Get.lazyPut(() => HomeLogic()); + Get.lazyPut(() => BuyLogic()); + Get.lazyPut(() => SalesInProvinceLogic()); + Get.lazyPut(() => OutOfProvinceLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); }), ), @@ -48,8 +51,8 @@ sealed class ChickenPages { page: () => EnteringTheWarehousePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(()=>EnteringTheWarehouseLogic()); - Get.lazyPut(()=>RootLogic()); + Get.lazyPut(() => EnteringTheWarehouseLogic()); + Get.lazyPut(() => RootLogic()); }), ), GetPage( @@ -57,22 +60,20 @@ sealed class ChickenPages { page: () => SalesInProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(()=>SalesInProvinceLogic()); - Get.lazyPut(()=>RootLogic()); + Get.lazyPut(() => SalesInProvinceLogic()); + Get.lazyPut(() => RootLogic()); }), ), - - GetPage( name: ChickenRoutes.outOfProvince, page: () => OutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(()=>OutOfProvinceLogic()); + Get.lazyPut(() => OutOfProvinceLogic()); - Get.lazyPut(()=>SalesOutOfProvinceLogic()); - Get.lazyPut(()=>RootLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => RootLogic()); }), ), @@ -81,8 +82,8 @@ sealed class ChickenPages { page: () => SalesOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(()=>SalesOutOfProvinceLogic()); - Get.lazyPut(()=>RootLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => RootLogic()); }), ), @@ -91,9 +92,11 @@ sealed class ChickenPages { page: () => BuysOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(()=>BuysOutOfProvinceLogic()); - Get.lazyPut(()=>RootLogic()); + Get.lazyPut(() => BuysOutOfProvinceLogic()); + Get.lazyPut(() => RootLogic()); }), ), + + ]; } diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index c209277..efeab53 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -2,8 +2,9 @@ sealed class ChickenRoutes { ChickenRoutes._(); static const _base = '/init'; - static const init = '$_base/init'; + static const init = '$_base/root'; static const home = '$_base/home'; + static const buy = '$_base/buy'; static const enteringTheWarehouse = '$_base/enteringTheWarehouse'; static const salesInProvince = '$_base/SalesInProvincePage'; diff --git a/packages/chicken/lib/presentation/widget/app_bar.dart b/packages/chicken/lib/presentation/widget/app_bar.dart index bd77879..6642341 100644 --- a/packages/chicken/lib/presentation/widget/app_bar.dart +++ b/packages/chicken/lib/presentation/widget/app_bar.dart @@ -5,12 +5,13 @@ RAppBar chickenAppBar({ bool hasBack = true, bool hasFilter = true, bool hasSearch = true, + bool isBase = false, VoidCallback? onBackPressed, GestureTapCallback? onFilterTap, GestureTapCallback? onSearchTap, }) { return RAppBar( - hasBack: hasBack, + hasBack: isBase == true ? false : hasBack, onBackPressed: onBackPressed, leadingWidth: 155, leading: Row( @@ -26,9 +27,9 @@ RAppBar chickenAppBar({ ], ), additionalActions: [ - if (hasFilter) filterWidget(onFilterTap), + if (!isBase && hasFilter) filterWidget(onFilterTap), SizedBox(width: 8), - if (hasSearch) searchWidget(onSearchTap), + if (!isBase && hasSearch) searchWidget(onSearchTap), SizedBox(width: 8), ], ); diff --git a/packages/chicken/lib/presentation/widget/base_page.dart b/packages/chicken/lib/presentation/widget/base_page.dart new file mode 100644 index 0000000..16971c3 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/base_page.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; +import 'package:rasadyar_core/core.dart'; + +class BasePage extends StatelessWidget { + const BasePage({super.key, required this.routes, required this.appBar, required this.widgets}); + + final List routes; + final RAppBar appBar; + final List widgets; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.bgLight, + appBar: appBar, + body: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [buildPageRoute(routes), ...widgets]), + ); + } +} diff --git a/packages/chicken/lib/presentation/widget/page_route.dart b/packages/chicken/lib/presentation/widget/page_route.dart index fe64118..16f77be 100644 --- a/packages/chicken/lib/presentation/widget/page_route.dart +++ b/packages/chicken/lib/presentation/widget/page_route.dart @@ -1,6 +1,9 @@ import 'package:flutter/cupertino.dart'; import 'package:rasadyar_core/core.dart'; -Text buildPageRoute(List route) { - return Text(route.isEmpty ? 'خانه' : route.join("/"), style: AppFonts.yekan14.copyWith(color: AppColor.bgDark)); +Widget buildPageRoute(List route) { + return Padding( + padding: const EdgeInsets.fromLTRB(0, 4, 7, 8), + child: Text(route.isEmpty ? 'خانه' : route.join("/"), style: AppFonts.yekan14.copyWith(color: AppColor.bgDark)), + ); } diff --git a/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart b/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart new file mode 100644 index 0000000..f410f75 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +Widget saleOrBuyItemCard({String? title, String? iconPath, required VoidCallback onTap}) { + return InkWell( + onTap: onTap, + child: Card( + color: Colors.white, + shape: RoundedRectangleBorder( + side: BorderSide(color: AppColor.blueNormal, width: 1.0.w), + borderRadius: BorderRadius.circular(8.r), + ), + child: Container( + width: 160.w, + height: 160.h, + padding: const EdgeInsets.all(8.0), + + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (iconPath != null) + SvgGenImage.vec(iconPath).svg( + width: 64.w, + height: 64.h, + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + SizedBox(height: 12.h), + if (title != null) Text(title, style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + ], + ), + ), + ), + ); +} diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index bf572c9..b7aa9ac 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -12,6 +12,7 @@ export 'package:device_info_plus/device_info_plus.dart'; export 'package:dio/dio.dart' ; export 'package:pretty_dio_logger/pretty_dio_logger.dart'; export 'package:flutter_screenutil/flutter_screenutil.dart'; + //freezed export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index e571660..263fceb 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -1,6 +1,6 @@ name: rasadyar_core description: "A new Flutter project." -publish_to: 'none' +publish_to: none version: 1.0.0+1 environment: From d76a2ab57984975653a1acc136b2db39f7ba43bb Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 16:16:54 +0330 Subject: [PATCH 161/256] feat : 1 - empty_widget 2- loading_widget 3 - use this widget in list_view widget 4 - fix some bug in list_view_widget 5 - add some feature in list_view_widget --- .../pages/buy_in_province/logic.dart | 15 +++++ .../pages/buy_in_province/view.dart | 16 ++++++ .../lib/presentation/widget/search/logic.dart | 21 +++++++ .../lib/presentation/widget/search/view.dart | 55 +++++++++++++++++++ .../lib/presentation/widget/empty_widget.dart | 21 +++++++ .../widget/list_view/list_view.dart | 3 + .../presentation/widget/loading_widget.dart | 14 +++++ 7 files changed, 145 insertions(+) create mode 100644 packages/chicken/lib/presentation/pages/buy_in_province/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/buy_in_province/view.dart create mode 100644 packages/chicken/lib/presentation/widget/search/logic.dart create mode 100644 packages/chicken/lib/presentation/widget/search/view.dart create mode 100644 packages/core/lib/presentation/widget/empty_widget.dart create mode 100644 packages/core/lib/presentation/widget/list_view/list_view.dart create mode 100644 packages/core/lib/presentation/widget/loading_widget.dart diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart new file mode 100644 index 0000000..3df5e79 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class BuyInProvinceLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart new file mode 100644 index 0000000..ae222d6 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class BuyInProvincePage extends GetView { + const BuyInProvincePage({super.key}); + + @override + Widget build(BuildContext context) { + + return Container( + color: Colors.amberAccent, + ); + } +} diff --git a/packages/chicken/lib/presentation/widget/search/logic.dart b/packages/chicken/lib/presentation/widget/search/logic.dart new file mode 100644 index 0000000..4379a4a --- /dev/null +++ b/packages/chicken/lib/presentation/widget/search/logic.dart @@ -0,0 +1,21 @@ +import 'package:rasadyar_core/core.dart'; + +class SearchLogic extends GetxController { + final RxBool isSearchSelected = false.obs; + + final RxnString searchValue = RxnString(); + + void setSearchCallback(void Function(String)? onSearchChanged) { + debounce(searchValue, (val) { + if (val != null && val.trim().isNotEmpty) { + onSearchChanged?.call(val); + } + }, time: const Duration(milliseconds: 600)); + } + + void toggleSearch() { + isSearchSelected.value = !isSearchSelected.value; + } + + +} diff --git a/packages/chicken/lib/presentation/widget/search/view.dart b/packages/chicken/lib/presentation/widget/search/view.dart new file mode 100644 index 0000000..e0f088e --- /dev/null +++ b/packages/chicken/lib/presentation/widget/search/view.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class SearchWidget extends StatefulWidget { + const SearchWidget({super.key, this.onSearchChanged}); + + final void Function(String)? onSearchChanged; + + @override + State createState() => _SearchWidgetState(); +} + +class _SearchWidgetState extends State { + late final SearchLogic controller; + + @override + void initState() { + super.initState(); + controller = Get.find(); + controller.setSearchCallback(widget.onSearchChanged); + } + + @override + Widget build(BuildContext context) { + return ObxValue((data) { + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + padding: const EdgeInsets.only(top: 5), + curve: Curves.easeInOut, + height: data.value ? 50 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: RTextField( + suffixIcon: Padding( + padding: const EdgeInsets.all(12.0), + child: Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + hintText: 'جستجو', + controller: TextEditingController(), + onChanged: (val) => controller.searchValue.value = val, + ), + ), + ), + ); + }, controller.isSearchSelected); + } +} diff --git a/packages/core/lib/presentation/widget/empty_widget.dart b/packages/core/lib/presentation/widget/empty_widget.dart new file mode 100644 index 0000000..b727b41 --- /dev/null +++ b/packages/core/lib/presentation/widget/empty_widget.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class EmptyWidget extends StatelessWidget { + const EmptyWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(), + Assets.icons.empty.svg(width: 156.w, height: 156.h), + Text('داده ای یافت نشد', style: AppFonts.yekan20.copyWith(color: AppColor.textColor)), + ], + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/list_view/list_view.dart b/packages/core/lib/presentation/widget/list_view/list_view.dart new file mode 100644 index 0000000..5336777 --- /dev/null +++ b/packages/core/lib/presentation/widget/list_view/list_view.dart @@ -0,0 +1,3 @@ + +export 'r_shimmer_list.dart'; +export 'r_paginated_list_view.dart'; diff --git a/packages/core/lib/presentation/widget/loading_widget.dart b/packages/core/lib/presentation/widget/loading_widget.dart new file mode 100644 index 0000000..d514e49 --- /dev/null +++ b/packages/core/lib/presentation/widget/loading_widget.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class LoadingWidget extends StatelessWidget { + const LoadingWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Expanded(child: Center(child: Assets.anim.loading.lottie( + width: 120.w, + height: 120.h, + ))); + } +} From e8df5721cb4db5a13761c1e327f27c78757538f5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 16:18:12 +0330 Subject: [PATCH 162/256] feat : new UI --- .../lib/presentation/pages/buy/logic.dart | 13 +- .../lib/presentation/pages/buy/view.dart | 23 +- .../logic.dart | 58 +++-- .../view.dart | 223 +++++++++--------- .../lib/presentation/pages/home/view.dart | 2 + .../lib/presentation/pages/root/logic.dart | 14 +- .../lib/presentation/pages/root/view.dart | 11 +- .../{out_of_province => sale}/logic.dart | 2 +- .../pages/{out_of_province => sale}/view.dart | 4 +- .../pages/sales_out_of_province/logic.dart | 6 +- .../pages/buyers_page.dart | 5 +- .../lib/presentation/routes/pages.dart | 88 ++++--- .../lib/presentation/routes/routes.dart | 12 +- .../lib/presentation/widget/app_bar.dart | 8 +- .../lib/presentation/widget/base_page.dart | 20 -- .../presentation/widget/base_page/logic.dart | 9 + .../presentation/widget/base_page/view.dart | 100 ++++++++ .../widget/sale_buy_card_item.dart | 1 + .../lib/presentation/common/assets.gen.dart | 71 +++++- .../list_view/r_paginated_list_view.dart | 25 +- .../core/lib/presentation/widget/widget.dart | 18 +- pubspec.yaml | 2 +- 22 files changed, 480 insertions(+), 235 deletions(-) rename packages/chicken/lib/presentation/pages/{buys_out_of_province => buy_out_of_province}/logic.dart (83%) rename packages/chicken/lib/presentation/pages/{buys_out_of_province => buy_out_of_province}/view.dart (83%) rename packages/chicken/lib/presentation/pages/{out_of_province => sale}/logic.dart (98%) rename packages/chicken/lib/presentation/pages/{out_of_province => sale}/view.dart (98%) delete mode 100644 packages/chicken/lib/presentation/widget/base_page.dart create mode 100644 packages/chicken/lib/presentation/widget/base_page/logic.dart create mode 100644 packages/chicken/lib/presentation/widget/base_page/view.dart diff --git a/packages/chicken/lib/presentation/pages/buy/logic.dart b/packages/chicken/lib/presentation/pages/buy/logic.dart index 817b6e4..1fb717b 100644 --- a/packages/chicken/lib/presentation/pages/buy/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy/logic.dart @@ -1,6 +1,17 @@ -import 'package:get/get.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_core/core.dart'; class BuyLogic extends GetxController { + RootLogic rootLogic = Get.find(); + + late List routesName; + + @override + void onInit() { + super.onInit(); + routesName = [...rootLogic.routesName, 'خرید'].toList(); + } + @override void onReady() { // TODO: implement onReady diff --git a/packages/chicken/lib/presentation/pages/buy/view.dart b/packages/chicken/lib/presentation/pages/buy/view.dart index 74ec9c3..bd04053 100644 --- a/packages/chicken/lib/presentation/pages/buy/view.dart +++ b/packages/chicken/lib/presentation/pages/buy/view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/app_bar.dart'; -import 'package:rasadyar_chicken/presentation/widget/base_page.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/sale_buy_card_item.dart'; import 'package:rasadyar_core/core.dart'; @@ -12,8 +13,8 @@ class BuyPage extends GetView { @override Widget build(BuildContext context) { return BasePage( - routes: ['رصدطیور', 'خرید'], - appBar: chickenAppBar(isBase: true), + routes: controller.routesName, + isBase: true, widgets: [ Row( mainAxisAlignment: MainAxisAlignment.center, @@ -22,8 +23,20 @@ class BuyPage extends GetView { alignment: WrapAlignment.center, spacing: 14.w, children: [ - saleOrBuyItemCard(title: 'داخل استان', iconPath: Assets.vec.cubeSvg.path, onTap: () {}), - saleOrBuyItemCard(title: 'خارج استان', iconPath: Assets.vec.truckFastSvg.path, onTap: () {}), + saleOrBuyItemCard( + title: 'داخل استان', + iconPath: Assets.vec.cubeSvg.path, + onTap: () { + Get.toNamed(ChickenRoutes.buysInProvince, id: 0); + }, + ), + saleOrBuyItemCard( + title: 'خارج استان', + iconPath: Assets.vec.truckFastSvg.path, + onTap: () { + Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); + }, + ), ], ), ], diff --git a/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart similarity index 83% rename from packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart rename to packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index 2787f71..76bf003 100644 --- a/packages/chicken/lib/presentation/pages/buys_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -4,20 +4,23 @@ import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/cre import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; -import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; import 'package:rasadyar_core/core.dart'; -class BuysOutOfProvinceLogic extends GetxController { +class BuyOutOfProvinceLogic extends GetxController { RxBool isExpanded = false.obs; RxBool isSubmitButtonEnabled = false.obs; RxList isExpandedList = [].obs; - RxBool searchIsSelected = false.obs; + + late List routesName; //TODO add this to Di ImagePicker imagePicker = ImagePicker(); - Rx>> purchaseOutOfProvinceList = Resource>.loading().obs; + Rx>> purchaseOutOfProvinceList = + Resource>.loading().obs; Rxn selectedProduct = Rxn(); RxList cites = [].obs; @@ -29,7 +32,9 @@ class BuysOutOfProvinceLogic extends GetxController { RootLogic get rootLogic => Get.find(); - OutOfProvinceLogic get outOfTheProvinceLogic => Get.find(); + BuyLogic get buyLogic => Get.find(); + + SaleLogic get outOfTheProvinceLogic => Get.find(); GlobalKey formKey = GlobalKey(); TextEditingController sellerNameController = TextEditingController(); @@ -40,23 +45,22 @@ class BuysOutOfProvinceLogic extends GetxController { Rx toDateFilter = Jalali.now().obs; RxnString searchedValue = RxnString(); + @override + void onInit() { + super.onInit(); + routesName = [...buyLogic.routesName, 'خارج استان'].toList(); + } + @override void onReady() { super.onReady(); getStewardPurchaseOutOfProvince(); selectedProvince.listen((p0) => getCites()); - tLog(selectedProduct.value); outOfTheProvinceLogic.rolesProductsModel.listen((lists) { selectedProduct.value = lists.first; - },); - tLog(selectedProduct.value); - setupListeners(); - debounce(searchedValue, (callback) => getStewardPurchaseOutOfProvince(), time: Duration(milliseconds: 2000)); - ever(searchIsSelected, (data) { - if (data == false) { - searchedValue.value = null; - } }); + + setupListeners(); } @override @@ -69,7 +73,13 @@ class BuysOutOfProvinceLogic extends GetxController { super.onClose(); } + void setSearchValue(String? data) { + searchedValue.value = data?.trim(); + getStewardPurchaseOutOfProvince(); + } + Future getStewardPurchaseOutOfProvince() async { + purchaseOutOfProvinceList.value = Resource>.loading(); await safeCall( call: () => rootLogic.chickenRepository.getStewardPurchasesOutSideOfTheProvince( token: rootLogic.tokenService.accessToken.value!, @@ -83,7 +93,8 @@ class BuysOutOfProvinceLogic extends GetxController { toDate: toDateFilter.value.toDateTime(), ), ), - onSuccess: (res) { + onSuccess: (res) async { + await Future.delayed(Duration(milliseconds: 500)); if ((res?.count ?? 0) == 0) { purchaseOutOfProvinceList.value = Resource>.empty(); } else { @@ -95,7 +106,8 @@ class BuysOutOfProvinceLogic extends GetxController { Future getCites() async { await safeCall( - call: () => rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), + call: () => + rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), onSuccess: (result) { if (result != null && result.isNotEmpty) { cites.value = result; @@ -123,12 +135,12 @@ class BuysOutOfProvinceLogic extends GetxController { void checkFormValid() { isSubmitButtonEnabled.value = sellerNameController.text.isNotEmpty && - sellerPhoneController.text.isNotEmpty && - carcassWeightController.text.isNotEmpty && - selectedProvince.value != null && - selectedCity.value != null && - selectedProduct.value != null && - selectedImage.value != null; + sellerPhoneController.text.isNotEmpty && + carcassWeightController.text.isNotEmpty && + selectedProvince.value != null && + selectedCity.value != null && + selectedProduct.value != null && + selectedImage.value != null; } Future createStewardPurchaseOutOfProvince() async { @@ -184,7 +196,7 @@ class BuysOutOfProvinceLogic extends GetxController { selectedProvince.value = IranProvinceCityModel(name: item.province); selectedCity.value = IranProvinceCityModel(name: item.city); selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.firstWhere( - (element) => element.key == item.product!.key, + (element) => element.key == item.product!.key, ); isSubmitButtonEnabled.value = true; } diff --git a/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart similarity index 83% rename from packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart rename to packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 74aee1c..116d235 100644 --- a/packages/chicken/lib/presentation/pages/buys_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -1,4 +1,3 @@ - import 'dart:io'; import 'package:flutter/cupertino.dart'; @@ -7,70 +6,38 @@ import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; -class BuysOutOfProvincePage extends GetView { - const BuysOutOfProvincePage({super.key}); +class BuyOutOfProvincePage extends GetView { + const BuyOutOfProvincePage({super.key}); @override Widget build(BuildContext context) { - return Scaffold( - appBar: RAppBar( - titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: true, - onBackPressed: () { - Get.back(id: 1); - - }, - leadingWidth: 155, - leading: Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, - children: [ - Assets.vec.chickenSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + return BasePage( + routes: controller.routesName, + onBackPressed: () => Get.back(id: 0), + onSearchChanged: (data) => controller.setSearchValue(data), + filteringWidget: filterBottomSheet(), + widgets: [ + ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) => saleListItem( + expandList: controller.isExpandedList, + index: index, + item: data.value.data![index], ), - Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), - ], - ), - additionalActions: [ - GestureDetector( - onTap: () { - controller.searchIsSelected.value = !controller.searchIsSelected.value; - }, - child: Assets.vec.searchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - SizedBox(width: 8), - GestureDetector( - onTap: () { - Get.bottomSheet(filterBottomSheet()); - }, - child: Assets.vec.filterOutlineSvg.svg( - width: 20, - height: 20, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - SizedBox(width: 8), - ], - ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - routePageWidget(), - _buildSearchWidget(), - Expanded(child: saleListWidget()), - ], - ), + itemCount: data.value.data?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + onLoadMore: () async {}, + ); + }, controller.purchaseOutOfProvinceList), + ], floatingActionButton: RFab.add( onPressed: () { Get.bottomSheet(addPurchasedInformationBottomSheet(), isScrollControlled: true); @@ -93,7 +60,11 @@ class BuysOutOfProvincePage extends GetView { padding: EdgeInsets.fromLTRB(8, 8, 18, 80), itemBuilder: (context, index) { return ObxValue( - (expandList) => saleListItem(expandList: expandList, index: index, item: data.value.data![index]), + (expandList) => saleListItem( + expandList: expandList, + index: index, + item: data.value.data![index], + ), controller.isExpandedList, ); }, @@ -115,11 +86,18 @@ class BuysOutOfProvincePage extends GetView { Widget emptyWidget() { return Center( - child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), + child: Text( + 'داده ای دریافت نشد!', + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover), + ), ); } - GestureDetector saleListItem({required RxList expandList, required int index, required StewardFreeBar item}) { + GestureDetector saleListItem({ + required RxList expandList, + required int index, + required StewardFreeBar item, + }) { return GestureDetector( onTap: () { if (expandList.contains(index)) { @@ -169,7 +147,7 @@ class BuysOutOfProvincePage extends GetView { style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), ), - SizedBox(width: 8,), + SizedBox(width: 8), Expanded( flex: 2, child: Column( @@ -180,11 +158,18 @@ class BuysOutOfProvincePage extends GetView { style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), - SizedBox(height: 2,), + SizedBox(height: 2), Visibility( - visible: item.product?.name?.contains('مرغ گرم') ?? false, - child: Assets.vec.hotChickenSvg.svg(width: 24,height: 24, colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn))), - + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), ], ), ), @@ -204,7 +189,10 @@ class BuysOutOfProvincePage extends GetView { secondChild: Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), child: Column( spacing: 8, children: [ @@ -237,7 +225,8 @@ class BuysOutOfProvincePage extends GetView { GestureDetector( onTap: () { buildDeleteDialog( - onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + onConfirm: () => + controller.deleteStewardPurchaseOutOfProvince(item.key!), ); }, child: Assets.vec.trashSvg.svg( @@ -261,9 +250,15 @@ class BuysOutOfProvincePage extends GetView { child: buildRow('تاریخ', item.date?.formattedJalaliDateYHMS ?? 'N/A'), ), - buildRow('مشخصات فروشنده', '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}'), - buildRow('محصول', item.product?.name ??'N/A'), - buildRow('وزن خریداری شده', '${item.weightOfCarcasses?.separatedByComma} کیلوگرم'), + buildRow( + 'مشخصات فروشنده', + '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}', + ), + buildRow('محصول', item.product?.name ?? 'N/A'), + buildRow( + 'وزن خریداری شده', + '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', + ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -277,7 +272,9 @@ class BuysOutOfProvincePage extends GetView { children: [ Text( 'بارنامه', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), ), Image.network( @@ -299,7 +296,10 @@ class BuysOutOfProvincePage extends GetView { ), ); }, - child: Text('مشاهده بارنامه', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal)), + child: Text( + 'مشاهده بارنامه', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), ), Icon(CupertinoIcons.chevron_up, size: 12), ], @@ -307,7 +307,9 @@ class BuysOutOfProvincePage extends GetView { ], ), ), - crossFadeState: expandList.contains(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst, + crossFadeState: expandList.contains(index) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, duration: Duration(milliseconds: 300), ), ), @@ -324,7 +326,10 @@ class BuysOutOfProvincePage extends GetView { border: Border.all(width: 0.50, color: AppColor.greenDarkActive), ), alignment: Alignment.center, - child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), ), ), ], @@ -333,37 +338,6 @@ class BuysOutOfProvincePage extends GetView { ); } - Row routePageWidget() { - return Row( - children: [ - SizedBox(width: 8), - RichText( - text: TextSpan( - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - children: [ - WidgetSpan( - child: Row( - children: [ - Assets.vec.cubeSearchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - SizedBox(width: 6), - ], - ), - ), - - TextSpan(text: 'خارج استان'), - TextSpan(text: '/'), - TextSpan(text: 'خرید'), - ], - ), - ), - ], - ); - } - Widget buildRow(String title, String value) { return Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), @@ -438,7 +412,10 @@ class BuysOutOfProvincePage extends GetView { label: 'وزن لاشه', keyboardType: TextInputType.number, borderColor: AppColor.darkGreyLight, - inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], ), _imageCarcasesWidget(isOnEdit), submitButtonWidget(isOnEdit), @@ -456,11 +433,11 @@ class BuysOutOfProvincePage extends GetView { text: isOnEdit ? 'ویرایش' : 'ثبت خرید', onPressed: data.value ? () async { - var res = await controller.createStewardPurchaseOutOfProvince(); - if (res) { - Get.back(); - } - } + var res = await controller.createStewardPurchaseOutOfProvince(); + if (res) { + Get.back(); + } + } : null, height: 40, ); @@ -526,7 +503,10 @@ class BuysOutOfProvincePage extends GetView { child: ObxValue((data) { return Container( width: Get.width, - decoration: BoxDecoration(color: AppColor.lightGreyNormal, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: AppColor.lightGreyNormal, + borderRadius: BorderRadius.circular(8), + ), child: Center( child: isOnEdit ? Image.network(controller.editImageUrl.value ?? '') @@ -544,7 +524,10 @@ class BuysOutOfProvincePage extends GetView { child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text('تصویر بار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + Text( + 'تصویر بار', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), Spacer(), GestureDetector( onTap: () async { @@ -612,7 +595,10 @@ class BuysOutOfProvincePage extends GetView { title: 'حذف خرید', middleText: 'آیا از حذف این خرید مطمئن هستید؟', confirm: ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.error, + foregroundColor: Colors.white, + ), onPressed: () async { await onConfirm(); Get.back(); @@ -692,7 +678,10 @@ class BuysOutOfProvincePage extends GetView { height: 24, colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), - Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + Text( + isFrom ? 'از' : 'تا', + style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + ), Expanded( child: ObxValue((data) { return Text( @@ -763,7 +752,7 @@ class BuysOutOfProvincePage extends GetView { ); } - ObxValue _buildSearchWidget() { + /*ObxValue _buildSearchWidget() { return ObxValue((data) { return AnimatedContainer( duration: Duration(milliseconds: 300), @@ -793,5 +782,5 @@ class BuysOutOfProvincePage extends GetView { ), ); }, controller.searchIsSelected); - } + }*/ } diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index ee5abae..cf417a7 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -121,6 +121,8 @@ class HomePage extends GetView { Icon(CupertinoIcons.chevron_down, size: 18), ], ), + _todayShipmentWidget(), + _inventoryWidget(), ], ), ), diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 780803a..1a9caf7 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -8,8 +8,8 @@ import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/out_of_province/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/view.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; @@ -19,12 +19,20 @@ class RootLogic extends GetxController { RxInt currentPage = 2.obs; List pages = [ BuyPage(), - OutOfProvincePage(), + SalePage(), HomePage(), Container(color: Colors.blue), Container(color: Colors.amber), ]; + final defaultRoutes = { + 0: ChickenRoutes.buy, + 1: ChickenRoutes.sale, + }; + + + List routesName = ['رصدطیور']; + late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index a461e6b..85f7e41 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -15,14 +15,21 @@ class RootPage extends GetView { children: [ Navigator( key: Get.nestedKey(0), - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[0]), + onGenerateRoute: (settings) { + final page = ChickenPages.pages.firstWhere( + (e) => e.name == settings.name, + orElse: () => ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.buy), + ); + + return buildRouteFromGetPage(page); + }, ), Navigator( key: Get.nestedKey(1), onGenerateRoute: (settings) { final page = ChickenPages.pages.firstWhere( (e) => e.name == settings.name, - orElse: () => ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.outOfProvince), + orElse: () => ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.sale), ); return buildRouteFromGetPage(page); diff --git a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sale/logic.dart similarity index 98% rename from packages/chicken/lib/presentation/pages/out_of_province/logic.dart rename to packages/chicken/lib/presentation/pages/sale/logic.dart index 8606a54..b57d7c3 100644 --- a/packages/chicken/lib/presentation/pages/out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sale/logic.dart @@ -8,7 +8,7 @@ import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; -class OutOfProvinceLogic extends GetxController { +class SaleLogic extends GetxController { var rootLogic = Get.find(); Rxn?> allocatedMadeModel = Rxn?>(); diff --git a/packages/chicken/lib/presentation/pages/out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sale/view.dart similarity index 98% rename from packages/chicken/lib/presentation/pages/out_of_province/view.dart rename to packages/chicken/lib/presentation/pages/sale/view.dart index 88e9fd3..4a599b3 100644 --- a/packages/chicken/lib/presentation/pages/out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sale/view.dart @@ -5,8 +5,8 @@ import 'package:rasadyar_core/core.dart'; import 'logic.dart'; -class OutOfProvincePage extends GetView { - OutOfProvincePage({super.key}); +class SalePage extends GetView { + SalePage({super.key}); @override Widget build(BuildContext context) { diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index e0c04d0..2961438 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -6,8 +6,8 @@ import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_pr import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; -import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { @@ -36,8 +36,8 @@ class SalesOutOfProvinceLogic extends GetxController { RootLogic get rootLogic => Get.find(); - OutOfProvinceLogic get outOfTheProvinceLogic => - Get.find(); + SaleLogic get outOfTheProvinceLogic => + Get.find(); GlobalKey formKey = GlobalKey(); TextEditingController buyerNameController = TextEditingController(); diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart index b2ca1df..7d3207d 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart @@ -16,10 +16,7 @@ class BuyersPage extends GetView { return Scaffold( body: Column( children: [ - searchWidget(controller.searchIsSelected, (data) { - controller.searchedValue.value = data; - controller.getOutProvinceCarcassesBuyer(); - }), + buyerListWidget(), ], diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index eacfa8b..f9b5cfa 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,21 +1,23 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/buys_out_of_province/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/out_of_province/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; +import 'package:rasadyar_chicken/presentation/widget/search/logic.dart'; import 'package:rasadyar_core/core.dart'; sealed class ChickenPages { @@ -30,9 +32,11 @@ sealed class ChickenPages { Get.put(RootLogic()); Get.lazyPut(() => HomeLogic()); Get.lazyPut(() => BuyLogic()); - Get.lazyPut(() => SalesInProvinceLogic()); - Get.lazyPut(() => OutOfProvinceLogic()); - Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => SaleLogic()); + Get.lazyPut(() => BaseLogic()); + /*Get.lazyPut(() => SalesInProvinceLogic()); + + Get.lazyPut(() => SalesOutOfProvinceLogic());*/ }), ), @@ -43,10 +47,11 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.put(HomeLogic()); Get.put(RootLogic()); + Get.lazyPut(() => BaseLogic()); }), ), - GetPage( + /* GetPage( name: ChickenRoutes.enteringTheWarehouse, page: () => EnteringTheWarehousePage(), middlewares: [AuthMiddleware()], @@ -54,29 +59,20 @@ sealed class ChickenPages { Get.lazyPut(() => EnteringTheWarehouseLogic()); Get.lazyPut(() => RootLogic()); }), - ), + ),*/ + + //sales GetPage( - name: ChickenRoutes.salesInProvince, - page: () => SalesInProvincePage(), + name: ChickenRoutes.sale, + page: () => SalePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(() => SalesInProvinceLogic()); - Get.lazyPut(() => RootLogic()); - }), - ), - - GetPage( - name: ChickenRoutes.outOfProvince, - page: () => OutOfProvincePage(), - middlewares: [AuthMiddleware()], - binding: BindingsBuilder(() { - Get.lazyPut(() => OutOfProvinceLogic()); - + Get.lazyPut(() => SaleLogic()); + Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SalesOutOfProvinceLogic()); Get.lazyPut(() => RootLogic()); }), ), - GetPage( name: ChickenRoutes.salesOutOfProvince, page: () => SalesOutOfProvincePage(), @@ -84,19 +80,53 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => SalesOutOfProvinceLogic()); Get.lazyPut(() => RootLogic()); + Get.lazyPut(() => BaseLogic()); + }), + ), + GetPage( + name: ChickenRoutes.salesInProvince, + page: () => SalesInProvincePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => SalesInProvinceLogic()); + Get.lazyPut(() => RootLogic()); + }), + ), + + //buy + GetPage( + name: ChickenRoutes.buy, + page: () => BuyPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => BuyLogic()); + Get.lazyPut(() => RootLogic()); }), ), GetPage( name: ChickenRoutes.buysOutOfProvince, - page: () => BuysOutOfProvincePage(), + page: () => BuyOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(() => BuysOutOfProvinceLogic()); + Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => SearchLogic()); + Get.lazyPut(() => BuyOutOfProvinceLogic()); Get.lazyPut(() => RootLogic()); }), ), - + GetPage( + name: ChickenRoutes.buysInProvince, + page: () => BuyInProvincePage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => BuyInProvinceLogic()); + Get.lazyPut(() => RootLogic()); + }), + ), ]; } diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index efeab53..d91ae8d 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -5,11 +5,13 @@ sealed class ChickenRoutes { static const init = '$_base/root'; static const home = '$_base/home'; static const buy = '$_base/buy'; + static const sale = '$_base/sale'; - static const enteringTheWarehouse = '$_base/enteringTheWarehouse'; - static const salesInProvince = '$_base/SalesInProvincePage'; - static const outOfProvince = '$_base/OutOfProvincePage'; + //buys + static const buysOutOfProvince = '$buy/buyOutOfProvince'; + static const buysInProvince = '$buy/buyInProvince'; - static const salesOutOfProvince = '$outOfProvince/saleOutOfProvince'; - static const buysOutOfProvince = '$outOfProvince/buyOutOfProvince'; + //sales + static const salesInProvince = '$sale/SalesInProvince'; + static const salesOutOfProvince = '$sale/saleOutOfProvince'; } diff --git a/packages/chicken/lib/presentation/widget/app_bar.dart b/packages/chicken/lib/presentation/widget/app_bar.dart index 6642341..ebf2ee6 100644 --- a/packages/chicken/lib/presentation/widget/app_bar.dart +++ b/packages/chicken/lib/presentation/widget/app_bar.dart @@ -27,15 +27,15 @@ RAppBar chickenAppBar({ ], ), additionalActions: [ - if (!isBase && hasFilter) filterWidget(onFilterTap), - SizedBox(width: 8), if (!isBase && hasSearch) searchWidget(onSearchTap), SizedBox(width: 8), + if (!isBase && hasFilter) filterWidget(onFilterTap), + SizedBox(width: 8), ], ); } -GestureDetector searchWidget(GestureTapCallback? onSearchTap) { +GestureDetector filterWidget(GestureTapCallback? onSearchTap) { return GestureDetector( onTap: onSearchTap, child: Assets.vec.filterOutlineSvg.svg( @@ -46,7 +46,7 @@ GestureDetector searchWidget(GestureTapCallback? onSearchTap) { ); } -GestureDetector filterWidget(GestureTapCallback? onFilterTap) { +GestureDetector searchWidget(GestureTapCallback? onFilterTap) { return GestureDetector( onTap: onFilterTap, child: Assets.vec.searchSvg.svg( diff --git a/packages/chicken/lib/presentation/widget/base_page.dart b/packages/chicken/lib/presentation/widget/base_page.dart deleted file mode 100644 index 16971c3..0000000 --- a/packages/chicken/lib/presentation/widget/base_page.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; -import 'package:rasadyar_core/core.dart'; - -class BasePage extends StatelessWidget { - const BasePage({super.key, required this.routes, required this.appBar, required this.widgets}); - - final List routes; - final RAppBar appBar; - final List widgets; - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColor.bgLight, - appBar: appBar, - body: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [buildPageRoute(routes), ...widgets]), - ); - } -} diff --git a/packages/chicken/lib/presentation/widget/base_page/logic.dart b/packages/chicken/lib/presentation/widget/base_page/logic.dart new file mode 100644 index 0000000..f33fa71 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/base_page/logic.dart @@ -0,0 +1,9 @@ +import 'package:rasadyar_core/core.dart'; + +class BaseLogic extends GetxController { + final RxBool isFilterSelected = false.obs; + + void toggleFilter() { + isFilterSelected.value = !isFilterSelected.value; + } +} diff --git a/packages/chicken/lib/presentation/widget/base_page/view.dart b/packages/chicken/lib/presentation/widget/base_page/view.dart new file mode 100644 index 0000000..fd2fb40 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/base_page/view.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/widget/app_bar.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; +import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; +import 'package:rasadyar_chicken/presentation/widget/search/logic.dart'; +import 'package:rasadyar_chicken/presentation/widget/search/view.dart'; +import 'package:rasadyar_core/core.dart'; + +class BasePage extends StatefulWidget { + const BasePage({ + super.key, + required this.routes, + required this.widgets, + this.floatingActionButtonLocation, + this.floatingActionButton, + this.onSearchChanged, + this.hasBack = true, + this.hasFilter = true, + this.hasSearch = true, + this.isBase = false, + this.onBackPressed, + this.onFilterTap, + this.onSearchTap, + this.filteringWidget, + }); + + final List routes; + final List widgets; + final FloatingActionButtonLocation? floatingActionButtonLocation; + final Widget? floatingActionButton; + final Widget? filteringWidget; + final void Function(String)? onSearchChanged; + final bool hasBack; + final bool hasFilter; + final bool hasSearch; + final bool isBase; + final VoidCallback? onBackPressed; + final GestureTapCallback? onFilterTap; + final GestureTapCallback? onSearchTap; + + @override + State createState() => _BasePageState(); +} + +class _BasePageState extends State { + BaseLogic get controller => Get.find(); + Worker? filterWorker; + + @override + void initState() { + super.initState(); + filterWorker = ever(controller.isFilterSelected, (bool isSelected) { + if (isSelected && widget.filteringWidget != null) { + Get.bottomSheet( + widget.filteringWidget!, + isScrollControlled: true, + isDismissible: true, + enableDrag: true, + ).then((_) { + controller.isFilterSelected.value = false; + }); + } + }); + } + + @override + void dispose() { + filterWorker?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.bgLight, + appBar: chickenAppBar( + hasBack: widget.isBase ? false : widget.hasBack, + onBackPressed: widget.onBackPressed, + hasFilter: widget.hasFilter, + hasSearch: widget.hasSearch, + isBase: widget.isBase, + onFilterTap: widget.hasFilter ? () => controller.toggleFilter() : null, + onSearchTap: widget.hasSearch ? () => Get.find().toggleSearch() : null, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildPageRoute(widget.routes), + const SizedBox(height: 8), + if (!widget.isBase && widget.hasSearch) ...{ + SearchWidget(onSearchChanged: widget.onSearchChanged), + }, + ...widget.widgets, + ], + ), + floatingActionButtonLocation: widget.floatingActionButtonLocation, + floatingActionButton: widget.floatingActionButton, + ); + } +} diff --git a/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart b/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart index f410f75..b261a29 100644 --- a/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart +++ b/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart @@ -3,6 +3,7 @@ import 'package:rasadyar_core/core.dart'; Widget saleOrBuyItemCard({String? title, String? iconPath, required VoidCallback onTap}) { return InkWell( + borderRadius: BorderRadius.circular(8.r), onTap: onTap, child: Card( color: Colors.white, diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index e19bcf8..4bbbc32 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -10,16 +10,17 @@ import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.dart' as _svg; +import 'package:lottie/lottie.dart' as _lottie; import 'package:vector_graphics/vector_graphics.dart' as _vg; class $AssetsAnimGen { const $AssetsAnimGen(); /// File path: assets/anim/loading.json - String get loading => 'assets/anim/loading.json'; + LottieGenImage get loading => const LottieGenImage('assets/anim/loading.json'); /// List of all assets - List get values => [loading]; + List get values => [loading]; } class $AssetsIconsGen { @@ -733,3 +734,69 @@ class SvgGenImage { String get keyName => _assetName; } + +class LottieGenImage { + const LottieGenImage(this._assetName, {this.flavors = const {}}); + + final String _assetName; + final Set flavors; + + _lottie.LottieBuilder lottie({ + Animation? controller, + bool? animate, + _lottie.FrameRate? frameRate, + bool? repeat, + bool? reverse, + _lottie.LottieDelegates? delegates, + _lottie.LottieOptions? options, + void Function(_lottie.LottieComposition)? onLoaded, + _lottie.LottieImageProviderFactory? imageProviderFactory, + Key? key, + AssetBundle? bundle, + Widget Function(BuildContext, Widget, _lottie.LottieComposition?)? frameBuilder, + ImageErrorWidgetBuilder? errorBuilder, + double? width, + double? height, + BoxFit? fit, + AlignmentGeometry? alignment, + String? package, + bool? addRepaintBoundary, + FilterQuality? filterQuality, + void Function(String)? onWarning, + _lottie.LottieDecoder? decoder, + _lottie.RenderCache? renderCache, + bool? backgroundLoading, + }) { + return _lottie.Lottie.asset( + _assetName, + controller: controller, + animate: animate, + frameRate: frameRate, + repeat: repeat, + reverse: reverse, + delegates: delegates, + options: options, + onLoaded: onLoaded, + imageProviderFactory: imageProviderFactory, + key: key, + bundle: bundle, + frameBuilder: frameBuilder, + errorBuilder: errorBuilder, + width: width, + height: height, + fit: fit, + alignment: alignment, + package: package, + addRepaintBoundary: addRepaintBoundary, + filterQuality: filterQuality, + onWarning: onWarning, + decoder: decoder, + renderCache: renderCache, + backgroundLoading: backgroundLoading, + ); + } + + String get path => _assetName; + + String get keyName => _assetName; +} diff --git a/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart b/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart index 52cdd93..b5fd4e5 100644 --- a/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart +++ b/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart @@ -1,8 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:rasadyar_core/utils/network/resource.dart'; - -import 'r_shimmer_list.dart'; +import 'package:rasadyar_core/core.dart'; enum ListType { builder, separated } @@ -21,7 +19,9 @@ class RPaginatedListView extends StatelessWidget { this.emptyWidget, this.errorWidget, this.scrollController, + this.padding = const EdgeInsets.all(8.0), this.listType = ListType.builder, + this.physics = const BouncingScrollPhysics(), }); final Resource> resource; @@ -37,11 +37,17 @@ class RPaginatedListView extends StatelessWidget { final Widget? errorWidget; final ScrollController? scrollController; final ListType listType; + final EdgeInsets padding; + final ScrollPhysics physics; @override Widget build(BuildContext context) { - if (resource.isLoading) { + /* if (resource.isLoading) { return loadingWidget ?? RShimmerList(isSeparated: listType == ListType.separated); + }*/ + + if (resource.isLoading) { + return loadingWidget ?? const LoadingWidget(); } if (resource.isError) { @@ -49,23 +55,28 @@ class RPaginatedListView extends StatelessWidget { } if (resource.isEmpty || resource.data?.isEmpty == true) { - return emptyWidget ?? const Center(child: Text('آیتمی یافت نشد')); + return emptyWidget ?? const EmptyWidget(); } final controller = scrollController ?? ScrollController(); return NotificationListener( onNotification: (ScrollNotification scrollInfo) { - if (!isPaginating && hasMore && scrollInfo.metrics.pixels >= scrollInfo.metrics.maxScrollExtent - 100) { + if (!isPaginating && + hasMore && + scrollInfo.metrics.pixels >= scrollInfo.metrics.maxScrollExtent - 100) { onLoadMore(); } return false; }, child: RefreshIndicator( + color: AppColor.blueNormal, onRefresh: onRefresh ?? () async {}, child: listType == ListType.separated ? ListView.separated( + padding: padding, controller: controller, + shrinkWrap: true, itemCount: itemCount + (isPaginating ? 1 : 0), itemBuilder: (context, index) { if (isPaginating && index == itemCount) { @@ -79,7 +90,9 @@ class RPaginatedListView extends StatelessWidget { separatorBuilder: separatorBuilder ?? (_, __) => const SizedBox(height: 8), ) : ListView.builder( + padding: padding, controller: controller, + shrinkWrap: true, itemCount: itemCount + (isPaginating ? 1 : 0), itemBuilder: (context, index) { if (isPaginating && index == itemCount) { diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 5b5cc6c..46c10d5 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -1,23 +1,27 @@ export 'app_bar/r_app_bar.dart'; export 'bottom_navigation/r_bottom_navigation.dart'; export 'bottom_navigation/wave_bottom_navigation.dart'; +export 'bottom_sheet/base_bottom_sheet.dart'; export 'buttons/elevated.dart'; +export 'buttons/fab.dart'; export 'buttons/outline_elevated.dart'; export 'buttons/outline_elevated_icon.dart'; export 'buttons/text_button.dart'; +export 'card/card_with_icon_with_border.dart'; +export 'chips/r_chips.dart'; +export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; -export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; +export 'inputs/input_fixed_hint.dart'; export 'inputs/r_input.dart'; +export 'list_view/list_view.dart'; +export 'overlay_dropdown_widget/view.dart'; export 'pagination/pagination_from_until.dart'; export 'pagination/show_more.dart'; export 'tabs/new_tab.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; -export 'card/card_with_icon_with_border.dart'; -export 'chips/r_chips.dart'; -export 'overlay_dropdown_widget/view.dart'; -export 'inputs/input_fixed_hint.dart'; -export 'bottom_sheet/base_bottom_sheet.dart'; -export 'buttons/fab.dart'; +export 'empty_widget.dart'; +export 'loading_widget.dart'; + diff --git a/pubspec.yaml b/pubspec.yaml index 38e5e0f..fc33edc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -80,5 +80,5 @@ flutter_gen: integrations: image: true flutter_svg: true + lottie: true rive: false - lottie: false From 18570e2f0ba877a52b7d41ddc839d69df11809a9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 30 Jun 2025 16:57:27 +0330 Subject: [PATCH 163/256] feat : list view item --- .../pages/buy_out_of_province/view.dart | 68 +++------- .../widget/list_item/list_item.dart | 127 ++++++++++++++++++ 2 files changed, 148 insertions(+), 47 deletions(-) create mode 100644 packages/chicken/lib/presentation/widget/list_item/list_item.dart diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 116d235..39e46bf 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -7,6 +7,7 @@ import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_pr import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -22,21 +23,26 @@ class BuyOutOfProvincePage extends GetView { onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ - ObxValue((data) { - return RPaginatedListView( - listType: ListType.separated, - resource: data.value, - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) => saleListItem( - expandList: controller.isExpandedList, - index: index, - item: data.value.data![index], - ), - itemCount: data.value.data?.length ?? 0, - separatorBuilder: (context, index) => SizedBox(height: 8.h), - onLoadMore: () async {}, - ); - }, controller.purchaseOutOfProvinceList), + Expanded( + child: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 18, 80), + itemBuilder: (context, index) => ListItem( + expandList: controller.isExpandedList, + index: index, + child: Container(height: 40, color: Colors.red), + secondChild: Container(height: 80, color: Colors.blue), + labelColor: AppColor.lightGreyNormalHover, + labelIcon: Assets.vec.truckFastSvg.path, + ), + itemCount: data.value.data?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + onLoadMore: () async {}, + ); + }, controller.purchaseOutOfProvinceList), + ), ], floatingActionButton: RFab.add( onPressed: () { @@ -751,36 +757,4 @@ class BuyOutOfProvincePage extends GetView { ), ); } - - /*ObxValue _buildSearchWidget() { - return ObxValue((data) { - return AnimatedContainer( - duration: Duration(milliseconds: 300), - padding: EdgeInsets.only(top: 5), - curve: Curves.easeInOut, - height: data.value ? 50 : 0, - child: Visibility( - visible: data.value, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: RTextField( - suffixIcon: Padding( - padding: const EdgeInsets.all(12.0), - child: Assets.vec.searchSvg.svg( - width: 10, - height: 10, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - hintText: 'جستجو', - onChanged: (value) { - controller.searchedValue.value = value; - }, - controller: TextEditingController(), - ), - ), - ), - ); - }, controller.searchIsSelected); - }*/ } diff --git a/packages/chicken/lib/presentation/widget/list_item/list_item.dart b/packages/chicken/lib/presentation/widget/list_item/list_item.dart new file mode 100644 index 0000000..ab9e0cc --- /dev/null +++ b/packages/chicken/lib/presentation/widget/list_item/list_item.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class ListItem extends StatelessWidget { + const ListItem({ + super.key, + required this.expandList, + required this.index, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final RxList expandList; + final int index; + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + /*if (expandList.contains(index)) { + controller.isExpandedList.remove(index); + } else { + controller.isExpandedList.add(index); + }*/ + }, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration(color: labelColor, borderRadius: BorderRadius.circular(8)), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 2, color: Colors.red), + ), + child: Row( + children: [ + Expanded( + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + child: child, + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: expandList.contains(index) + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + colorFilter: ColorFilter.mode(labelColor, BlendMode.srcIn), + ), + ), + ), + ], + ), + ), + ), + + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ), + ); + } +} From 3d6d3d7b08a4baa9710852280d346211abdb4130 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 1 Jul 2025 09:00:09 +0330 Subject: [PATCH 164/256] feat : list view item --- .../lib/presentation/widget/list_item/list_item.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/chicken/lib/presentation/widget/list_item/list_item.dart b/packages/chicken/lib/presentation/widget/list_item/list_item.dart index ab9e0cc..a199ca0 100644 --- a/packages/chicken/lib/presentation/widget/list_item/list_item.dart +++ b/packages/chicken/lib/presentation/widget/list_item/list_item.dart @@ -34,7 +34,11 @@ class ListItem extends StatelessWidget { child: Container( width: Get.width, margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - decoration: BoxDecoration(color: labelColor, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), child: AnimatedSize( duration: Duration(milliseconds: 400), alignment: Alignment.center, @@ -50,7 +54,6 @@ class ListItem extends StatelessWidget { decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular(8), - border: Border.all(width: 2, color: Colors.red), ), child: Row( children: [ @@ -68,11 +71,12 @@ class ListItem extends StatelessWidget { topRight: Radius.circular(8), ), ), + clipBehavior: Clip.antiAlias, child: child, ), secondChild: Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - + clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), From 666f6326e58f78d437effb4aac2c52f03fb8ce95 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 1 Jul 2025 15:43:47 +0330 Subject: [PATCH 165/256] feat : list view item in out of the province --- assets/anim/error.json | 14879 ++++++++++++++++ assets/icons/clipboard_eye.svg | 8 + assets/icons/clipboard_task.svg | 6 + assets/icons/killogram.svg | 3 + assets/icons/place_holder.svg | 34 +- assets/images/place_holder.png | Bin 23331 -> 12617 bytes assets/vec/clipboard_eye.svg.vec | Bin 0 -> 1650 bytes assets/vec/clipboard_task.svg.vec | Bin 0 -> 2389 bytes assets/vec/killogram.svg.vec | Bin 0 -> 4824 bytes assets/vec/place_holder.svg.vec | Bin 5160 -> 11080 bytes .../pages/buy_out_of_province/view.dart | 732 +- .../widget/list_item/list_item.dart | 128 +- .../presentation/widget/list_row_item.dart | 76 + .../lib/presentation/common/app_color.dart | 2 + .../lib/presentation/common/assets.gen.dart | 29 +- .../bottom_sheet/base_bottom_sheet.dart | 14 +- .../lib/presentation/widget/empty_widget.dart | 18 +- .../presentation/widget/inputs/r_input.dart | 38 +- .../presentation/widget/loading_widget.dart | 4 +- .../widget/overlay_dropdown_widget/view.dart | 4 +- packages/core/lib/utils/date_time_utils.dart | 5 + 21 files changed, 15522 insertions(+), 458 deletions(-) create mode 100644 assets/anim/error.json create mode 100644 assets/icons/clipboard_eye.svg create mode 100644 assets/icons/clipboard_task.svg create mode 100644 assets/icons/killogram.svg create mode 100644 assets/vec/clipboard_eye.svg.vec create mode 100644 assets/vec/clipboard_task.svg.vec create mode 100644 assets/vec/killogram.svg.vec create mode 100644 packages/chicken/lib/presentation/widget/list_row_item.dart diff --git a/assets/anim/error.json b/assets/anim/error.json new file mode 100644 index 0000000..ec8dcbc --- /dev/null +++ b/assets/anim/error.json @@ -0,0 +1,14879 @@ +{ + "v": "5.5.7", + "meta": { + "g": "LottieFiles AE 0.1.21", + "a": "", + "k": "", + "d": "", + "tc": "#ffffff" + }, + "fr": 60, + "ip": 0, + "op": 300, + "w": 1000, + "h": 1000, + "nm": "Frame 33680", + "ddd": 0, + "assets": [ + { + "id": "comp_0", + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 0, + "s": [ + 0 + ] + }, + { + "t": 45, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 861, + 52.376, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0.031, + 8.341 + ], + [ + -20.583, + 8.777 + ], + [ + -20.352, + -0.093 + ], + [ + -20.151, + -5.851 + ], + [ + -20.583, + -8.279 + ], + [ + -6.959, + -8.03 + ], + [ + 20.275, + -7.859 + ], + [ + 19.519, + -8.637 + ], + [ + 19.596, + 8.777 + ], + [ + 20.275, + 8.077 + ], + [ + 13.562999999999999, + 8.17 + ] + ], + "o": [ + [ + 0.031, + 8.341 + ], + [ + -20.583, + 8.777 + ], + [ + -20.29, + -2.988 + ], + [ + -20.151, + -8.699 + ], + [ + -13.762999999999998, + -8.201 + ], + [ + -0.154, + -8.03 + ], + [ + 20.275, + -7.859 + ], + [ + 19.519, + -8.637 + ], + [ + 19.596, + 8.777 + ], + [ + 16.910999999999998, + 8.17 + ], + [ + 10.184, + 8.17 + ] + ], + "v": [ + [ + 0.031, + 8.341 + ], + [ + -20.583, + 8.777 + ], + [ + -20.352, + -0.093 + ], + [ + -20.151, + -8.699 + ], + [ + -20.583, + -8.279 + ], + [ + -0.154, + -8.03 + ], + [ + 20.275, + -7.859 + ], + [ + 19.519, + -8.637 + ], + [ + 19.596, + 8.777 + ], + [ + 20.275, + 8.077 + ], + [ + 10.184, + 8.17 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -20.799, + -2.754 + ], + [ + -20.583, + 8.777 + ], + [ + -0.386, + 9.291 + ], + [ + 9.891, + 9.477 + ], + [ + 16.772000000000002, + 9.477 + ], + [ + 20.969, + 9.477 + ], + [ + 20.969, + 8.777 + ], + [ + 21, + -8.684 + ], + [ + 21, + -9.477 + ], + [ + 20.213, + -9.477 + ], + [ + -0.154, + -9.369 + ], + [ + -13.762999999999998, + -9.197999999999999 + ], + [ + -21, + -9.12 + ], + [ + -21, + -8.637 + ] + ], + "o": [ + [ + -20.799, + 0.156 + ], + [ + -20.583, + 8.777 + ], + [ + -0.386, + 9.291 + ], + [ + 13.332, + 9.477 + ], + [ + 20.213, + 9.477 + ], + [ + 20.969, + 9.477 + ], + [ + 20.969, + 8.777 + ], + [ + 21, + -8.684 + ], + [ + 21, + -9.477 + ], + [ + 20.213, + -9.477 + ], + [ + -6.959, + -9.369 + ], + [ + -20.583, + -9.12 + ], + [ + -21, + -9.12 + ], + [ + -20.969, + -5.696000000000001 + ] + ], + "v": [ + [ + -20.799, + 0.156 + ], + [ + -20.583, + 8.777 + ], + [ + -0.386, + 9.291 + ], + [ + 9.891, + 9.477 + ], + [ + 20.213, + 9.477 + ], + [ + 20.969, + 9.477 + ], + [ + 20.969, + 8.777 + ], + [ + 21, + -8.684 + ], + [ + 21, + -9.477 + ], + [ + 20.213, + -9.477 + ], + [ + -0.154, + -9.369 + ], + [ + -20.583, + -9.12 + ], + [ + -21, + -9.12 + ], + [ + -21, + -8.637 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 45, + "s": [ + 0 + ] + }, + { + "t": 90, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 64.5, + 91.283, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + -100, + -100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 14.5, + -6.485 + ], + [ + -14.5, + -6.485 + ], + [ + -14.5, + 6.485 + ], + [ + 14.5, + 6.485 + ] + ], + "o": [ + [ + 14.5, + -6.485 + ], + [ + -14.5, + -6.485 + ], + [ + -14.5, + 6.485 + ], + [ + 14.5, + 6.485 + ] + ], + "v": [ + [ + 14.5, + -6.485 + ], + [ + -14.5, + -6.485 + ], + [ + -14.5, + 6.485 + ], + [ + 14.5, + 6.485 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 15, + "s": [ + 0 + ] + }, + { + "t": 60, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 114, + 44.893, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 6.155 + ], + [ + -14.692, + 6.466 + ], + [ + -14.505, + -0.035 + ], + [ + -14.362, + -4.291 + ], + [ + -14.659, + -6.086 + ], + [ + -4.952, + -5.902 + ], + [ + 14.45, + -5.775 + ], + [ + 13.899, + -6.351 + ], + [ + 13.955, + 6.523 + ], + [ + 14.45, + 6.017 + ], + [ + 9.651, + 6.017 + ] + ], + "o": [ + [ + 0, + 6.155 + ], + [ + -14.692, + 6.466 + ], + [ + -14.461, + -2.1750000000000003 + ], + [ + -14.362, + -6.408 + ], + [ + -9.806000000000001, + -6.0280000000000005 + ], + [ + -0.088, + -5.902 + ], + [ + 14.45, + -5.775 + ], + [ + 13.899, + -6.351 + ], + [ + 13.955, + 6.523 + ], + [ + 12.050999999999998, + 6.017 + ], + [ + 7.241, + 6.017 + ] + ], + "v": [ + [ + 0, + 6.155 + ], + [ + -14.692, + 6.466 + ], + [ + -14.505, + -0.035 + ], + [ + -14.362, + -6.408 + ], + [ + -14.659, + -6.086 + ], + [ + -0.088, + -5.902 + ], + [ + 14.45, + -5.775 + ], + [ + 13.899, + -6.351 + ], + [ + 13.955, + 6.523 + ], + [ + 14.45, + 6.017 + ], + [ + 7.241, + 6.017 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -14.857, + -2.0469999999999997 + ], + [ + -14.692, + 6.466 + ], + [ + -0.253, + 6.788 + ], + [ + 7.076, + 6.914 + ], + [ + 11.995999999999999, + 6.983 + ], + [ + 14.934, + 6.983 + ], + [ + 14.934, + 6.466 + ], + [ + 15, + -6.408 + ], + [ + 15, + -6.983 + ], + [ + 14.45, + -6.983 + ], + [ + -0.121, + -6.903 + ], + [ + -9.839, + -6.719 + ], + [ + -15, + -6.719 + ], + [ + -15, + -6.408 + ] + ], + "o": [ + [ + -14.857, + 0.104 + ], + [ + -14.692, + 6.466 + ], + [ + -0.253, + 6.788 + ], + [ + 9.53, + 6.983 + ], + [ + 14.45, + 6.983 + ], + [ + 14.934, + 6.983 + ], + [ + 14.934, + 6.466 + ], + [ + 15, + -6.408 + ], + [ + 15, + -6.983 + ], + [ + 14.45, + -6.983 + ], + [ + -4.984999999999999, + -6.903 + ], + [ + -14.692, + -6.719 + ], + [ + -15, + -6.719 + ], + [ + -14.978, + -4.222 + ] + ], + "v": [ + [ + -14.857, + 0.104 + ], + [ + -14.692, + 6.466 + ], + [ + -0.253, + 6.788 + ], + [ + 7.076, + 6.914 + ], + [ + 14.45, + 6.983 + ], + [ + 14.934, + 6.983 + ], + [ + 14.934, + 6.466 + ], + [ + 15, + -6.408 + ], + [ + 15, + -6.983 + ], + [ + 14.45, + -6.983 + ], + [ + -0.121, + -6.903 + ], + [ + -14.692, + -6.719 + ], + [ + -15, + -6.719 + ], + [ + -15, + -6.408 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 31, + "s": [ + 0 + ] + }, + { + "t": 76, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 721.5, + 395.062, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0.007, + -6.996 + ], + [ + 18.134, + -7.35 + ], + [ + 17.93, + 0.007 + ], + [ + 17.754, + 4.868 + ], + [ + 18.134, + 6.917 + ], + [ + 6.154, + 6.707 + ], + [ + -17.794, + 6.628 + ], + [ + -17.116, + 7.272 + ], + [ + -17.197, + -7.416 + ], + [ + -17.794, + -6.838 + ], + [ + -11.892, + -6.838 + ] + ], + "o": [ + [ + 0.007, + -6.996 + ], + [ + 18.134, + -7.35 + ], + [ + 17.876, + 2.451 + ], + [ + 17.754, + 7.272 + ], + [ + 12.137, + 6.851 + ], + [ + 0.17, + 6.707 + ], + [ + -17.794, + 6.628 + ], + [ + -17.116, + 7.272 + ], + [ + -17.197, + -7.416 + ], + [ + -14.836, + -6.838 + ], + [ + -8.921, + -6.838 + ] + ], + "v": [ + [ + 0.007, + -6.996 + ], + [ + 18.134, + -7.35 + ], + [ + 17.93, + 0.007 + ], + [ + 17.754, + 7.272 + ], + [ + 18.134, + 6.917 + ], + [ + 0.17, + 6.707 + ], + [ + -17.794, + 6.628 + ], + [ + -17.116, + 7.272 + ], + [ + -17.197, + -7.416 + ], + [ + -17.794, + -6.838 + ], + [ + -8.921, + -6.838 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 18.324, + 2.372 + ], + [ + 18.134, + -7.35 + ], + [ + 0.292, + -7.758 + ], + [ + -8.745, + -7.915 + ], + [ + -14.796, + -7.981 + ], + [ + -18.432, + -7.981 + ], + [ + -18.432, + -7.377 + ], + [ + -18.5, + 7.311 + ], + [ + -18.5, + 7.981 + ], + [ + -17.794, + 7.981 + ], + [ + 0.17, + 7.902 + ], + [ + 12.137, + 7.758 + ], + [ + 18.5, + 7.692 + ], + [ + 18.5, + 7.337 + ] + ], + "o": [ + [ + 18.324, + -0.085 + ], + [ + 18.134, + -7.35 + ], + [ + 0.292, + -7.758 + ], + [ + -11.770999999999999, + -7.981 + ], + [ + -17.822, + -7.981 + ], + [ + -18.432, + -7.981 + ], + [ + -18.432, + -7.377 + ], + [ + -18.5, + 7.311 + ], + [ + -18.5, + 7.981 + ], + [ + -17.794, + 7.981 + ], + [ + 6.154, + 7.902 + ], + [ + 18.134, + 7.692 + ], + [ + 18.5, + 7.692 + ], + [ + 18.473, + 4.853999999999999 + ] + ], + "v": [ + [ + 18.324, + -0.085 + ], + [ + 18.134, + -7.35 + ], + [ + 0.292, + -7.758 + ], + [ + -8.745, + -7.915 + ], + [ + -17.822, + -7.981 + ], + [ + -18.432, + -7.981 + ], + [ + -18.432, + -7.377 + ], + [ + -18.5, + 7.311 + ], + [ + -18.5, + 7.981 + ], + [ + -17.794, + 7.981 + ], + [ + 0.17, + 7.902 + ], + [ + 18.134, + 7.692 + ], + [ + 18.5, + 7.692 + ], + [ + 18.5, + 7.337 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 60, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 75, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 105, + "s": [ + 100 + ] + }, + { + "t": 120, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 603, + 395.062, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + -6.996 + ], + [ + 17.63, + -7.35 + ], + [ + 17.379, + 0.007 + ], + [ + 17.208, + 4.868 + ], + [ + 17.564, + 6.917 + ], + [ + 5.9159999999999995, + 6.707 + ], + [ + -17.406, + 6.628 + ], + [ + -16.745, + 7.272 + ], + [ + -16.745, + -7.416 + ], + [ + -17.34, + -6.838 + ], + [ + -11.581999999999999, + -6.838 + ] + ], + "o": [ + [ + 0, + -6.996 + ], + [ + 17.63, + -7.35 + ], + [ + 17.326, + 2.451 + ], + [ + 17.208, + 7.272 + ], + [ + 11.74, + 6.851 + ], + [ + 0.079, + 6.707 + ], + [ + -17.406, + 6.628 + ], + [ + -16.745, + 7.272 + ], + [ + -16.745, + -7.416 + ], + [ + -14.461, + -6.838 + ], + [ + -8.69, + -6.838 + ] + ], + "v": [ + [ + 0, + -6.996 + ], + [ + 17.63, + -7.35 + ], + [ + 17.379, + 0.007 + ], + [ + 17.208, + 7.272 + ], + [ + 17.564, + 6.917 + ], + [ + 0.079, + 6.707 + ], + [ + -17.406, + 6.628 + ], + [ + -16.745, + 7.272 + ], + [ + -16.745, + -7.416 + ], + [ + -17.34, + -6.838 + ], + [ + -8.69, + -6.838 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 17.881, + 2.372 + ], + [ + 17.63, + -7.35 + ], + [ + 0.357, + -7.758 + ], + [ + -8.439, + -7.915 + ], + [ + -14.341999999999999, + -7.981 + ], + [ + -17.921, + -7.981 + ], + [ + -17.921, + -7.377 + ], + [ + -18, + 7.311 + ], + [ + -18, + 7.981 + ], + [ + -17.34, + 7.981 + ], + [ + 0.145, + 7.902 + ], + [ + 11.806, + 7.758 + ], + [ + 18, + 7.692 + ], + [ + 18, + 7.337 + ] + ], + "o": [ + [ + 17.815, + -0.085 + ], + [ + 17.63, + -7.35 + ], + [ + 0.357, + -7.758 + ], + [ + -11.384, + -7.981 + ], + [ + -17.287, + -7.981 + ], + [ + -17.921, + -7.981 + ], + [ + -17.921, + -7.377 + ], + [ + -18, + 7.311 + ], + [ + -18, + 7.981 + ], + [ + -17.34, + 7.981 + ], + [ + 5.981999999999999, + 7.902 + ], + [ + 17.63, + 7.692 + ], + [ + 18, + 7.692 + ], + [ + 17.974, + 4.853999999999999 + ] + ], + "v": [ + [ + 17.815, + -0.085 + ], + [ + 17.63, + -7.35 + ], + [ + 0.357, + -7.758 + ], + [ + -8.439, + -7.915 + ], + [ + -17.287, + -7.981 + ], + [ + -17.921, + -7.981 + ], + [ + -17.921, + -7.377 + ], + [ + -18, + 7.311 + ], + [ + -18, + 7.981 + ], + [ + -17.34, + 7.981 + ], + [ + 0.145, + 7.902 + ], + [ + 17.63, + 7.692 + ], + [ + 18, + 7.692 + ], + [ + 18, + 7.337 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 21, + "s": [ + 0 + ] + }, + { + "t": 66, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 663, + 450.431, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 18, + -7.482 + ], + [ + -18, + -7.482 + ], + [ + -18, + 7.482 + ], + [ + 18, + 7.482 + ] + ], + "o": [ + [ + 18, + -7.482 + ], + [ + -18, + -7.482 + ], + [ + -18, + 7.482 + ], + [ + 18, + 7.482 + ] + ], + "v": [ + [ + 18, + -7.482 + ], + [ + -18, + -7.482 + ], + [ + -18, + 7.482 + ], + [ + 18, + 7.482 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 7, + "s": [ + 0 + ] + }, + { + "t": 52, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 534, + 152.638, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 10.775, + -11.133 + ], + [ + 15, + -3.783 + ], + [ + 12.732, + -2.483 + ], + [ + 12.154, + -2.013 + ], + [ + 11.733, + -0.979 + ], + [ + 11.759, + -0.185 + ], + [ + 11.759, + 0.44000000000000006 + ], + [ + 11.811, + 1.387 + ], + [ + 12.414, + 2.321 + ], + [ + 14.981, + 3.812 + ], + [ + 10.756, + 11.162 + ], + [ + 8.507, + 9.862 + ], + [ + 7.816000000000001, + 9.587000000000002 + ], + [ + 6.713, + 9.732 + ], + [ + 5.695, + 10.381 + ], + [ + 4.704, + 10.997 + ], + [ + 4.207, + 11.993 + ], + [ + 4.205, + 14.964 + ], + [ + -4.225, + 14.964 + ], + [ + -4.225, + 12.365 + ], + [ + -4.332, + 11.629000000000001 + ], + [ + -5.002999999999999, + 10.742 + ], + [ + -6.074000000000001, + 10.165 + ], + [ + -7.0969999999999995, + 9.615 + ], + [ + -8.212000000000002, + 9.677 + ], + [ + -10.775, + 11.162 + ], + [ + -15, + 3.812 + ], + [ + -12.751, + 2.502 + ], + [ + -12.168000000000001, + 2.045 + ], + [ + -11.748000000000001, + 1.0150000000000001 + ], + [ + -11.778, + 0.235 + ], + [ + -11.778, + -0.401 + ], + [ + -11.828999999999999, + -1.351 + ], + [ + -12.431999999999999, + -2.291 + ], + [ + -15, + -3.783 + ], + [ + -10.795, + -11.172 + ], + [ + -8.556, + -9.872 + ], + [ + -7.866, + -9.593 + ], + [ + -6.763, + -9.732999999999999 + ], + [ + -5.737, + -10.383000000000001 + ], + [ + -4.74, + -10.988 + ], + [ + -4.24, + -11.991 + ], + [ + -4.244, + -14.964 + ], + [ + 4.205, + -14.964 + ], + [ + 4.205, + -12.365 + ], + [ + 4.306, + -11.611 + ], + [ + 4.992999999999999, + -10.703000000000001 + ], + [ + 6.08, + -10.134 + ], + [ + 7.105, + -9.578000000000001 + ], + [ + 8.215000000000002, + -9.647 + ] + ], + "o": [ + [ + 10.775, + -11.133 + ], + [ + 15, + -3.783 + ], + [ + 12.412999999999998, + -2.291 + ], + [ + 11.809999999999999, + -1.351 + ], + [ + 11.759, + -0.401 + ], + [ + 11.759, + 0.22499999999999998 + ], + [ + 11.734, + 1.016 + ], + [ + 12.155000000000001, + 2.047 + ], + [ + 12.732, + 2.512 + ], + [ + 14.981, + 3.812 + ], + [ + 10.756, + 11.162 + ], + [ + 8.184, + 9.677 + ], + [ + 7.074, + 9.615 + ], + [ + 6.055000000000001, + 10.165 + ], + [ + 4.984, + 10.742 + ], + [ + 4.312, + 11.629000000000001 + ], + [ + 4.205, + 12.365 + ], + [ + 4.205, + 14.964 + ], + [ + -4.225, + 14.964 + ], + [ + -4.226999999999999, + 11.993 + ], + [ + -4.723999999999999, + 10.997 + ], + [ + -5.7139999999999995, + 10.381 + ], + [ + -6.734, + 9.732 + ], + [ + -7.843, + 9.587000000000002 + ], + [ + -8.537, + 9.862 + ], + [ + -10.775, + 11.162 + ], + [ + -15, + 3.812 + ], + [ + -12.43, + 2.3169999999999997 + ], + [ + -11.824, + 1.387 + ], + [ + -11.778, + 0.44000000000000006 + ], + [ + -11.778, + -0.195 + ], + [ + -11.752, + -0.979 + ], + [ + -12.173, + -2.013 + ], + [ + -12.751, + -2.483 + ], + [ + -15, + -3.783 + ], + [ + -10.795, + -11.172 + ], + [ + -8.234, + -9.686 + ], + [ + -7.1240000000000006, + -9.617 + ], + [ + -6.101999999999999, + -10.17 + ], + [ + -5.025, + -10.735000000000001 + ], + [ + -4.343999999999999, + -11.622 + ], + [ + -4.244, + -12.365 + ], + [ + -4.244, + -14.964 + ], + [ + 4.205, + -14.964 + ], + [ + 4.202, + -11.984 + ], + [ + 4.706, + -10.963000000000001 + ], + [ + 5.712, + -10.346 + ], + [ + 6.743, + -9.693999999999999 + ], + [ + 7.8469999999999995, + -9.554 + ], + [ + 8.537, + -9.833 + ] + ], + "v": [ + [ + 10.775, + -11.133 + ], + [ + 15, + -3.783 + ], + [ + 12.732, + -2.483 + ], + [ + 11.982, + -1.682 + ], + [ + 11.759, + -0.606 + ], + [ + 11.759, + 0.02 + ], + [ + 11.759, + 0.645 + ], + [ + 11.983, + 1.717 + ], + [ + 12.732, + 2.512 + ], + [ + 14.981, + 3.812 + ], + [ + 10.756, + 11.162 + ], + [ + 8.507, + 9.862 + ], + [ + 7.445, + 9.601 + ], + [ + 6.405, + 9.94 + ], + [ + 5.315, + 10.576 + ], + [ + 4.508, + 11.313 + ], + [ + 4.205, + 12.365 + ], + [ + 4.205, + 14.964 + ], + [ + -4.225, + 14.964 + ], + [ + -4.225, + 12.365 + ], + [ + -4.528, + 11.313 + ], + [ + -5.334, + 10.576 + ], + [ + -6.424, + 9.94 + ], + [ + -7.47, + 9.601 + ], + [ + -8.537, + 9.862 + ], + [ + -10.775, + 11.162 + ], + [ + -15, + 3.812 + ], + [ + -12.751, + 2.502 + ], + [ + -11.996, + 1.716 + ], + [ + -11.778, + 0.645 + ], + [ + -11.778, + 0.02 + ], + [ + -11.778, + -0.606 + ], + [ + -12.001, + -1.682 + ], + [ + -12.751, + -2.483 + ], + [ + -15, + -3.783 + ], + [ + -10.795, + -11.172 + ], + [ + -8.556, + -9.872 + ], + [ + -7.495, + -9.605 + ], + [ + -6.454, + -9.94 + ], + [ + -5.363, + -10.576 + ], + [ + -4.542, + -11.305 + ], + [ + -4.244, + -12.365 + ], + [ + -4.244, + -14.964 + ], + [ + 4.205, + -14.964 + ], + [ + 4.205, + -12.365 + ], + [ + 4.506, + -11.287 + ], + [ + 5.334, + -10.537 + ], + [ + 6.434, + -9.901 + ], + [ + 7.476, + -9.566 + ], + [ + 8.537, + -9.833 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 4.9879999999999995, + 5.02 + ], + [ + 6.9190000000000005, + 1.3940000000000001 + ], + [ + 6.921, + -0.02 + ], + [ + 6.18, + -3.6180000000000003 + ], + [ + 1.83, + -6.94 + ], + [ + -2.706, + -6.532 + ], + [ + -5.869, + -3.9210000000000003 + ], + [ + -7.055, + 0.014000000000000012 + ], + [ + -5.864, + 3.948 + ], + [ + -2.6980000000000004, + 6.556 + ], + [ + 1.377, + 6.957 + ] + ], + "o": [ + [ + 6.5120000000000005, + 2.736 + ], + [ + 6.921, + 0.02 + ], + [ + 6.913, + -1.858 + ], + [ + 3.5860000000000003, + -6.212 + ], + [ + -1.368, + -6.94 + ], + [ + -4.981999999999999, + -5.006 + ], + [ + -6.917, + -1.3830000000000002 + ], + [ + -6.523, + 2.71 + ], + [ + -3.93, + 5.8919999999999995 + ], + [ + -0.014000000000000012, + 7.094 + ], + [ + 3.907, + 5.909 + ] + ], + "v": [ + [ + 5.75, + 3.878 + ], + [ + 6.921, + 0.02 + ], + [ + 6.921, + -0.02 + ], + [ + 4.883, + -4.915 + ], + [ + 0, + -6.94 + ], + [ + -3.844, + -5.769 + ], + [ + -6.393, + -2.652 + ], + [ + -6.789, + 1.362 + ], + [ + -4.897, + 4.92 + ], + [ + -1.356, + 6.825 + ], + [ + 2.642, + 6.433 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 4, + "s": [ + 0 + ] + }, + { + "t": 49, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 63, + 326.226, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 15.657, + 15.013 + ], + [ + 5.329, + 20.95 + ], + [ + 3.502, + 17.771 + ], + [ + 2.849, + 16.962999999999997 + ], + [ + 1.401, + 16.375 + ], + [ + 0, + 16.412 + ], + [ + -0.879, + 16.412 + ], + [ + -1.923, + 16.483 + ], + [ + -3.235, + 17.326 + ], + [ + -5.343, + 20.91 + ], + [ + -15.671, + 15.013 + ], + [ + -13.831, + 11.915 + ], + [ + -13.443999999999999, + 10.951 + ], + [ + -13.647, + 9.411 + ], + [ + -14.562, + 7.981 + ], + [ + -15.416, + 6.595 + ], + [ + -16.822000000000003, + 5.904 + ], + [ + -21, + 5.91 + ], + [ + -21, + -5.896 + ], + [ + -17.347, + -5.896 + ], + [ + -16.306, + -6.033 + ], + [ + -15.059000000000001, + -6.976 + ], + [ + -14.264, + -8.475000000000001 + ], + [ + -13.482, + -9.9 + ], + [ + -13.571, + -11.450999999999999 + ], + [ + -15.671, + -15.04 + ], + [ + -5.288, + -20.95 + ], + [ + -3.447, + -17.798 + ], + [ + -2.7920000000000003, + -16.994 + ], + [ + -1.345, + -16.406000000000002 + ], + [ + -0.23299999999999998, + -16.44 + ], + [ + 0.6460000000000001, + -16.44 + ], + [ + 1.9769999999999999, + -16.512 + ], + [ + 3.2889999999999997, + -17.354 + ], + [ + 5.274, + -20.937 + ], + [ + 15.602, + -15.04 + ], + [ + 13.776, + -11.915 + ], + [ + 13.389, + -10.947000000000001 + ], + [ + 13.593, + -9.4 + ], + [ + 14.503, + -7.9750000000000005 + ], + [ + 15.360999999999999, + -6.581 + ], + [ + 16.767000000000003, + -5.89 + ], + [ + 21, + -5.896 + ], + [ + 21, + 5.91 + ], + [ + 17.292, + 5.91 + ], + [ + 16.28, + 6.052 + ], + [ + 15.06, + 6.965 + ], + [ + 14.256, + 8.450999999999999 + ], + [ + 13.482, + 9.877999999999998 + ], + [ + 13.571, + 11.435 + ] + ], + "o": [ + [ + 15.657, + 15.013 + ], + [ + 5.329, + 20.95 + ], + [ + 3.235, + 17.326 + ], + [ + 1.923, + 16.483 + ], + [ + 0.879, + 16.412 + ], + [ + 0, + 16.412 + ], + [ + -1.401, + 16.375 + ], + [ + -2.849, + 16.962999999999997 + ], + [ + -3.502, + 17.771 + ], + [ + -5.343, + 20.91 + ], + [ + -15.671, + 15.013 + ], + [ + -13.571, + 11.463999999999999 + ], + [ + -13.482, + 9.913 + ], + [ + -14.264, + 8.489 + ], + [ + -15.059000000000001, + 6.989999999999999 + ], + [ + -16.306, + 6.047 + ], + [ + -17.347, + 5.91 + ], + [ + -21, + 5.91 + ], + [ + -21, + -5.896 + ], + [ + -16.822000000000003, + -5.89 + ], + [ + -15.416, + -6.581 + ], + [ + -14.562, + -7.9670000000000005 + ], + [ + -13.647, + -9.397 + ], + [ + -13.443999999999999, + -10.938 + ], + [ + -13.831, + -11.902 + ], + [ + -15.671, + -15.04 + ], + [ + -5.288, + -20.95 + ], + [ + -3.178, + -17.354999999999997 + ], + [ + -1.866, + -16.514000000000003 + ], + [ + -0.536, + -16.44 + ], + [ + 0.34299999999999997, + -16.44 + ], + [ + 1.455, + -16.405 + ], + [ + 2.903, + -16.991999999999997 + ], + [ + 3.557, + -17.798 + ], + [ + 5.274, + -20.937 + ], + [ + 15.602, + -15.04 + ], + [ + 13.516, + -11.462 + ], + [ + 13.427, + -9.905 + ], + [ + 14.202, + -8.478 + ], + [ + 15.004000000000001, + -6.976 + ], + [ + 16.250999999999998, + -6.033 + ], + [ + 17.292, + -5.896 + ], + [ + 21, + -5.896 + ], + [ + 21, + 5.91 + ], + [ + 16.781000000000002, + 5.91 + ], + [ + 15.412, + 6.584 + ], + [ + 14.558, + 7.948 + ], + [ + 13.647, + 9.373 + ], + [ + 13.443999999999999, + 10.92 + ], + [ + 13.831, + 11.888 + ] + ], + "v": [ + [ + 15.657, + 15.013 + ], + [ + 5.329, + 20.95 + ], + [ + 3.502, + 17.771 + ], + [ + 2.386, + 16.723 + ], + [ + 0.879, + 16.412 + ], + [ + 0, + 16.412 + ], + [ + -0.879, + 16.412 + ], + [ + -2.386, + 16.723 + ], + [ + -3.502, + 17.771 + ], + [ + -5.343, + 20.91 + ], + [ + -15.671, + 15.013 + ], + [ + -13.831, + 11.915 + ], + [ + -13.463, + 10.432 + ], + [ + -13.94, + 8.981 + ], + [ + -14.833, + 7.459 + ], + [ + -15.861, + 6.321 + ], + [ + -17.347, + 5.91 + ], + [ + -21, + 5.91 + ], + [ + -21, + -5.896 + ], + [ + -17.347, + -5.896 + ], + [ + -15.861, + -6.307 + ], + [ + -14.833, + -7.445 + ], + [ + -13.94, + -8.967 + ], + [ + -13.463, + -10.419 + ], + [ + -13.831, + -11.902 + ], + [ + -15.671, + -15.04 + ], + [ + -5.288, + -20.95 + ], + [ + -3.447, + -17.798 + ], + [ + -2.329, + -16.754 + ], + [ + -0.824, + -16.44 + ], + [ + 0.055, + -16.44 + ], + [ + 0.934, + -16.44 + ], + [ + 2.44, + -16.752 + ], + [ + 3.557, + -17.798 + ], + [ + 5.274, + -20.937 + ], + [ + 15.602, + -15.04 + ], + [ + 13.776, + -11.915 + ], + [ + 13.408, + -10.426 + ], + [ + 13.886, + -8.967 + ], + [ + 14.778, + -7.445 + ], + [ + 15.806, + -6.307 + ], + [ + 17.292, + -5.896 + ], + [ + 21, + -5.896 + ], + [ + 21, + 5.91 + ], + [ + 17.292, + 5.91 + ], + [ + 15.846, + 6.318 + ], + [ + 14.833, + 7.418 + ], + [ + 13.94, + 8.94 + ], + [ + 13.463, + 10.399 + ], + [ + 13.831, + 11.888 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -7.055, + 6.981 + ], + [ + -1.938, + 9.677 + ], + [ + 0, + 9.674 + ], + [ + 5.056, + 8.663 + ], + [ + 9.75, + 2.621 + ], + [ + 9.217, + -3.7259999999999995 + ], + [ + 5.559, + -8.177 + ], + [ + 0.018000000000000016, + -9.861999999999998 + ], + [ + -5.535, + -8.21 + ], + [ + -9.22, + -3.783 + ], + [ + -9.791, + 1.924 + ] + ], + "o": [ + [ + -3.833, + 9.109 + ], + [ + 0, + 9.674 + ], + [ + 2.58, + 9.674 + ], + [ + 8.716000000000001, + 5.063000000000001 + ], + [ + 9.779, + -1.849 + ], + [ + 7.083, + -6.926 + ], + [ + 1.987, + -9.661000000000001 + ], + [ + -3.7859999999999996, + -9.128 + ], + [ + -8.283, + -5.508 + ], + [ + -9.982000000000001, + -0.02499999999999991 + ], + [ + -8.311, + 5.465999999999999 + ] + ], + "v": [ + [ + -5.444, + 8.045 + ], + [ + 0, + 9.674 + ], + [ + 0, + 9.674 + ], + [ + 6.886, + 6.863 + ], + [ + 9.765, + 0.068 + ], + [ + 8.15, + -5.326 + ], + [ + 3.773, + -8.919 + ], + [ + -1.884, + -9.495 + ], + [ + -6.909, + -6.859 + ], + [ + -9.601, + -1.904 + ], + [ + -9.051, + 3.695 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 37, + "s": [ + 0 + ] + }, + { + "t": 82, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 382.5, + 64.347, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 21.17, + 6.063 + ], + [ + 14.799, + 16.311 + ], + [ + 11.686, + 14.413 + ], + [ + 10.713, + 13.993 + ], + [ + 9.134, + 14.138 + ], + [ + 8.175, + 14.705 + ], + [ + 7.380000000000001, + 15.133 + ], + [ + 6.226, + 15.822 + ], + [ + 5.469, + 17.212 + ], + [ + 5.334, + 21.449 + ], + [ + -6.682, + 21.07 + ], + [ + -6.565, + 17.371 + ], + [ + -6.686999999999999, + 16.315 + ], + [ + -7.609999999999999, + 15.022 + ], + [ + -9.106000000000002, + 14.141 + ], + [ + -10.536, + 13.313 + ], + [ + -12.113, + 13.357000000000001 + ], + [ + -15.827, + 15.347 + ], + [ + -21.5, + 4.72 + ], + [ + -18.271, + 2.929 + ], + [ + -17.429000000000002, + 2.295 + ], + [ + -16.768, + 0.859 + ], + [ + -16.777, + -0.872 + ], + [ + -16.776999999999997, + -2.5269999999999997 + ], + [ + -17.604, + -3.879 + ], + [ + -21.18, + -6.112 + ], + [ + -14.847, + -16.359 + ], + [ + -11.696, + -14.413 + ], + [ + -10.729, + -13.989 + ], + [ + -9.158, + -14.136000000000001 + ], + [ + -8.204, + -14.705 + ], + [ + -7.4190000000000005, + -15.123 + ], + [ + -6.254, + -15.821000000000002 + ], + [ + -5.498, + -17.220000000000002 + ], + [ + -5.363, + -21.449 + ], + [ + 6.643, + -21.079 + ], + [ + 6.527, + -17.381 + ], + [ + 6.657, + -16.329 + ], + [ + 7.574999999999999, + -15.036999999999999 + ], + [ + 9.072999999999999, + -14.162 + ], + [ + 10.5, + -13.32 + ], + [ + 12.081999999999999, + -13.365 + ], + [ + 15.788, + -15.357 + ], + [ + 21.5, + -4.73 + ], + [ + 18.261, + -2.978 + ], + [ + 17.422, + -2.346 + ], + [ + 16.759999999999998, + -0.916 + ], + [ + 16.767, + 0.8130000000000001 + ], + [ + 16.764, + 2.472 + ], + [ + 17.592, + 3.83 + ] + ], + "o": [ + [ + 21.17, + 6.063 + ], + [ + 14.799, + 16.311 + ], + [ + 11.232, + 14.138 + ], + [ + 9.653, + 13.993 + ], + [ + 8.427999999999999, + 14.569 + ], + [ + 7.651, + 14.997000000000002 + ], + [ + 6.6370000000000005, + 15.475999999999999 + ], + [ + 5.636, + 16.7 + ], + [ + 5.45, + 17.741 + ], + [ + 5.334, + 21.449 + ], + [ + -6.682, + 21.07 + ], + [ + -6.5520000000000005, + 16.84 + ], + [ + -7.221, + 15.397 + ], + [ + -8.631, + 14.452 + ], + [ + -10.030000000000001, + 13.494000000000002 + ], + [ + -11.588, + 13.245 + ], + [ + -12.578, + 13.605 + ], + [ + -15.827, + 15.347 + ], + [ + -21.5, + 4.72 + ], + [ + -17.811, + 2.6719999999999997 + ], + [ + -16.903, + 1.379 + ], + [ + -16.797, + -0.26999999999999996 + ], + [ + -16.676000000000002, + -1.998 + ], + [ + -17.245, + -3.477 + ], + [ + -18.048, + -4.165 + ], + [ + -21.18, + -6.112 + ], + [ + -14.847, + -16.359 + ], + [ + -11.247, + -14.136000000000001 + ], + [ + -9.675, + -13.989 + ], + [ + -8.456999999999999, + -14.569 + ], + [ + -7.68, + -14.997000000000002 + ], + [ + -6.665, + -15.47 + ], + [ + -5.664, + -16.705000000000002 + ], + [ + -5.479, + -17.751 + ], + [ + -5.363, + -21.449 + ], + [ + 6.643, + -21.079 + ], + [ + 6.5200000000000005, + -16.851 + ], + [ + 7.191000000000001, + -15.413 + ], + [ + 8.564, + -14.487 + ], + [ + 9.992999999999999, + -13.502 + ], + [ + 11.556000000000001, + -13.251999999999999 + ], + [ + 12.549, + -13.615 + ], + [ + 15.788, + -15.357 + ], + [ + 21.5, + -4.73 + ], + [ + 17.803, + -2.7220000000000004 + ], + [ + 16.895999999999997, + -1.434 + ], + [ + 16.787, + 0.21199999999999997 + ], + [ + 16.663999999999998, + 1.941 + ], + [ + 17.232000000000003, + 3.4259999999999997 + ], + [ + 18.038, + 4.117 + ] + ], + "v": [ + [ + 21.17, + 6.063 + ], + [ + 14.799, + 16.311 + ], + [ + 11.686, + 14.413 + ], + [ + 10.183, + 13.993 + ], + [ + 8.68, + 14.413 + ], + [ + 7.913, + 14.851 + ], + [ + 7.118, + 15.26 + ], + [ + 5.931, + 16.261 + ], + [ + 5.45, + 17.741 + ], + [ + 5.334, + 21.449 + ], + [ + -6.682, + 21.07 + ], + [ + -6.565, + 17.371 + ], + [ + -6.954, + 15.856 + ], + [ + -8.078, + 14.773 + ], + [ + -9.601, + 13.8 + ], + [ + -11.062, + 13.279 + ], + [ + -12.578, + 13.605 + ], + [ + -15.827, + 15.347 + ], + [ + -21.5, + 4.72 + ], + [ + -18.271, + 2.929 + ], + [ + -17.166, + 1.837 + ], + [ + -16.777, + 0.331 + ], + [ + -16.719, + -1.47 + ], + [ + -17.011, + -3.002 + ], + [ + -18.048, + -4.165 + ], + [ + -21.18, + -6.112 + ], + [ + -14.847, + -16.359 + ], + [ + -11.696, + -14.413 + ], + [ + -10.202, + -13.989 + ], + [ + -8.709, + -14.413 + ], + [ + -7.942, + -14.851 + ], + [ + -7.147, + -15.25 + ], + [ + -5.959, + -16.263 + ], + [ + -5.479, + -17.751 + ], + [ + -5.363, + -21.449 + ], + [ + 6.643, + -21.079 + ], + [ + 6.527, + -17.381 + ], + [ + 6.924, + -15.871 + ], + [ + 8.039, + -14.783 + ], + [ + 9.562, + -13.81 + ], + [ + 11.028, + -13.286 + ], + [ + 12.549, + -13.615 + ], + [ + 15.788, + -15.357 + ], + [ + 21.5, + -4.73 + ], + [ + 18.261, + -2.978 + ], + [ + 17.159, + -1.89 + ], + [ + 16.767, + -0.389 + ], + [ + 16.709, + 1.411 + ], + [ + 16.998, + 2.949 + ], + [ + 18.038, + 4.117 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -2.858, + 9.637 + ], + [ + 2.968, + 9.623 + ], + [ + 6.833, + 7.257 + ], + [ + 9.084999999999999, + 4.093999999999999 + ], + [ + 9.959999999999999, + 0.30599999999999994 + ], + [ + 9.321, + -3.5280000000000005 + ], + [ + 6.381, + -7.802999999999999 + ], + [ + 0.9940000000000001, + -10.028 + ], + [ + -4.7170000000000005, + -8.875 + ], + [ + -8.827, + -4.731 + ], + [ + -9.95, + 1.0050000000000001 + ], + [ + -7.709, + 6.4 + ] + ], + "o": [ + [ + 1.0179999999999998, + 10.015 + ], + [ + 5.824, + 8.088 + ], + [ + 8.471, + 5.2490000000000006 + ], + [ + 9.833, + 1.6099999999999999 + ], + [ + 9.702, + -2.276 + ], + [ + 7.789, + -6.393000000000001 + ], + [ + 2.9450000000000003, + -9.641 + ], + [ + -2.88, + -9.639999999999999 + ], + [ + -7.725, + -6.393000000000001 + ], + [ + -9.953000000000001, + -0.9910000000000001 + ], + [ + -8.815999999999999, + 4.743 + ], + [ + -4.695, + 8.876 + ] + ], + "v": [ + [ + -0.92, + 9.826 + ], + [ + 4.684, + 8.7 + ], + [ + 7.652, + 6.253 + ], + [ + 9.459, + 2.852 + ], + [ + 9.831, + -0.985 + ], + [ + 8.709, + -4.671 + ], + [ + 4.663, + -8.722 + ], + [ + -0.943, + -9.834 + ], + [ + -6.221, + -7.634 + ], + [ + -9.39, + -2.861 + ], + [ + -9.383, + 2.874 + ], + [ + -6.202, + 7.638 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + } + ] + } + ], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 3, + "nm": "▽ Group 23322", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 500, + 500, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 462, + 256.5, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 2, + "ty": 3, + "nm": "▽ freepik--Gears--inject-52", + "parent": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 471.056, + 253.86, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 382.479, + 204.101, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Ellipse 20", + "parent": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 70, + "s": [ + 0 + ] + }, + { + "t": 90, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 635.922, + 128.741, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 70, + "s": [ + 0, + 0, + 100 + ] + }, + { + "t": 90, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6, + "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 4;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 21, + 21 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Ellipse 20", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Vector", + "parent": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 13, + "s": [ + 0 + ] + }, + { + "t": 33, + "s": [ + 100 + ] + } + ], + "ix": 11, + "x": "var $bm_rt;\n$bm_rt = transform.opacity;" + }, + "r": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 30, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0 + ] + }, + "t": 70, + "s": [ + 45 + ] + }, + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 100, + "s": [ + 45 + ] + }, + { + "t": 130, + "s": [ + -15 + ] + } + ], + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 636.959, + 127.795, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 13, + "s": [ + 0, + 0, + 100 + ] + }, + { + "t": 33, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6, + "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 28.446, + 19.443 + ], + [ + 32.709, + 11.382 + ], + [ + 42.314, + 6.444 + ], + [ + 42.666, + -5.399 + ], + [ + 33.578, + -6.347 + ], + [ + 31, + -14.91 + ], + [ + 34.52, + -25.271 + ], + [ + 26.292, + -33.897 + ], + [ + 19.224, + -28.166 + ], + [ + 11.344000000000001, + -32.622 + ], + [ + 6.485, + -42.27 + ], + [ + -5.416, + -42.584 + ], + [ + -6.321, + -33.965 + ], + [ + -15.340000000000002, + -31.514000000000003 + ], + [ + -25.342, + -34.465 + ], + [ + -33.982, + -26.256 + ], + [ + -28.88, + -19.958 + ], + [ + -33.702, + -11.582 + ], + [ + -42.352, + -6.466 + ], + [ + -42.666, + 5.414 + ], + [ + -34.976, + 6.242 + ], + [ + -32.297, + 15.693000000000001 + ], + [ + -34.565, + 25.316 + ], + [ + -26.337, + 33.927 + ], + [ + -20.271, + 29.025 + ], + [ + -11.686, + 33.657000000000004 + ], + [ + -6.485, + 42.27 + ], + [ + 5.416, + 42.584 + ], + [ + 6.276, + 34.42 + ], + [ + 15.305, + 31.618 + ], + [ + 25.335, + 34.465 + ], + [ + 33.982, + 26.256 + ] + ], + "o": [ + [ + 30.969, + 15.644000000000002 + ], + [ + 33.563, + 6.906 + ], + [ + 42.314, + 6.444 + ], + [ + 42.666, + -5.399 + ], + [ + 32.712, + -10.734 + ], + [ + 28.536, + -18.645 + ], + [ + 34.52, + -25.271 + ], + [ + 26.292, + -33.897 + ], + [ + 15.523, + -30.77 + ], + [ + 6.926, + -33.614 + ], + [ + 6.485, + -42.27 + ], + [ + -5.416, + -42.584 + ], + [ + -10.931999999999999, + -33.199000000000005 + ], + [ + -19.283, + -29.01 + ], + [ + -25.342, + -34.465 + ], + [ + -33.982, + -26.256 + ], + [ + -31.721999999999998, + -16.048 + ], + [ + -34.692, + -6.854 + ], + [ + -42.352, + -6.466 + ], + [ + -42.666, + 5.414 + ], + [ + -34.153, + 11.084 + ], + [ + -29.531, + 19.756 + ], + [ + -34.565, + 25.316 + ], + [ + -26.337, + 33.927 + ], + [ + -16.25, + 31.784999999999997 + ], + [ + -6.882, + 34.517 + ], + [ + -6.485, + 42.27 + ], + [ + 5.416, + 42.584 + ], + [ + 10.91, + 33.485 + ], + [ + 19.194, + 28.935 + ], + [ + 25.335, + 34.465 + ], + [ + 33.982, + 26.256 + ] + ], + "v": [ + [ + 28.446, + 19.443 + ], + [ + 33.563, + 6.906 + ], + [ + 42.314, + 6.444 + ], + [ + 42.666, + -5.399 + ], + [ + 33.578, + -6.347 + ], + [ + 28.536, + -18.645 + ], + [ + 34.52, + -25.271 + ], + [ + 26.292, + -33.897 + ], + [ + 19.224, + -28.166 + ], + [ + 6.926, + -33.614 + ], + [ + 6.485, + -42.27 + ], + [ + -5.416, + -42.584 + ], + [ + -6.321, + -33.965 + ], + [ + -19.283, + -29.01 + ], + [ + -25.342, + -34.465 + ], + [ + -33.982, + -26.256 + ], + [ + -28.88, + -19.958 + ], + [ + -34.692, + -6.854 + ], + [ + -42.352, + -6.466 + ], + [ + -42.666, + 5.414 + ], + [ + -34.976, + 6.242 + ], + [ + -29.531, + 19.756 + ], + [ + -34.565, + 25.316 + ], + [ + -26.337, + 33.927 + ], + [ + -20.271, + 29.025 + ], + [ + -6.882, + 34.517 + ], + [ + -6.485, + 42.27 + ], + [ + 5.416, + 42.584 + ], + [ + 6.276, + 34.42 + ], + [ + 19.194, + 28.935 + ], + [ + 25.335, + 34.465 + ], + [ + 33.982, + 26.256 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "rd", + "nm": "Round Corners 1", + "r": { + "a": 0, + "k": 2, + "ix": 1 + }, + "ix": 2, + "mn": "ADBE Vector Filter - RC", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.25, + 0.25, + 0.25, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "?", + "parent": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 70, + "s": [ + 0 + ] + }, + { + "t": 90, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 128.922, + 128.318, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 70, + "s": [ + 0, + 0, + 100 + ] + }, + { + "t": 90, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6, + "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 4;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -6.958, + 3.327 + ], + [ + -5.8839999999999995, + 4.9430000000000005 + ], + [ + -0.428, + 4.16 + ], + [ + 5.968, + 2.033 + ], + [ + 10.5, + -3.752 + ], + [ + 10.231000000000002, + -9.450999999999999 + ], + [ + 8.435, + -12.854 + ], + [ + 5.196, + -15.27 + ], + [ + 0.6799999999999999, + -16.461 + ], + [ + -3.769, + -16.359 + ], + [ + -7.042, + -15.644 + ], + [ + -9.325, + -14.402000000000001 + ], + [ + -10.5, + -12.684 + ], + [ + -10.349, + -10.693 + ], + [ + -9.308, + -9.281 + ], + [ + -7.042, + -9.962 + ], + [ + -3.1639999999999997, + -10.948 + ], + [ + 1.6199999999999999, + -10.506 + ], + [ + 3.802, + -7.784 + ], + [ + 3.4, + -4.33 + ], + [ + 0.663, + -2.186 + ], + [ + -4.558, + -0.893 + ], + [ + -6.086, + -0.33099999999999996 + ], + [ + -7.126, + 1.08 + ] + ], + "o": [ + [ + -6.286, + 4.483 + ], + [ + -5.414, + 5.283 + ], + [ + 3.231, + 3.309 + ], + [ + 9.594, + -1.403 + ], + [ + 10.5, + -8.141 + ], + [ + 9.190000000000001, + -11.833 + ], + [ + 6.421, + -14.59 + ], + [ + 2.308, + -16.222 + ], + [ + -2.509, + -16.461 + ], + [ + -6.051, + -15.951 + ], + [ + -8.687000000000001, + -14.862 + ], + [ + -10.265, + -13.314 + ], + [ + -10.5, + -11.288 + ], + [ + -9.711, + -9.707 + ], + [ + -8.065999999999999, + -9.485 + ], + [ + -4.49, + -10.744 + ], + [ + 0.19300000000000006, + -10.948 + ], + [ + 3.3659999999999997, + -8.77 + ], + [ + 3.802, + -5.367999999999999 + ], + [ + 1.8219999999999998, + -2.7640000000000002 + ], + [ + -0.881, + -1.812 + ], + [ + -5.431, + -0.655 + ], + [ + -6.925000000000001, + 0.485 + ], + [ + -7.126, + 2.646 + ] + ], + "v": [ + [ + -6.622, + 3.905 + ], + [ + -5.414, + 5.283 + ], + [ + -0.428, + 4.16 + ], + [ + 7.781, + 0.332 + ], + [ + 10.5, + -6.712 + ], + [ + 9.694, + -10.642 + ], + [ + 7.428, + -13.705 + ], + [ + 3.752, + -15.746 + ], + [ + -1.133, + -16.461 + ], + [ + -4.91, + -16.155 + ], + [ + -7.881, + -15.236 + ], + [ + -9.795, + -13.858 + ], + [ + -10.5, + -11.969 + ], + [ + -10.047, + -10.183 + ], + [ + -8.838, + -8.907 + ], + [ + -5.766, + -10.336 + ], + [ + -1.788, + -10.948 + ], + [ + 2.493, + -9.621 + ], + [ + 3.802, + -6.661 + ], + [ + 2.594, + -3.547 + ], + [ + -0.881, + -1.812 + ], + [ + -4.558, + -0.893 + ], + [ + -6.522, + 0.077 + ], + [ + -7.126, + 1.863 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -4.809, + 9.077 + ], + [ + -6.572, + 11.51 + ], + [ + -6.219, + 14.639999999999999 + ], + [ + -3.8689999999999998, + 16.461 + ], + [ + -0.579, + 16.104 + ], + [ + 1.183, + 13.722 + ], + [ + 0.831, + 10.575000000000001 + ], + [ + -1.519, + 8.703 + ] + ], + "o": [ + [ + -6.219, + 10.575000000000001 + ], + [ + -6.572, + 13.722 + ], + [ + -4.809, + 16.104 + ], + [ + -1.519, + 16.461 + ], + [ + 0.831, + 14.639999999999999 + ], + [ + 1.183, + 11.51 + ], + [ + -0.579, + 9.077 + ], + [ + -3.8689999999999998, + 8.703 + ] + ], + "v": [ + [ + -5.514, + 9.826 + ], + [ + -6.572, + 12.633 + ], + [ + -5.514, + 15.389 + ], + [ + -2.694, + 16.461 + ], + [ + 0.126, + 15.389 + ], + [ + 1.183, + 12.633 + ], + [ + 0.126, + 9.826 + ], + [ + -2.694, + 8.703 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "?", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Vector", + "parent": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 7, + "s": [ + 0 + ] + }, + { + "t": 37, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.333 + ], + "y": [ + 0 + ] + }, + "t": 30, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.299 + ], + "y": [ + 0 + ] + }, + "t": 71, + "s": [ + 45 + ] + }, + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.415 + ], + "y": [ + 0.26 + ] + }, + "t": 102, + "s": [ + 45 + ] + }, + { + "t": 131, + "s": [ + -15 + ] + } + ], + "ix": 10, + "x": "var $bm_rt;\nvar e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\ne = 0.7;\ng = 5000;\nnMax = 9;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n}\nif (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}" + }, + "p": { + "a": 0, + "k": [ + 127.953, + 127.706, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 7, + "s": [ + 0, + 0, + 100 + ] + }, + { + "t": 27, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6, + "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 28.461, + 19.473 + ], + [ + 32.724000000000004, + 11.411999999999999 + ], + [ + 42.337, + 6.503 + ], + [ + 42.651, + -5.369 + ], + [ + 33.563, + -6.317 + ], + [ + 30.985, + -14.879999999999999 + ], + [ + 34.505, + -25.241 + ], + [ + 26.315, + -33.868 + ], + [ + 19.239, + -28.137 + ], + [ + 11.337, + -32.608 + ], + [ + 6.463, + -42.255 + ], + [ + -5.438, + -42.569 + ], + [ + -6.343, + -33.95 + ], + [ + -15.363000000000001, + -31.499000000000002 + ], + [ + -25.365, + -34.45 + ], + [ + -34.004, + -26.241 + ], + [ + -28.873, + -19.928 + ], + [ + -33.688, + -11.551 + ], + [ + -42.337, + -6.436 + ], + [ + -42.651, + 5.444 + ], + [ + -34.962, + 6.272 + ], + [ + -32.278999999999996, + 15.722000000000001 + ], + [ + -34.55, + 25.346 + ], + [ + -26.322, + 33.957 + ], + [ + -20.256, + 29.054 + ], + [ + -11.671, + 33.687 + ], + [ + -6.433, + 42.255 + ], + [ + 5.423, + 42.569 + ], + [ + 6.283, + 34.405 + ], + [ + 15.315, + 31.633 + ], + [ + 25.35, + 34.494 + ], + [ + 33.997, + 26.286 + ] + ], + "o": [ + [ + 30.983999999999998, + 15.674 + ], + [ + 33.578, + 6.936 + ], + [ + 42.337, + 6.503 + ], + [ + 42.651, + -5.369 + ], + [ + 32.697, + -10.704 + ], + [ + 28.521, + -18.615 + ], + [ + 34.505, + -25.241 + ], + [ + 26.315, + -33.868 + ], + [ + 15.529, + -30.752000000000002 + ], + [ + 6.904, + -33.599 + ], + [ + 6.463, + -42.255 + ], + [ + -5.438, + -42.569 + ], + [ + -10.954, + -33.184000000000005 + ], + [ + -19.306, + -28.995 + ], + [ + -25.365, + -34.45 + ], + [ + -34.004, + -26.241 + ], + [ + -31.71, + -16.016000000000002 + ], + [ + -34.677, + -6.824 + ], + [ + -42.337, + -6.436 + ], + [ + -42.651, + 5.444 + ], + [ + -34.137, + 11.113 + ], + [ + -29.516, + 19.786 + ], + [ + -34.55, + 25.346 + ], + [ + -26.322, + 33.957 + ], + [ + -16.235, + 31.814 + ], + [ + -6.867, + 34.547 + ], + [ + -6.433, + 42.255 + ], + [ + 5.423, + 42.569 + ], + [ + 10.916, + 33.484 + ], + [ + 19.209, + 28.965 + ], + [ + 25.35, + 34.494 + ], + [ + 33.997, + 26.286 + ] + ], + "v": [ + [ + 28.461, + 19.473 + ], + [ + 33.578, + 6.936 + ], + [ + 42.337, + 6.503 + ], + [ + 42.651, + -5.369 + ], + [ + 33.563, + -6.317 + ], + [ + 28.521, + -18.615 + ], + [ + 34.505, + -25.241 + ], + [ + 26.315, + -33.868 + ], + [ + 19.239, + -28.137 + ], + [ + 6.904, + -33.599 + ], + [ + 6.463, + -42.255 + ], + [ + -5.438, + -42.569 + ], + [ + -6.343, + -33.95 + ], + [ + -19.306, + -28.995 + ], + [ + -25.365, + -34.45 + ], + [ + -34.004, + -26.241 + ], + [ + -28.873, + -19.928 + ], + [ + -34.677, + -6.824 + ], + [ + -42.337, + -6.436 + ], + [ + -42.651, + 5.444 + ], + [ + -34.962, + 6.272 + ], + [ + -29.516, + 19.786 + ], + [ + -34.55, + 25.346 + ], + [ + -26.322, + 33.957 + ], + [ + -20.256, + 29.054 + ], + [ + -6.867, + 34.547 + ], + [ + -6.433, + 42.255 + ], + [ + 5.423, + 42.569 + ], + [ + 6.283, + 34.405 + ], + [ + 19.209, + 28.965 + ], + [ + 25.35, + 34.494 + ], + [ + 33.997, + 26.286 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "rd", + "nm": "Round Corners 1", + "r": { + "a": 0, + "k": 2, + "ix": 1 + }, + "ix": 2, + "mn": "ADBE Vector Filter - RC", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.3465, + 0.3146, + 0.3135, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "!", + "parent": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 70, + "s": [ + 0 + ] + }, + { + "t": 90, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 385.422, + 253.085, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 70, + "s": [ + 0, + 0, + 100 + ] + }, + { + "t": 90, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6, + "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 4;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 4.178, + -10.969 + ], + [ + 4.286, + -16.639999999999997 + ], + [ + 3.918, + -20.246 + ], + [ + 1.4289999999999998, + -21.948 + ], + [ + -3.096, + -21.517 + ], + [ + -4.4590000000000005, + -16.685 + ], + [ + -4.308, + -9.267 + ], + [ + -4.026, + -2.008 + ], + [ + -3.637, + 3.958 + ], + [ + -3.009, + 6.680999999999999 + ], + [ + -0.974, + 7.52 + ], + [ + 1.017, + 7.452 + ], + [ + 2.771, + 6.907 + ], + [ + 3.5060000000000002, + 2.7560000000000002 + ], + [ + 3.9389999999999996, + -4.2299999999999995 + ] + ], + "o": [ + [ + 4.264, + -15.007 + ], + [ + 4.286, + -19.226 + ], + [ + 2.4459999999999997, + -21.608 + ], + [ + -1.5579999999999998, + -21.948 + ], + [ + -4.481, + -18.84 + ], + [ + -4.373, + -11.739999999999998 + ], + [ + -4.134, + -4.322 + ], + [ + -3.766, + 2.302 + ], + [ + -3.3770000000000002, + 6.045 + ], + [ + -1.754, + 7.361999999999999 + ], + [ + 0.454, + 7.52 + ], + [ + 2.2720000000000002, + 7.135 + ], + [ + 3.333, + 4.82 + ], + [ + 3.809, + -1.917 + ], + [ + 4.1129999999999995, + -8.812999999999999 + ] + ], + "v": [ + [ + 4.221, + -12.965 + ], + [ + 4.286, + -17.865 + ], + [ + 3.182, + -20.927 + ], + [ + 0.13, + -21.948 + ], + [ + -4.481, + -20.655 + ], + [ + -4.416, + -14.19 + ], + [ + -4.221, + -6.772 + ], + [ + -3.896, + 0.17 + ], + [ + -3.507, + 5.138 + ], + [ + -2.403, + 7.044 + ], + [ + -0.065, + 7.52 + ], + [ + 1.623, + 7.316 + ], + [ + 3.117, + 6.635 + ], + [ + 3.636, + 0.442 + ], + [ + 4.026, + -6.499 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -2.7270000000000003, + 12.103000000000002 + ], + [ + -5, + 15.279 + ], + [ + -4.545, + 19.520999999999997 + ], + [ + -1.515, + 21.948 + ], + [ + 2.7270000000000003, + 21.471999999999998 + ], + [ + 5, + 18.273 + ], + [ + 4.545, + 14.054 + ], + [ + 1.515, + 11.603 + ] + ], + "o": [ + [ + -4.545, + 14.054 + ], + [ + -5, + 18.273 + ], + [ + -2.7270000000000003, + 21.471999999999998 + ], + [ + 1.515, + 21.948 + ], + [ + 4.545, + 19.520999999999997 + ], + [ + 5, + 15.279 + ], + [ + 2.7270000000000003, + 12.103000000000002 + ], + [ + -1.515, + 11.603 + ] + ], + "v": [ + [ + -3.636, + 13.101 + ], + [ + -5, + 16.776 + ], + [ + -3.636, + 20.519 + ], + [ + 0, + 21.948 + ], + [ + 3.636, + 20.519 + ], + [ + 5, + 16.776 + ], + [ + 3.636, + 13.101 + ], + [ + 0, + 11.603 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "!", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Vector", + "parent": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 0, + "s": [ + 0 + ] + }, + { + "t": 30, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 30, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0 + ] + }, + "t": 70, + "s": [ + -45 + ] + }, + { + "i": { + "x": [ + 0.667 + ], + "y": [ + 1 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 102, + "s": [ + -45 + ] + }, + { + "t": 131, + "s": [ + 15 + ] + } + ], + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 382.916, + 253.274, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 0, + "s": [ + 0, + 0, + 100 + ] + }, + { + "t": 20, + "s": [ + 100, + 100, + 100 + ] + } + ], + "ix": 6, + "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 39.292, + 16.861 + ], + [ + 42.065, + 8.876 + ], + [ + 51.777, + 3.757 + ], + [ + 51.777, + -4.071 + ], + [ + 42.471, + -5.003 + ], + [ + 40.902, + -13.274999999999999 + ], + [ + 46.772, + -22.54 + ], + [ + 42.853, + -29.323 + ], + [ + 34.341, + -25.487 + ], + [ + 28.778, + -31.863000000000003 + ], + [ + 29.187, + -42.83 + ], + [ + 22.403, + -46.747 + ], + [ + 16.95, + -39.188 + ], + [ + 8.95, + -41.952000000000005 + ], + [ + 3.815, + -51.643 + ], + [ + -4.024, + -51.643 + ], + [ + -4.944, + -42.382 + ], + [ + -13.248999999999999, + -40.803999999999995 + ], + [ + -22.545, + -46.65 + ], + [ + -29.337, + -42.733 + ], + [ + -25.552, + -34.263 + ], + [ + -31.948000000000004, + -28.718 + ], + [ + -42.935, + -29.129 + ], + [ + -46.862, + -22.361 + ], + [ + -39.277, + -16.928 + ], + [ + -42.049, + -8.938 + ], + [ + -51.777, + -3.817 + ], + [ + -51.777, + 4.004 + ], + [ + -42.449, + 4.959 + ], + [ + -40.852000000000004, + 13.256 + ], + [ + -46.705, + 22.54 + ], + [ + -42.801, + 29.256 + ], + [ + -34.296, + 25.495 + ], + [ + -28.732, + 31.866000000000003 + ], + [ + -29.142, + 42.837 + ], + [ + -22.35, + 46.747 + ], + [ + -16.905, + 39.188 + ], + [ + -8.904, + 41.944 + ], + [ + -3.77, + 51.643 + ], + [ + 4.069, + 51.643 + ], + [ + 4.997, + 42.352 + ], + [ + 13.313, + 40.762 + ], + [ + 22.62, + 46.591 + ], + [ + 29.411, + 42.688 + ], + [ + 25.567, + 34.196 + ], + [ + 31.961000000000002, + 28.649 + ], + [ + 42.95, + 29.069 + ], + [ + 46.877, + 22.294 + ] + ], + "o": [ + [ + 40.975, + 12.984000000000002 + ], + [ + 42.524, + 4.675 + ], + [ + 51.777, + 3.757 + ], + [ + 51.777, + -4.071 + ], + [ + 42.001, + -9.186 + ], + [ + 39.21, + -17.13 + ], + [ + 46.772, + -22.54 + ], + [ + 42.853, + -29.323 + ], + [ + 31.802, + -28.869999999999997 + ], + [ + 25.365, + -34.368 + ], + [ + 29.187, + -42.83 + ], + [ + 22.403, + -46.747 + ], + [ + 13.067, + -40.868 + ], + [ + 4.742, + -42.404 + ], + [ + 3.815, + -51.643 + ], + [ + -4.024, + -51.643 + ], + [ + -9.144, + -41.905 + ], + [ + -17.122, + -39.114 + ], + [ + -22.545, + -46.65 + ], + [ + -29.337, + -42.733 + ], + [ + -28.948999999999998, + -31.735999999999997 + ], + [ + -34.453, + -25.308 + ], + [ + -42.935, + -29.129 + ], + [ + -46.862, + -22.361 + ], + [ + -40.96, + -13.048000000000002 + ], + [ + -42.509, + -4.735 + ], + [ + -51.777, + -3.817 + ], + [ + -51.777, + 4.004 + ], + [ + -41.966, + 9.155999999999999 + ], + [ + -39.143, + 17.122 + ], + [ + -46.705, + 22.54 + ], + [ + -42.801, + 29.256 + ], + [ + -31.756999999999998, + 28.876 + ], + [ + -25.32, + 34.368 + ], + [ + -29.142, + 42.837 + ], + [ + -22.35, + 46.747 + ], + [ + -13.019000000000002, + 40.861000000000004 + ], + [ + -4.697, + 42.404 + ], + [ + -3.77, + 51.643 + ], + [ + 4.069, + 51.643 + ], + [ + 9.204, + 41.872 + ], + [ + 17.189, + 39.061 + ], + [ + 22.62, + 46.591 + ], + [ + 29.411, + 42.688 + ], + [ + 28.962, + 31.666999999999998 + ], + [ + 34.468, + 25.241 + ], + [ + 42.95, + 29.069 + ], + [ + 46.877, + 22.294 + ] + ], + "v": [ + [ + 39.292, + 16.861 + ], + [ + 42.524, + 4.675 + ], + [ + 51.777, + 3.757 + ], + [ + 51.777, + -4.071 + ], + [ + 42.471, + -5.003 + ], + [ + 39.21, + -17.13 + ], + [ + 46.772, + -22.54 + ], + [ + 42.853, + -29.323 + ], + [ + 34.341, + -25.487 + ], + [ + 25.365, + -34.368 + ], + [ + 29.187, + -42.83 + ], + [ + 22.403, + -46.747 + ], + [ + 16.95, + -39.188 + ], + [ + 4.742, + -42.404 + ], + [ + 3.815, + -51.643 + ], + [ + -4.024, + -51.643 + ], + [ + -4.944, + -42.382 + ], + [ + -17.122, + -39.114 + ], + [ + -22.545, + -46.65 + ], + [ + -29.337, + -42.733 + ], + [ + -25.552, + -34.263 + ], + [ + -34.453, + -25.308 + ], + [ + -42.935, + -29.129 + ], + [ + -46.862, + -22.361 + ], + [ + -39.277, + -16.928 + ], + [ + -42.509, + -4.735 + ], + [ + -51.777, + -3.817 + ], + [ + -51.777, + 4.004 + ], + [ + -42.449, + 4.959 + ], + [ + -39.143, + 17.122 + ], + [ + -46.705, + 22.54 + ], + [ + -42.801, + 29.256 + ], + [ + -34.296, + 25.495 + ], + [ + -25.32, + 34.368 + ], + [ + -29.142, + 42.837 + ], + [ + -22.35, + 46.747 + ], + [ + -16.905, + 39.188 + ], + [ + -4.697, + 42.404 + ], + [ + -3.77, + 51.643 + ], + [ + 4.069, + 51.643 + ], + [ + 4.997, + 42.352 + ], + [ + 17.189, + 39.061 + ], + [ + 22.62, + 46.591 + ], + [ + 29.411, + 42.688 + ], + [ + 25.567, + 34.196 + ], + [ + 34.468, + 25.241 + ], + [ + 42.95, + 29.069 + ], + [ + 46.877, + 22.294 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "rd", + "nm": "Round Corners 1", + "r": { + "a": 0, + "k": 2, + "ix": 1 + }, + "ix": 2, + "mn": "ADBE Vector Filter - RC", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.8706, + 0.3216, + 0.298, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 11, + "ty": 0, + "nm": "background", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 30, + "s": [ + 0 + ] + }, + { + "t": 132, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 500, + 500, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 462, + 256.5, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "w": 924, + "h": 513, + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true, + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 0, + "s": [ + 0 + ] + }, + { + "t": 45, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 861, + 52.376, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0.031, + 8.341 + ], + [ + -20.583, + 8.777 + ], + [ + -20.352, + -0.093 + ], + [ + -20.151, + -5.851 + ], + [ + -20.583, + -8.279 + ], + [ + -6.959, + -8.03 + ], + [ + 20.275, + -7.859 + ], + [ + 19.519, + -8.637 + ], + [ + 19.596, + 8.777 + ], + [ + 20.275, + 8.077 + ], + [ + 13.562999999999999, + 8.17 + ] + ], + "o": [ + [ + 0.031, + 8.341 + ], + [ + -20.583, + 8.777 + ], + [ + -20.29, + -2.988 + ], + [ + -20.151, + -8.699 + ], + [ + -13.762999999999998, + -8.201 + ], + [ + -0.154, + -8.03 + ], + [ + 20.275, + -7.859 + ], + [ + 19.519, + -8.637 + ], + [ + 19.596, + 8.777 + ], + [ + 16.910999999999998, + 8.17 + ], + [ + 10.184, + 8.17 + ] + ], + "v": [ + [ + 0.031, + 8.341 + ], + [ + -20.583, + 8.777 + ], + [ + -20.352, + -0.093 + ], + [ + -20.151, + -8.699 + ], + [ + -20.583, + -8.279 + ], + [ + -0.154, + -8.03 + ], + [ + 20.275, + -7.859 + ], + [ + 19.519, + -8.637 + ], + [ + 19.596, + 8.777 + ], + [ + 20.275, + 8.077 + ], + [ + 10.184, + 8.17 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -20.799, + -2.754 + ], + [ + -20.583, + 8.777 + ], + [ + -0.386, + 9.291 + ], + [ + 9.891, + 9.477 + ], + [ + 16.772000000000002, + 9.477 + ], + [ + 20.969, + 9.477 + ], + [ + 20.969, + 8.777 + ], + [ + 21, + -8.684 + ], + [ + 21, + -9.477 + ], + [ + 20.213, + -9.477 + ], + [ + -0.154, + -9.369 + ], + [ + -13.762999999999998, + -9.197999999999999 + ], + [ + -21, + -9.12 + ], + [ + -21, + -8.637 + ] + ], + "o": [ + [ + -20.799, + 0.156 + ], + [ + -20.583, + 8.777 + ], + [ + -0.386, + 9.291 + ], + [ + 13.332, + 9.477 + ], + [ + 20.213, + 9.477 + ], + [ + 20.969, + 9.477 + ], + [ + 20.969, + 8.777 + ], + [ + 21, + -8.684 + ], + [ + 21, + -9.477 + ], + [ + 20.213, + -9.477 + ], + [ + -6.959, + -9.369 + ], + [ + -20.583, + -9.12 + ], + [ + -21, + -9.12 + ], + [ + -20.969, + -5.696000000000001 + ] + ], + "v": [ + [ + -20.799, + 0.156 + ], + [ + -20.583, + 8.777 + ], + [ + -0.386, + 9.291 + ], + [ + 9.891, + 9.477 + ], + [ + 20.213, + 9.477 + ], + [ + 20.969, + 9.477 + ], + [ + 20.969, + 8.777 + ], + [ + 21, + -8.684 + ], + [ + 21, + -9.477 + ], + [ + 20.213, + -9.477 + ], + [ + -0.154, + -9.369 + ], + [ + -20.583, + -9.12 + ], + [ + -21, + -9.12 + ], + [ + -21, + -8.637 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 45, + "s": [ + 0 + ] + }, + { + "t": 90, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 64.5, + 91.283, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + -100, + -100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 14.5, + -6.485 + ], + [ + -14.5, + -6.485 + ], + [ + -14.5, + 6.485 + ], + [ + 14.5, + 6.485 + ] + ], + "o": [ + [ + 14.5, + -6.485 + ], + [ + -14.5, + -6.485 + ], + [ + -14.5, + 6.485 + ], + [ + 14.5, + 6.485 + ] + ], + "v": [ + [ + 14.5, + -6.485 + ], + [ + -14.5, + -6.485 + ], + [ + -14.5, + 6.485 + ], + [ + 14.5, + 6.485 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 15, + "s": [ + 0 + ] + }, + { + "t": 60, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 114, + 44.893, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + 6.155 + ], + [ + -14.692, + 6.466 + ], + [ + -14.505, + -0.035 + ], + [ + -14.362, + -4.291 + ], + [ + -14.659, + -6.086 + ], + [ + -4.952, + -5.902 + ], + [ + 14.45, + -5.775 + ], + [ + 13.899, + -6.351 + ], + [ + 13.955, + 6.523 + ], + [ + 14.45, + 6.017 + ], + [ + 9.651, + 6.017 + ] + ], + "o": [ + [ + 0, + 6.155 + ], + [ + -14.692, + 6.466 + ], + [ + -14.461, + -2.1750000000000003 + ], + [ + -14.362, + -6.408 + ], + [ + -9.806000000000001, + -6.0280000000000005 + ], + [ + -0.088, + -5.902 + ], + [ + 14.45, + -5.775 + ], + [ + 13.899, + -6.351 + ], + [ + 13.955, + 6.523 + ], + [ + 12.050999999999998, + 6.017 + ], + [ + 7.241, + 6.017 + ] + ], + "v": [ + [ + 0, + 6.155 + ], + [ + -14.692, + 6.466 + ], + [ + -14.505, + -0.035 + ], + [ + -14.362, + -6.408 + ], + [ + -14.659, + -6.086 + ], + [ + -0.088, + -5.902 + ], + [ + 14.45, + -5.775 + ], + [ + 13.899, + -6.351 + ], + [ + 13.955, + 6.523 + ], + [ + 14.45, + 6.017 + ], + [ + 7.241, + 6.017 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -14.857, + -2.0469999999999997 + ], + [ + -14.692, + 6.466 + ], + [ + -0.253, + 6.788 + ], + [ + 7.076, + 6.914 + ], + [ + 11.995999999999999, + 6.983 + ], + [ + 14.934, + 6.983 + ], + [ + 14.934, + 6.466 + ], + [ + 15, + -6.408 + ], + [ + 15, + -6.983 + ], + [ + 14.45, + -6.983 + ], + [ + -0.121, + -6.903 + ], + [ + -9.839, + -6.719 + ], + [ + -15, + -6.719 + ], + [ + -15, + -6.408 + ] + ], + "o": [ + [ + -14.857, + 0.104 + ], + [ + -14.692, + 6.466 + ], + [ + -0.253, + 6.788 + ], + [ + 9.53, + 6.983 + ], + [ + 14.45, + 6.983 + ], + [ + 14.934, + 6.983 + ], + [ + 14.934, + 6.466 + ], + [ + 15, + -6.408 + ], + [ + 15, + -6.983 + ], + [ + 14.45, + -6.983 + ], + [ + -4.984999999999999, + -6.903 + ], + [ + -14.692, + -6.719 + ], + [ + -15, + -6.719 + ], + [ + -14.978, + -4.222 + ] + ], + "v": [ + [ + -14.857, + 0.104 + ], + [ + -14.692, + 6.466 + ], + [ + -0.253, + 6.788 + ], + [ + 7.076, + 6.914 + ], + [ + 14.45, + 6.983 + ], + [ + 14.934, + 6.983 + ], + [ + 14.934, + 6.466 + ], + [ + 15, + -6.408 + ], + [ + 15, + -6.983 + ], + [ + 14.45, + -6.983 + ], + [ + -0.121, + -6.903 + ], + [ + -14.692, + -6.719 + ], + [ + -15, + -6.719 + ], + [ + -15, + -6.408 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 31, + "s": [ + 0 + ] + }, + { + "t": 76, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 721.5, + 395.062, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0.007, + -6.996 + ], + [ + 18.134, + -7.35 + ], + [ + 17.93, + 0.007 + ], + [ + 17.754, + 4.868 + ], + [ + 18.134, + 6.917 + ], + [ + 6.154, + 6.707 + ], + [ + -17.794, + 6.628 + ], + [ + -17.116, + 7.272 + ], + [ + -17.197, + -7.416 + ], + [ + -17.794, + -6.838 + ], + [ + -11.892, + -6.838 + ] + ], + "o": [ + [ + 0.007, + -6.996 + ], + [ + 18.134, + -7.35 + ], + [ + 17.876, + 2.451 + ], + [ + 17.754, + 7.272 + ], + [ + 12.137, + 6.851 + ], + [ + 0.17, + 6.707 + ], + [ + -17.794, + 6.628 + ], + [ + -17.116, + 7.272 + ], + [ + -17.197, + -7.416 + ], + [ + -14.836, + -6.838 + ], + [ + -8.921, + -6.838 + ] + ], + "v": [ + [ + 0.007, + -6.996 + ], + [ + 18.134, + -7.35 + ], + [ + 17.93, + 0.007 + ], + [ + 17.754, + 7.272 + ], + [ + 18.134, + 6.917 + ], + [ + 0.17, + 6.707 + ], + [ + -17.794, + 6.628 + ], + [ + -17.116, + 7.272 + ], + [ + -17.197, + -7.416 + ], + [ + -17.794, + -6.838 + ], + [ + -8.921, + -6.838 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 18.324, + 2.372 + ], + [ + 18.134, + -7.35 + ], + [ + 0.292, + -7.758 + ], + [ + -8.745, + -7.915 + ], + [ + -14.796, + -7.981 + ], + [ + -18.432, + -7.981 + ], + [ + -18.432, + -7.377 + ], + [ + -18.5, + 7.311 + ], + [ + -18.5, + 7.981 + ], + [ + -17.794, + 7.981 + ], + [ + 0.17, + 7.902 + ], + [ + 12.137, + 7.758 + ], + [ + 18.5, + 7.692 + ], + [ + 18.5, + 7.337 + ] + ], + "o": [ + [ + 18.324, + -0.085 + ], + [ + 18.134, + -7.35 + ], + [ + 0.292, + -7.758 + ], + [ + -11.770999999999999, + -7.981 + ], + [ + -17.822, + -7.981 + ], + [ + -18.432, + -7.981 + ], + [ + -18.432, + -7.377 + ], + [ + -18.5, + 7.311 + ], + [ + -18.5, + 7.981 + ], + [ + -17.794, + 7.981 + ], + [ + 6.154, + 7.902 + ], + [ + 18.134, + 7.692 + ], + [ + 18.5, + 7.692 + ], + [ + 18.473, + 4.853999999999999 + ] + ], + "v": [ + [ + 18.324, + -0.085 + ], + [ + 18.134, + -7.35 + ], + [ + 0.292, + -7.758 + ], + [ + -8.745, + -7.915 + ], + [ + -17.822, + -7.981 + ], + [ + -18.432, + -7.981 + ], + [ + -18.432, + -7.377 + ], + [ + -18.5, + 7.311 + ], + [ + -18.5, + 7.981 + ], + [ + -17.794, + 7.981 + ], + [ + 0.17, + 7.902 + ], + [ + 18.134, + 7.692 + ], + [ + 18.5, + 7.692 + ], + [ + 18.5, + 7.337 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 60, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 75, + "s": [ + 0 + ] + }, + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 105, + "s": [ + 100 + ] + }, + { + "t": 120, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 603, + 395.062, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 0, + -6.996 + ], + [ + 17.63, + -7.35 + ], + [ + 17.379, + 0.007 + ], + [ + 17.208, + 4.868 + ], + [ + 17.564, + 6.917 + ], + [ + 5.9159999999999995, + 6.707 + ], + [ + -17.406, + 6.628 + ], + [ + -16.745, + 7.272 + ], + [ + -16.745, + -7.416 + ], + [ + -17.34, + -6.838 + ], + [ + -11.581999999999999, + -6.838 + ] + ], + "o": [ + [ + 0, + -6.996 + ], + [ + 17.63, + -7.35 + ], + [ + 17.326, + 2.451 + ], + [ + 17.208, + 7.272 + ], + [ + 11.74, + 6.851 + ], + [ + 0.079, + 6.707 + ], + [ + -17.406, + 6.628 + ], + [ + -16.745, + 7.272 + ], + [ + -16.745, + -7.416 + ], + [ + -14.461, + -6.838 + ], + [ + -8.69, + -6.838 + ] + ], + "v": [ + [ + 0, + -6.996 + ], + [ + 17.63, + -7.35 + ], + [ + 17.379, + 0.007 + ], + [ + 17.208, + 7.272 + ], + [ + 17.564, + 6.917 + ], + [ + 0.079, + 6.707 + ], + [ + -17.406, + 6.628 + ], + [ + -16.745, + 7.272 + ], + [ + -16.745, + -7.416 + ], + [ + -17.34, + -6.838 + ], + [ + -8.69, + -6.838 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 17.881, + 2.372 + ], + [ + 17.63, + -7.35 + ], + [ + 0.357, + -7.758 + ], + [ + -8.439, + -7.915 + ], + [ + -14.341999999999999, + -7.981 + ], + [ + -17.921, + -7.981 + ], + [ + -17.921, + -7.377 + ], + [ + -18, + 7.311 + ], + [ + -18, + 7.981 + ], + [ + -17.34, + 7.981 + ], + [ + 0.145, + 7.902 + ], + [ + 11.806, + 7.758 + ], + [ + 18, + 7.692 + ], + [ + 18, + 7.337 + ] + ], + "o": [ + [ + 17.815, + -0.085 + ], + [ + 17.63, + -7.35 + ], + [ + 0.357, + -7.758 + ], + [ + -11.384, + -7.981 + ], + [ + -17.287, + -7.981 + ], + [ + -17.921, + -7.981 + ], + [ + -17.921, + -7.377 + ], + [ + -18, + 7.311 + ], + [ + -18, + 7.981 + ], + [ + -17.34, + 7.981 + ], + [ + 5.981999999999999, + 7.902 + ], + [ + 17.63, + 7.692 + ], + [ + 18, + 7.692 + ], + [ + 17.974, + 4.853999999999999 + ] + ], + "v": [ + [ + 17.815, + -0.085 + ], + [ + 17.63, + -7.35 + ], + [ + 0.357, + -7.758 + ], + [ + -8.439, + -7.915 + ], + [ + -17.287, + -7.981 + ], + [ + -17.921, + -7.981 + ], + [ + -17.921, + -7.377 + ], + [ + -18, + 7.311 + ], + [ + -18, + 7.981 + ], + [ + -17.34, + 7.981 + ], + [ + 0.145, + 7.902 + ], + [ + 17.63, + 7.692 + ], + [ + 18, + 7.692 + ], + [ + 18, + 7.337 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 21, + "s": [ + 0 + ] + }, + { + "t": 66, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 663, + 450.431, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 18, + -7.482 + ], + [ + -18, + -7.482 + ], + [ + -18, + 7.482 + ], + [ + 18, + 7.482 + ] + ], + "o": [ + [ + 18, + -7.482 + ], + [ + -18, + -7.482 + ], + [ + -18, + 7.482 + ], + [ + 18, + 7.482 + ] + ], + "v": [ + [ + 18, + -7.482 + ], + [ + -18, + -7.482 + ], + [ + -18, + 7.482 + ], + [ + 18, + 7.482 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 7, + "s": [ + 0 + ] + }, + { + "t": 52, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 534, + 152.638, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 10.775, + -11.133 + ], + [ + 15, + -3.783 + ], + [ + 12.732, + -2.483 + ], + [ + 12.154, + -2.013 + ], + [ + 11.733, + -0.979 + ], + [ + 11.759, + -0.185 + ], + [ + 11.759, + 0.44000000000000006 + ], + [ + 11.811, + 1.387 + ], + [ + 12.414, + 2.321 + ], + [ + 14.981, + 3.812 + ], + [ + 10.756, + 11.162 + ], + [ + 8.507, + 9.862 + ], + [ + 7.816000000000001, + 9.587000000000002 + ], + [ + 6.713, + 9.732 + ], + [ + 5.695, + 10.381 + ], + [ + 4.704, + 10.997 + ], + [ + 4.207, + 11.993 + ], + [ + 4.205, + 14.964 + ], + [ + -4.225, + 14.964 + ], + [ + -4.225, + 12.365 + ], + [ + -4.332, + 11.629000000000001 + ], + [ + -5.002999999999999, + 10.742 + ], + [ + -6.074000000000001, + 10.165 + ], + [ + -7.0969999999999995, + 9.615 + ], + [ + -8.212000000000002, + 9.677 + ], + [ + -10.775, + 11.162 + ], + [ + -15, + 3.812 + ], + [ + -12.751, + 2.502 + ], + [ + -12.168000000000001, + 2.045 + ], + [ + -11.748000000000001, + 1.0150000000000001 + ], + [ + -11.778, + 0.235 + ], + [ + -11.778, + -0.401 + ], + [ + -11.828999999999999, + -1.351 + ], + [ + -12.431999999999999, + -2.291 + ], + [ + -15, + -3.783 + ], + [ + -10.795, + -11.172 + ], + [ + -8.556, + -9.872 + ], + [ + -7.866, + -9.593 + ], + [ + -6.763, + -9.732999999999999 + ], + [ + -5.737, + -10.383000000000001 + ], + [ + -4.74, + -10.988 + ], + [ + -4.24, + -11.991 + ], + [ + -4.244, + -14.964 + ], + [ + 4.205, + -14.964 + ], + [ + 4.205, + -12.365 + ], + [ + 4.306, + -11.611 + ], + [ + 4.992999999999999, + -10.703000000000001 + ], + [ + 6.08, + -10.134 + ], + [ + 7.105, + -9.578000000000001 + ], + [ + 8.215000000000002, + -9.647 + ] + ], + "o": [ + [ + 10.775, + -11.133 + ], + [ + 15, + -3.783 + ], + [ + 12.412999999999998, + -2.291 + ], + [ + 11.809999999999999, + -1.351 + ], + [ + 11.759, + -0.401 + ], + [ + 11.759, + 0.22499999999999998 + ], + [ + 11.734, + 1.016 + ], + [ + 12.155000000000001, + 2.047 + ], + [ + 12.732, + 2.512 + ], + [ + 14.981, + 3.812 + ], + [ + 10.756, + 11.162 + ], + [ + 8.184, + 9.677 + ], + [ + 7.074, + 9.615 + ], + [ + 6.055000000000001, + 10.165 + ], + [ + 4.984, + 10.742 + ], + [ + 4.312, + 11.629000000000001 + ], + [ + 4.205, + 12.365 + ], + [ + 4.205, + 14.964 + ], + [ + -4.225, + 14.964 + ], + [ + -4.226999999999999, + 11.993 + ], + [ + -4.723999999999999, + 10.997 + ], + [ + -5.7139999999999995, + 10.381 + ], + [ + -6.734, + 9.732 + ], + [ + -7.843, + 9.587000000000002 + ], + [ + -8.537, + 9.862 + ], + [ + -10.775, + 11.162 + ], + [ + -15, + 3.812 + ], + [ + -12.43, + 2.3169999999999997 + ], + [ + -11.824, + 1.387 + ], + [ + -11.778, + 0.44000000000000006 + ], + [ + -11.778, + -0.195 + ], + [ + -11.752, + -0.979 + ], + [ + -12.173, + -2.013 + ], + [ + -12.751, + -2.483 + ], + [ + -15, + -3.783 + ], + [ + -10.795, + -11.172 + ], + [ + -8.234, + -9.686 + ], + [ + -7.1240000000000006, + -9.617 + ], + [ + -6.101999999999999, + -10.17 + ], + [ + -5.025, + -10.735000000000001 + ], + [ + -4.343999999999999, + -11.622 + ], + [ + -4.244, + -12.365 + ], + [ + -4.244, + -14.964 + ], + [ + 4.205, + -14.964 + ], + [ + 4.202, + -11.984 + ], + [ + 4.706, + -10.963000000000001 + ], + [ + 5.712, + -10.346 + ], + [ + 6.743, + -9.693999999999999 + ], + [ + 7.8469999999999995, + -9.554 + ], + [ + 8.537, + -9.833 + ] + ], + "v": [ + [ + 10.775, + -11.133 + ], + [ + 15, + -3.783 + ], + [ + 12.732, + -2.483 + ], + [ + 11.982, + -1.682 + ], + [ + 11.759, + -0.606 + ], + [ + 11.759, + 0.02 + ], + [ + 11.759, + 0.645 + ], + [ + 11.983, + 1.717 + ], + [ + 12.732, + 2.512 + ], + [ + 14.981, + 3.812 + ], + [ + 10.756, + 11.162 + ], + [ + 8.507, + 9.862 + ], + [ + 7.445, + 9.601 + ], + [ + 6.405, + 9.94 + ], + [ + 5.315, + 10.576 + ], + [ + 4.508, + 11.313 + ], + [ + 4.205, + 12.365 + ], + [ + 4.205, + 14.964 + ], + [ + -4.225, + 14.964 + ], + [ + -4.225, + 12.365 + ], + [ + -4.528, + 11.313 + ], + [ + -5.334, + 10.576 + ], + [ + -6.424, + 9.94 + ], + [ + -7.47, + 9.601 + ], + [ + -8.537, + 9.862 + ], + [ + -10.775, + 11.162 + ], + [ + -15, + 3.812 + ], + [ + -12.751, + 2.502 + ], + [ + -11.996, + 1.716 + ], + [ + -11.778, + 0.645 + ], + [ + -11.778, + 0.02 + ], + [ + -11.778, + -0.606 + ], + [ + -12.001, + -1.682 + ], + [ + -12.751, + -2.483 + ], + [ + -15, + -3.783 + ], + [ + -10.795, + -11.172 + ], + [ + -8.556, + -9.872 + ], + [ + -7.495, + -9.605 + ], + [ + -6.454, + -9.94 + ], + [ + -5.363, + -10.576 + ], + [ + -4.542, + -11.305 + ], + [ + -4.244, + -12.365 + ], + [ + -4.244, + -14.964 + ], + [ + 4.205, + -14.964 + ], + [ + 4.205, + -12.365 + ], + [ + 4.506, + -11.287 + ], + [ + 5.334, + -10.537 + ], + [ + 6.434, + -9.901 + ], + [ + 7.476, + -9.566 + ], + [ + 8.537, + -9.833 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 4.9879999999999995, + 5.02 + ], + [ + 6.9190000000000005, + 1.3940000000000001 + ], + [ + 6.921, + -0.02 + ], + [ + 6.18, + -3.6180000000000003 + ], + [ + 1.83, + -6.94 + ], + [ + -2.706, + -6.532 + ], + [ + -5.869, + -3.9210000000000003 + ], + [ + -7.055, + 0.014000000000000012 + ], + [ + -5.864, + 3.948 + ], + [ + -2.6980000000000004, + 6.556 + ], + [ + 1.377, + 6.957 + ] + ], + "o": [ + [ + 6.5120000000000005, + 2.736 + ], + [ + 6.921, + 0.02 + ], + [ + 6.913, + -1.858 + ], + [ + 3.5860000000000003, + -6.212 + ], + [ + -1.368, + -6.94 + ], + [ + -4.981999999999999, + -5.006 + ], + [ + -6.917, + -1.3830000000000002 + ], + [ + -6.523, + 2.71 + ], + [ + -3.93, + 5.8919999999999995 + ], + [ + -0.014000000000000012, + 7.094 + ], + [ + 3.907, + 5.909 + ] + ], + "v": [ + [ + 5.75, + 3.878 + ], + [ + 6.921, + 0.02 + ], + [ + 6.921, + -0.02 + ], + [ + 4.883, + -4.915 + ], + [ + 0, + -6.94 + ], + [ + -3.844, + -5.769 + ], + [ + -6.393, + -2.652 + ], + [ + -6.789, + 1.362 + ], + [ + -4.897, + 4.92 + ], + [ + -1.356, + 6.825 + ], + [ + 2.642, + 6.433 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 4, + "s": [ + 0 + ] + }, + { + "t": 49, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 63, + 326.226, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 15.657, + 15.013 + ], + [ + 5.329, + 20.95 + ], + [ + 3.502, + 17.771 + ], + [ + 2.849, + 16.962999999999997 + ], + [ + 1.401, + 16.375 + ], + [ + 0, + 16.412 + ], + [ + -0.879, + 16.412 + ], + [ + -1.923, + 16.483 + ], + [ + -3.235, + 17.326 + ], + [ + -5.343, + 20.91 + ], + [ + -15.671, + 15.013 + ], + [ + -13.831, + 11.915 + ], + [ + -13.443999999999999, + 10.951 + ], + [ + -13.647, + 9.411 + ], + [ + -14.562, + 7.981 + ], + [ + -15.416, + 6.595 + ], + [ + -16.822000000000003, + 5.904 + ], + [ + -21, + 5.91 + ], + [ + -21, + -5.896 + ], + [ + -17.347, + -5.896 + ], + [ + -16.306, + -6.033 + ], + [ + -15.059000000000001, + -6.976 + ], + [ + -14.264, + -8.475000000000001 + ], + [ + -13.482, + -9.9 + ], + [ + -13.571, + -11.450999999999999 + ], + [ + -15.671, + -15.04 + ], + [ + -5.288, + -20.95 + ], + [ + -3.447, + -17.798 + ], + [ + -2.7920000000000003, + -16.994 + ], + [ + -1.345, + -16.406000000000002 + ], + [ + -0.23299999999999998, + -16.44 + ], + [ + 0.6460000000000001, + -16.44 + ], + [ + 1.9769999999999999, + -16.512 + ], + [ + 3.2889999999999997, + -17.354 + ], + [ + 5.274, + -20.937 + ], + [ + 15.602, + -15.04 + ], + [ + 13.776, + -11.915 + ], + [ + 13.389, + -10.947000000000001 + ], + [ + 13.593, + -9.4 + ], + [ + 14.503, + -7.9750000000000005 + ], + [ + 15.360999999999999, + -6.581 + ], + [ + 16.767000000000003, + -5.89 + ], + [ + 21, + -5.896 + ], + [ + 21, + 5.91 + ], + [ + 17.292, + 5.91 + ], + [ + 16.28, + 6.052 + ], + [ + 15.06, + 6.965 + ], + [ + 14.256, + 8.450999999999999 + ], + [ + 13.482, + 9.877999999999998 + ], + [ + 13.571, + 11.435 + ] + ], + "o": [ + [ + 15.657, + 15.013 + ], + [ + 5.329, + 20.95 + ], + [ + 3.235, + 17.326 + ], + [ + 1.923, + 16.483 + ], + [ + 0.879, + 16.412 + ], + [ + 0, + 16.412 + ], + [ + -1.401, + 16.375 + ], + [ + -2.849, + 16.962999999999997 + ], + [ + -3.502, + 17.771 + ], + [ + -5.343, + 20.91 + ], + [ + -15.671, + 15.013 + ], + [ + -13.571, + 11.463999999999999 + ], + [ + -13.482, + 9.913 + ], + [ + -14.264, + 8.489 + ], + [ + -15.059000000000001, + 6.989999999999999 + ], + [ + -16.306, + 6.047 + ], + [ + -17.347, + 5.91 + ], + [ + -21, + 5.91 + ], + [ + -21, + -5.896 + ], + [ + -16.822000000000003, + -5.89 + ], + [ + -15.416, + -6.581 + ], + [ + -14.562, + -7.9670000000000005 + ], + [ + -13.647, + -9.397 + ], + [ + -13.443999999999999, + -10.938 + ], + [ + -13.831, + -11.902 + ], + [ + -15.671, + -15.04 + ], + [ + -5.288, + -20.95 + ], + [ + -3.178, + -17.354999999999997 + ], + [ + -1.866, + -16.514000000000003 + ], + [ + -0.536, + -16.44 + ], + [ + 0.34299999999999997, + -16.44 + ], + [ + 1.455, + -16.405 + ], + [ + 2.903, + -16.991999999999997 + ], + [ + 3.557, + -17.798 + ], + [ + 5.274, + -20.937 + ], + [ + 15.602, + -15.04 + ], + [ + 13.516, + -11.462 + ], + [ + 13.427, + -9.905 + ], + [ + 14.202, + -8.478 + ], + [ + 15.004000000000001, + -6.976 + ], + [ + 16.250999999999998, + -6.033 + ], + [ + 17.292, + -5.896 + ], + [ + 21, + -5.896 + ], + [ + 21, + 5.91 + ], + [ + 16.781000000000002, + 5.91 + ], + [ + 15.412, + 6.584 + ], + [ + 14.558, + 7.948 + ], + [ + 13.647, + 9.373 + ], + [ + 13.443999999999999, + 10.92 + ], + [ + 13.831, + 11.888 + ] + ], + "v": [ + [ + 15.657, + 15.013 + ], + [ + 5.329, + 20.95 + ], + [ + 3.502, + 17.771 + ], + [ + 2.386, + 16.723 + ], + [ + 0.879, + 16.412 + ], + [ + 0, + 16.412 + ], + [ + -0.879, + 16.412 + ], + [ + -2.386, + 16.723 + ], + [ + -3.502, + 17.771 + ], + [ + -5.343, + 20.91 + ], + [ + -15.671, + 15.013 + ], + [ + -13.831, + 11.915 + ], + [ + -13.463, + 10.432 + ], + [ + -13.94, + 8.981 + ], + [ + -14.833, + 7.459 + ], + [ + -15.861, + 6.321 + ], + [ + -17.347, + 5.91 + ], + [ + -21, + 5.91 + ], + [ + -21, + -5.896 + ], + [ + -17.347, + -5.896 + ], + [ + -15.861, + -6.307 + ], + [ + -14.833, + -7.445 + ], + [ + -13.94, + -8.967 + ], + [ + -13.463, + -10.419 + ], + [ + -13.831, + -11.902 + ], + [ + -15.671, + -15.04 + ], + [ + -5.288, + -20.95 + ], + [ + -3.447, + -17.798 + ], + [ + -2.329, + -16.754 + ], + [ + -0.824, + -16.44 + ], + [ + 0.055, + -16.44 + ], + [ + 0.934, + -16.44 + ], + [ + 2.44, + -16.752 + ], + [ + 3.557, + -17.798 + ], + [ + 5.274, + -20.937 + ], + [ + 15.602, + -15.04 + ], + [ + 13.776, + -11.915 + ], + [ + 13.408, + -10.426 + ], + [ + 13.886, + -8.967 + ], + [ + 14.778, + -7.445 + ], + [ + 15.806, + -6.307 + ], + [ + 17.292, + -5.896 + ], + [ + 21, + -5.896 + ], + [ + 21, + 5.91 + ], + [ + 17.292, + 5.91 + ], + [ + 15.846, + 6.318 + ], + [ + 14.833, + 7.418 + ], + [ + 13.94, + 8.94 + ], + [ + 13.463, + 10.399 + ], + [ + 13.831, + 11.888 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -7.055, + 6.981 + ], + [ + -1.938, + 9.677 + ], + [ + 0, + 9.674 + ], + [ + 5.056, + 8.663 + ], + [ + 9.75, + 2.621 + ], + [ + 9.217, + -3.7259999999999995 + ], + [ + 5.559, + -8.177 + ], + [ + 0.018000000000000016, + -9.861999999999998 + ], + [ + -5.535, + -8.21 + ], + [ + -9.22, + -3.783 + ], + [ + -9.791, + 1.924 + ] + ], + "o": [ + [ + -3.833, + 9.109 + ], + [ + 0, + 9.674 + ], + [ + 2.58, + 9.674 + ], + [ + 8.716000000000001, + 5.063000000000001 + ], + [ + 9.779, + -1.849 + ], + [ + 7.083, + -6.926 + ], + [ + 1.987, + -9.661000000000001 + ], + [ + -3.7859999999999996, + -9.128 + ], + [ + -8.283, + -5.508 + ], + [ + -9.982000000000001, + -0.02499999999999991 + ], + [ + -8.311, + 5.465999999999999 + ] + ], + "v": [ + [ + -5.444, + 8.045 + ], + [ + 0, + 9.674 + ], + [ + 0, + 9.674 + ], + [ + 6.886, + 6.863 + ], + [ + 9.765, + 0.068 + ], + [ + 8.15, + -5.326 + ], + [ + 3.773, + -8.919 + ], + [ + -1.884, + -9.495 + ], + [ + -6.909, + -6.859 + ], + [ + -9.601, + -1.904 + ], + [ + -9.051, + 3.695 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Vector", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 37, + "s": [ + 0 + ] + }, + { + "t": 82, + "s": [ + 100 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 382.5, + 64.347, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 21.17, + 6.063 + ], + [ + 14.799, + 16.311 + ], + [ + 11.686, + 14.413 + ], + [ + 10.713, + 13.993 + ], + [ + 9.134, + 14.138 + ], + [ + 8.175, + 14.705 + ], + [ + 7.380000000000001, + 15.133 + ], + [ + 6.226, + 15.822 + ], + [ + 5.469, + 17.212 + ], + [ + 5.334, + 21.449 + ], + [ + -6.682, + 21.07 + ], + [ + -6.565, + 17.371 + ], + [ + -6.686999999999999, + 16.315 + ], + [ + -7.609999999999999, + 15.022 + ], + [ + -9.106000000000002, + 14.141 + ], + [ + -10.536, + 13.313 + ], + [ + -12.113, + 13.357000000000001 + ], + [ + -15.827, + 15.347 + ], + [ + -21.5, + 4.72 + ], + [ + -18.271, + 2.929 + ], + [ + -17.429000000000002, + 2.295 + ], + [ + -16.768, + 0.859 + ], + [ + -16.777, + -0.872 + ], + [ + -16.776999999999997, + -2.5269999999999997 + ], + [ + -17.604, + -3.879 + ], + [ + -21.18, + -6.112 + ], + [ + -14.847, + -16.359 + ], + [ + -11.696, + -14.413 + ], + [ + -10.729, + -13.989 + ], + [ + -9.158, + -14.136000000000001 + ], + [ + -8.204, + -14.705 + ], + [ + -7.4190000000000005, + -15.123 + ], + [ + -6.254, + -15.821000000000002 + ], + [ + -5.498, + -17.220000000000002 + ], + [ + -5.363, + -21.449 + ], + [ + 6.643, + -21.079 + ], + [ + 6.527, + -17.381 + ], + [ + 6.657, + -16.329 + ], + [ + 7.574999999999999, + -15.036999999999999 + ], + [ + 9.072999999999999, + -14.162 + ], + [ + 10.5, + -13.32 + ], + [ + 12.081999999999999, + -13.365 + ], + [ + 15.788, + -15.357 + ], + [ + 21.5, + -4.73 + ], + [ + 18.261, + -2.978 + ], + [ + 17.422, + -2.346 + ], + [ + 16.759999999999998, + -0.916 + ], + [ + 16.767, + 0.8130000000000001 + ], + [ + 16.764, + 2.472 + ], + [ + 17.592, + 3.83 + ] + ], + "o": [ + [ + 21.17, + 6.063 + ], + [ + 14.799, + 16.311 + ], + [ + 11.232, + 14.138 + ], + [ + 9.653, + 13.993 + ], + [ + 8.427999999999999, + 14.569 + ], + [ + 7.651, + 14.997000000000002 + ], + [ + 6.6370000000000005, + 15.475999999999999 + ], + [ + 5.636, + 16.7 + ], + [ + 5.45, + 17.741 + ], + [ + 5.334, + 21.449 + ], + [ + -6.682, + 21.07 + ], + [ + -6.5520000000000005, + 16.84 + ], + [ + -7.221, + 15.397 + ], + [ + -8.631, + 14.452 + ], + [ + -10.030000000000001, + 13.494000000000002 + ], + [ + -11.588, + 13.245 + ], + [ + -12.578, + 13.605 + ], + [ + -15.827, + 15.347 + ], + [ + -21.5, + 4.72 + ], + [ + -17.811, + 2.6719999999999997 + ], + [ + -16.903, + 1.379 + ], + [ + -16.797, + -0.26999999999999996 + ], + [ + -16.676000000000002, + -1.998 + ], + [ + -17.245, + -3.477 + ], + [ + -18.048, + -4.165 + ], + [ + -21.18, + -6.112 + ], + [ + -14.847, + -16.359 + ], + [ + -11.247, + -14.136000000000001 + ], + [ + -9.675, + -13.989 + ], + [ + -8.456999999999999, + -14.569 + ], + [ + -7.68, + -14.997000000000002 + ], + [ + -6.665, + -15.47 + ], + [ + -5.664, + -16.705000000000002 + ], + [ + -5.479, + -17.751 + ], + [ + -5.363, + -21.449 + ], + [ + 6.643, + -21.079 + ], + [ + 6.5200000000000005, + -16.851 + ], + [ + 7.191000000000001, + -15.413 + ], + [ + 8.564, + -14.487 + ], + [ + 9.992999999999999, + -13.502 + ], + [ + 11.556000000000001, + -13.251999999999999 + ], + [ + 12.549, + -13.615 + ], + [ + 15.788, + -15.357 + ], + [ + 21.5, + -4.73 + ], + [ + 17.803, + -2.7220000000000004 + ], + [ + 16.895999999999997, + -1.434 + ], + [ + 16.787, + 0.21199999999999997 + ], + [ + 16.663999999999998, + 1.941 + ], + [ + 17.232000000000003, + 3.4259999999999997 + ], + [ + 18.038, + 4.117 + ] + ], + "v": [ + [ + 21.17, + 6.063 + ], + [ + 14.799, + 16.311 + ], + [ + 11.686, + 14.413 + ], + [ + 10.183, + 13.993 + ], + [ + 8.68, + 14.413 + ], + [ + 7.913, + 14.851 + ], + [ + 7.118, + 15.26 + ], + [ + 5.931, + 16.261 + ], + [ + 5.45, + 17.741 + ], + [ + 5.334, + 21.449 + ], + [ + -6.682, + 21.07 + ], + [ + -6.565, + 17.371 + ], + [ + -6.954, + 15.856 + ], + [ + -8.078, + 14.773 + ], + [ + -9.601, + 13.8 + ], + [ + -11.062, + 13.279 + ], + [ + -12.578, + 13.605 + ], + [ + -15.827, + 15.347 + ], + [ + -21.5, + 4.72 + ], + [ + -18.271, + 2.929 + ], + [ + -17.166, + 1.837 + ], + [ + -16.777, + 0.331 + ], + [ + -16.719, + -1.47 + ], + [ + -17.011, + -3.002 + ], + [ + -18.048, + -4.165 + ], + [ + -21.18, + -6.112 + ], + [ + -14.847, + -16.359 + ], + [ + -11.696, + -14.413 + ], + [ + -10.202, + -13.989 + ], + [ + -8.709, + -14.413 + ], + [ + -7.942, + -14.851 + ], + [ + -7.147, + -15.25 + ], + [ + -5.959, + -16.263 + ], + [ + -5.479, + -17.751 + ], + [ + -5.363, + -21.449 + ], + [ + 6.643, + -21.079 + ], + [ + 6.527, + -17.381 + ], + [ + 6.924, + -15.871 + ], + [ + 8.039, + -14.783 + ], + [ + 9.562, + -13.81 + ], + [ + 11.028, + -13.286 + ], + [ + 12.549, + -13.615 + ], + [ + 15.788, + -15.357 + ], + [ + 21.5, + -4.73 + ], + [ + 18.261, + -2.978 + ], + [ + 17.159, + -1.89 + ], + [ + 16.767, + -0.389 + ], + [ + 16.709, + 1.411 + ], + [ + 16.998, + 2.949 + ], + [ + 18.038, + 4.117 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -2.858, + 9.637 + ], + [ + 2.968, + 9.623 + ], + [ + 6.833, + 7.257 + ], + [ + 9.084999999999999, + 4.093999999999999 + ], + [ + 9.959999999999999, + 0.30599999999999994 + ], + [ + 9.321, + -3.5280000000000005 + ], + [ + 6.381, + -7.802999999999999 + ], + [ + 0.9940000000000001, + -10.028 + ], + [ + -4.7170000000000005, + -8.875 + ], + [ + -8.827, + -4.731 + ], + [ + -9.95, + 1.0050000000000001 + ], + [ + -7.709, + 6.4 + ] + ], + "o": [ + [ + 1.0179999999999998, + 10.015 + ], + [ + 5.824, + 8.088 + ], + [ + 8.471, + 5.2490000000000006 + ], + [ + 9.833, + 1.6099999999999999 + ], + [ + 9.702, + -2.276 + ], + [ + 7.789, + -6.393000000000001 + ], + [ + 2.9450000000000003, + -9.641 + ], + [ + -2.88, + -9.639999999999999 + ], + [ + -7.725, + -6.393000000000001 + ], + [ + -9.953000000000001, + -0.9910000000000001 + ], + [ + -8.815999999999999, + 4.743 + ], + [ + -4.695, + 8.876 + ] + ], + "v": [ + [ + -0.92, + 9.826 + ], + [ + 4.684, + 8.7 + ], + [ + 7.652, + 6.253 + ], + [ + 9.459, + 2.852 + ], + [ + 9.831, + -0.985 + ], + [ + 8.709, + -4.671 + ], + [ + 4.663, + -8.722 + ], + [ + -0.943, + -9.834 + ], + [ + -6.221, + -7.634 + ], + [ + -9.39, + -2.861 + ], + [ + -9.383, + 2.874 + ], + [ + -6.202, + 7.638 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false, + "_render": true + }, + { + "ty": "mm", + "mm": 1, + "nm": "Merge Paths 1", + "mn": "ADBE Vector Filter - Merge", + "hd": false, + "_render": true + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0.6157, + 0.7059, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false, + "_render": true + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 300, + 300 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform", + "_render": true + } + ], + "nm": "Vector", + "np": 4, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false, + "_render": true + } + ], + "ip": 0, + "op": 300, + "st": 0, + "bm": 0, + "completed": true + } + ] + } + ], + "markers": [], + "__complete": true +} \ No newline at end of file diff --git a/assets/icons/clipboard_eye.svg b/assets/icons/clipboard_eye.svg new file mode 100644 index 0000000..99bc1ad --- /dev/null +++ b/assets/icons/clipboard_eye.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/assets/icons/clipboard_task.svg b/assets/icons/clipboard_task.svg new file mode 100644 index 0000000..b0d2d3e --- /dev/null +++ b/assets/icons/clipboard_task.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/killogram.svg b/assets/icons/killogram.svg new file mode 100644 index 0000000..695689c --- /dev/null +++ b/assets/icons/killogram.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/place_holder.svg b/assets/icons/place_holder.svg index cfd772b..f76a0bf 100644 --- a/assets/icons/place_holder.svg +++ b/assets/icons/place_holder.svg @@ -1 +1,33 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/place_holder.png b/assets/images/place_holder.png index fe12c5a005e81ec1e5d1acb2da3ee323980a0a75..48c509ed57325f81e2e6d7c153051abda013df31 100644 GIT binary patch literal 12617 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 literal 23331 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 diff --git a/assets/vec/clipboard_eye.svg.vec b/assets/vec/clipboard_eye.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..e0db39f0cf82755d879a061ba5f8d29f033ca8f2 GIT binary patch literal 1650 zcmYL}3ry8j9LLZ9B22i~r0jwUmoYKu5}=a`d0fuEejJu=!FoLWwYt8dHnbONa81q*lby}ex#zG zkM<4xf-E8aD&2~lYP-5zzwj}iT6jTny|Lqje64K(UKzVjW;)+NsiQ_tEh$7s-*y?B zG9N{sR>+l|`G$2ERm(wTRnxuZs z3r)G$G*2RIQiK)V$cyFovjLiT`ub)4WiB+sRsaZrzO(ayxF{V;C&Wgdfl{8F4UdCq)) zi0S9qX#qI8+pg9H55=VHK((qo5N#3uYV8m^5^f3AAL+pEj=Qq3&4KIjw`EV~FjP9v z$^OV-tgrUUsl!LW?cX4GJ#b>oqMg#SdKBW;Rme)G%kWBbq~Y@Tv1b2DSd7v41jQPA zy=(lnl*AkVo}dK8_uQ37W5!`*k5Hf0jmNzxf3?~*0ef=;Rrha+So67EB_Djj#2+>; z=P_^AR4C>*NcOQRZ>Oo(z+0MkT2Xv_2db7Fgs*lx0?WO4bK^D~XgGvk|BsM7<*@0; zB~A8+JRN>PQobqVh@@WRoJL7IJ+qR2+M6pR{Z6je)O{h@7s|hlD^=91cE7D?w;*$_ z?$;5SRGh8o_gHC`nYVwIW+~3!ATynN%sTf_t>V0PMt`9=zkQ3E6z93CwOMh#y_@$d z&O6C_X4d-Nk-Uf0KiYPS%NWvu@0Tb!1+wEAt$z zZJ(p1UZd7NsFE#szOuD!P6OLGqSf@ W+T=Ny@AwE7!{>{zbQ3jf2LA%FTT literal 0 HcmV?d00001 diff --git a/assets/vec/clipboard_task.svg.vec b/assets/vec/clipboard_task.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..5b272b6102861bbcc585790841a89d2ffc40cb51 GIT binary patch literal 2389 zcmYk83s6*L6vyxG3J8edN+@844q-IYgi=icli&Y}4<_@GyFOt|OU3dvrbdQnF}@R& z1r|hP@c}L`0bziZd_+D5)@`8H7o-#7GtAVnM3L>Dvu<@~m*2hLch3Ji=X~dW%Yrwz zN~$nP3YO_R#GzaoNpd)XRFWhl#SBonL8X=Gn_lNe!gmm5}_#j(1+a=>VdnB3weuYKMm{2bnLNd0d@lKRQXE4rCO zNA#Cz{MIW2WU`y{c%V#v_k8?i()lKIuuQt+bpbN1GfE#IA6(fjh_RO61dZqRHVLvD z6KN6T*RjSdNar07lOSD5G6`CTNbAx##X)uy7x__~q(gC&F6BY%P+pQWk@F-D*KOkG z=#(T;us9Y;50?x3tq;)q;8Wq1Fc}*k%n{F;r=jN~y%M9IIpN_}=DG&wj%A_E|IV1u>ACo0o_&lGC-X|_LFVEZGtaM|TE_P2ah2@9xvrY^ z>V0Zif3e=qR0m#UK5M?j@x0vc3da{dsg2{MeWUn^&U~Ev7!k3P^RyK&_?IViZpbON z!9}Xad21EVf3>6%ryTj>ME?rhh}kFN@0G*5U#^mW8AkqW6aycYB5|BS#3z@c$SqZL zW|SbVG(~)W-3*_lYeY?95#BqVAii312n&4UM1I451Vb<4d-IurB9Gb6u!raS%*bZ@ zbAz+kzhH3&>%}JfGdovtN=w)Vs;lFGT7W8V~&Sz973{6*mR>t^EC(=m^uu zCqplbh(2n$Wu~3qgW)>+i@G{FpjZp4b9{t9sQx>R0igXT8#Dy8KUU*V(0(m*yb9Vs zBJ~ZC`iMwt^%YyRw zdzM{LUU7OmzZXQxo5raQWJh%&KdKYyM1^Z*()BOa@_V>JA-$JGssoKvUC7Q=-yoGr z@{^Ryb$ZZ=;yh+FG0L#ctVQ3_Nc5QhVrDOY!aN=P6y|}^xc2cgTs6Fp)21G1{eVo} zb7&G{m{F>UOm#_LnZ~E?^pweN(IPLI{8qbr%cQfY&|4kw&OqBi&?X2&sa zwrh;?WWNK)+*wDhyaS|5q;-h2E|KCOJBo|^C{EI$xJj4ta^+Xp`zmUbp8CXb|6g91 zp$Cn-Nb^A|wWOtbQJs`S+4)zw(|kmu(x7u$u)SeJ!IMlh{c;|kMQ1Ah=W#1919xhz z*f?=Oy7hhD;k*L#TMq@opn4ve^f2oUwu#m&9<$WTUm{qsO^~X z{3u$b@0i|ab}|bR(|A6leiz7o^o$%trXN@Qk05dHVa2}!kLMOC{#E$1s8I2*W_q8g zVHPCT@_a~r9orXm*W+2c8Kq?w>`p6THtEWk>cAtQ`D|+i$UexY3fuedVN=epO1P*0gh{m) zxSc+ay+1bMy(i5GZna|e=Cf!SZimrv5(aY{?1>iW!#fc2dX_0O literal 0 HcmV?d00001 diff --git a/assets/vec/killogram.svg.vec b/assets/vec/killogram.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..72a627f740fa945adc116a4501af25242cb98abb GIT binary patch literal 4824 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 literal 0 HcmV?d00001 diff --git a/assets/vec/place_holder.svg.vec b/assets/vec/place_holder.svg.vec index caeb6bf3555827d9e81281726165faf16f3603fd..caefba3892624ca873745811b86d8a4dcb4cd912 100644 GIT binary patch literal 11080 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 HU;qCAh_}hP literal 5160 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 KQ6Uiy4gCukGL5eQ diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 39e46bf..a7d6683 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -28,15 +28,247 @@ class BuyOutOfProvincePage extends GetView { return RPaginatedListView( listType: ListType.separated, resource: data.value, - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) => ListItem( - expandList: controller.isExpandedList, - index: index, - child: Container(height: 40, color: Colors.red), - secondChild: Container(height: 80, color: Colors.blue), - labelColor: AppColor.lightGreyNormalHover, - labelIcon: Assets.vec.truckFastSvg.path, - ), + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + + index: index, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 20), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 3, + children: [ + Text( + item.killHouseName ?? 'N/A', + textAlign: TextAlign.start, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + + Expanded( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 3, + children: [ + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + SizedBox(height: 2), + + Text( + '${item.province}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 1, + child: Assets.vec.scanSvg.svg( + width: 32.w, + height: 32.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ], + ), + secondChild: Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + item.date?.toJalali.formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${item.date?.toJalali.formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + + buildRow(title: 'مشخصات فروشنده', value: item.killHouseName ?? 'N/A'), + + buildRow( + title: 'تلفن فروشنده', + value: item.killHouseMobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), + buildRow( + title: 'وزن خریداری شده', + value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', + ), + buildRowOnTapped( + title: 'مشاهده بارنامه', + titleStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + valueWidget: Assets.vec.clipboardEyeSvg.svg( + width: 20, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + onTap: () { + Get.bottomSheet( + BaseBottomSheet( + height: 400, + child: Column( + spacing: 16, + children: [ + Text( + 'بارنامه', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + Image.network( + item.barImage ?? '', + fit: BoxFit.cover, + height: 300, + errorBuilder: (context, error, stackTrace) { + eLog(error.toString()); + return Center(child: Text('خطایی پیش آمده!')); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + print('Loading progress: $loadingProgress'); + return CupertinoActivityIndicator(); + }, + ), + ], + ), + ), + ); + }, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditData(item); + Get.bottomSheet( + addPurchasedInformationBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () => + controller.deleteStewardPurchaseOutOfProvince(item.key!), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ], + ), + ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.truckFastOutlinedSvg.path, + ); + }, controller.isExpandedList); + }, itemCount: data.value.data?.length ?? 0, separatorBuilder: (context, index) => SizedBox(height: 8.h), onLoadMore: () async {}, @@ -53,325 +285,6 @@ class BuyOutOfProvincePage extends GetView { ); } - Widget saleListWidget() { - return ObxValue((data) { - switch (data.value.status) { - case Status.initial: - case Status.loading: - return Center(child: CupertinoActivityIndicator()); - case Status.success: - return ListView.separated( - shrinkWrap: true, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) { - return ObxValue( - (expandList) => saleListItem( - expandList: expandList, - index: index, - item: data.value.data![index], - ), - controller.isExpandedList, - ); - }, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemCount: data.value.data?.length ?? 0, - ); - case Status.error: - return Center( - child: Text( - data.value.message ?? 'خطا در دریافت اطلاعات', - style: AppFonts.yekan16.copyWith(color: AppColor.error), - ), - ); - case Status.empty: - return emptyWidget(); - } - }, controller.purchaseOutOfProvinceList); - } - - Widget emptyWidget() { - return Center( - child: Text( - 'داده ای دریافت نشد!', - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover), - ), - ); - } - - GestureDetector saleListItem({ - required RxList expandList, - required int index, - required StewardFreeBar item, - }) { - return GestureDetector( - onTap: () { - if (expandList.contains(index)) { - controller.isExpandedList.remove(index); - } else { - controller.isExpandedList.add(index); - } - }, - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - AnimatedSize( - duration: Duration(milliseconds: 300), - child: Container( - width: Get.width - 30, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: AppColor.darkGreyNormal), - ), - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox(width: 12), - Expanded( - flex: 2, - child: Text( - item.date?.formattedJalaliDate ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - ), - Expanded( - flex: 3, - child: Text( - item.killHouseName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(width: 8), - Expanded( - flex: 2, - child: Column( - children: [ - Text( - '${item.weightOfCarcasses?.separatedByComma}kg', - textAlign: TextAlign.left, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - - SizedBox(height: 2), - Visibility( - visible: item.product?.name?.contains('مرغ گرم') ?? false, - child: Assets.vec.hotChickenSvg.svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - ), - ], - ), - ), - Expanded( - flex: 2, - child: Text( - '${item.province}\n${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), - ), - ), - Icon(CupertinoIcons.chevron_down, size: 12), - SizedBox(width: 8), - ], - ), - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - controller.setEditData(item); - Get.bottomSheet( - addPurchasedInformationBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - - Text( - '${item.province}-${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - - GestureDetector( - onTap: () { - buildDeleteDialog( - onConfirm: () => - controller.deleteStewardPurchaseOutOfProvince(item.key!), - ); - }, - child: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), - ), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: buildRow('تاریخ', item.date?.formattedJalaliDateYHMS ?? 'N/A'), - ), - - buildRow( - 'مشخصات فروشنده', - '${item.killHouseName} - ${item.killHouseMobile ?? 'N/A'}', - ), - buildRow('محصول', item.product?.name ?? 'N/A'), - buildRow( - 'وزن خریداری شده', - '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - Get.bottomSheet( - BaseBottomSheet( - height: 400, - child: Column( - spacing: 16, - children: [ - Text( - 'بارنامه', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - - Image.network( - item.barImage ?? '', - fit: BoxFit.cover, - height: 300, - errorBuilder: (context, error, stackTrace) { - eLog(error.toString()); - return Center(child: Text('خطایی پیش آمده!')); - }, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - print('Loading progress: $loadingProgress'); - return CupertinoActivityIndicator(); - }, - ), - ], - ), - ), - ); - }, - child: Text( - 'مشاهده بارنامه', - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - ), - Icon(CupertinoIcons.chevron_up, size: 12), - ], - ), - ], - ), - ), - crossFadeState: expandList.contains(index) - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - ), - ), - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), - ), - alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), - ), - ), - ], - ), - ), - ); - } - - Widget buildRow(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - Flexible( - flex: 2, - child: Text( - value, - textAlign: TextAlign.left, - - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - ], - ), - ); - } - Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( child: SingleChildScrollView( @@ -389,6 +302,8 @@ class BuyOutOfProvincePage extends GetView { controller: controller.sellerNameController, label: 'نام فروشنده', borderColor: AppColor.darkGreyLight, + filled: true, + filledColor: AppColor.bgLight, ), RTextField( controller: controller.sellerPhoneController, @@ -396,6 +311,8 @@ class BuyOutOfProvincePage extends GetView { keyboardType: TextInputType.phone, borderColor: AppColor.darkGreyLight, maxLength: 11, + filled: true, + filledColor: AppColor.bgLight, validator: (value) { if (value == null || value.isEmpty) { return 'لطفاً شماره موبایل را وارد کنید'; @@ -415,7 +332,13 @@ class BuyOutOfProvincePage extends GetView { _cityWidget(), RTextField( controller: controller.carcassWeightController, - label: 'وزن لاشه', + label: 'وزن', + filled: true, + suffixIcon: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Assets.vec.killogramSvg.svg(), + ), + filledColor: AppColor.bgLight, keyboardType: TextInputType.number, borderColor: AppColor.darkGreyLight, inputFormatters: [ @@ -437,6 +360,8 @@ class BuyOutOfProvincePage extends GetView { return ObxValue((data) { return RElevated( text: isOnEdit ? 'ویرایش' : 'ثبت خرید', + width: Get.width, + backgroundColor: AppColor.greenNormal, onPressed: data.value ? () async { var res = await controller.createStewardPurchaseOutOfProvince(); @@ -459,8 +384,16 @@ class BuyOutOfProvincePage extends GetView { }, selectedItem: controller.selectedProduct.value, initialValue: controller.selectedProduct.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + itemBuilder: (item) => Text( + item.name ?? 'بدون نام', + style: AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarker), + ), + labelBuilder: (item) => item?.name != null + ? Text(item!.name!, style: AppFonts.yekan14.copyWith(color: AppColor.textColor)) + : Text( + 'انتخاب محصول', + style: AppFonts.yekan14.copyWith(color: AppColor.textColorLight), + ), ); }); } @@ -474,8 +407,16 @@ class BuyOutOfProvincePage extends GetView { print('Selected Product: ${value.name}'); }, selectedItem: controller.selectedProvince.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), + itemBuilder: (item) => Text( + item.name ?? 'بدون نام', + style: AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarker), + ), + labelBuilder: (item) => item?.name != null + ? Text(item!.name!, style: AppFonts.yekan14.copyWith(color: AppColor.textColor)) + : Text( + 'انتخاب استان', + style: AppFonts.yekan14.copyWith(color: AppColor.textColorLight), + ), ); }); } @@ -486,11 +427,15 @@ class BuyOutOfProvincePage extends GetView { items: data, onChanged: (value) { controller.selectedCity.value = value; - print('Selected Product: ${value.name}'); }, selectedItem: controller.selectedCity.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), + itemBuilder: (item) => Text( + item.name ?? 'بدون نام', + style: AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarker), + ), + labelBuilder: (item) => item?.name != null + ? Text(item!.name!, style: AppFonts.yekan14.copyWith(color: AppColor.textColor)) + : Text('انتخاب شهر', style: AppFonts.yekan14.copyWith(color: AppColor.textColorLight)), ); }, controller.cites); } @@ -498,96 +443,73 @@ class BuyOutOfProvincePage extends GetView { SizedBox _imageCarcasesWidget(bool isOnEdit) { return SizedBox( width: Get.width, - height: 250, + height: 370, child: Card( color: Colors.white, child: Padding( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(4.0), child: Column( + spacing: 8, children: [ + Text('بارنامه', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), Expanded( child: ObxValue((data) { return Container( width: Get.width, + height: 270, decoration: BoxDecoration( color: AppColor.lightGreyNormal, borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLight), ), child: Center( child: isOnEdit ? Image.network(controller.editImageUrl.value ?? '') : data.value == null - ? Assets.images.placeHolder.image(height: 150, width: 200) + ? Padding( + padding: const EdgeInsets.fromLTRB(30, 10, 10, 30), + child: Assets.vec.placeHolderSvg.svg(width: 200.w, height: 150.h), + ) : Image.file(File(data.value!.path), fit: BoxFit.cover), ), ); }, controller.selectedImage), ), - SizedBox(height: 15), - Container( - width: Get.width, - height: 40, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'تصویر بار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - Spacer(), - GestureDetector( - onTap: () async { - controller.selectedImage.value = await controller.imagePicker.pickImage( - source: ImageSource.camera, - imageQuality: 60, - maxWidth: 1080, - maxHeight: 720, - ); - }, - child: Container( - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text('دوربین', style: AppFonts.yekan14.copyWith(color: Colors.white)), - SizedBox(width: 8), - Icon(CupertinoIcons.camera, color: Colors.white), - ], - ), - ), - ), - SizedBox(width: 16), - GestureDetector( - onTap: () async { - controller.selectedImage.value = await controller.imagePicker.pickImage( - source: ImageSource.gallery, - imageQuality: 60, - maxWidth: 1080, - maxHeight: 720, - ); - }, - child: Container( - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - padding: EdgeInsetsGeometry.symmetric(horizontal: 6, vertical: 4), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text('گالری', style: AppFonts.yekan14.copyWith(color: Colors.white)), - SizedBox(width: 8), - Icon(CupertinoIcons.photo, color: Colors.white), - ], - ), - ), - ), - ], - ), + + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + text: 'گالری', + width: 150.w, + height: 40.h, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + onPressed: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.gallery, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + ), + SizedBox(width: 16), + ROutlinedElevated( + text: 'دوربین', + width: 150.w, + height: 40.h, + textStyle: AppFonts.yekan20.copyWith(color: AppColor.blueNormal), + onPressed: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.camera, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + ), + ], ), ], ), diff --git a/packages/chicken/lib/presentation/widget/list_item/list_item.dart b/packages/chicken/lib/presentation/widget/list_item/list_item.dart index a199ca0..9b54657 100644 --- a/packages/chicken/lib/presentation/widget/list_item/list_item.dart +++ b/packages/chicken/lib/presentation/widget/list_item/list_item.dart @@ -4,33 +4,29 @@ import 'package:rasadyar_core/core.dart'; class ListItem extends StatelessWidget { const ListItem({ super.key, - required this.expandList, required this.index, required this.child, required this.secondChild, required this.labelColor, required this.labelIcon, + required this.onTap, + required this.selected, this.labelIconColor = AppColor.mediumGreyDarkHover, }); - final RxList expandList; final int index; final Widget child; final Widget secondChild; final Color labelColor; final String labelIcon; final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; @override Widget build(BuildContext context) { return GestureDetector( - onTap: () { - /*if (expandList.contains(index)) { - controller.isExpandedList.remove(index); - } else { - controller.isExpandedList.add(index); - }*/ - }, + onTap: onTap, child: Container( width: Get.width, margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), @@ -83,7 +79,7 @@ class ListItem extends StatelessWidget { ), child: secondChild, ), - crossFadeState: expandList.contains(index) + crossFadeState: selected ? CrossFadeState.showSecond : CrossFadeState.showFirst, duration: Duration(milliseconds: 300), @@ -129,3 +125,115 @@ class ListItem extends StatelessWidget { ); } } + +class ListItem2 extends StatelessWidget { + const ListItem2({ + super.key, + required this.index, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + required this.onTap, + required this.selected, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final int index; + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedCrossFade( + firstChild: Row( + children: [ + Expanded( + child: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + ), + Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + //TODO + colorFilter: ColorFilter.mode(labelIconColor ?? AppColor.mediumGreyDarkActive, BlendMode.srcIn), + ), + ), + ), + ], + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 8, 12, 12), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: selected ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/packages/chicken/lib/presentation/widget/list_row_item.dart b/packages/chicken/lib/presentation/widget/list_row_item.dart new file mode 100644 index 0000000..790a035 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/list_row_item.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +Widget buildRow({ + required String title, + required String value, + TextStyle? titleStyle, + TextStyle? valueStyle, +}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: Text( + title, + textAlign: TextAlign.right, + style: titleStyle ?? AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + Flexible( + flex: 2, + child: Text( + value, + textAlign: TextAlign.left, + style: valueStyle ?? AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ], + ), + ); +} + +Widget buildRowOnTapped({ + String? title, + String? value, + Widget? titleWidget, + Widget? valueWidget, + TextStyle? titleStyle, + TextStyle? valueStyle, + required VoidCallback onTap, +}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 2, + child: + titleWidget ?? + Text( + title ?? 'N/A', + textAlign: TextAlign.right, + style: titleStyle ?? AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + GestureDetector( + onTap: onTap, + child: Flexible( + flex: 2, + child: + valueWidget ?? + Text( + value ?? 'N/A', + textAlign: TextAlign.left, + style: valueStyle ?? AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ), + ), + ], + ), + ); +} diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index acb62bd..c69ee77 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -361,8 +361,10 @@ class AppColor { static const Color bgLight = Color(0xFFF5F5F5); // #083940 rgb(8, 57, 64) + static const Color bgIcon = Color(0xFF797979); // #797979 static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64) static const Color textColor = Color(0xFF5B5B5B); // #083940 rgb(8, 57, 64) + static const Color textColorLight = Color(0xFFB2B2B2); //endregion diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 4bbbc32..ea84c81 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -16,11 +16,14 @@ import 'package:vector_graphics/vector_graphics.dart' as _vg; class $AssetsAnimGen { const $AssetsAnimGen(); + /// File path: assets/anim/error.json + LottieGenImage get error => const LottieGenImage('assets/anim/error.json'); + /// File path: assets/anim/loading.json LottieGenImage get loading => const LottieGenImage('assets/anim/loading.json'); /// List of all assets - List get values => [loading]; + List get values => [error, loading]; } class $AssetsIconsGen { @@ -62,6 +65,12 @@ class $AssetsIconsGen { /// File path: assets/icons/chicken.svg SvgGenImage get chicken => const SvgGenImage('assets/icons/chicken.svg'); + /// File path: assets/icons/clipboard_eye.svg + SvgGenImage get clipboardEye => const SvgGenImage('assets/icons/clipboard_eye.svg'); + + /// File path: assets/icons/clipboard_task.svg + SvgGenImage get clipboardTask => const SvgGenImage('assets/icons/clipboard_task.svg'); + /// File path: assets/icons/close_square.svg SvgGenImage get closeSquare => const SvgGenImage('assets/icons/close_square.svg'); @@ -128,6 +137,9 @@ class $AssetsIconsGen { /// File path: assets/icons/key.svg SvgGenImage get key => const SvgGenImage('assets/icons/key.svg'); + /// File path: assets/icons/killogram.svg + SvgGenImage get killogram => const SvgGenImage('assets/icons/killogram.svg'); + /// File path: assets/icons/liveStock.svg SvgGenImage get liveStock => const SvgGenImage('assets/icons/liveStock.svg'); @@ -238,6 +250,8 @@ class $AssetsIconsGen { check, checkSquare, chicken, + clipboardEye, + clipboardTask, closeSquare, convertCube, cube, @@ -260,6 +274,7 @@ class $AssetsIconsGen { inside, inspection, key, + killogram, liveStock, logout, map, @@ -363,6 +378,12 @@ class $AssetsVecGen { /// File path: assets/vec/chicken.svg.vec SvgGenImage get chickenSvg => const SvgGenImage.vec('assets/vec/chicken.svg.vec'); + /// File path: assets/vec/clipboard_eye.svg.vec + SvgGenImage get clipboardEyeSvg => const SvgGenImage.vec('assets/vec/clipboard_eye.svg.vec'); + + /// File path: assets/vec/clipboard_task.svg.vec + SvgGenImage get clipboardTaskSvg => const SvgGenImage.vec('assets/vec/clipboard_task.svg.vec'); + /// File path: assets/vec/close_square.svg.vec SvgGenImage get closeSquareSvg => const SvgGenImage.vec('assets/vec/close_square.svg.vec'); @@ -429,6 +450,9 @@ class $AssetsVecGen { /// File path: assets/vec/key.svg.vec SvgGenImage get keySvg => const SvgGenImage.vec('assets/vec/key.svg.vec'); + /// File path: assets/vec/killogram.svg.vec + SvgGenImage get killogramSvg => const SvgGenImage.vec('assets/vec/killogram.svg.vec'); + /// File path: assets/vec/liveStock.svg.vec SvgGenImage get liveStockSvg => const SvgGenImage.vec('assets/vec/liveStock.svg.vec'); @@ -539,6 +563,8 @@ class $AssetsVecGen { checkSvg, checkSquareSvg, chickenSvg, + clipboardEyeSvg, + clipboardTaskSvg, closeSquareSvg, convertCubeSvg, cubeSvg, @@ -561,6 +587,7 @@ class $AssetsVecGen { insideSvg, inspectionSvg, keySvg, + killogramSvg, liveStockSvg, logoutSvg, mapSvg, diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart index cb646f0..f32398b 100644 --- a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -15,8 +15,11 @@ class BaseBottomSheet extends StatelessWidget { height: height ?? MediaQuery.of(context).size.height * 0.85, padding: EdgeInsets.symmetric(vertical: 15, horizontal: 20), decoration: BoxDecoration( - color:bgColor?? Colors.white, - borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), + color: bgColor ?? Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(25), + topRight: Radius.circular(25), + ), ), child: SingleChildScrollView( child: Column( @@ -33,11 +36,14 @@ class BaseBottomSheet extends StatelessWidget { Container( height: 3, width: 50, - decoration: BoxDecoration(color: AppColor.darkGreyDark, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: AppColor.darkGreyDark, + borderRadius: BorderRadius.circular(8), + ), ), Positioned( - left: 0, + left: -10, child: IconButton( onPressed: () { Navigator.of(context).pop(); diff --git a/packages/core/lib/presentation/widget/empty_widget.dart b/packages/core/lib/presentation/widget/empty_widget.dart index b727b41..c8b0ed6 100644 --- a/packages/core/lib/presentation/widget/empty_widget.dart +++ b/packages/core/lib/presentation/widget/empty_widget.dart @@ -6,16 +6,14 @@ class EmptyWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row(), - Assets.icons.empty.svg(width: 156.w, height: 156.h), - Text('داده ای یافت نشد', style: AppFonts.yekan20.copyWith(color: AppColor.textColor)), - ], - ), + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(), + Assets.anim.error.lottie(), + Text('داده ای یافت نشد', style: AppFonts.yekan20.copyWith(color: AppColor.textColor)), + ], ); } } diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 9ff9aec..acb3711 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -3,12 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:rasadyar_core/core.dart'; -enum RTextFieldVariant { - normal, - noBorder, - password, - passwordNoBorder, -} +enum RTextFieldVariant { normal, noBorder, password, passwordNoBorder } class RTextField extends StatefulWidget { final TextEditingController controller; @@ -40,6 +35,7 @@ class RTextField extends StatefulWidget { final void Function(String)? onChanged; final void Function(String)? onSubmitted; final List? inputFormatters; + final Widget? suffix; const RTextField({ super.key, @@ -71,32 +67,25 @@ class RTextField extends StatefulWidget { this.onChanged, this.onSubmitted, this.borderColor, - this.inputFormatters + this.inputFormatters, + this.suffix, }); - @override State createState() => _RTextFieldState(); bool get _isPassword => variant == RTextFieldVariant.password; + bool get _noBorder => variant == RTextFieldVariant.noBorder; + bool get _passwordNoBorder => variant == RTextFieldVariant.passwordNoBorder; - - InputBorder get _inputBorder => - _noBorder || _passwordNoBorder ? InputBorder.none : OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide( - color: borderColor ?? AppColor.lightGreyDarkActive, - width: 1, - ), - ); - - - - - - + InputBorder get _inputBorder => _noBorder || _passwordNoBorder + ? InputBorder.none + : OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: borderColor ?? AppColor.lightGreyDarkActive, width: 1), + ); } class _RTextFieldState extends State { @@ -164,6 +153,7 @@ class _RTextFieldState extends State { errorStyle: widget.errorStyle, errorMaxLines: 1, isDense: widget.isDense, + suffix: widget.suffix, suffixIcon: _buildSuffixIcon(), suffixIconConstraints: widget.boxConstraints, prefixIcon: widget.prefixIcon, @@ -185,4 +175,4 @@ class _RTextFieldState extends State { ), ); } -} \ No newline at end of file +} diff --git a/packages/core/lib/presentation/widget/loading_widget.dart b/packages/core/lib/presentation/widget/loading_widget.dart index d514e49..98f4671 100644 --- a/packages/core/lib/presentation/widget/loading_widget.dart +++ b/packages/core/lib/presentation/widget/loading_widget.dart @@ -6,9 +6,9 @@ class LoadingWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Expanded(child: Center(child: Assets.anim.loading.lottie( + return Center(child: Assets.anim.loading.lottie( width: 120.w, height: 120.h, - ))); + )); } } diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index 629d9c9..1973c9f 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -58,8 +58,9 @@ class _OverlayDropdownState extends State> { elevation: 4, borderRadius: BorderRadius.circular(8), child: Container( + decoration: BoxDecoration( - color: Colors.white, + color: AppColor.bgLight, border: Border.all(color: AppColor.darkGreyLight), borderRadius: BorderRadius.circular(8), ), @@ -123,6 +124,7 @@ class _OverlayDropdownState extends State> { width: Get.width, padding: const EdgeInsets.symmetric(horizontal: 12), decoration: BoxDecoration( + color: AppColor.bgLight, border: Border.all(color: AppColor.darkGreyLight), borderRadius: BorderRadius.circular(8), ), diff --git a/packages/core/lib/utils/date_time_utils.dart b/packages/core/lib/utils/date_time_utils.dart index 7cf2645..0c045ff 100644 --- a/packages/core/lib/utils/date_time_utils.dart +++ b/packages/core/lib/utils/date_time_utils.dart @@ -21,6 +21,11 @@ extension XDateTime on String { String get formattedYHMS { return DateFormat('yyyy-MM-dd HH:mm:ss').format(toDateTime); } + + Jalali get toJalali{ + final dateTime = DateTime.parse(this); + return Jalali.fromDateTime(dateTime); + } } extension XDateTime2 on DateTime { From 157398494b2d3e95f8bd8b2bf6218368db0f698a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 1 Jul 2025 16:28:19 +0330 Subject: [PATCH 166/256] fix : empty widget --- packages/core/lib/presentation/widget/empty_widget.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/presentation/widget/empty_widget.dart b/packages/core/lib/presentation/widget/empty_widget.dart index c8b0ed6..a9d3ad4 100644 --- a/packages/core/lib/presentation/widget/empty_widget.dart +++ b/packages/core/lib/presentation/widget/empty_widget.dart @@ -11,8 +11,8 @@ class EmptyWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Row(), - Assets.anim.error.lottie(), - Text('داده ای یافت نشد', style: AppFonts.yekan20.copyWith(color: AppColor.textColor)), + Assets.images.placeHolder.image(width: 170.w,height: 170.h), + Text('داده ای یافت نشد!', style: AppFonts.yekan20.copyWith(color: AppColor.textColor)), ], ); } From 0da9f54d35c4babc3c631c48f58868d9add6b760 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 2 Jul 2025 08:49:24 +0330 Subject: [PATCH 167/256] fix : incorrect parent --- .../lib/presentation/widget/list_row_item.dart | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/chicken/lib/presentation/widget/list_row_item.dart b/packages/chicken/lib/presentation/widget/list_row_item.dart index 790a035..cd6bdaf 100644 --- a/packages/chicken/lib/presentation/widget/list_row_item.dart +++ b/packages/chicken/lib/presentation/widget/list_row_item.dart @@ -49,20 +49,18 @@ Widget buildRowOnTapped({ children: [ Flexible( flex: 2, - child: - titleWidget ?? + child: titleWidget ?? Text( title ?? 'N/A', textAlign: TextAlign.right, style: titleStyle ?? AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), - GestureDetector( - onTap: onTap, - child: Flexible( - flex: 2, - child: - valueWidget ?? + Flexible( + flex: 2, + child: GestureDetector( + onTap: onTap, + child: valueWidget ?? Text( value ?? 'N/A', textAlign: TextAlign.left, From d49bbf1e93c79bdccf11aca227a6d961a6d553bf Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 2 Jul 2025 08:50:19 +0330 Subject: [PATCH 168/256] fix :kiss and dray --- .../pages/buy_out_of_province/view.dart | 454 +++++++++--------- 1 file changed, 226 insertions(+), 228 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index a7d6683..27e8a94 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; @@ -35,235 +36,9 @@ class BuyOutOfProvincePage extends GetView { return ListItem2( selected: val.contains(index), onTap: () => controller.isExpandedList.toggle(index), - index: index, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox(width: 20), - Expanded( - flex: 2, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 3, - children: [ - Text( - item.killHouseName ?? 'N/A', - textAlign: TextAlign.start, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - Text( - item.date?.formattedJalaliDate ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - ], - ), - ), - - Expanded( - flex: 3, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 3, - children: [ - Visibility( - visible: item.product?.name?.contains('مرغ گرم') ?? false, - child: Assets.vec.hotChickenSvg.svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - ), - Text( - '${item.weightOfCarcasses?.separatedByComma}kg', - textAlign: TextAlign.left, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - ], - ), - - SizedBox(height: 2), - - Text( - '${item.province}', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), - ), - ], - ), - ), - Expanded( - flex: 1, - child: Assets.vec.scanSvg.svg( - width: 32.w, - height: 32.h, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - ], - ), - secondChild: Container( - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - '${item.province}-${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - spacing: 3, - children: [ - Text( - item.date?.toJalali.formatter.wN ?? 'N/A', - style: AppFonts.yekan14.copyWith(color: AppColor.textColor), - ), - - Text( - '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - ], - ), - - Text( - '${item.date?.toJalali.formatter.y}', - style: AppFonts.yekan20.copyWith(color: AppColor.textColor), - ), - - Text( - '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', - style: AppFonts.yekan14.copyWith(color: AppColor.textColor), - ), - ], - ), - ), - - buildRow(title: 'مشخصات فروشنده', value: item.killHouseName ?? 'N/A'), - - buildRow( - title: 'تلفن فروشنده', - value: item.killHouseMobile ?? 'N/A', - valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), - buildRow( - title: 'وزن خریداری شده', - value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', - ), - buildRowOnTapped( - title: 'مشاهده بارنامه', - titleStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - valueWidget: Assets.vec.clipboardEyeSvg.svg( - width: 20, - height: 24, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - onTap: () { - Get.bottomSheet( - BaseBottomSheet( - height: 400, - child: Column( - spacing: 16, - children: [ - Text( - 'بارنامه', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - - Image.network( - item.barImage ?? '', - fit: BoxFit.cover, - height: 300, - errorBuilder: (context, error, stackTrace) { - eLog(error.toString()); - return Center(child: Text('خطایی پیش آمده!')); - }, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - print('Loading progress: $loadingProgress'); - return CupertinoActivityIndicator(); - }, - ), - ], - ), - ), - ); - }, - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 16.w, - children: [ - RElevated( - text: 'ویرایش', - width: 150.w, - height: 40.h, - onPressed: () { - controller.setEditData(item); - Get.bottomSheet( - addPurchasedInformationBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - textStyle: AppFonts.yekan20.copyWith(color: Colors.white), - backgroundColor: AppColor.greenNormal, - ), - ROutlinedElevated( - text: 'حذف', - textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), - width: 150.w, - height: 40.h, - onPressed: () { - buildDeleteDialog( - onConfirm: () => - controller.deleteStewardPurchaseOutOfProvince(item.key!), - ); - }, - borderColor: AppColor.redNormal, - ), - ], - ), - ], - ), - ), + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), labelColor: AppColor.blueLight, labelIcon: Assets.vec.truckFastOutlinedSvg.path, ); @@ -285,6 +60,229 @@ class BuyOutOfProvincePage extends GetView { ); } + Container itemListExpandedWidget(StewardFreeBar item) { + return Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + item.date?.toJalali.formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${item.date?.toJalali.formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + + buildRow(title: 'مشخصات فروشنده', value: item.killHouseName ?? 'N/A'), + + buildRow( + title: 'تلفن فروشنده', + value: item.killHouseMobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), + buildRow( + title: 'وزن خریداری شده', + value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', + ), + buildRowOnTapped( + title: 'مشاهده بارنامه', + titleStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + valueWidget: Assets.vec.clipboardEyeSvg.svg( + width: 20, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + onTap: () { + Get.bottomSheet( + BaseBottomSheet( + height: 400, + child: Column( + spacing: 16, + children: [ + Text( + 'بارنامه', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Image.network( + item.barImage ?? '', + fit: BoxFit.cover, + height: 300, + errorBuilder: (context, error, stackTrace) { + eLog(error.toString()); + return Center(child: Text('خطایی پیش آمده!')); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + print('Loading progress: $loadingProgress'); + return CupertinoActivityIndicator(); + }, + ), + ], + ), + ), + ); + }, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditData(item); + Get.bottomSheet( + addPurchasedInformationBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ], + ), + ); + } + + Row itemListWidget(StewardFreeBar item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 20), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 3, + children: [ + Text( + item.killHouseName ?? 'N/A', + textAlign: TextAlign.start, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 3, + children: [ + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + SizedBox(height: 2), + + Text( + '${item.province}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 1, + child: Assets.vec.scanSvg.svg( + width: 32.w, + height: 32.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ], + ); + } + Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( child: SingleChildScrollView( From 2cfb158d96ce18e8733627e0792a69bab96ba41a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 2 Jul 2025 08:56:50 +0330 Subject: [PATCH 169/256] feat : error widget and error json --- assets/anim/error.json | 14880 +--------------- .../lib/presentation/widget/error_widget.dart | 22 + 2 files changed, 23 insertions(+), 14879 deletions(-) create mode 100644 packages/core/lib/presentation/widget/error_widget.dart diff --git a/assets/anim/error.json b/assets/anim/error.json index ec8dcbc..6bd95b9 100644 --- a/assets/anim/error.json +++ b/assets/anim/error.json @@ -1,14879 +1 @@ -{ - "v": "5.5.7", - "meta": { - "g": "LottieFiles AE 0.1.21", - "a": "", - "k": "", - "d": "", - "tc": "#ffffff" - }, - "fr": 60, - "ip": 0, - "op": 300, - "w": 1000, - "h": 1000, - "nm": "Frame 33680", - "ddd": 0, - "assets": [ - { - "id": "comp_0", - "layers": [ - { - "ddd": 0, - "ind": 1, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 0, - "s": [ - 0 - ] - }, - { - "t": 45, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 861, - 52.376, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0.031, - 8.341 - ], - [ - -20.583, - 8.777 - ], - [ - -20.352, - -0.093 - ], - [ - -20.151, - -5.851 - ], - [ - -20.583, - -8.279 - ], - [ - -6.959, - -8.03 - ], - [ - 20.275, - -7.859 - ], - [ - 19.519, - -8.637 - ], - [ - 19.596, - 8.777 - ], - [ - 20.275, - 8.077 - ], - [ - 13.562999999999999, - 8.17 - ] - ], - "o": [ - [ - 0.031, - 8.341 - ], - [ - -20.583, - 8.777 - ], - [ - -20.29, - -2.988 - ], - [ - -20.151, - -8.699 - ], - [ - -13.762999999999998, - -8.201 - ], - [ - -0.154, - -8.03 - ], - [ - 20.275, - -7.859 - ], - [ - 19.519, - -8.637 - ], - [ - 19.596, - 8.777 - ], - [ - 16.910999999999998, - 8.17 - ], - [ - 10.184, - 8.17 - ] - ], - "v": [ - [ - 0.031, - 8.341 - ], - [ - -20.583, - 8.777 - ], - [ - -20.352, - -0.093 - ], - [ - -20.151, - -8.699 - ], - [ - -20.583, - -8.279 - ], - [ - -0.154, - -8.03 - ], - [ - 20.275, - -7.859 - ], - [ - 19.519, - -8.637 - ], - [ - 19.596, - 8.777 - ], - [ - 20.275, - 8.077 - ], - [ - 10.184, - 8.17 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -20.799, - -2.754 - ], - [ - -20.583, - 8.777 - ], - [ - -0.386, - 9.291 - ], - [ - 9.891, - 9.477 - ], - [ - 16.772000000000002, - 9.477 - ], - [ - 20.969, - 9.477 - ], - [ - 20.969, - 8.777 - ], - [ - 21, - -8.684 - ], - [ - 21, - -9.477 - ], - [ - 20.213, - -9.477 - ], - [ - -0.154, - -9.369 - ], - [ - -13.762999999999998, - -9.197999999999999 - ], - [ - -21, - -9.12 - ], - [ - -21, - -8.637 - ] - ], - "o": [ - [ - -20.799, - 0.156 - ], - [ - -20.583, - 8.777 - ], - [ - -0.386, - 9.291 - ], - [ - 13.332, - 9.477 - ], - [ - 20.213, - 9.477 - ], - [ - 20.969, - 9.477 - ], - [ - 20.969, - 8.777 - ], - [ - 21, - -8.684 - ], - [ - 21, - -9.477 - ], - [ - 20.213, - -9.477 - ], - [ - -6.959, - -9.369 - ], - [ - -20.583, - -9.12 - ], - [ - -21, - -9.12 - ], - [ - -20.969, - -5.696000000000001 - ] - ], - "v": [ - [ - -20.799, - 0.156 - ], - [ - -20.583, - 8.777 - ], - [ - -0.386, - 9.291 - ], - [ - 9.891, - 9.477 - ], - [ - 20.213, - 9.477 - ], - [ - 20.969, - 9.477 - ], - [ - 20.969, - 8.777 - ], - [ - 21, - -8.684 - ], - [ - 21, - -9.477 - ], - [ - 20.213, - -9.477 - ], - [ - -0.154, - -9.369 - ], - [ - -20.583, - -9.12 - ], - [ - -21, - -9.12 - ], - [ - -21, - -8.637 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 2, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 45, - "s": [ - 0 - ] - }, - { - "t": 90, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 64.5, - 91.283, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - -100, - -100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 14.5, - -6.485 - ], - [ - -14.5, - -6.485 - ], - [ - -14.5, - 6.485 - ], - [ - 14.5, - 6.485 - ] - ], - "o": [ - [ - 14.5, - -6.485 - ], - [ - -14.5, - -6.485 - ], - [ - -14.5, - 6.485 - ], - [ - 14.5, - 6.485 - ] - ], - "v": [ - [ - 14.5, - -6.485 - ], - [ - -14.5, - -6.485 - ], - [ - -14.5, - 6.485 - ], - [ - 14.5, - 6.485 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 3, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 15, - "s": [ - 0 - ] - }, - { - "t": 60, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 114, - 44.893, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0, - 6.155 - ], - [ - -14.692, - 6.466 - ], - [ - -14.505, - -0.035 - ], - [ - -14.362, - -4.291 - ], - [ - -14.659, - -6.086 - ], - [ - -4.952, - -5.902 - ], - [ - 14.45, - -5.775 - ], - [ - 13.899, - -6.351 - ], - [ - 13.955, - 6.523 - ], - [ - 14.45, - 6.017 - ], - [ - 9.651, - 6.017 - ] - ], - "o": [ - [ - 0, - 6.155 - ], - [ - -14.692, - 6.466 - ], - [ - -14.461, - -2.1750000000000003 - ], - [ - -14.362, - -6.408 - ], - [ - -9.806000000000001, - -6.0280000000000005 - ], - [ - -0.088, - -5.902 - ], - [ - 14.45, - -5.775 - ], - [ - 13.899, - -6.351 - ], - [ - 13.955, - 6.523 - ], - [ - 12.050999999999998, - 6.017 - ], - [ - 7.241, - 6.017 - ] - ], - "v": [ - [ - 0, - 6.155 - ], - [ - -14.692, - 6.466 - ], - [ - -14.505, - -0.035 - ], - [ - -14.362, - -6.408 - ], - [ - -14.659, - -6.086 - ], - [ - -0.088, - -5.902 - ], - [ - 14.45, - -5.775 - ], - [ - 13.899, - -6.351 - ], - [ - 13.955, - 6.523 - ], - [ - 14.45, - 6.017 - ], - [ - 7.241, - 6.017 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -14.857, - -2.0469999999999997 - ], - [ - -14.692, - 6.466 - ], - [ - -0.253, - 6.788 - ], - [ - 7.076, - 6.914 - ], - [ - 11.995999999999999, - 6.983 - ], - [ - 14.934, - 6.983 - ], - [ - 14.934, - 6.466 - ], - [ - 15, - -6.408 - ], - [ - 15, - -6.983 - ], - [ - 14.45, - -6.983 - ], - [ - -0.121, - -6.903 - ], - [ - -9.839, - -6.719 - ], - [ - -15, - -6.719 - ], - [ - -15, - -6.408 - ] - ], - "o": [ - [ - -14.857, - 0.104 - ], - [ - -14.692, - 6.466 - ], - [ - -0.253, - 6.788 - ], - [ - 9.53, - 6.983 - ], - [ - 14.45, - 6.983 - ], - [ - 14.934, - 6.983 - ], - [ - 14.934, - 6.466 - ], - [ - 15, - -6.408 - ], - [ - 15, - -6.983 - ], - [ - 14.45, - -6.983 - ], - [ - -4.984999999999999, - -6.903 - ], - [ - -14.692, - -6.719 - ], - [ - -15, - -6.719 - ], - [ - -14.978, - -4.222 - ] - ], - "v": [ - [ - -14.857, - 0.104 - ], - [ - -14.692, - 6.466 - ], - [ - -0.253, - 6.788 - ], - [ - 7.076, - 6.914 - ], - [ - 14.45, - 6.983 - ], - [ - 14.934, - 6.983 - ], - [ - 14.934, - 6.466 - ], - [ - 15, - -6.408 - ], - [ - 15, - -6.983 - ], - [ - 14.45, - -6.983 - ], - [ - -0.121, - -6.903 - ], - [ - -14.692, - -6.719 - ], - [ - -15, - -6.719 - ], - [ - -15, - -6.408 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 4, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 31, - "s": [ - 0 - ] - }, - { - "t": 76, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 721.5, - 395.062, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0.007, - -6.996 - ], - [ - 18.134, - -7.35 - ], - [ - 17.93, - 0.007 - ], - [ - 17.754, - 4.868 - ], - [ - 18.134, - 6.917 - ], - [ - 6.154, - 6.707 - ], - [ - -17.794, - 6.628 - ], - [ - -17.116, - 7.272 - ], - [ - -17.197, - -7.416 - ], - [ - -17.794, - -6.838 - ], - [ - -11.892, - -6.838 - ] - ], - "o": [ - [ - 0.007, - -6.996 - ], - [ - 18.134, - -7.35 - ], - [ - 17.876, - 2.451 - ], - [ - 17.754, - 7.272 - ], - [ - 12.137, - 6.851 - ], - [ - 0.17, - 6.707 - ], - [ - -17.794, - 6.628 - ], - [ - -17.116, - 7.272 - ], - [ - -17.197, - -7.416 - ], - [ - -14.836, - -6.838 - ], - [ - -8.921, - -6.838 - ] - ], - "v": [ - [ - 0.007, - -6.996 - ], - [ - 18.134, - -7.35 - ], - [ - 17.93, - 0.007 - ], - [ - 17.754, - 7.272 - ], - [ - 18.134, - 6.917 - ], - [ - 0.17, - 6.707 - ], - [ - -17.794, - 6.628 - ], - [ - -17.116, - 7.272 - ], - [ - -17.197, - -7.416 - ], - [ - -17.794, - -6.838 - ], - [ - -8.921, - -6.838 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 18.324, - 2.372 - ], - [ - 18.134, - -7.35 - ], - [ - 0.292, - -7.758 - ], - [ - -8.745, - -7.915 - ], - [ - -14.796, - -7.981 - ], - [ - -18.432, - -7.981 - ], - [ - -18.432, - -7.377 - ], - [ - -18.5, - 7.311 - ], - [ - -18.5, - 7.981 - ], - [ - -17.794, - 7.981 - ], - [ - 0.17, - 7.902 - ], - [ - 12.137, - 7.758 - ], - [ - 18.5, - 7.692 - ], - [ - 18.5, - 7.337 - ] - ], - "o": [ - [ - 18.324, - -0.085 - ], - [ - 18.134, - -7.35 - ], - [ - 0.292, - -7.758 - ], - [ - -11.770999999999999, - -7.981 - ], - [ - -17.822, - -7.981 - ], - [ - -18.432, - -7.981 - ], - [ - -18.432, - -7.377 - ], - [ - -18.5, - 7.311 - ], - [ - -18.5, - 7.981 - ], - [ - -17.794, - 7.981 - ], - [ - 6.154, - 7.902 - ], - [ - 18.134, - 7.692 - ], - [ - 18.5, - 7.692 - ], - [ - 18.473, - 4.853999999999999 - ] - ], - "v": [ - [ - 18.324, - -0.085 - ], - [ - 18.134, - -7.35 - ], - [ - 0.292, - -7.758 - ], - [ - -8.745, - -7.915 - ], - [ - -17.822, - -7.981 - ], - [ - -18.432, - -7.981 - ], - [ - -18.432, - -7.377 - ], - [ - -18.5, - 7.311 - ], - [ - -18.5, - 7.981 - ], - [ - -17.794, - 7.981 - ], - [ - 0.17, - 7.902 - ], - [ - 18.134, - 7.692 - ], - [ - 18.5, - 7.692 - ], - [ - 18.5, - 7.337 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 5, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 60, - "s": [ - 0 - ] - }, - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 75, - "s": [ - 0 - ] - }, - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 105, - "s": [ - 100 - ] - }, - { - "t": 120, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 603, - 395.062, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0, - -6.996 - ], - [ - 17.63, - -7.35 - ], - [ - 17.379, - 0.007 - ], - [ - 17.208, - 4.868 - ], - [ - 17.564, - 6.917 - ], - [ - 5.9159999999999995, - 6.707 - ], - [ - -17.406, - 6.628 - ], - [ - -16.745, - 7.272 - ], - [ - -16.745, - -7.416 - ], - [ - -17.34, - -6.838 - ], - [ - -11.581999999999999, - -6.838 - ] - ], - "o": [ - [ - 0, - -6.996 - ], - [ - 17.63, - -7.35 - ], - [ - 17.326, - 2.451 - ], - [ - 17.208, - 7.272 - ], - [ - 11.74, - 6.851 - ], - [ - 0.079, - 6.707 - ], - [ - -17.406, - 6.628 - ], - [ - -16.745, - 7.272 - ], - [ - -16.745, - -7.416 - ], - [ - -14.461, - -6.838 - ], - [ - -8.69, - -6.838 - ] - ], - "v": [ - [ - 0, - -6.996 - ], - [ - 17.63, - -7.35 - ], - [ - 17.379, - 0.007 - ], - [ - 17.208, - 7.272 - ], - [ - 17.564, - 6.917 - ], - [ - 0.079, - 6.707 - ], - [ - -17.406, - 6.628 - ], - [ - -16.745, - 7.272 - ], - [ - -16.745, - -7.416 - ], - [ - -17.34, - -6.838 - ], - [ - -8.69, - -6.838 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 17.881, - 2.372 - ], - [ - 17.63, - -7.35 - ], - [ - 0.357, - -7.758 - ], - [ - -8.439, - -7.915 - ], - [ - -14.341999999999999, - -7.981 - ], - [ - -17.921, - -7.981 - ], - [ - -17.921, - -7.377 - ], - [ - -18, - 7.311 - ], - [ - -18, - 7.981 - ], - [ - -17.34, - 7.981 - ], - [ - 0.145, - 7.902 - ], - [ - 11.806, - 7.758 - ], - [ - 18, - 7.692 - ], - [ - 18, - 7.337 - ] - ], - "o": [ - [ - 17.815, - -0.085 - ], - [ - 17.63, - -7.35 - ], - [ - 0.357, - -7.758 - ], - [ - -11.384, - -7.981 - ], - [ - -17.287, - -7.981 - ], - [ - -17.921, - -7.981 - ], - [ - -17.921, - -7.377 - ], - [ - -18, - 7.311 - ], - [ - -18, - 7.981 - ], - [ - -17.34, - 7.981 - ], - [ - 5.981999999999999, - 7.902 - ], - [ - 17.63, - 7.692 - ], - [ - 18, - 7.692 - ], - [ - 17.974, - 4.853999999999999 - ] - ], - "v": [ - [ - 17.815, - -0.085 - ], - [ - 17.63, - -7.35 - ], - [ - 0.357, - -7.758 - ], - [ - -8.439, - -7.915 - ], - [ - -17.287, - -7.981 - ], - [ - -17.921, - -7.981 - ], - [ - -17.921, - -7.377 - ], - [ - -18, - 7.311 - ], - [ - -18, - 7.981 - ], - [ - -17.34, - 7.981 - ], - [ - 0.145, - 7.902 - ], - [ - 17.63, - 7.692 - ], - [ - 18, - 7.692 - ], - [ - 18, - 7.337 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 6, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 21, - "s": [ - 0 - ] - }, - { - "t": 66, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 663, - 450.431, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 18, - -7.482 - ], - [ - -18, - -7.482 - ], - [ - -18, - 7.482 - ], - [ - 18, - 7.482 - ] - ], - "o": [ - [ - 18, - -7.482 - ], - [ - -18, - -7.482 - ], - [ - -18, - 7.482 - ], - [ - 18, - 7.482 - ] - ], - "v": [ - [ - 18, - -7.482 - ], - [ - -18, - -7.482 - ], - [ - -18, - 7.482 - ], - [ - 18, - 7.482 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 7, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 7, - "s": [ - 0 - ] - }, - { - "t": 52, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 534, - 152.638, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 10.775, - -11.133 - ], - [ - 15, - -3.783 - ], - [ - 12.732, - -2.483 - ], - [ - 12.154, - -2.013 - ], - [ - 11.733, - -0.979 - ], - [ - 11.759, - -0.185 - ], - [ - 11.759, - 0.44000000000000006 - ], - [ - 11.811, - 1.387 - ], - [ - 12.414, - 2.321 - ], - [ - 14.981, - 3.812 - ], - [ - 10.756, - 11.162 - ], - [ - 8.507, - 9.862 - ], - [ - 7.816000000000001, - 9.587000000000002 - ], - [ - 6.713, - 9.732 - ], - [ - 5.695, - 10.381 - ], - [ - 4.704, - 10.997 - ], - [ - 4.207, - 11.993 - ], - [ - 4.205, - 14.964 - ], - [ - -4.225, - 14.964 - ], - [ - -4.225, - 12.365 - ], - [ - -4.332, - 11.629000000000001 - ], - [ - -5.002999999999999, - 10.742 - ], - [ - -6.074000000000001, - 10.165 - ], - [ - -7.0969999999999995, - 9.615 - ], - [ - -8.212000000000002, - 9.677 - ], - [ - -10.775, - 11.162 - ], - [ - -15, - 3.812 - ], - [ - -12.751, - 2.502 - ], - [ - -12.168000000000001, - 2.045 - ], - [ - -11.748000000000001, - 1.0150000000000001 - ], - [ - -11.778, - 0.235 - ], - [ - -11.778, - -0.401 - ], - [ - -11.828999999999999, - -1.351 - ], - [ - -12.431999999999999, - -2.291 - ], - [ - -15, - -3.783 - ], - [ - -10.795, - -11.172 - ], - [ - -8.556, - -9.872 - ], - [ - -7.866, - -9.593 - ], - [ - -6.763, - -9.732999999999999 - ], - [ - -5.737, - -10.383000000000001 - ], - [ - -4.74, - -10.988 - ], - [ - -4.24, - -11.991 - ], - [ - -4.244, - -14.964 - ], - [ - 4.205, - -14.964 - ], - [ - 4.205, - -12.365 - ], - [ - 4.306, - -11.611 - ], - [ - 4.992999999999999, - -10.703000000000001 - ], - [ - 6.08, - -10.134 - ], - [ - 7.105, - -9.578000000000001 - ], - [ - 8.215000000000002, - -9.647 - ] - ], - "o": [ - [ - 10.775, - -11.133 - ], - [ - 15, - -3.783 - ], - [ - 12.412999999999998, - -2.291 - ], - [ - 11.809999999999999, - -1.351 - ], - [ - 11.759, - -0.401 - ], - [ - 11.759, - 0.22499999999999998 - ], - [ - 11.734, - 1.016 - ], - [ - 12.155000000000001, - 2.047 - ], - [ - 12.732, - 2.512 - ], - [ - 14.981, - 3.812 - ], - [ - 10.756, - 11.162 - ], - [ - 8.184, - 9.677 - ], - [ - 7.074, - 9.615 - ], - [ - 6.055000000000001, - 10.165 - ], - [ - 4.984, - 10.742 - ], - [ - 4.312, - 11.629000000000001 - ], - [ - 4.205, - 12.365 - ], - [ - 4.205, - 14.964 - ], - [ - -4.225, - 14.964 - ], - [ - -4.226999999999999, - 11.993 - ], - [ - -4.723999999999999, - 10.997 - ], - [ - -5.7139999999999995, - 10.381 - ], - [ - -6.734, - 9.732 - ], - [ - -7.843, - 9.587000000000002 - ], - [ - -8.537, - 9.862 - ], - [ - -10.775, - 11.162 - ], - [ - -15, - 3.812 - ], - [ - -12.43, - 2.3169999999999997 - ], - [ - -11.824, - 1.387 - ], - [ - -11.778, - 0.44000000000000006 - ], - [ - -11.778, - -0.195 - ], - [ - -11.752, - -0.979 - ], - [ - -12.173, - -2.013 - ], - [ - -12.751, - -2.483 - ], - [ - -15, - -3.783 - ], - [ - -10.795, - -11.172 - ], - [ - -8.234, - -9.686 - ], - [ - -7.1240000000000006, - -9.617 - ], - [ - -6.101999999999999, - -10.17 - ], - [ - -5.025, - -10.735000000000001 - ], - [ - -4.343999999999999, - -11.622 - ], - [ - -4.244, - -12.365 - ], - [ - -4.244, - -14.964 - ], - [ - 4.205, - -14.964 - ], - [ - 4.202, - -11.984 - ], - [ - 4.706, - -10.963000000000001 - ], - [ - 5.712, - -10.346 - ], - [ - 6.743, - -9.693999999999999 - ], - [ - 7.8469999999999995, - -9.554 - ], - [ - 8.537, - -9.833 - ] - ], - "v": [ - [ - 10.775, - -11.133 - ], - [ - 15, - -3.783 - ], - [ - 12.732, - -2.483 - ], - [ - 11.982, - -1.682 - ], - [ - 11.759, - -0.606 - ], - [ - 11.759, - 0.02 - ], - [ - 11.759, - 0.645 - ], - [ - 11.983, - 1.717 - ], - [ - 12.732, - 2.512 - ], - [ - 14.981, - 3.812 - ], - [ - 10.756, - 11.162 - ], - [ - 8.507, - 9.862 - ], - [ - 7.445, - 9.601 - ], - [ - 6.405, - 9.94 - ], - [ - 5.315, - 10.576 - ], - [ - 4.508, - 11.313 - ], - [ - 4.205, - 12.365 - ], - [ - 4.205, - 14.964 - ], - [ - -4.225, - 14.964 - ], - [ - -4.225, - 12.365 - ], - [ - -4.528, - 11.313 - ], - [ - -5.334, - 10.576 - ], - [ - -6.424, - 9.94 - ], - [ - -7.47, - 9.601 - ], - [ - -8.537, - 9.862 - ], - [ - -10.775, - 11.162 - ], - [ - -15, - 3.812 - ], - [ - -12.751, - 2.502 - ], - [ - -11.996, - 1.716 - ], - [ - -11.778, - 0.645 - ], - [ - -11.778, - 0.02 - ], - [ - -11.778, - -0.606 - ], - [ - -12.001, - -1.682 - ], - [ - -12.751, - -2.483 - ], - [ - -15, - -3.783 - ], - [ - -10.795, - -11.172 - ], - [ - -8.556, - -9.872 - ], - [ - -7.495, - -9.605 - ], - [ - -6.454, - -9.94 - ], - [ - -5.363, - -10.576 - ], - [ - -4.542, - -11.305 - ], - [ - -4.244, - -12.365 - ], - [ - -4.244, - -14.964 - ], - [ - 4.205, - -14.964 - ], - [ - 4.205, - -12.365 - ], - [ - 4.506, - -11.287 - ], - [ - 5.334, - -10.537 - ], - [ - 6.434, - -9.901 - ], - [ - 7.476, - -9.566 - ], - [ - 8.537, - -9.833 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 4.9879999999999995, - 5.02 - ], - [ - 6.9190000000000005, - 1.3940000000000001 - ], - [ - 6.921, - -0.02 - ], - [ - 6.18, - -3.6180000000000003 - ], - [ - 1.83, - -6.94 - ], - [ - -2.706, - -6.532 - ], - [ - -5.869, - -3.9210000000000003 - ], - [ - -7.055, - 0.014000000000000012 - ], - [ - -5.864, - 3.948 - ], - [ - -2.6980000000000004, - 6.556 - ], - [ - 1.377, - 6.957 - ] - ], - "o": [ - [ - 6.5120000000000005, - 2.736 - ], - [ - 6.921, - 0.02 - ], - [ - 6.913, - -1.858 - ], - [ - 3.5860000000000003, - -6.212 - ], - [ - -1.368, - -6.94 - ], - [ - -4.981999999999999, - -5.006 - ], - [ - -6.917, - -1.3830000000000002 - ], - [ - -6.523, - 2.71 - ], - [ - -3.93, - 5.8919999999999995 - ], - [ - -0.014000000000000012, - 7.094 - ], - [ - 3.907, - 5.909 - ] - ], - "v": [ - [ - 5.75, - 3.878 - ], - [ - 6.921, - 0.02 - ], - [ - 6.921, - -0.02 - ], - [ - 4.883, - -4.915 - ], - [ - 0, - -6.94 - ], - [ - -3.844, - -5.769 - ], - [ - -6.393, - -2.652 - ], - [ - -6.789, - 1.362 - ], - [ - -4.897, - 4.92 - ], - [ - -1.356, - 6.825 - ], - [ - 2.642, - 6.433 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 8, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 4, - "s": [ - 0 - ] - }, - { - "t": 49, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 63, - 326.226, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 15.657, - 15.013 - ], - [ - 5.329, - 20.95 - ], - [ - 3.502, - 17.771 - ], - [ - 2.849, - 16.962999999999997 - ], - [ - 1.401, - 16.375 - ], - [ - 0, - 16.412 - ], - [ - -0.879, - 16.412 - ], - [ - -1.923, - 16.483 - ], - [ - -3.235, - 17.326 - ], - [ - -5.343, - 20.91 - ], - [ - -15.671, - 15.013 - ], - [ - -13.831, - 11.915 - ], - [ - -13.443999999999999, - 10.951 - ], - [ - -13.647, - 9.411 - ], - [ - -14.562, - 7.981 - ], - [ - -15.416, - 6.595 - ], - [ - -16.822000000000003, - 5.904 - ], - [ - -21, - 5.91 - ], - [ - -21, - -5.896 - ], - [ - -17.347, - -5.896 - ], - [ - -16.306, - -6.033 - ], - [ - -15.059000000000001, - -6.976 - ], - [ - -14.264, - -8.475000000000001 - ], - [ - -13.482, - -9.9 - ], - [ - -13.571, - -11.450999999999999 - ], - [ - -15.671, - -15.04 - ], - [ - -5.288, - -20.95 - ], - [ - -3.447, - -17.798 - ], - [ - -2.7920000000000003, - -16.994 - ], - [ - -1.345, - -16.406000000000002 - ], - [ - -0.23299999999999998, - -16.44 - ], - [ - 0.6460000000000001, - -16.44 - ], - [ - 1.9769999999999999, - -16.512 - ], - [ - 3.2889999999999997, - -17.354 - ], - [ - 5.274, - -20.937 - ], - [ - 15.602, - -15.04 - ], - [ - 13.776, - -11.915 - ], - [ - 13.389, - -10.947000000000001 - ], - [ - 13.593, - -9.4 - ], - [ - 14.503, - -7.9750000000000005 - ], - [ - 15.360999999999999, - -6.581 - ], - [ - 16.767000000000003, - -5.89 - ], - [ - 21, - -5.896 - ], - [ - 21, - 5.91 - ], - [ - 17.292, - 5.91 - ], - [ - 16.28, - 6.052 - ], - [ - 15.06, - 6.965 - ], - [ - 14.256, - 8.450999999999999 - ], - [ - 13.482, - 9.877999999999998 - ], - [ - 13.571, - 11.435 - ] - ], - "o": [ - [ - 15.657, - 15.013 - ], - [ - 5.329, - 20.95 - ], - [ - 3.235, - 17.326 - ], - [ - 1.923, - 16.483 - ], - [ - 0.879, - 16.412 - ], - [ - 0, - 16.412 - ], - [ - -1.401, - 16.375 - ], - [ - -2.849, - 16.962999999999997 - ], - [ - -3.502, - 17.771 - ], - [ - -5.343, - 20.91 - ], - [ - -15.671, - 15.013 - ], - [ - -13.571, - 11.463999999999999 - ], - [ - -13.482, - 9.913 - ], - [ - -14.264, - 8.489 - ], - [ - -15.059000000000001, - 6.989999999999999 - ], - [ - -16.306, - 6.047 - ], - [ - -17.347, - 5.91 - ], - [ - -21, - 5.91 - ], - [ - -21, - -5.896 - ], - [ - -16.822000000000003, - -5.89 - ], - [ - -15.416, - -6.581 - ], - [ - -14.562, - -7.9670000000000005 - ], - [ - -13.647, - -9.397 - ], - [ - -13.443999999999999, - -10.938 - ], - [ - -13.831, - -11.902 - ], - [ - -15.671, - -15.04 - ], - [ - -5.288, - -20.95 - ], - [ - -3.178, - -17.354999999999997 - ], - [ - -1.866, - -16.514000000000003 - ], - [ - -0.536, - -16.44 - ], - [ - 0.34299999999999997, - -16.44 - ], - [ - 1.455, - -16.405 - ], - [ - 2.903, - -16.991999999999997 - ], - [ - 3.557, - -17.798 - ], - [ - 5.274, - -20.937 - ], - [ - 15.602, - -15.04 - ], - [ - 13.516, - -11.462 - ], - [ - 13.427, - -9.905 - ], - [ - 14.202, - -8.478 - ], - [ - 15.004000000000001, - -6.976 - ], - [ - 16.250999999999998, - -6.033 - ], - [ - 17.292, - -5.896 - ], - [ - 21, - -5.896 - ], - [ - 21, - 5.91 - ], - [ - 16.781000000000002, - 5.91 - ], - [ - 15.412, - 6.584 - ], - [ - 14.558, - 7.948 - ], - [ - 13.647, - 9.373 - ], - [ - 13.443999999999999, - 10.92 - ], - [ - 13.831, - 11.888 - ] - ], - "v": [ - [ - 15.657, - 15.013 - ], - [ - 5.329, - 20.95 - ], - [ - 3.502, - 17.771 - ], - [ - 2.386, - 16.723 - ], - [ - 0.879, - 16.412 - ], - [ - 0, - 16.412 - ], - [ - -0.879, - 16.412 - ], - [ - -2.386, - 16.723 - ], - [ - -3.502, - 17.771 - ], - [ - -5.343, - 20.91 - ], - [ - -15.671, - 15.013 - ], - [ - -13.831, - 11.915 - ], - [ - -13.463, - 10.432 - ], - [ - -13.94, - 8.981 - ], - [ - -14.833, - 7.459 - ], - [ - -15.861, - 6.321 - ], - [ - -17.347, - 5.91 - ], - [ - -21, - 5.91 - ], - [ - -21, - -5.896 - ], - [ - -17.347, - -5.896 - ], - [ - -15.861, - -6.307 - ], - [ - -14.833, - -7.445 - ], - [ - -13.94, - -8.967 - ], - [ - -13.463, - -10.419 - ], - [ - -13.831, - -11.902 - ], - [ - -15.671, - -15.04 - ], - [ - -5.288, - -20.95 - ], - [ - -3.447, - -17.798 - ], - [ - -2.329, - -16.754 - ], - [ - -0.824, - -16.44 - ], - [ - 0.055, - -16.44 - ], - [ - 0.934, - -16.44 - ], - [ - 2.44, - -16.752 - ], - [ - 3.557, - -17.798 - ], - [ - 5.274, - -20.937 - ], - [ - 15.602, - -15.04 - ], - [ - 13.776, - -11.915 - ], - [ - 13.408, - -10.426 - ], - [ - 13.886, - -8.967 - ], - [ - 14.778, - -7.445 - ], - [ - 15.806, - -6.307 - ], - [ - 17.292, - -5.896 - ], - [ - 21, - -5.896 - ], - [ - 21, - 5.91 - ], - [ - 17.292, - 5.91 - ], - [ - 15.846, - 6.318 - ], - [ - 14.833, - 7.418 - ], - [ - 13.94, - 8.94 - ], - [ - 13.463, - 10.399 - ], - [ - 13.831, - 11.888 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -7.055, - 6.981 - ], - [ - -1.938, - 9.677 - ], - [ - 0, - 9.674 - ], - [ - 5.056, - 8.663 - ], - [ - 9.75, - 2.621 - ], - [ - 9.217, - -3.7259999999999995 - ], - [ - 5.559, - -8.177 - ], - [ - 0.018000000000000016, - -9.861999999999998 - ], - [ - -5.535, - -8.21 - ], - [ - -9.22, - -3.783 - ], - [ - -9.791, - 1.924 - ] - ], - "o": [ - [ - -3.833, - 9.109 - ], - [ - 0, - 9.674 - ], - [ - 2.58, - 9.674 - ], - [ - 8.716000000000001, - 5.063000000000001 - ], - [ - 9.779, - -1.849 - ], - [ - 7.083, - -6.926 - ], - [ - 1.987, - -9.661000000000001 - ], - [ - -3.7859999999999996, - -9.128 - ], - [ - -8.283, - -5.508 - ], - [ - -9.982000000000001, - -0.02499999999999991 - ], - [ - -8.311, - 5.465999999999999 - ] - ], - "v": [ - [ - -5.444, - 8.045 - ], - [ - 0, - 9.674 - ], - [ - 0, - 9.674 - ], - [ - 6.886, - 6.863 - ], - [ - 9.765, - 0.068 - ], - [ - 8.15, - -5.326 - ], - [ - 3.773, - -8.919 - ], - [ - -1.884, - -9.495 - ], - [ - -6.909, - -6.859 - ], - [ - -9.601, - -1.904 - ], - [ - -9.051, - 3.695 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 9, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 37, - "s": [ - 0 - ] - }, - { - "t": 82, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 382.5, - 64.347, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 21.17, - 6.063 - ], - [ - 14.799, - 16.311 - ], - [ - 11.686, - 14.413 - ], - [ - 10.713, - 13.993 - ], - [ - 9.134, - 14.138 - ], - [ - 8.175, - 14.705 - ], - [ - 7.380000000000001, - 15.133 - ], - [ - 6.226, - 15.822 - ], - [ - 5.469, - 17.212 - ], - [ - 5.334, - 21.449 - ], - [ - -6.682, - 21.07 - ], - [ - -6.565, - 17.371 - ], - [ - -6.686999999999999, - 16.315 - ], - [ - -7.609999999999999, - 15.022 - ], - [ - -9.106000000000002, - 14.141 - ], - [ - -10.536, - 13.313 - ], - [ - -12.113, - 13.357000000000001 - ], - [ - -15.827, - 15.347 - ], - [ - -21.5, - 4.72 - ], - [ - -18.271, - 2.929 - ], - [ - -17.429000000000002, - 2.295 - ], - [ - -16.768, - 0.859 - ], - [ - -16.777, - -0.872 - ], - [ - -16.776999999999997, - -2.5269999999999997 - ], - [ - -17.604, - -3.879 - ], - [ - -21.18, - -6.112 - ], - [ - -14.847, - -16.359 - ], - [ - -11.696, - -14.413 - ], - [ - -10.729, - -13.989 - ], - [ - -9.158, - -14.136000000000001 - ], - [ - -8.204, - -14.705 - ], - [ - -7.4190000000000005, - -15.123 - ], - [ - -6.254, - -15.821000000000002 - ], - [ - -5.498, - -17.220000000000002 - ], - [ - -5.363, - -21.449 - ], - [ - 6.643, - -21.079 - ], - [ - 6.527, - -17.381 - ], - [ - 6.657, - -16.329 - ], - [ - 7.574999999999999, - -15.036999999999999 - ], - [ - 9.072999999999999, - -14.162 - ], - [ - 10.5, - -13.32 - ], - [ - 12.081999999999999, - -13.365 - ], - [ - 15.788, - -15.357 - ], - [ - 21.5, - -4.73 - ], - [ - 18.261, - -2.978 - ], - [ - 17.422, - -2.346 - ], - [ - 16.759999999999998, - -0.916 - ], - [ - 16.767, - 0.8130000000000001 - ], - [ - 16.764, - 2.472 - ], - [ - 17.592, - 3.83 - ] - ], - "o": [ - [ - 21.17, - 6.063 - ], - [ - 14.799, - 16.311 - ], - [ - 11.232, - 14.138 - ], - [ - 9.653, - 13.993 - ], - [ - 8.427999999999999, - 14.569 - ], - [ - 7.651, - 14.997000000000002 - ], - [ - 6.6370000000000005, - 15.475999999999999 - ], - [ - 5.636, - 16.7 - ], - [ - 5.45, - 17.741 - ], - [ - 5.334, - 21.449 - ], - [ - -6.682, - 21.07 - ], - [ - -6.5520000000000005, - 16.84 - ], - [ - -7.221, - 15.397 - ], - [ - -8.631, - 14.452 - ], - [ - -10.030000000000001, - 13.494000000000002 - ], - [ - -11.588, - 13.245 - ], - [ - -12.578, - 13.605 - ], - [ - -15.827, - 15.347 - ], - [ - -21.5, - 4.72 - ], - [ - -17.811, - 2.6719999999999997 - ], - [ - -16.903, - 1.379 - ], - [ - -16.797, - -0.26999999999999996 - ], - [ - -16.676000000000002, - -1.998 - ], - [ - -17.245, - -3.477 - ], - [ - -18.048, - -4.165 - ], - [ - -21.18, - -6.112 - ], - [ - -14.847, - -16.359 - ], - [ - -11.247, - -14.136000000000001 - ], - [ - -9.675, - -13.989 - ], - [ - -8.456999999999999, - -14.569 - ], - [ - -7.68, - -14.997000000000002 - ], - [ - -6.665, - -15.47 - ], - [ - -5.664, - -16.705000000000002 - ], - [ - -5.479, - -17.751 - ], - [ - -5.363, - -21.449 - ], - [ - 6.643, - -21.079 - ], - [ - 6.5200000000000005, - -16.851 - ], - [ - 7.191000000000001, - -15.413 - ], - [ - 8.564, - -14.487 - ], - [ - 9.992999999999999, - -13.502 - ], - [ - 11.556000000000001, - -13.251999999999999 - ], - [ - 12.549, - -13.615 - ], - [ - 15.788, - -15.357 - ], - [ - 21.5, - -4.73 - ], - [ - 17.803, - -2.7220000000000004 - ], - [ - 16.895999999999997, - -1.434 - ], - [ - 16.787, - 0.21199999999999997 - ], - [ - 16.663999999999998, - 1.941 - ], - [ - 17.232000000000003, - 3.4259999999999997 - ], - [ - 18.038, - 4.117 - ] - ], - "v": [ - [ - 21.17, - 6.063 - ], - [ - 14.799, - 16.311 - ], - [ - 11.686, - 14.413 - ], - [ - 10.183, - 13.993 - ], - [ - 8.68, - 14.413 - ], - [ - 7.913, - 14.851 - ], - [ - 7.118, - 15.26 - ], - [ - 5.931, - 16.261 - ], - [ - 5.45, - 17.741 - ], - [ - 5.334, - 21.449 - ], - [ - -6.682, - 21.07 - ], - [ - -6.565, - 17.371 - ], - [ - -6.954, - 15.856 - ], - [ - -8.078, - 14.773 - ], - [ - -9.601, - 13.8 - ], - [ - -11.062, - 13.279 - ], - [ - -12.578, - 13.605 - ], - [ - -15.827, - 15.347 - ], - [ - -21.5, - 4.72 - ], - [ - -18.271, - 2.929 - ], - [ - -17.166, - 1.837 - ], - [ - -16.777, - 0.331 - ], - [ - -16.719, - -1.47 - ], - [ - -17.011, - -3.002 - ], - [ - -18.048, - -4.165 - ], - [ - -21.18, - -6.112 - ], - [ - -14.847, - -16.359 - ], - [ - -11.696, - -14.413 - ], - [ - -10.202, - -13.989 - ], - [ - -8.709, - -14.413 - ], - [ - -7.942, - -14.851 - ], - [ - -7.147, - -15.25 - ], - [ - -5.959, - -16.263 - ], - [ - -5.479, - -17.751 - ], - [ - -5.363, - -21.449 - ], - [ - 6.643, - -21.079 - ], - [ - 6.527, - -17.381 - ], - [ - 6.924, - -15.871 - ], - [ - 8.039, - -14.783 - ], - [ - 9.562, - -13.81 - ], - [ - 11.028, - -13.286 - ], - [ - 12.549, - -13.615 - ], - [ - 15.788, - -15.357 - ], - [ - 21.5, - -4.73 - ], - [ - 18.261, - -2.978 - ], - [ - 17.159, - -1.89 - ], - [ - 16.767, - -0.389 - ], - [ - 16.709, - 1.411 - ], - [ - 16.998, - 2.949 - ], - [ - 18.038, - 4.117 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -2.858, - 9.637 - ], - [ - 2.968, - 9.623 - ], - [ - 6.833, - 7.257 - ], - [ - 9.084999999999999, - 4.093999999999999 - ], - [ - 9.959999999999999, - 0.30599999999999994 - ], - [ - 9.321, - -3.5280000000000005 - ], - [ - 6.381, - -7.802999999999999 - ], - [ - 0.9940000000000001, - -10.028 - ], - [ - -4.7170000000000005, - -8.875 - ], - [ - -8.827, - -4.731 - ], - [ - -9.95, - 1.0050000000000001 - ], - [ - -7.709, - 6.4 - ] - ], - "o": [ - [ - 1.0179999999999998, - 10.015 - ], - [ - 5.824, - 8.088 - ], - [ - 8.471, - 5.2490000000000006 - ], - [ - 9.833, - 1.6099999999999999 - ], - [ - 9.702, - -2.276 - ], - [ - 7.789, - -6.393000000000001 - ], - [ - 2.9450000000000003, - -9.641 - ], - [ - -2.88, - -9.639999999999999 - ], - [ - -7.725, - -6.393000000000001 - ], - [ - -9.953000000000001, - -0.9910000000000001 - ], - [ - -8.815999999999999, - 4.743 - ], - [ - -4.695, - 8.876 - ] - ], - "v": [ - [ - -0.92, - 9.826 - ], - [ - 4.684, - 8.7 - ], - [ - 7.652, - 6.253 - ], - [ - 9.459, - 2.852 - ], - [ - 9.831, - -0.985 - ], - [ - 8.709, - -4.671 - ], - [ - 4.663, - -8.722 - ], - [ - -0.943, - -9.834 - ], - [ - -6.221, - -7.634 - ], - [ - -9.39, - -2.861 - ], - [ - -9.383, - 2.874 - ], - [ - -6.202, - 7.638 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - } - ] - } - ], - "layers": [ - { - "ddd": 0, - "ind": 1, - "ty": 3, - "nm": "▽ Group 23322", - "sr": 1, - "ks": { - "o": { - "a": 0, - "k": 100, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 500, - 500, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 462, - 256.5, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 2, - "ty": 3, - "nm": "▽ freepik--Gears--inject-52", - "parent": 1, - "sr": 1, - "ks": { - "o": { - "a": 0, - "k": 100, - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 471.056, - 253.86, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 382.479, - 204.101, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 3, - "ty": 4, - "nm": "Ellipse 20", - "parent": 2, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 70, - "s": [ - 0 - ] - }, - { - "t": 90, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 635.922, - 128.741, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 0.833, - 0.833, - 0.833 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0.167, - 0.167, - 0.167 - ] - }, - "t": 70, - "s": [ - 0, - 0, - 100 - ] - }, - { - "t": 90, - "s": [ - 100, - 100, - 100 - ] - } - ], - "ix": 6, - "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 4;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 0, - "k": [ - 21, - 21 - ], - "ix": 2 - }, - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 3 - }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 1, - 1, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Ellipse 20", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 4, - "ty": 4, - "nm": "Vector", - "parent": 2, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 13, - "s": [ - 0 - ] - }, - { - "t": 33, - "s": [ - 100 - ] - } - ], - "ix": 11, - "x": "var $bm_rt;\n$bm_rt = transform.opacity;" - }, - "r": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 30, - "s": [ - 0 - ] - }, - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0 - ] - }, - "t": 70, - "s": [ - 45 - ] - }, - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 100, - "s": [ - 45 - ] - }, - { - "t": 130, - "s": [ - -15 - ] - } - ], - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 636.959, - 127.795, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 0.833, - 0.833, - 0.833 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0.167, - 0.167, - 0.167 - ] - }, - "t": 13, - "s": [ - 0, - 0, - 100 - ] - }, - { - "t": 33, - "s": [ - 100, - 100, - 100 - ] - } - ], - "ix": 6, - "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 28.446, - 19.443 - ], - [ - 32.709, - 11.382 - ], - [ - 42.314, - 6.444 - ], - [ - 42.666, - -5.399 - ], - [ - 33.578, - -6.347 - ], - [ - 31, - -14.91 - ], - [ - 34.52, - -25.271 - ], - [ - 26.292, - -33.897 - ], - [ - 19.224, - -28.166 - ], - [ - 11.344000000000001, - -32.622 - ], - [ - 6.485, - -42.27 - ], - [ - -5.416, - -42.584 - ], - [ - -6.321, - -33.965 - ], - [ - -15.340000000000002, - -31.514000000000003 - ], - [ - -25.342, - -34.465 - ], - [ - -33.982, - -26.256 - ], - [ - -28.88, - -19.958 - ], - [ - -33.702, - -11.582 - ], - [ - -42.352, - -6.466 - ], - [ - -42.666, - 5.414 - ], - [ - -34.976, - 6.242 - ], - [ - -32.297, - 15.693000000000001 - ], - [ - -34.565, - 25.316 - ], - [ - -26.337, - 33.927 - ], - [ - -20.271, - 29.025 - ], - [ - -11.686, - 33.657000000000004 - ], - [ - -6.485, - 42.27 - ], - [ - 5.416, - 42.584 - ], - [ - 6.276, - 34.42 - ], - [ - 15.305, - 31.618 - ], - [ - 25.335, - 34.465 - ], - [ - 33.982, - 26.256 - ] - ], - "o": [ - [ - 30.969, - 15.644000000000002 - ], - [ - 33.563, - 6.906 - ], - [ - 42.314, - 6.444 - ], - [ - 42.666, - -5.399 - ], - [ - 32.712, - -10.734 - ], - [ - 28.536, - -18.645 - ], - [ - 34.52, - -25.271 - ], - [ - 26.292, - -33.897 - ], - [ - 15.523, - -30.77 - ], - [ - 6.926, - -33.614 - ], - [ - 6.485, - -42.27 - ], - [ - -5.416, - -42.584 - ], - [ - -10.931999999999999, - -33.199000000000005 - ], - [ - -19.283, - -29.01 - ], - [ - -25.342, - -34.465 - ], - [ - -33.982, - -26.256 - ], - [ - -31.721999999999998, - -16.048 - ], - [ - -34.692, - -6.854 - ], - [ - -42.352, - -6.466 - ], - [ - -42.666, - 5.414 - ], - [ - -34.153, - 11.084 - ], - [ - -29.531, - 19.756 - ], - [ - -34.565, - 25.316 - ], - [ - -26.337, - 33.927 - ], - [ - -16.25, - 31.784999999999997 - ], - [ - -6.882, - 34.517 - ], - [ - -6.485, - 42.27 - ], - [ - 5.416, - 42.584 - ], - [ - 10.91, - 33.485 - ], - [ - 19.194, - 28.935 - ], - [ - 25.335, - 34.465 - ], - [ - 33.982, - 26.256 - ] - ], - "v": [ - [ - 28.446, - 19.443 - ], - [ - 33.563, - 6.906 - ], - [ - 42.314, - 6.444 - ], - [ - 42.666, - -5.399 - ], - [ - 33.578, - -6.347 - ], - [ - 28.536, - -18.645 - ], - [ - 34.52, - -25.271 - ], - [ - 26.292, - -33.897 - ], - [ - 19.224, - -28.166 - ], - [ - 6.926, - -33.614 - ], - [ - 6.485, - -42.27 - ], - [ - -5.416, - -42.584 - ], - [ - -6.321, - -33.965 - ], - [ - -19.283, - -29.01 - ], - [ - -25.342, - -34.465 - ], - [ - -33.982, - -26.256 - ], - [ - -28.88, - -19.958 - ], - [ - -34.692, - -6.854 - ], - [ - -42.352, - -6.466 - ], - [ - -42.666, - 5.414 - ], - [ - -34.976, - 6.242 - ], - [ - -29.531, - 19.756 - ], - [ - -34.565, - 25.316 - ], - [ - -26.337, - 33.927 - ], - [ - -20.271, - 29.025 - ], - [ - -6.882, - 34.517 - ], - [ - -6.485, - 42.27 - ], - [ - 5.416, - 42.584 - ], - [ - 6.276, - 34.42 - ], - [ - 19.194, - 28.935 - ], - [ - 25.335, - 34.465 - ], - [ - 33.982, - 26.256 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "rd", - "nm": "Round Corners 1", - "r": { - "a": 0, - "k": 2, - "ix": 1 - }, - "ix": 2, - "mn": "ADBE Vector Filter - RC", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.25, - 0.25, - 0.25, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 5, - "ty": 4, - "nm": "?", - "parent": 2, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 70, - "s": [ - 0 - ] - }, - { - "t": 90, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 128.922, - 128.318, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 0.833, - 0.833, - 0.833 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0.167, - 0.167, - 0.167 - ] - }, - "t": 70, - "s": [ - 0, - 0, - 100 - ] - }, - { - "t": 90, - "s": [ - 100, - 100, - 100 - ] - } - ], - "ix": 6, - "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 4;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -6.958, - 3.327 - ], - [ - -5.8839999999999995, - 4.9430000000000005 - ], - [ - -0.428, - 4.16 - ], - [ - 5.968, - 2.033 - ], - [ - 10.5, - -3.752 - ], - [ - 10.231000000000002, - -9.450999999999999 - ], - [ - 8.435, - -12.854 - ], - [ - 5.196, - -15.27 - ], - [ - 0.6799999999999999, - -16.461 - ], - [ - -3.769, - -16.359 - ], - [ - -7.042, - -15.644 - ], - [ - -9.325, - -14.402000000000001 - ], - [ - -10.5, - -12.684 - ], - [ - -10.349, - -10.693 - ], - [ - -9.308, - -9.281 - ], - [ - -7.042, - -9.962 - ], - [ - -3.1639999999999997, - -10.948 - ], - [ - 1.6199999999999999, - -10.506 - ], - [ - 3.802, - -7.784 - ], - [ - 3.4, - -4.33 - ], - [ - 0.663, - -2.186 - ], - [ - -4.558, - -0.893 - ], - [ - -6.086, - -0.33099999999999996 - ], - [ - -7.126, - 1.08 - ] - ], - "o": [ - [ - -6.286, - 4.483 - ], - [ - -5.414, - 5.283 - ], - [ - 3.231, - 3.309 - ], - [ - 9.594, - -1.403 - ], - [ - 10.5, - -8.141 - ], - [ - 9.190000000000001, - -11.833 - ], - [ - 6.421, - -14.59 - ], - [ - 2.308, - -16.222 - ], - [ - -2.509, - -16.461 - ], - [ - -6.051, - -15.951 - ], - [ - -8.687000000000001, - -14.862 - ], - [ - -10.265, - -13.314 - ], - [ - -10.5, - -11.288 - ], - [ - -9.711, - -9.707 - ], - [ - -8.065999999999999, - -9.485 - ], - [ - -4.49, - -10.744 - ], - [ - 0.19300000000000006, - -10.948 - ], - [ - 3.3659999999999997, - -8.77 - ], - [ - 3.802, - -5.367999999999999 - ], - [ - 1.8219999999999998, - -2.7640000000000002 - ], - [ - -0.881, - -1.812 - ], - [ - -5.431, - -0.655 - ], - [ - -6.925000000000001, - 0.485 - ], - [ - -7.126, - 2.646 - ] - ], - "v": [ - [ - -6.622, - 3.905 - ], - [ - -5.414, - 5.283 - ], - [ - -0.428, - 4.16 - ], - [ - 7.781, - 0.332 - ], - [ - 10.5, - -6.712 - ], - [ - 9.694, - -10.642 - ], - [ - 7.428, - -13.705 - ], - [ - 3.752, - -15.746 - ], - [ - -1.133, - -16.461 - ], - [ - -4.91, - -16.155 - ], - [ - -7.881, - -15.236 - ], - [ - -9.795, - -13.858 - ], - [ - -10.5, - -11.969 - ], - [ - -10.047, - -10.183 - ], - [ - -8.838, - -8.907 - ], - [ - -5.766, - -10.336 - ], - [ - -1.788, - -10.948 - ], - [ - 2.493, - -9.621 - ], - [ - 3.802, - -6.661 - ], - [ - 2.594, - -3.547 - ], - [ - -0.881, - -1.812 - ], - [ - -4.558, - -0.893 - ], - [ - -6.522, - 0.077 - ], - [ - -7.126, - 1.863 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -4.809, - 9.077 - ], - [ - -6.572, - 11.51 - ], - [ - -6.219, - 14.639999999999999 - ], - [ - -3.8689999999999998, - 16.461 - ], - [ - -0.579, - 16.104 - ], - [ - 1.183, - 13.722 - ], - [ - 0.831, - 10.575000000000001 - ], - [ - -1.519, - 8.703 - ] - ], - "o": [ - [ - -6.219, - 10.575000000000001 - ], - [ - -6.572, - 13.722 - ], - [ - -4.809, - 16.104 - ], - [ - -1.519, - 16.461 - ], - [ - 0.831, - 14.639999999999999 - ], - [ - 1.183, - 11.51 - ], - [ - -0.579, - 9.077 - ], - [ - -3.8689999999999998, - 8.703 - ] - ], - "v": [ - [ - -5.514, - 9.826 - ], - [ - -6.572, - 12.633 - ], - [ - -5.514, - 15.389 - ], - [ - -2.694, - 16.461 - ], - [ - 0.126, - 15.389 - ], - [ - 1.183, - 12.633 - ], - [ - 0.126, - 9.826 - ], - [ - -2.694, - 8.703 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 1, - 1, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "?", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 6, - "ty": 4, - "nm": "Vector", - "parent": 2, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 7, - "s": [ - 0 - ] - }, - { - "t": 37, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.333 - ], - "y": [ - 0 - ] - }, - "t": 30, - "s": [ - 0 - ] - }, - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.299 - ], - "y": [ - 0 - ] - }, - "t": 71, - "s": [ - 45 - ] - }, - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.415 - ], - "y": [ - 0.26 - ] - }, - "t": 102, - "s": [ - 45 - ] - }, - { - "t": 131, - "s": [ - -15 - ] - } - ], - "ix": 10, - "x": "var $bm_rt;\nvar e, g, nMax, n, n, t, v, vl, vu, vu, tCur, segDur, tNext, nb, delta;\ne = 0.7;\ng = 5000;\nnMax = 9;\n$bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time)\n n--;\n}\nif (n > 0) {\n t = $bm_sub(time, key(n).time);\n v = $bm_mul($bm_neg(velocityAtTime($bm_sub(key(n).time, 0.001))), e);\n vl = length(v);\n if ($bm_isInstanceOfArray(value)) {\n vu = vl > 0 ? normalize(v) : [\n 0,\n 0,\n 0\n ];\n } else {\n vu = v < 0 ? -1 : 1;\n }\n tCur = 0;\n segDur = $bm_div($bm_mul(2, vl), g);\n tNext = segDur;\n nb = 1;\n while (tNext < t && nb <= nMax) {\n vl *= e;\n segDur *= e;\n tCur = tNext;\n tNext = $bm_sum(tNext, segDur);\n nb++;\n }\n if (nb <= nMax) {\n delta = $bm_sub(t, tCur);\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(vu, delta), $bm_sub(vl, $bm_div($bm_mul(g, delta), 2))));\n } else {\n $bm_rt = value;\n }\n} else {\n $bm_rt = value;\n}" - }, - "p": { - "a": 0, - "k": [ - 127.953, - 127.706, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 0.833, - 0.833, - 0.833 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0.167, - 0.167, - 0.167 - ] - }, - "t": 7, - "s": [ - 0, - 0, - 100 - ] - }, - { - "t": 27, - "s": [ - 100, - 100, - 100 - ] - } - ], - "ix": 6, - "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 28.461, - 19.473 - ], - [ - 32.724000000000004, - 11.411999999999999 - ], - [ - 42.337, - 6.503 - ], - [ - 42.651, - -5.369 - ], - [ - 33.563, - -6.317 - ], - [ - 30.985, - -14.879999999999999 - ], - [ - 34.505, - -25.241 - ], - [ - 26.315, - -33.868 - ], - [ - 19.239, - -28.137 - ], - [ - 11.337, - -32.608 - ], - [ - 6.463, - -42.255 - ], - [ - -5.438, - -42.569 - ], - [ - -6.343, - -33.95 - ], - [ - -15.363000000000001, - -31.499000000000002 - ], - [ - -25.365, - -34.45 - ], - [ - -34.004, - -26.241 - ], - [ - -28.873, - -19.928 - ], - [ - -33.688, - -11.551 - ], - [ - -42.337, - -6.436 - ], - [ - -42.651, - 5.444 - ], - [ - -34.962, - 6.272 - ], - [ - -32.278999999999996, - 15.722000000000001 - ], - [ - -34.55, - 25.346 - ], - [ - -26.322, - 33.957 - ], - [ - -20.256, - 29.054 - ], - [ - -11.671, - 33.687 - ], - [ - -6.433, - 42.255 - ], - [ - 5.423, - 42.569 - ], - [ - 6.283, - 34.405 - ], - [ - 15.315, - 31.633 - ], - [ - 25.35, - 34.494 - ], - [ - 33.997, - 26.286 - ] - ], - "o": [ - [ - 30.983999999999998, - 15.674 - ], - [ - 33.578, - 6.936 - ], - [ - 42.337, - 6.503 - ], - [ - 42.651, - -5.369 - ], - [ - 32.697, - -10.704 - ], - [ - 28.521, - -18.615 - ], - [ - 34.505, - -25.241 - ], - [ - 26.315, - -33.868 - ], - [ - 15.529, - -30.752000000000002 - ], - [ - 6.904, - -33.599 - ], - [ - 6.463, - -42.255 - ], - [ - -5.438, - -42.569 - ], - [ - -10.954, - -33.184000000000005 - ], - [ - -19.306, - -28.995 - ], - [ - -25.365, - -34.45 - ], - [ - -34.004, - -26.241 - ], - [ - -31.71, - -16.016000000000002 - ], - [ - -34.677, - -6.824 - ], - [ - -42.337, - -6.436 - ], - [ - -42.651, - 5.444 - ], - [ - -34.137, - 11.113 - ], - [ - -29.516, - 19.786 - ], - [ - -34.55, - 25.346 - ], - [ - -26.322, - 33.957 - ], - [ - -16.235, - 31.814 - ], - [ - -6.867, - 34.547 - ], - [ - -6.433, - 42.255 - ], - [ - 5.423, - 42.569 - ], - [ - 10.916, - 33.484 - ], - [ - 19.209, - 28.965 - ], - [ - 25.35, - 34.494 - ], - [ - 33.997, - 26.286 - ] - ], - "v": [ - [ - 28.461, - 19.473 - ], - [ - 33.578, - 6.936 - ], - [ - 42.337, - 6.503 - ], - [ - 42.651, - -5.369 - ], - [ - 33.563, - -6.317 - ], - [ - 28.521, - -18.615 - ], - [ - 34.505, - -25.241 - ], - [ - 26.315, - -33.868 - ], - [ - 19.239, - -28.137 - ], - [ - 6.904, - -33.599 - ], - [ - 6.463, - -42.255 - ], - [ - -5.438, - -42.569 - ], - [ - -6.343, - -33.95 - ], - [ - -19.306, - -28.995 - ], - [ - -25.365, - -34.45 - ], - [ - -34.004, - -26.241 - ], - [ - -28.873, - -19.928 - ], - [ - -34.677, - -6.824 - ], - [ - -42.337, - -6.436 - ], - [ - -42.651, - 5.444 - ], - [ - -34.962, - 6.272 - ], - [ - -29.516, - 19.786 - ], - [ - -34.55, - 25.346 - ], - [ - -26.322, - 33.957 - ], - [ - -20.256, - 29.054 - ], - [ - -6.867, - 34.547 - ], - [ - -6.433, - 42.255 - ], - [ - 5.423, - 42.569 - ], - [ - 6.283, - 34.405 - ], - [ - 19.209, - 28.965 - ], - [ - 25.35, - 34.494 - ], - [ - 33.997, - 26.286 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "rd", - "nm": "Round Corners 1", - "r": { - "a": 0, - "k": 2, - "ix": 1 - }, - "ix": 2, - "mn": "ADBE Vector Filter - RC", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.3465, - 0.3146, - 0.3135, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 7, - "ty": 4, - "nm": "!", - "parent": 2, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 70, - "s": [ - 0 - ] - }, - { - "t": 90, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 385.422, - 253.085, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 0.833, - 0.833, - 0.833 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0.167, - 0.167, - 0.167 - ] - }, - "t": 70, - "s": [ - 0, - 0, - 100 - ] - }, - { - "t": 90, - "s": [ - 100, - 100, - 100 - ] - } - ], - "ix": 6, - "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 4;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 4.178, - -10.969 - ], - [ - 4.286, - -16.639999999999997 - ], - [ - 3.918, - -20.246 - ], - [ - 1.4289999999999998, - -21.948 - ], - [ - -3.096, - -21.517 - ], - [ - -4.4590000000000005, - -16.685 - ], - [ - -4.308, - -9.267 - ], - [ - -4.026, - -2.008 - ], - [ - -3.637, - 3.958 - ], - [ - -3.009, - 6.680999999999999 - ], - [ - -0.974, - 7.52 - ], - [ - 1.017, - 7.452 - ], - [ - 2.771, - 6.907 - ], - [ - 3.5060000000000002, - 2.7560000000000002 - ], - [ - 3.9389999999999996, - -4.2299999999999995 - ] - ], - "o": [ - [ - 4.264, - -15.007 - ], - [ - 4.286, - -19.226 - ], - [ - 2.4459999999999997, - -21.608 - ], - [ - -1.5579999999999998, - -21.948 - ], - [ - -4.481, - -18.84 - ], - [ - -4.373, - -11.739999999999998 - ], - [ - -4.134, - -4.322 - ], - [ - -3.766, - 2.302 - ], - [ - -3.3770000000000002, - 6.045 - ], - [ - -1.754, - 7.361999999999999 - ], - [ - 0.454, - 7.52 - ], - [ - 2.2720000000000002, - 7.135 - ], - [ - 3.333, - 4.82 - ], - [ - 3.809, - -1.917 - ], - [ - 4.1129999999999995, - -8.812999999999999 - ] - ], - "v": [ - [ - 4.221, - -12.965 - ], - [ - 4.286, - -17.865 - ], - [ - 3.182, - -20.927 - ], - [ - 0.13, - -21.948 - ], - [ - -4.481, - -20.655 - ], - [ - -4.416, - -14.19 - ], - [ - -4.221, - -6.772 - ], - [ - -3.896, - 0.17 - ], - [ - -3.507, - 5.138 - ], - [ - -2.403, - 7.044 - ], - [ - -0.065, - 7.52 - ], - [ - 1.623, - 7.316 - ], - [ - 3.117, - 6.635 - ], - [ - 3.636, - 0.442 - ], - [ - 4.026, - -6.499 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -2.7270000000000003, - 12.103000000000002 - ], - [ - -5, - 15.279 - ], - [ - -4.545, - 19.520999999999997 - ], - [ - -1.515, - 21.948 - ], - [ - 2.7270000000000003, - 21.471999999999998 - ], - [ - 5, - 18.273 - ], - [ - 4.545, - 14.054 - ], - [ - 1.515, - 11.603 - ] - ], - "o": [ - [ - -4.545, - 14.054 - ], - [ - -5, - 18.273 - ], - [ - -2.7270000000000003, - 21.471999999999998 - ], - [ - 1.515, - 21.948 - ], - [ - 4.545, - 19.520999999999997 - ], - [ - 5, - 15.279 - ], - [ - 2.7270000000000003, - 12.103000000000002 - ], - [ - -1.515, - 11.603 - ] - ], - "v": [ - [ - -3.636, - 13.101 - ], - [ - -5, - 16.776 - ], - [ - -3.636, - 20.519 - ], - [ - 0, - 21.948 - ], - [ - 3.636, - 20.519 - ], - [ - 5, - 16.776 - ], - [ - 3.636, - 13.101 - ], - [ - 0, - 11.603 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 1, - 1, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "!", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 8, - "ty": 4, - "nm": "Vector", - "parent": 2, - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 0, - "s": [ - 0 - ] - }, - { - "t": 30, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 30, - "s": [ - 0 - ] - }, - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0 - ] - }, - "t": 70, - "s": [ - -45 - ] - }, - { - "i": { - "x": [ - 0.667 - ], - "y": [ - 1 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 102, - "s": [ - -45 - ] - }, - { - "t": 131, - "s": [ - 15 - ] - } - ], - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 382.916, - 253.274, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833, - 0.833, - 0.833 - ], - "y": [ - 0.833, - 0.833, - 0.833 - ] - }, - "o": { - "x": [ - 0.167, - 0.167, - 0.167 - ], - "y": [ - 0.167, - 0.167, - 0.167 - ] - }, - "t": 0, - "s": [ - 0, - 0, - 100 - ] - }, - { - "t": 20, - "s": [ - 100, - 100, - 100 - ] - } - ], - "ix": 6, - "x": "var $bm_rt;\nvar amp, freq, decay, n, time_max, n, t, t, v;\namp = 0.1;\nfreq = 2;\ndecay = 2;\nn = 0;\n$bm_rt = time_max = 2;\nif (numKeys > 0) {\n $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = t = 0;\n} else {\n $bm_rt = t = $bm_sub(time, key(n).time);\n}\nif (n > 0 && t < time_max) {\n v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10)));\n $bm_rt = $bm_sum(value, $bm_div($bm_mul($bm_mul(v, amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))));\n} else {\n $bm_rt = value;\n}" - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 39.292, - 16.861 - ], - [ - 42.065, - 8.876 - ], - [ - 51.777, - 3.757 - ], - [ - 51.777, - -4.071 - ], - [ - 42.471, - -5.003 - ], - [ - 40.902, - -13.274999999999999 - ], - [ - 46.772, - -22.54 - ], - [ - 42.853, - -29.323 - ], - [ - 34.341, - -25.487 - ], - [ - 28.778, - -31.863000000000003 - ], - [ - 29.187, - -42.83 - ], - [ - 22.403, - -46.747 - ], - [ - 16.95, - -39.188 - ], - [ - 8.95, - -41.952000000000005 - ], - [ - 3.815, - -51.643 - ], - [ - -4.024, - -51.643 - ], - [ - -4.944, - -42.382 - ], - [ - -13.248999999999999, - -40.803999999999995 - ], - [ - -22.545, - -46.65 - ], - [ - -29.337, - -42.733 - ], - [ - -25.552, - -34.263 - ], - [ - -31.948000000000004, - -28.718 - ], - [ - -42.935, - -29.129 - ], - [ - -46.862, - -22.361 - ], - [ - -39.277, - -16.928 - ], - [ - -42.049, - -8.938 - ], - [ - -51.777, - -3.817 - ], - [ - -51.777, - 4.004 - ], - [ - -42.449, - 4.959 - ], - [ - -40.852000000000004, - 13.256 - ], - [ - -46.705, - 22.54 - ], - [ - -42.801, - 29.256 - ], - [ - -34.296, - 25.495 - ], - [ - -28.732, - 31.866000000000003 - ], - [ - -29.142, - 42.837 - ], - [ - -22.35, - 46.747 - ], - [ - -16.905, - 39.188 - ], - [ - -8.904, - 41.944 - ], - [ - -3.77, - 51.643 - ], - [ - 4.069, - 51.643 - ], - [ - 4.997, - 42.352 - ], - [ - 13.313, - 40.762 - ], - [ - 22.62, - 46.591 - ], - [ - 29.411, - 42.688 - ], - [ - 25.567, - 34.196 - ], - [ - 31.961000000000002, - 28.649 - ], - [ - 42.95, - 29.069 - ], - [ - 46.877, - 22.294 - ] - ], - "o": [ - [ - 40.975, - 12.984000000000002 - ], - [ - 42.524, - 4.675 - ], - [ - 51.777, - 3.757 - ], - [ - 51.777, - -4.071 - ], - [ - 42.001, - -9.186 - ], - [ - 39.21, - -17.13 - ], - [ - 46.772, - -22.54 - ], - [ - 42.853, - -29.323 - ], - [ - 31.802, - -28.869999999999997 - ], - [ - 25.365, - -34.368 - ], - [ - 29.187, - -42.83 - ], - [ - 22.403, - -46.747 - ], - [ - 13.067, - -40.868 - ], - [ - 4.742, - -42.404 - ], - [ - 3.815, - -51.643 - ], - [ - -4.024, - -51.643 - ], - [ - -9.144, - -41.905 - ], - [ - -17.122, - -39.114 - ], - [ - -22.545, - -46.65 - ], - [ - -29.337, - -42.733 - ], - [ - -28.948999999999998, - -31.735999999999997 - ], - [ - -34.453, - -25.308 - ], - [ - -42.935, - -29.129 - ], - [ - -46.862, - -22.361 - ], - [ - -40.96, - -13.048000000000002 - ], - [ - -42.509, - -4.735 - ], - [ - -51.777, - -3.817 - ], - [ - -51.777, - 4.004 - ], - [ - -41.966, - 9.155999999999999 - ], - [ - -39.143, - 17.122 - ], - [ - -46.705, - 22.54 - ], - [ - -42.801, - 29.256 - ], - [ - -31.756999999999998, - 28.876 - ], - [ - -25.32, - 34.368 - ], - [ - -29.142, - 42.837 - ], - [ - -22.35, - 46.747 - ], - [ - -13.019000000000002, - 40.861000000000004 - ], - [ - -4.697, - 42.404 - ], - [ - -3.77, - 51.643 - ], - [ - 4.069, - 51.643 - ], - [ - 9.204, - 41.872 - ], - [ - 17.189, - 39.061 - ], - [ - 22.62, - 46.591 - ], - [ - 29.411, - 42.688 - ], - [ - 28.962, - 31.666999999999998 - ], - [ - 34.468, - 25.241 - ], - [ - 42.95, - 29.069 - ], - [ - 46.877, - 22.294 - ] - ], - "v": [ - [ - 39.292, - 16.861 - ], - [ - 42.524, - 4.675 - ], - [ - 51.777, - 3.757 - ], - [ - 51.777, - -4.071 - ], - [ - 42.471, - -5.003 - ], - [ - 39.21, - -17.13 - ], - [ - 46.772, - -22.54 - ], - [ - 42.853, - -29.323 - ], - [ - 34.341, - -25.487 - ], - [ - 25.365, - -34.368 - ], - [ - 29.187, - -42.83 - ], - [ - 22.403, - -46.747 - ], - [ - 16.95, - -39.188 - ], - [ - 4.742, - -42.404 - ], - [ - 3.815, - -51.643 - ], - [ - -4.024, - -51.643 - ], - [ - -4.944, - -42.382 - ], - [ - -17.122, - -39.114 - ], - [ - -22.545, - -46.65 - ], - [ - -29.337, - -42.733 - ], - [ - -25.552, - -34.263 - ], - [ - -34.453, - -25.308 - ], - [ - -42.935, - -29.129 - ], - [ - -46.862, - -22.361 - ], - [ - -39.277, - -16.928 - ], - [ - -42.509, - -4.735 - ], - [ - -51.777, - -3.817 - ], - [ - -51.777, - 4.004 - ], - [ - -42.449, - 4.959 - ], - [ - -39.143, - 17.122 - ], - [ - -46.705, - 22.54 - ], - [ - -42.801, - 29.256 - ], - [ - -34.296, - 25.495 - ], - [ - -25.32, - 34.368 - ], - [ - -29.142, - 42.837 - ], - [ - -22.35, - 46.747 - ], - [ - -16.905, - 39.188 - ], - [ - -4.697, - 42.404 - ], - [ - -3.77, - 51.643 - ], - [ - 4.069, - 51.643 - ], - [ - 4.997, - 42.352 - ], - [ - 17.189, - 39.061 - ], - [ - 22.62, - 46.591 - ], - [ - 29.411, - 42.688 - ], - [ - 25.567, - 34.196 - ], - [ - 34.468, - 25.241 - ], - [ - 42.95, - 29.069 - ], - [ - 46.877, - 22.294 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "rd", - "nm": "Round Corners 1", - "r": { - "a": 0, - "k": 2, - "ix": 1 - }, - "ix": 2, - "mn": "ADBE Vector Filter - RC", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8706, - 0.3216, - 0.298, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 11, - "ty": 0, - "nm": "background", - "refId": "comp_0", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 30, - "s": [ - 0 - ] - }, - { - "t": 132, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 500, - 500, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 462, - 256.5, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "w": 924, - "h": 513, - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true, - "layers": [ - { - "ddd": 0, - "ind": 1, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 0, - "s": [ - 0 - ] - }, - { - "t": 45, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 861, - 52.376, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0.031, - 8.341 - ], - [ - -20.583, - 8.777 - ], - [ - -20.352, - -0.093 - ], - [ - -20.151, - -5.851 - ], - [ - -20.583, - -8.279 - ], - [ - -6.959, - -8.03 - ], - [ - 20.275, - -7.859 - ], - [ - 19.519, - -8.637 - ], - [ - 19.596, - 8.777 - ], - [ - 20.275, - 8.077 - ], - [ - 13.562999999999999, - 8.17 - ] - ], - "o": [ - [ - 0.031, - 8.341 - ], - [ - -20.583, - 8.777 - ], - [ - -20.29, - -2.988 - ], - [ - -20.151, - -8.699 - ], - [ - -13.762999999999998, - -8.201 - ], - [ - -0.154, - -8.03 - ], - [ - 20.275, - -7.859 - ], - [ - 19.519, - -8.637 - ], - [ - 19.596, - 8.777 - ], - [ - 16.910999999999998, - 8.17 - ], - [ - 10.184, - 8.17 - ] - ], - "v": [ - [ - 0.031, - 8.341 - ], - [ - -20.583, - 8.777 - ], - [ - -20.352, - -0.093 - ], - [ - -20.151, - -8.699 - ], - [ - -20.583, - -8.279 - ], - [ - -0.154, - -8.03 - ], - [ - 20.275, - -7.859 - ], - [ - 19.519, - -8.637 - ], - [ - 19.596, - 8.777 - ], - [ - 20.275, - 8.077 - ], - [ - 10.184, - 8.17 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -20.799, - -2.754 - ], - [ - -20.583, - 8.777 - ], - [ - -0.386, - 9.291 - ], - [ - 9.891, - 9.477 - ], - [ - 16.772000000000002, - 9.477 - ], - [ - 20.969, - 9.477 - ], - [ - 20.969, - 8.777 - ], - [ - 21, - -8.684 - ], - [ - 21, - -9.477 - ], - [ - 20.213, - -9.477 - ], - [ - -0.154, - -9.369 - ], - [ - -13.762999999999998, - -9.197999999999999 - ], - [ - -21, - -9.12 - ], - [ - -21, - -8.637 - ] - ], - "o": [ - [ - -20.799, - 0.156 - ], - [ - -20.583, - 8.777 - ], - [ - -0.386, - 9.291 - ], - [ - 13.332, - 9.477 - ], - [ - 20.213, - 9.477 - ], - [ - 20.969, - 9.477 - ], - [ - 20.969, - 8.777 - ], - [ - 21, - -8.684 - ], - [ - 21, - -9.477 - ], - [ - 20.213, - -9.477 - ], - [ - -6.959, - -9.369 - ], - [ - -20.583, - -9.12 - ], - [ - -21, - -9.12 - ], - [ - -20.969, - -5.696000000000001 - ] - ], - "v": [ - [ - -20.799, - 0.156 - ], - [ - -20.583, - 8.777 - ], - [ - -0.386, - 9.291 - ], - [ - 9.891, - 9.477 - ], - [ - 20.213, - 9.477 - ], - [ - 20.969, - 9.477 - ], - [ - 20.969, - 8.777 - ], - [ - 21, - -8.684 - ], - [ - 21, - -9.477 - ], - [ - 20.213, - -9.477 - ], - [ - -0.154, - -9.369 - ], - [ - -20.583, - -9.12 - ], - [ - -21, - -9.12 - ], - [ - -21, - -8.637 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 2, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 45, - "s": [ - 0 - ] - }, - { - "t": 90, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 64.5, - 91.283, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - -100, - -100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 14.5, - -6.485 - ], - [ - -14.5, - -6.485 - ], - [ - -14.5, - 6.485 - ], - [ - 14.5, - 6.485 - ] - ], - "o": [ - [ - 14.5, - -6.485 - ], - [ - -14.5, - -6.485 - ], - [ - -14.5, - 6.485 - ], - [ - 14.5, - 6.485 - ] - ], - "v": [ - [ - 14.5, - -6.485 - ], - [ - -14.5, - -6.485 - ], - [ - -14.5, - 6.485 - ], - [ - 14.5, - 6.485 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 3, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 15, - "s": [ - 0 - ] - }, - { - "t": 60, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 114, - 44.893, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0, - 6.155 - ], - [ - -14.692, - 6.466 - ], - [ - -14.505, - -0.035 - ], - [ - -14.362, - -4.291 - ], - [ - -14.659, - -6.086 - ], - [ - -4.952, - -5.902 - ], - [ - 14.45, - -5.775 - ], - [ - 13.899, - -6.351 - ], - [ - 13.955, - 6.523 - ], - [ - 14.45, - 6.017 - ], - [ - 9.651, - 6.017 - ] - ], - "o": [ - [ - 0, - 6.155 - ], - [ - -14.692, - 6.466 - ], - [ - -14.461, - -2.1750000000000003 - ], - [ - -14.362, - -6.408 - ], - [ - -9.806000000000001, - -6.0280000000000005 - ], - [ - -0.088, - -5.902 - ], - [ - 14.45, - -5.775 - ], - [ - 13.899, - -6.351 - ], - [ - 13.955, - 6.523 - ], - [ - 12.050999999999998, - 6.017 - ], - [ - 7.241, - 6.017 - ] - ], - "v": [ - [ - 0, - 6.155 - ], - [ - -14.692, - 6.466 - ], - [ - -14.505, - -0.035 - ], - [ - -14.362, - -6.408 - ], - [ - -14.659, - -6.086 - ], - [ - -0.088, - -5.902 - ], - [ - 14.45, - -5.775 - ], - [ - 13.899, - -6.351 - ], - [ - 13.955, - 6.523 - ], - [ - 14.45, - 6.017 - ], - [ - 7.241, - 6.017 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -14.857, - -2.0469999999999997 - ], - [ - -14.692, - 6.466 - ], - [ - -0.253, - 6.788 - ], - [ - 7.076, - 6.914 - ], - [ - 11.995999999999999, - 6.983 - ], - [ - 14.934, - 6.983 - ], - [ - 14.934, - 6.466 - ], - [ - 15, - -6.408 - ], - [ - 15, - -6.983 - ], - [ - 14.45, - -6.983 - ], - [ - -0.121, - -6.903 - ], - [ - -9.839, - -6.719 - ], - [ - -15, - -6.719 - ], - [ - -15, - -6.408 - ] - ], - "o": [ - [ - -14.857, - 0.104 - ], - [ - -14.692, - 6.466 - ], - [ - -0.253, - 6.788 - ], - [ - 9.53, - 6.983 - ], - [ - 14.45, - 6.983 - ], - [ - 14.934, - 6.983 - ], - [ - 14.934, - 6.466 - ], - [ - 15, - -6.408 - ], - [ - 15, - -6.983 - ], - [ - 14.45, - -6.983 - ], - [ - -4.984999999999999, - -6.903 - ], - [ - -14.692, - -6.719 - ], - [ - -15, - -6.719 - ], - [ - -14.978, - -4.222 - ] - ], - "v": [ - [ - -14.857, - 0.104 - ], - [ - -14.692, - 6.466 - ], - [ - -0.253, - 6.788 - ], - [ - 7.076, - 6.914 - ], - [ - 14.45, - 6.983 - ], - [ - 14.934, - 6.983 - ], - [ - 14.934, - 6.466 - ], - [ - 15, - -6.408 - ], - [ - 15, - -6.983 - ], - [ - 14.45, - -6.983 - ], - [ - -0.121, - -6.903 - ], - [ - -14.692, - -6.719 - ], - [ - -15, - -6.719 - ], - [ - -15, - -6.408 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 4, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 31, - "s": [ - 0 - ] - }, - { - "t": 76, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 721.5, - 395.062, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0.007, - -6.996 - ], - [ - 18.134, - -7.35 - ], - [ - 17.93, - 0.007 - ], - [ - 17.754, - 4.868 - ], - [ - 18.134, - 6.917 - ], - [ - 6.154, - 6.707 - ], - [ - -17.794, - 6.628 - ], - [ - -17.116, - 7.272 - ], - [ - -17.197, - -7.416 - ], - [ - -17.794, - -6.838 - ], - [ - -11.892, - -6.838 - ] - ], - "o": [ - [ - 0.007, - -6.996 - ], - [ - 18.134, - -7.35 - ], - [ - 17.876, - 2.451 - ], - [ - 17.754, - 7.272 - ], - [ - 12.137, - 6.851 - ], - [ - 0.17, - 6.707 - ], - [ - -17.794, - 6.628 - ], - [ - -17.116, - 7.272 - ], - [ - -17.197, - -7.416 - ], - [ - -14.836, - -6.838 - ], - [ - -8.921, - -6.838 - ] - ], - "v": [ - [ - 0.007, - -6.996 - ], - [ - 18.134, - -7.35 - ], - [ - 17.93, - 0.007 - ], - [ - 17.754, - 7.272 - ], - [ - 18.134, - 6.917 - ], - [ - 0.17, - 6.707 - ], - [ - -17.794, - 6.628 - ], - [ - -17.116, - 7.272 - ], - [ - -17.197, - -7.416 - ], - [ - -17.794, - -6.838 - ], - [ - -8.921, - -6.838 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 18.324, - 2.372 - ], - [ - 18.134, - -7.35 - ], - [ - 0.292, - -7.758 - ], - [ - -8.745, - -7.915 - ], - [ - -14.796, - -7.981 - ], - [ - -18.432, - -7.981 - ], - [ - -18.432, - -7.377 - ], - [ - -18.5, - 7.311 - ], - [ - -18.5, - 7.981 - ], - [ - -17.794, - 7.981 - ], - [ - 0.17, - 7.902 - ], - [ - 12.137, - 7.758 - ], - [ - 18.5, - 7.692 - ], - [ - 18.5, - 7.337 - ] - ], - "o": [ - [ - 18.324, - -0.085 - ], - [ - 18.134, - -7.35 - ], - [ - 0.292, - -7.758 - ], - [ - -11.770999999999999, - -7.981 - ], - [ - -17.822, - -7.981 - ], - [ - -18.432, - -7.981 - ], - [ - -18.432, - -7.377 - ], - [ - -18.5, - 7.311 - ], - [ - -18.5, - 7.981 - ], - [ - -17.794, - 7.981 - ], - [ - 6.154, - 7.902 - ], - [ - 18.134, - 7.692 - ], - [ - 18.5, - 7.692 - ], - [ - 18.473, - 4.853999999999999 - ] - ], - "v": [ - [ - 18.324, - -0.085 - ], - [ - 18.134, - -7.35 - ], - [ - 0.292, - -7.758 - ], - [ - -8.745, - -7.915 - ], - [ - -17.822, - -7.981 - ], - [ - -18.432, - -7.981 - ], - [ - -18.432, - -7.377 - ], - [ - -18.5, - 7.311 - ], - [ - -18.5, - 7.981 - ], - [ - -17.794, - 7.981 - ], - [ - 0.17, - 7.902 - ], - [ - 18.134, - 7.692 - ], - [ - 18.5, - 7.692 - ], - [ - 18.5, - 7.337 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 5, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 60, - "s": [ - 0 - ] - }, - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 75, - "s": [ - 0 - ] - }, - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 105, - "s": [ - 100 - ] - }, - { - "t": 120, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 603, - 395.062, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 0, - -6.996 - ], - [ - 17.63, - -7.35 - ], - [ - 17.379, - 0.007 - ], - [ - 17.208, - 4.868 - ], - [ - 17.564, - 6.917 - ], - [ - 5.9159999999999995, - 6.707 - ], - [ - -17.406, - 6.628 - ], - [ - -16.745, - 7.272 - ], - [ - -16.745, - -7.416 - ], - [ - -17.34, - -6.838 - ], - [ - -11.581999999999999, - -6.838 - ] - ], - "o": [ - [ - 0, - -6.996 - ], - [ - 17.63, - -7.35 - ], - [ - 17.326, - 2.451 - ], - [ - 17.208, - 7.272 - ], - [ - 11.74, - 6.851 - ], - [ - 0.079, - 6.707 - ], - [ - -17.406, - 6.628 - ], - [ - -16.745, - 7.272 - ], - [ - -16.745, - -7.416 - ], - [ - -14.461, - -6.838 - ], - [ - -8.69, - -6.838 - ] - ], - "v": [ - [ - 0, - -6.996 - ], - [ - 17.63, - -7.35 - ], - [ - 17.379, - 0.007 - ], - [ - 17.208, - 7.272 - ], - [ - 17.564, - 6.917 - ], - [ - 0.079, - 6.707 - ], - [ - -17.406, - 6.628 - ], - [ - -16.745, - 7.272 - ], - [ - -16.745, - -7.416 - ], - [ - -17.34, - -6.838 - ], - [ - -8.69, - -6.838 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 17.881, - 2.372 - ], - [ - 17.63, - -7.35 - ], - [ - 0.357, - -7.758 - ], - [ - -8.439, - -7.915 - ], - [ - -14.341999999999999, - -7.981 - ], - [ - -17.921, - -7.981 - ], - [ - -17.921, - -7.377 - ], - [ - -18, - 7.311 - ], - [ - -18, - 7.981 - ], - [ - -17.34, - 7.981 - ], - [ - 0.145, - 7.902 - ], - [ - 11.806, - 7.758 - ], - [ - 18, - 7.692 - ], - [ - 18, - 7.337 - ] - ], - "o": [ - [ - 17.815, - -0.085 - ], - [ - 17.63, - -7.35 - ], - [ - 0.357, - -7.758 - ], - [ - -11.384, - -7.981 - ], - [ - -17.287, - -7.981 - ], - [ - -17.921, - -7.981 - ], - [ - -17.921, - -7.377 - ], - [ - -18, - 7.311 - ], - [ - -18, - 7.981 - ], - [ - -17.34, - 7.981 - ], - [ - 5.981999999999999, - 7.902 - ], - [ - 17.63, - 7.692 - ], - [ - 18, - 7.692 - ], - [ - 17.974, - 4.853999999999999 - ] - ], - "v": [ - [ - 17.815, - -0.085 - ], - [ - 17.63, - -7.35 - ], - [ - 0.357, - -7.758 - ], - [ - -8.439, - -7.915 - ], - [ - -17.287, - -7.981 - ], - [ - -17.921, - -7.981 - ], - [ - -17.921, - -7.377 - ], - [ - -18, - 7.311 - ], - [ - -18, - 7.981 - ], - [ - -17.34, - 7.981 - ], - [ - 0.145, - 7.902 - ], - [ - 17.63, - 7.692 - ], - [ - 18, - 7.692 - ], - [ - 18, - 7.337 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 6, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 21, - "s": [ - 0 - ] - }, - { - "t": 66, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 663, - 450.431, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 18, - -7.482 - ], - [ - -18, - -7.482 - ], - [ - -18, - 7.482 - ], - [ - 18, - 7.482 - ] - ], - "o": [ - [ - 18, - -7.482 - ], - [ - -18, - -7.482 - ], - [ - -18, - 7.482 - ], - [ - 18, - 7.482 - ] - ], - "v": [ - [ - 18, - -7.482 - ], - [ - -18, - -7.482 - ], - [ - -18, - 7.482 - ], - [ - 18, - 7.482 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 2, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 7, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 7, - "s": [ - 0 - ] - }, - { - "t": 52, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 534, - 152.638, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 10.775, - -11.133 - ], - [ - 15, - -3.783 - ], - [ - 12.732, - -2.483 - ], - [ - 12.154, - -2.013 - ], - [ - 11.733, - -0.979 - ], - [ - 11.759, - -0.185 - ], - [ - 11.759, - 0.44000000000000006 - ], - [ - 11.811, - 1.387 - ], - [ - 12.414, - 2.321 - ], - [ - 14.981, - 3.812 - ], - [ - 10.756, - 11.162 - ], - [ - 8.507, - 9.862 - ], - [ - 7.816000000000001, - 9.587000000000002 - ], - [ - 6.713, - 9.732 - ], - [ - 5.695, - 10.381 - ], - [ - 4.704, - 10.997 - ], - [ - 4.207, - 11.993 - ], - [ - 4.205, - 14.964 - ], - [ - -4.225, - 14.964 - ], - [ - -4.225, - 12.365 - ], - [ - -4.332, - 11.629000000000001 - ], - [ - -5.002999999999999, - 10.742 - ], - [ - -6.074000000000001, - 10.165 - ], - [ - -7.0969999999999995, - 9.615 - ], - [ - -8.212000000000002, - 9.677 - ], - [ - -10.775, - 11.162 - ], - [ - -15, - 3.812 - ], - [ - -12.751, - 2.502 - ], - [ - -12.168000000000001, - 2.045 - ], - [ - -11.748000000000001, - 1.0150000000000001 - ], - [ - -11.778, - 0.235 - ], - [ - -11.778, - -0.401 - ], - [ - -11.828999999999999, - -1.351 - ], - [ - -12.431999999999999, - -2.291 - ], - [ - -15, - -3.783 - ], - [ - -10.795, - -11.172 - ], - [ - -8.556, - -9.872 - ], - [ - -7.866, - -9.593 - ], - [ - -6.763, - -9.732999999999999 - ], - [ - -5.737, - -10.383000000000001 - ], - [ - -4.74, - -10.988 - ], - [ - -4.24, - -11.991 - ], - [ - -4.244, - -14.964 - ], - [ - 4.205, - -14.964 - ], - [ - 4.205, - -12.365 - ], - [ - 4.306, - -11.611 - ], - [ - 4.992999999999999, - -10.703000000000001 - ], - [ - 6.08, - -10.134 - ], - [ - 7.105, - -9.578000000000001 - ], - [ - 8.215000000000002, - -9.647 - ] - ], - "o": [ - [ - 10.775, - -11.133 - ], - [ - 15, - -3.783 - ], - [ - 12.412999999999998, - -2.291 - ], - [ - 11.809999999999999, - -1.351 - ], - [ - 11.759, - -0.401 - ], - [ - 11.759, - 0.22499999999999998 - ], - [ - 11.734, - 1.016 - ], - [ - 12.155000000000001, - 2.047 - ], - [ - 12.732, - 2.512 - ], - [ - 14.981, - 3.812 - ], - [ - 10.756, - 11.162 - ], - [ - 8.184, - 9.677 - ], - [ - 7.074, - 9.615 - ], - [ - 6.055000000000001, - 10.165 - ], - [ - 4.984, - 10.742 - ], - [ - 4.312, - 11.629000000000001 - ], - [ - 4.205, - 12.365 - ], - [ - 4.205, - 14.964 - ], - [ - -4.225, - 14.964 - ], - [ - -4.226999999999999, - 11.993 - ], - [ - -4.723999999999999, - 10.997 - ], - [ - -5.7139999999999995, - 10.381 - ], - [ - -6.734, - 9.732 - ], - [ - -7.843, - 9.587000000000002 - ], - [ - -8.537, - 9.862 - ], - [ - -10.775, - 11.162 - ], - [ - -15, - 3.812 - ], - [ - -12.43, - 2.3169999999999997 - ], - [ - -11.824, - 1.387 - ], - [ - -11.778, - 0.44000000000000006 - ], - [ - -11.778, - -0.195 - ], - [ - -11.752, - -0.979 - ], - [ - -12.173, - -2.013 - ], - [ - -12.751, - -2.483 - ], - [ - -15, - -3.783 - ], - [ - -10.795, - -11.172 - ], - [ - -8.234, - -9.686 - ], - [ - -7.1240000000000006, - -9.617 - ], - [ - -6.101999999999999, - -10.17 - ], - [ - -5.025, - -10.735000000000001 - ], - [ - -4.343999999999999, - -11.622 - ], - [ - -4.244, - -12.365 - ], - [ - -4.244, - -14.964 - ], - [ - 4.205, - -14.964 - ], - [ - 4.202, - -11.984 - ], - [ - 4.706, - -10.963000000000001 - ], - [ - 5.712, - -10.346 - ], - [ - 6.743, - -9.693999999999999 - ], - [ - 7.8469999999999995, - -9.554 - ], - [ - 8.537, - -9.833 - ] - ], - "v": [ - [ - 10.775, - -11.133 - ], - [ - 15, - -3.783 - ], - [ - 12.732, - -2.483 - ], - [ - 11.982, - -1.682 - ], - [ - 11.759, - -0.606 - ], - [ - 11.759, - 0.02 - ], - [ - 11.759, - 0.645 - ], - [ - 11.983, - 1.717 - ], - [ - 12.732, - 2.512 - ], - [ - 14.981, - 3.812 - ], - [ - 10.756, - 11.162 - ], - [ - 8.507, - 9.862 - ], - [ - 7.445, - 9.601 - ], - [ - 6.405, - 9.94 - ], - [ - 5.315, - 10.576 - ], - [ - 4.508, - 11.313 - ], - [ - 4.205, - 12.365 - ], - [ - 4.205, - 14.964 - ], - [ - -4.225, - 14.964 - ], - [ - -4.225, - 12.365 - ], - [ - -4.528, - 11.313 - ], - [ - -5.334, - 10.576 - ], - [ - -6.424, - 9.94 - ], - [ - -7.47, - 9.601 - ], - [ - -8.537, - 9.862 - ], - [ - -10.775, - 11.162 - ], - [ - -15, - 3.812 - ], - [ - -12.751, - 2.502 - ], - [ - -11.996, - 1.716 - ], - [ - -11.778, - 0.645 - ], - [ - -11.778, - 0.02 - ], - [ - -11.778, - -0.606 - ], - [ - -12.001, - -1.682 - ], - [ - -12.751, - -2.483 - ], - [ - -15, - -3.783 - ], - [ - -10.795, - -11.172 - ], - [ - -8.556, - -9.872 - ], - [ - -7.495, - -9.605 - ], - [ - -6.454, - -9.94 - ], - [ - -5.363, - -10.576 - ], - [ - -4.542, - -11.305 - ], - [ - -4.244, - -12.365 - ], - [ - -4.244, - -14.964 - ], - [ - 4.205, - -14.964 - ], - [ - 4.205, - -12.365 - ], - [ - 4.506, - -11.287 - ], - [ - 5.334, - -10.537 - ], - [ - 6.434, - -9.901 - ], - [ - 7.476, - -9.566 - ], - [ - 8.537, - -9.833 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 4.9879999999999995, - 5.02 - ], - [ - 6.9190000000000005, - 1.3940000000000001 - ], - [ - 6.921, - -0.02 - ], - [ - 6.18, - -3.6180000000000003 - ], - [ - 1.83, - -6.94 - ], - [ - -2.706, - -6.532 - ], - [ - -5.869, - -3.9210000000000003 - ], - [ - -7.055, - 0.014000000000000012 - ], - [ - -5.864, - 3.948 - ], - [ - -2.6980000000000004, - 6.556 - ], - [ - 1.377, - 6.957 - ] - ], - "o": [ - [ - 6.5120000000000005, - 2.736 - ], - [ - 6.921, - 0.02 - ], - [ - 6.913, - -1.858 - ], - [ - 3.5860000000000003, - -6.212 - ], - [ - -1.368, - -6.94 - ], - [ - -4.981999999999999, - -5.006 - ], - [ - -6.917, - -1.3830000000000002 - ], - [ - -6.523, - 2.71 - ], - [ - -3.93, - 5.8919999999999995 - ], - [ - -0.014000000000000012, - 7.094 - ], - [ - 3.907, - 5.909 - ] - ], - "v": [ - [ - 5.75, - 3.878 - ], - [ - 6.921, - 0.02 - ], - [ - 6.921, - -0.02 - ], - [ - 4.883, - -4.915 - ], - [ - 0, - -6.94 - ], - [ - -3.844, - -5.769 - ], - [ - -6.393, - -2.652 - ], - [ - -6.789, - 1.362 - ], - [ - -4.897, - 4.92 - ], - [ - -1.356, - 6.825 - ], - [ - 2.642, - 6.433 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 8, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 4, - "s": [ - 0 - ] - }, - { - "t": 49, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 63, - 326.226, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 15.657, - 15.013 - ], - [ - 5.329, - 20.95 - ], - [ - 3.502, - 17.771 - ], - [ - 2.849, - 16.962999999999997 - ], - [ - 1.401, - 16.375 - ], - [ - 0, - 16.412 - ], - [ - -0.879, - 16.412 - ], - [ - -1.923, - 16.483 - ], - [ - -3.235, - 17.326 - ], - [ - -5.343, - 20.91 - ], - [ - -15.671, - 15.013 - ], - [ - -13.831, - 11.915 - ], - [ - -13.443999999999999, - 10.951 - ], - [ - -13.647, - 9.411 - ], - [ - -14.562, - 7.981 - ], - [ - -15.416, - 6.595 - ], - [ - -16.822000000000003, - 5.904 - ], - [ - -21, - 5.91 - ], - [ - -21, - -5.896 - ], - [ - -17.347, - -5.896 - ], - [ - -16.306, - -6.033 - ], - [ - -15.059000000000001, - -6.976 - ], - [ - -14.264, - -8.475000000000001 - ], - [ - -13.482, - -9.9 - ], - [ - -13.571, - -11.450999999999999 - ], - [ - -15.671, - -15.04 - ], - [ - -5.288, - -20.95 - ], - [ - -3.447, - -17.798 - ], - [ - -2.7920000000000003, - -16.994 - ], - [ - -1.345, - -16.406000000000002 - ], - [ - -0.23299999999999998, - -16.44 - ], - [ - 0.6460000000000001, - -16.44 - ], - [ - 1.9769999999999999, - -16.512 - ], - [ - 3.2889999999999997, - -17.354 - ], - [ - 5.274, - -20.937 - ], - [ - 15.602, - -15.04 - ], - [ - 13.776, - -11.915 - ], - [ - 13.389, - -10.947000000000001 - ], - [ - 13.593, - -9.4 - ], - [ - 14.503, - -7.9750000000000005 - ], - [ - 15.360999999999999, - -6.581 - ], - [ - 16.767000000000003, - -5.89 - ], - [ - 21, - -5.896 - ], - [ - 21, - 5.91 - ], - [ - 17.292, - 5.91 - ], - [ - 16.28, - 6.052 - ], - [ - 15.06, - 6.965 - ], - [ - 14.256, - 8.450999999999999 - ], - [ - 13.482, - 9.877999999999998 - ], - [ - 13.571, - 11.435 - ] - ], - "o": [ - [ - 15.657, - 15.013 - ], - [ - 5.329, - 20.95 - ], - [ - 3.235, - 17.326 - ], - [ - 1.923, - 16.483 - ], - [ - 0.879, - 16.412 - ], - [ - 0, - 16.412 - ], - [ - -1.401, - 16.375 - ], - [ - -2.849, - 16.962999999999997 - ], - [ - -3.502, - 17.771 - ], - [ - -5.343, - 20.91 - ], - [ - -15.671, - 15.013 - ], - [ - -13.571, - 11.463999999999999 - ], - [ - -13.482, - 9.913 - ], - [ - -14.264, - 8.489 - ], - [ - -15.059000000000001, - 6.989999999999999 - ], - [ - -16.306, - 6.047 - ], - [ - -17.347, - 5.91 - ], - [ - -21, - 5.91 - ], - [ - -21, - -5.896 - ], - [ - -16.822000000000003, - -5.89 - ], - [ - -15.416, - -6.581 - ], - [ - -14.562, - -7.9670000000000005 - ], - [ - -13.647, - -9.397 - ], - [ - -13.443999999999999, - -10.938 - ], - [ - -13.831, - -11.902 - ], - [ - -15.671, - -15.04 - ], - [ - -5.288, - -20.95 - ], - [ - -3.178, - -17.354999999999997 - ], - [ - -1.866, - -16.514000000000003 - ], - [ - -0.536, - -16.44 - ], - [ - 0.34299999999999997, - -16.44 - ], - [ - 1.455, - -16.405 - ], - [ - 2.903, - -16.991999999999997 - ], - [ - 3.557, - -17.798 - ], - [ - 5.274, - -20.937 - ], - [ - 15.602, - -15.04 - ], - [ - 13.516, - -11.462 - ], - [ - 13.427, - -9.905 - ], - [ - 14.202, - -8.478 - ], - [ - 15.004000000000001, - -6.976 - ], - [ - 16.250999999999998, - -6.033 - ], - [ - 17.292, - -5.896 - ], - [ - 21, - -5.896 - ], - [ - 21, - 5.91 - ], - [ - 16.781000000000002, - 5.91 - ], - [ - 15.412, - 6.584 - ], - [ - 14.558, - 7.948 - ], - [ - 13.647, - 9.373 - ], - [ - 13.443999999999999, - 10.92 - ], - [ - 13.831, - 11.888 - ] - ], - "v": [ - [ - 15.657, - 15.013 - ], - [ - 5.329, - 20.95 - ], - [ - 3.502, - 17.771 - ], - [ - 2.386, - 16.723 - ], - [ - 0.879, - 16.412 - ], - [ - 0, - 16.412 - ], - [ - -0.879, - 16.412 - ], - [ - -2.386, - 16.723 - ], - [ - -3.502, - 17.771 - ], - [ - -5.343, - 20.91 - ], - [ - -15.671, - 15.013 - ], - [ - -13.831, - 11.915 - ], - [ - -13.463, - 10.432 - ], - [ - -13.94, - 8.981 - ], - [ - -14.833, - 7.459 - ], - [ - -15.861, - 6.321 - ], - [ - -17.347, - 5.91 - ], - [ - -21, - 5.91 - ], - [ - -21, - -5.896 - ], - [ - -17.347, - -5.896 - ], - [ - -15.861, - -6.307 - ], - [ - -14.833, - -7.445 - ], - [ - -13.94, - -8.967 - ], - [ - -13.463, - -10.419 - ], - [ - -13.831, - -11.902 - ], - [ - -15.671, - -15.04 - ], - [ - -5.288, - -20.95 - ], - [ - -3.447, - -17.798 - ], - [ - -2.329, - -16.754 - ], - [ - -0.824, - -16.44 - ], - [ - 0.055, - -16.44 - ], - [ - 0.934, - -16.44 - ], - [ - 2.44, - -16.752 - ], - [ - 3.557, - -17.798 - ], - [ - 5.274, - -20.937 - ], - [ - 15.602, - -15.04 - ], - [ - 13.776, - -11.915 - ], - [ - 13.408, - -10.426 - ], - [ - 13.886, - -8.967 - ], - [ - 14.778, - -7.445 - ], - [ - 15.806, - -6.307 - ], - [ - 17.292, - -5.896 - ], - [ - 21, - -5.896 - ], - [ - 21, - 5.91 - ], - [ - 17.292, - 5.91 - ], - [ - 15.846, - 6.318 - ], - [ - 14.833, - 7.418 - ], - [ - 13.94, - 8.94 - ], - [ - 13.463, - 10.399 - ], - [ - 13.831, - 11.888 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -7.055, - 6.981 - ], - [ - -1.938, - 9.677 - ], - [ - 0, - 9.674 - ], - [ - 5.056, - 8.663 - ], - [ - 9.75, - 2.621 - ], - [ - 9.217, - -3.7259999999999995 - ], - [ - 5.559, - -8.177 - ], - [ - 0.018000000000000016, - -9.861999999999998 - ], - [ - -5.535, - -8.21 - ], - [ - -9.22, - -3.783 - ], - [ - -9.791, - 1.924 - ] - ], - "o": [ - [ - -3.833, - 9.109 - ], - [ - 0, - 9.674 - ], - [ - 2.58, - 9.674 - ], - [ - 8.716000000000001, - 5.063000000000001 - ], - [ - 9.779, - -1.849 - ], - [ - 7.083, - -6.926 - ], - [ - 1.987, - -9.661000000000001 - ], - [ - -3.7859999999999996, - -9.128 - ], - [ - -8.283, - -5.508 - ], - [ - -9.982000000000001, - -0.02499999999999991 - ], - [ - -8.311, - 5.465999999999999 - ] - ], - "v": [ - [ - -5.444, - 8.045 - ], - [ - 0, - 9.674 - ], - [ - 0, - 9.674 - ], - [ - 6.886, - 6.863 - ], - [ - 9.765, - 0.068 - ], - [ - 8.15, - -5.326 - ], - [ - 3.773, - -8.919 - ], - [ - -1.884, - -9.495 - ], - [ - -6.909, - -6.859 - ], - [ - -9.601, - -1.904 - ], - [ - -9.051, - 3.695 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - }, - { - "ddd": 0, - "ind": 9, - "ty": 4, - "nm": "Vector", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { - "x": [ - 0.833 - ], - "y": [ - 0.833 - ] - }, - "o": { - "x": [ - 0.167 - ], - "y": [ - 0.167 - ] - }, - "t": 37, - "s": [ - 0 - ] - }, - { - "t": 82, - "s": [ - 100 - ] - } - ], - "ix": 11 - }, - "r": { - "a": 0, - "k": 0, - "ix": 10 - }, - "p": { - "a": 0, - "k": [ - 382.5, - 64.347, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 100, - 100, - 100 - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [ - 21.17, - 6.063 - ], - [ - 14.799, - 16.311 - ], - [ - 11.686, - 14.413 - ], - [ - 10.713, - 13.993 - ], - [ - 9.134, - 14.138 - ], - [ - 8.175, - 14.705 - ], - [ - 7.380000000000001, - 15.133 - ], - [ - 6.226, - 15.822 - ], - [ - 5.469, - 17.212 - ], - [ - 5.334, - 21.449 - ], - [ - -6.682, - 21.07 - ], - [ - -6.565, - 17.371 - ], - [ - -6.686999999999999, - 16.315 - ], - [ - -7.609999999999999, - 15.022 - ], - [ - -9.106000000000002, - 14.141 - ], - [ - -10.536, - 13.313 - ], - [ - -12.113, - 13.357000000000001 - ], - [ - -15.827, - 15.347 - ], - [ - -21.5, - 4.72 - ], - [ - -18.271, - 2.929 - ], - [ - -17.429000000000002, - 2.295 - ], - [ - -16.768, - 0.859 - ], - [ - -16.777, - -0.872 - ], - [ - -16.776999999999997, - -2.5269999999999997 - ], - [ - -17.604, - -3.879 - ], - [ - -21.18, - -6.112 - ], - [ - -14.847, - -16.359 - ], - [ - -11.696, - -14.413 - ], - [ - -10.729, - -13.989 - ], - [ - -9.158, - -14.136000000000001 - ], - [ - -8.204, - -14.705 - ], - [ - -7.4190000000000005, - -15.123 - ], - [ - -6.254, - -15.821000000000002 - ], - [ - -5.498, - -17.220000000000002 - ], - [ - -5.363, - -21.449 - ], - [ - 6.643, - -21.079 - ], - [ - 6.527, - -17.381 - ], - [ - 6.657, - -16.329 - ], - [ - 7.574999999999999, - -15.036999999999999 - ], - [ - 9.072999999999999, - -14.162 - ], - [ - 10.5, - -13.32 - ], - [ - 12.081999999999999, - -13.365 - ], - [ - 15.788, - -15.357 - ], - [ - 21.5, - -4.73 - ], - [ - 18.261, - -2.978 - ], - [ - 17.422, - -2.346 - ], - [ - 16.759999999999998, - -0.916 - ], - [ - 16.767, - 0.8130000000000001 - ], - [ - 16.764, - 2.472 - ], - [ - 17.592, - 3.83 - ] - ], - "o": [ - [ - 21.17, - 6.063 - ], - [ - 14.799, - 16.311 - ], - [ - 11.232, - 14.138 - ], - [ - 9.653, - 13.993 - ], - [ - 8.427999999999999, - 14.569 - ], - [ - 7.651, - 14.997000000000002 - ], - [ - 6.6370000000000005, - 15.475999999999999 - ], - [ - 5.636, - 16.7 - ], - [ - 5.45, - 17.741 - ], - [ - 5.334, - 21.449 - ], - [ - -6.682, - 21.07 - ], - [ - -6.5520000000000005, - 16.84 - ], - [ - -7.221, - 15.397 - ], - [ - -8.631, - 14.452 - ], - [ - -10.030000000000001, - 13.494000000000002 - ], - [ - -11.588, - 13.245 - ], - [ - -12.578, - 13.605 - ], - [ - -15.827, - 15.347 - ], - [ - -21.5, - 4.72 - ], - [ - -17.811, - 2.6719999999999997 - ], - [ - -16.903, - 1.379 - ], - [ - -16.797, - -0.26999999999999996 - ], - [ - -16.676000000000002, - -1.998 - ], - [ - -17.245, - -3.477 - ], - [ - -18.048, - -4.165 - ], - [ - -21.18, - -6.112 - ], - [ - -14.847, - -16.359 - ], - [ - -11.247, - -14.136000000000001 - ], - [ - -9.675, - -13.989 - ], - [ - -8.456999999999999, - -14.569 - ], - [ - -7.68, - -14.997000000000002 - ], - [ - -6.665, - -15.47 - ], - [ - -5.664, - -16.705000000000002 - ], - [ - -5.479, - -17.751 - ], - [ - -5.363, - -21.449 - ], - [ - 6.643, - -21.079 - ], - [ - 6.5200000000000005, - -16.851 - ], - [ - 7.191000000000001, - -15.413 - ], - [ - 8.564, - -14.487 - ], - [ - 9.992999999999999, - -13.502 - ], - [ - 11.556000000000001, - -13.251999999999999 - ], - [ - 12.549, - -13.615 - ], - [ - 15.788, - -15.357 - ], - [ - 21.5, - -4.73 - ], - [ - 17.803, - -2.7220000000000004 - ], - [ - 16.895999999999997, - -1.434 - ], - [ - 16.787, - 0.21199999999999997 - ], - [ - 16.663999999999998, - 1.941 - ], - [ - 17.232000000000003, - 3.4259999999999997 - ], - [ - 18.038, - 4.117 - ] - ], - "v": [ - [ - 21.17, - 6.063 - ], - [ - 14.799, - 16.311 - ], - [ - 11.686, - 14.413 - ], - [ - 10.183, - 13.993 - ], - [ - 8.68, - 14.413 - ], - [ - 7.913, - 14.851 - ], - [ - 7.118, - 15.26 - ], - [ - 5.931, - 16.261 - ], - [ - 5.45, - 17.741 - ], - [ - 5.334, - 21.449 - ], - [ - -6.682, - 21.07 - ], - [ - -6.565, - 17.371 - ], - [ - -6.954, - 15.856 - ], - [ - -8.078, - 14.773 - ], - [ - -9.601, - 13.8 - ], - [ - -11.062, - 13.279 - ], - [ - -12.578, - 13.605 - ], - [ - -15.827, - 15.347 - ], - [ - -21.5, - 4.72 - ], - [ - -18.271, - 2.929 - ], - [ - -17.166, - 1.837 - ], - [ - -16.777, - 0.331 - ], - [ - -16.719, - -1.47 - ], - [ - -17.011, - -3.002 - ], - [ - -18.048, - -4.165 - ], - [ - -21.18, - -6.112 - ], - [ - -14.847, - -16.359 - ], - [ - -11.696, - -14.413 - ], - [ - -10.202, - -13.989 - ], - [ - -8.709, - -14.413 - ], - [ - -7.942, - -14.851 - ], - [ - -7.147, - -15.25 - ], - [ - -5.959, - -16.263 - ], - [ - -5.479, - -17.751 - ], - [ - -5.363, - -21.449 - ], - [ - 6.643, - -21.079 - ], - [ - 6.527, - -17.381 - ], - [ - 6.924, - -15.871 - ], - [ - 8.039, - -14.783 - ], - [ - 9.562, - -13.81 - ], - [ - 11.028, - -13.286 - ], - [ - 12.549, - -13.615 - ], - [ - 15.788, - -15.357 - ], - [ - 21.5, - -4.73 - ], - [ - 18.261, - -2.978 - ], - [ - 17.159, - -1.89 - ], - [ - 16.767, - -0.389 - ], - [ - 16.709, - 1.411 - ], - [ - 16.998, - 2.949 - ], - [ - 18.038, - 4.117 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [ - -2.858, - 9.637 - ], - [ - 2.968, - 9.623 - ], - [ - 6.833, - 7.257 - ], - [ - 9.084999999999999, - 4.093999999999999 - ], - [ - 9.959999999999999, - 0.30599999999999994 - ], - [ - 9.321, - -3.5280000000000005 - ], - [ - 6.381, - -7.802999999999999 - ], - [ - 0.9940000000000001, - -10.028 - ], - [ - -4.7170000000000005, - -8.875 - ], - [ - -8.827, - -4.731 - ], - [ - -9.95, - 1.0050000000000001 - ], - [ - -7.709, - 6.4 - ] - ], - "o": [ - [ - 1.0179999999999998, - 10.015 - ], - [ - 5.824, - 8.088 - ], - [ - 8.471, - 5.2490000000000006 - ], - [ - 9.833, - 1.6099999999999999 - ], - [ - 9.702, - -2.276 - ], - [ - 7.789, - -6.393000000000001 - ], - [ - 2.9450000000000003, - -9.641 - ], - [ - -2.88, - -9.639999999999999 - ], - [ - -7.725, - -6.393000000000001 - ], - [ - -9.953000000000001, - -0.9910000000000001 - ], - [ - -8.815999999999999, - 4.743 - ], - [ - -4.695, - 8.876 - ] - ], - "v": [ - [ - -0.92, - 9.826 - ], - [ - 4.684, - 8.7 - ], - [ - 7.652, - 6.253 - ], - [ - 9.459, - 2.852 - ], - [ - 9.831, - -0.985 - ], - [ - 8.709, - -4.671 - ], - [ - 4.663, - -8.722 - ], - [ - -0.943, - -9.834 - ], - [ - -6.221, - -7.634 - ], - [ - -9.39, - -2.861 - ], - [ - -9.383, - 2.874 - ], - [ - -6.202, - 7.638 - ] - ], - "c": true - }, - "ix": 2 - }, - "nm": "Path 2", - "mn": "ADBE Vector Shape - Group", - "hd": false, - "_render": true - }, - { - "ty": "mm", - "mm": 1, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false, - "_render": true - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.6157, - 0.7059, - 1, - 1 - ], - "ix": 4 - }, - "o": { - "a": 0, - "k": 100, - "ix": 5 - }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false, - "_render": true - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 2 - }, - "a": { - "a": 0, - "k": [ - 0, - 0 - ], - "ix": 1 - }, - "s": { - "a": 0, - "k": [ - 300, - 300 - ], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform", - "_render": true - } - ], - "nm": "Vector", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false, - "_render": true - } - ], - "ip": 0, - "op": 300, - "st": 0, - "bm": 0, - "completed": true - } - ] - } - ], - "markers": [], - "__complete": true -} \ No newline at end of file +{"nm":"Main Scene","ddd":0,"h":1200,"w":1200,"meta":{"g":"@lottiefiles/creator 1.46.1"},"layers":[{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-274,234,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[314,839,0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[326,839,0],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[326,839,0],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[326,839,0],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[326,839,0],"t":91},{"s":[314,839,0],"t":100}],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[17],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[-21],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[-11],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[-11],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-21],"t":91},{"s":[17],"t":100}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":2,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[4.586,-3.25],[62.789,88.617],[-4.586,3.25],[-62.789,-88.617]],"o":[[-4.586,3.25],[-62.789,-88.617],[4.586,-3.25],[62.789,88.617]],"v":[[169.344,65.194],[8.747,-150.147],[-102.42,-316.472],[20.512,-159.004]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[281.289,45.92],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.9372549019607843,0.9568627450980393,1,0.504,0.9568627450980393,0.9686274509803922,1,1,1,1,1,0.004,0.21,0.504,0.52,1,0.27],"ix":9}},"t":2,"a":{"a":0,"k":0,"ix":8},"h":{"a":0,"k":0,"ix":7},"s":{"a":0,"k":[160.851,-124.073],"ix":5},"r":1,"o":{"a":0,"k":50,"ix":10}},{"ty":"tr","a":{"a":0,"k":[33.46199798583979,-125.63899230957031],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[33.46199798583979,-125.63899230957031],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[133.057,-8.913],[-198.831,95.234],[-197.466,11.653],[84.183,-76.728]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9686,0.9725,0.9765],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[19.826,-166.017],[-195.662,-98.397],[-194.297,-181.978],[-29.047,-233.833]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9686,0.9725,0.9765],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 5","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[12.717,-17.874],[29.925,-13.292],[48.218,-16.591],[66.945,-14.638],[0,0],[2.743,8.742],[0,0],[-8.742,2.743],[0,0],[-2.743,-8.742],[0,0]],"o":[[0,0],[-25.281,11.229],[-35.02,12.05],[-67.866,14.84],[-14.228,-12.346],[0,0],[-2.743,-8.742],[0,0],[8.742,-2.743],[0,0],[2.743,8.742]],"v":[[271.661,97.892],[173.478,149.96],[48.094,196.401],[-101.344,237.839],[-263.195,269.353],[-281.046,235.631],[-281.046,235.631],[-270.184,214.836],[259.958,48.476],[280.753,59.338],[280.753,59.338]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","c":{"a":0,"k":[0.8706,0.3216,0.298]},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0.2967071533201988,158.53305053710932],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0.2967071533201988,158.53305053710932],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 6","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.545,2.367],[0,0],[-4.617,-6.409],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.127,-7.898],[0,0],[7.545,-2.367],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[190.512,70.795],[-200.445,193.478],[-198.829,95.239],[-197.836,34.101],[-197.464,11.658],[-195.66,-98.392],[-194.295,-181.973],[-192.623,-283.875],[-179.781,-301.07],[-109.003,-323.281],[-88.639,-316.505],[-29.046,-233.829],[19.828,-166.013],[84.185,-76.724],[97.312,-58.517],[133.058,-8.908]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","c":{"a":0,"k":[0.8706,0.3216,0.298]},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[-4.9665069580078125,-65.31124877929693],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-4.9665069580078125,-65.31124877929693],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"mask","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[600,600,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Rectangle 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[-36.641,-4.311],[-80,0],[-55.359,7.689]],"o":[[0,0],[0,0],[0,0],[0,0],[25.5,3],[55.891,0],[54,-7.5]],"v":[[272,-188],[282,158],[-282,158],[-281.5,-189],[-177,-155],[17,-145],[184,-158]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[4,442],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":0,"nm":"Creature","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"tt":2,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[600,600,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,730,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,566,0],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[600,600,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,600,0],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[600,566,0],"t":85},{"s":[600,730,0],"t":100}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"w":1200,"h":1200,"refId":"comp_0_332d3c06-a209-499e-9dfc-aa05a140aa13","ind":3,"tp":2},{"ty":4,"nm":"Layer 10","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-1.833,259.407,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[91.095,91.095,100],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[119.095,119.095,100],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[119.095,119.095,100],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[119.095,119.095,100],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[119.095,119.095,100],"t":91},{"s":[91.095,91.095,100],"t":100}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[598,866,0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[655,866,0],"t":15},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[655,866,0],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[655,866,0],"t":80},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[655,866,0],"t":91},{"s":[598,866,0],"t":100}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":26,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.403],[89.265,-7.376],[44.738,0],[37.326,3.096],[0,17.403],[-89.265,7.376],[-44.738,0],[-37.326,-3.096]],"o":[[0,17.403],[-37.326,3.096],[-44.738,0],[-89.265,-7.376],[0,-17.403],[37.326,-3.096],[44.738,0],[89.265,7.376]],"v":[[274.724,252.177],[124.304,292.037],[0,296.868],[-124.304,292.037],[-274.724,252.177],[-124.304,212.306],[0,207.475],[124.304,212.306]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[0,169.35],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.18823529411764706,0.18823529411764706,0.18823529411764706,0.535,0.38823529411764707,0.38823529411764707,0.38823529411764707,0.996,0.5882352941176471,0.5882352941176471,0.5882352941176471],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[0,305],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":1,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"it":[{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"Layer 5","sr":1,"st":0,"op":130,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[1,258,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[601,858,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-17.403],[89.265,-7.376],[44.738,0],[37.326,3.096],[0,17.403],[-89.265,7.376],[-44.738,0],[-37.326,-3.096]],"o":[[0,17.403],[-37.326,3.096],[-44.738,0],[-89.265,-7.376],[0,-17.403],[37.326,-3.096],[44.738,0],[89.265,7.376]],"v":[[274.724,252.177],[124.304,292.037],[0,296.868],[-124.304,292.037],[-274.724,252.177],[-124.304,212.306],[0,207.475],[124.304,212.306]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[0,169.35],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[0,305],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5}],"v":"5.7.0","fr":30,"op":130,"ip":0,"assets":[{"nm":"Scene","id":"comp_0_332d3c06-a209-499e-9dfc-aa05a140aa13","layers":[{"ty":0,"nm":"Eyelids_01","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[104,51.5,0],"ix":1},"s":{"a":0,"k":[110.68,110.68,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[608,776.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"w":208,"h":103,"refId":"comp_1_1948dd07-9d2c-4edc-bd2c-fabe7777f75a","ind":1},{"ty":4,"nm":"Layer 3","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"tt":1,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[600,600,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.411],[4.411,0],[0,4.411],[-4.411,0]],"o":[[0,4.411],[-4.411,0],[0,-4.411],[4.411,0]],"v":[[-45.792,186.953],[-53.778,194.939],[-61.764,186.953],[-53.778,178.967]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[-46.028,186],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-62,186],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"EYE_01","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.745],[15.745,0],[0,15.745],[-15.745,0]],"o":[[0,15.745],[-15.745,0],[0,-15.745],[15.745,0]],"v":[[-25.27,178.967],[-53.778,207.475],[-82.286,178.967],[-53.778,150.459]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[-9.124,171],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.9215686274509803,0.9215686274509803,0.9215686274509803,0.833,0.7764705882352941,0.7843137254901961,0.8117647058823529,1,0.6352941176470588,0.6509803921568628,0.7019607843137254],"ix":9}},"t":2,"a":{"a":0,"k":0,"ix":8},"h":{"a":0,"k":0,"ix":7},"s":{"a":0,"k":[-51,171],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.411],[4.411,0],[0,4.411],[-4.411,0]],"o":[[0,4.411],[-4.411,0],[0,-4.411],[4.411,0]],"v":[[61.764,182.708],[53.778,190.694],[45.792,182.708],[53.778,174.722]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[60.972,182],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[45,182],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"EYE_02","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.745],[15.745,0],[0,15.745],[-15.745,0]],"o":[[0,15.745],[-15.745,0],[0,-15.745],[15.745,0]],"v":[[82.286,178.967],[53.778,207.475],[25.27,178.967],[53.778,150.459]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[97.876,171],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.9215686274509803,0.9215686274509803,0.9215686274509803,0.833,0.7764705882352941,0.7843137254901961,0.8117647058823529,1,0.6352941176470588,0.6509803921568628,0.7019607843137254],"ix":9}},"t":2,"a":{"a":0,"k":0,"ix":8},"h":{"a":0,"k":0,"ix":7},"s":{"a":0,"k":[56,171],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2,"tp":1},{"ty":4,"nm":"Layer 4","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[600,600,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-34.336],[0,0],[44.738,0],[37.327,3.096],[0,0],[-68.649,0],[-22.492,-22.492]],"o":[[0,0],[-37.327,3.096],[-44.738,0],[0,0],[0,-68.66],[34.324,0],[22.504,22.492]],"v":[[124.304,149.333],[120.806,350.947],[0,360.868],[-124.216,352.037],[-124.304,149.333],[0,25.029],[87.892,61.429]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[132.072,70.816],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0.004,0.1411764705882353,0.1607843137254902,0.20392156862745098,0.504,0.16470588235294117,0.1803921568627451,0.22745098039215686,1,0.1843137254901961,0.20392156862745098,0.25098039215686274],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-92,277],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3}]},{"nm":"Scene_1","id":"comp_1_1948dd07-9d2c-4edc-bd2c-fabe7777f75a","layers":[{"ty":4,"nm":"Shape Layer 2","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-54.25,180,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":26},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":32.285},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":38.571},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":44.857},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":49},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":55.286},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":61.572},{"s":[100,100,100],"t":67.857421875}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[145.75,54,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-14.221,0],[0,-14.221],[14.221,0],[0,14.221]],"o":[[14.221,0],[0,14.221],[-14.221,0],[0,-14.221]],"v":[[0,-25.75],[25.75,0],[0,25.75],[-25.75,0]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[114.583,114.583],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-54.25,180],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Shape Layer 1","sr":1,"st":0,"op":150,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-54.25,180,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":26},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":32.285},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":38.571},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":44.857},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":49},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":55.286},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,0,100],"t":61.572},{"s":[100,100,100],"t":67.857421875}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[48.25,54,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-14.221,0],[0,-14.221],[14.221,0],[0,14.221]],"o":[[14.221,0],[0,14.221],[-14.221,0],[0,-14.221]],"v":[[0,-25.75],[25.75,0],[0,25.75],[-25.75,0]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[114.583,114.583],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-54.25,180],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2}]}]} \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/error_widget.dart b/packages/core/lib/presentation/widget/error_widget.dart new file mode 100644 index 0000000..75b657f --- /dev/null +++ b/packages/core/lib/presentation/widget/error_widget.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class ErrorWidget extends StatelessWidget { + const ErrorWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(), + Assets.anim.error.lottie(width: 160.w, height: 160.h), + Text( + 'مشکلی پیش آمده\nدوباره تلاش کنید..', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + ], + ); + } +} From e0ac676f0a11a1718b91ae424c6d87a0dc00fde3 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 2 Jul 2025 09:09:36 +0330 Subject: [PATCH 170/256] feat : 1 - date_picker_bottom_sheet 2 - delete_dialog 3 - use in view --- .../pages/buy_out_of_province/view.dart | 129 +----------------- .../date_picker_bottom_sheet.dart | 94 +++++++++++++ .../widget/dialog/delete_dialog.dart | 33 +++++ .../core/lib/presentation/widget/widget.dart | 7 +- 4 files changed, 134 insertions(+), 129 deletions(-) create mode 100644 packages/core/lib/presentation/widget/bottom_sheet/date_picker_bottom_sheet.dart create mode 100644 packages/core/lib/presentation/widget/dialog/delete_dialog.dart diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 27e8a94..776360a 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -198,6 +198,7 @@ class BuyOutOfProvincePage extends GetView { onPressed: () { buildDeleteDialog( onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + onRefresh: () => controller.getStewardPurchaseOutOfProvince(), ); }, borderColor: AppColor.redNormal, @@ -315,7 +316,6 @@ class BuyOutOfProvincePage extends GetView { if (value == null || value.isEmpty) { return 'لطفاً شماره موبایل را وارد کنید'; } - // حذف کاماها برای اعتبارسنجی String cleaned = value.replaceAll(',', ''); if (cleaned.length != 11) { return 'شماره موبایل باید ۱۱ رقم باشد'; @@ -402,7 +402,6 @@ class BuyOutOfProvincePage extends GetView { items: controller.rootLogic.provinces, onChanged: (value) { controller.selectedProvince.value = value; - print('Selected Product: ${value.name}'); }, selectedItem: controller.selectedProvince.value, itemBuilder: (item) => Text( @@ -516,30 +515,6 @@ class BuyOutOfProvincePage extends GetView { ); } - Future buildDeleteDialog({required Future Function() onConfirm}) async { - await Get.defaultDialog( - title: 'حذف خرید', - middleText: 'آیا از حذف این خرید مطمئن هستید؟', - confirm: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: AppColor.error, - foregroundColor: Colors.white, - ), - onPressed: () async { - await onConfirm(); - Get.back(); - }, - child: Text('بله'), - ), - cancel: ElevatedButton( - onPressed: () { - Get.back(); - }, - child: Text('خیر'), - ), - ).whenComplete(() => controller.getStewardPurchaseOutOfProvince()); - } - Widget filterBottomSheet() { return BaseBottomSheet( height: 250, @@ -551,13 +526,13 @@ class BuyOutOfProvincePage extends GetView { spacing: 8, children: [ Expanded( - child: timeFilterWidget( + child: dateFilterWidget( date: controller.fromDateFilter, onChanged: (jalali) => controller.fromDateFilter.value = jalali, ), ), Expanded( - child: timeFilterWidget( + child: dateFilterWidget( isFrom: false, date: controller.toDateFilter, onChanged: (jalali) => controller.toDateFilter.value = jalali, @@ -579,102 +554,4 @@ class BuyOutOfProvincePage extends GetView { ), ); } - - GestureDetector timeFilterWidget({ - isFrom = true, - required Rx date, - required Function(Jalali jalali) onChanged, - }) { - return GestureDetector( - onTap: () { - Get.bottomSheet(modalDatePicker((value) => onChanged(value))); - }, - child: Container( - height: 35, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blueNormal), - ), - padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), - child: Row( - spacing: 8, - children: [ - Assets.vec.calendarSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - Text( - isFrom ? 'از' : 'تا', - style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), - ), - Expanded( - child: ObxValue((data) { - return Text( - date.value.formatCompactDate(), - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), - ); - }, date), - ), - ], - ), - ), - ); - } - - Container modalDatePicker(ValueChanged onDateSelected) { - Jalali? tempPickedDate; - return Container( - height: 250, - color: Colors.white, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - child: Row( - children: [ - SizedBox(width: 20), - RElevated( - height: 35, - width: 70, - textStyle: AppFonts.yekan14.copyWith(color: Colors.white), - onPressed: () { - onDateSelected(tempPickedDate ?? Jalali.now()); - Get.back(); - }, - text: 'تایید', - ), - Spacer(), - RElevated( - height: 35, - width: 70, - backgroundColor: AppColor.error, - textStyle: AppFonts.yekan14.copyWith(color: Colors.white), - onPressed: () { - onDateSelected(tempPickedDate ?? Jalali.now()); - Get.back(); - }, - text: 'لغو', - ), - SizedBox(width: 20), - ], - ), - ), - Divider(height: 0, thickness: 1), - Expanded( - child: Container( - child: PersianCupertinoDatePicker( - initialDateTime: Jalali.now(), - mode: PersianCupertinoDatePickerMode.date, - onDateTimeChanged: (dateTime) { - tempPickedDate = dateTime; - }, - ), - ), - ), - ], - ), - ); - } } diff --git a/packages/core/lib/presentation/widget/bottom_sheet/date_picker_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/date_picker_bottom_sheet.dart new file mode 100644 index 0000000..7d3195a --- /dev/null +++ b/packages/core/lib/presentation/widget/bottom_sheet/date_picker_bottom_sheet.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; + +import '../../../core.dart'; + +GestureDetector dateFilterWidget({ + isFrom = true, + required Rx date, + required Function(Jalali jalali) onChanged, +}) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blueNormal), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + Expanded( + child: ObxValue((data) { + return Text( + date.value.formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + ); + }, date), + ), + ], + ), + ), + ); +} + +Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'تایید', + ), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', + ), + SizedBox(width: 20), + ], + ), + Divider(height: 0, thickness: 1), + Expanded( + child: PersianCupertinoDatePicker( + initialDateTime: Jalali.now(), + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, + ), + ), + ], + ), + ); +} diff --git a/packages/core/lib/presentation/widget/dialog/delete_dialog.dart b/packages/core/lib/presentation/widget/dialog/delete_dialog.dart new file mode 100644 index 0000000..5ec7dd2 --- /dev/null +++ b/packages/core/lib/presentation/widget/dialog/delete_dialog.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +import '../../../core.dart'; + + + +Future buildDeleteDialog({ + required Future Function() onConfirm, + required Future Function() onRefresh, +}) async { + await Get.defaultDialog( + title: 'حذف', + middleText: 'آیا از حذف این مورد مطمئن هستید؟', + confirm: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.error, + foregroundColor: Colors.white, + ), + onPressed: () async { + await onConfirm(); + onRefresh(); + Get.back(); + }, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ); +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 46c10d5..1ea7bfa 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -2,6 +2,7 @@ export 'app_bar/r_app_bar.dart'; export 'bottom_navigation/r_bottom_navigation.dart'; export 'bottom_navigation/wave_bottom_navigation.dart'; export 'bottom_sheet/base_bottom_sheet.dart'; +export 'bottom_sheet/date_picker_bottom_sheet.dart'; export 'buttons/elevated.dart'; export 'buttons/fab.dart'; export 'buttons/outline_elevated.dart'; @@ -9,19 +10,19 @@ export 'buttons/outline_elevated_icon.dart'; export 'buttons/text_button.dart'; export 'card/card_with_icon_with_border.dart'; export 'chips/r_chips.dart'; +export 'dialog/delete_dialog.dart'; export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; +export 'empty_widget.dart'; export 'inputs/input_fixed_hint.dart'; export 'inputs/r_input.dart'; export 'list_view/list_view.dart'; +export 'loading_widget.dart'; export 'overlay_dropdown_widget/view.dart'; export 'pagination/pagination_from_until.dart'; export 'pagination/show_more.dart'; export 'tabs/new_tab.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; -export 'empty_widget.dart'; -export 'loading_widget.dart'; - From d6f7cb4930d7547d0eba9babacc78028891d33e2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 2 Jul 2025 16:29:29 +0330 Subject: [PATCH 171/256] feat : 1 - AllocatedMadeModel 2 - RSegment widget 3 - buy in province --- .../waiting_arrival/waiting_arrival.dart | 206 +- .../waiting_arrival.freezed.dart | 1782 +++-------------- .../waiting_arrival/waiting_arrival.g.dart | 270 +-- .../data/repositories/chicken_repository.dart | 4 +- .../repositories/chicken_repository_imp.dart | 70 +- .../pages/buy_in_province/logic.dart | 32 +- .../pages/buy_in_province/view.dart | 41 +- .../pages/buy_in_province_all/logic.dart | 15 + .../pages/buy_in_province_all/view.dart | 13 + .../pages/buy_in_province_waiting/logic.dart | 58 + .../pages/buy_in_province_waiting/view.dart | 264 +++ .../pages/buy_out_of_province/logic.dart | 1 - .../pages/entering_the_warehouse/logic.dart | 41 +- .../pages/entering_the_warehouse/view.dart | 10 +- .../lib/presentation/routes/pages.dart | 5 + .../presentation/widget/base_page/view.dart | 14 +- .../lib/presentation/widget/tabs/new_tab.dart | 219 +- .../presentation/widget/tabs/r_segment.dart | 104 + .../core/lib/presentation/widget/widget.dart | 1 + 19 files changed, 1129 insertions(+), 2021 deletions(-) create mode 100644 packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart create mode 100644 packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart create mode 100644 packages/core/lib/presentation/widget/tabs/r_segment.dart diff --git a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart index e93b258..a775928 100644 --- a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart +++ b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.dart @@ -4,26 +4,14 @@ part 'waiting_arrival.freezed.dart'; part 'waiting_arrival.g.dart'; @freezed -abstract class WaitingArrivalModel with _$WaitingArrivalModel { +abstract class WaitingArrivalModel with _$WaitingArrivalModel { factory WaitingArrivalModel({ - required int count, - String? next, - String? previous, - required List results, - }) = _WaitingArrivalModel; - - factory WaitingArrivalModel.fromJson(Map json) => _$WaitingArrivalModelFromJson(json); -} - -@freezed -abstract class ResultModel with _$ResultModel { - factory ResultModel({ int? id, ProductModel? product, - KillHouseModel? killHouse, + dynamic killHouse, dynamic toKillHouse, - dynamic steward, - @JsonKey(name: 'to_steward') ToStewardModel? toSteward, + StewardModel? steward, + StewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, @@ -67,95 +55,88 @@ abstract class ResultModel with _$ResultModel { bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, + bool? overhead, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser, - }) = _ResultModel; + }) = _WaitingArrivalModel; - factory ResultModel.fromJson(Map json) => _$ResultModelFromJson(json); + factory WaitingArrivalModel.fromJson(Map json) => + _$WaitingArrivalModelFromJson(json); } @freezed abstract class ProductModel with _$ProductModel { - factory ProductModel({ - double? weightAverage, - }) = _ProductModel; + factory ProductModel({String? name, double? weightAverage}) = _ProductModel; factory ProductModel.fromJson(Map json) => _$ProductModelFromJson(json); } @freezed -abstract class ToStewardModel with _$ToStewardModel { - factory ToStewardModel({ +abstract class StewardModel with _$StewardModel { + factory StewardModel({ int? id, - ToStewardUserModel? user, + StewardUserModel? user, AddressModel? address, - GuildAreaActivityModel? guildAreaActivity, - GuildTypeActivityModel? guildTypeActivity, + dynamic guildAreaActivity, + dynamic guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key, - @JsonKey(name: 'create_date') String? createDate, - @JsonKey(name: 'modify_date') String? modifyDate, + String? createDate, + String? modifyDate, bool? trash, bool? active, + int? cityNumber, + String? cityName, String? guildsId, String? licenseNumber, String? guildsName, + String? phone, String? typeActivity, String? areaActivity, + int? provinceNumber, + String? provinceName, bool? steward, bool? hasPos, + int? allocationLimit, + bool? limitationAllocation, String? provinceAcceptState, - }) = _ToStewardModel; + bool? stewardActive, + bool? stewardLimitationAllocation, + bool? license, + int? wallet, + List? cars, + List? userLevel, + }) = _StewardModel; - factory ToStewardModel.fromJson(Map json) => _$ToStewardModelFromJson(json); + factory StewardModel.fromJson(Map json) => _$StewardModelFromJson(json); } @freezed -abstract class ToStewardUserModel with _$ToStewardUserModel { - factory ToStewardUserModel({ +abstract class StewardUserModel with _$StewardUserModel { + factory StewardUserModel({ String? fullname, - @JsonKey(name: 'first_name') String? firstName, - @JsonKey(name: 'last_name') String? lastName, + String? firstName, + String? lastName, String? mobile, - @JsonKey(name: 'national_id') String? nationalId, + String? nationalId, String? city, - }) = _ToStewardUserModel; + }) = _StewardUserModel; - factory ToStewardUserModel.fromJson(Map json) => _$ToStewardUserModelFromJson(json); -} - -@freezed -abstract class ToStewardCityModel with _$ToStewardCityModel { - factory ToStewardCityModel({ - String? key, - @JsonKey(name: 'name') String? title, - }) = _ToStewardCityModel; - - factory ToStewardCityModel.fromJson(Map json) => _$ToStewardCityModelFromJson(json); -} - -@freezed -abstract class ToStewardProvinceModel with _$ToStewardProvinceModel { - factory ToStewardProvinceModel({ - String? key, - @JsonKey(name: 'name') String? title, - }) = _ToStewardProvinceModel; - - factory ToStewardProvinceModel.fromJson(Map json) => _$ToStewardProvinceModelFromJson(json); + factory StewardUserModel.fromJson(Map json) => _$StewardUserModelFromJson(json); } @freezed abstract class AddressModel with _$AddressModel { factory AddressModel({ - ToStewardProvinceModel? province, - ToStewardCityModel? city, + ProvinceModel? province, + CityModel? city, String? address, String? postalCode, }) = _AddressModel; @@ -164,103 +145,24 @@ abstract class AddressModel with _$AddressModel { } @freezed -abstract class GuildAreaActivityModel with _$GuildAreaActivityModel { - factory GuildAreaActivityModel({ - String? key, - String? title, - }) = _GuildAreaActivityModel; +abstract class ProvinceModel with _$ProvinceModel { + factory ProvinceModel({String? key, String? name}) = _ProvinceModel; - factory GuildAreaActivityModel.fromJson(Map json) => _$GuildAreaActivityModelFromJson(json); -} - -@freezed -abstract class GuildTypeActivityModel with _$GuildTypeActivityModel { - factory GuildTypeActivityModel({ - String? key, - String? title, - }) = _GuildTypeActivityModel; - - factory GuildTypeActivityModel.fromJson(Map json) => _$GuildTypeActivityModelFromJson(json); -} - -@freezed -abstract class GetPosStatusModel with _$GetPosStatusModel { - factory GetPosStatusModel({ - int? lenActiveSessions, - bool? hasPons, - bool? hasActivePons, - }) = _GetPosStatusModel; - - factory GetPosStatusModel.fromJson(Map json) => _$GetPosStatusModelFromJson(json); -} - -@freezed -abstract class KillHouseModel with _$KillHouseModel { - factory KillHouseModel({ - String? key, - @JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? operator, - String? name, - bool? killer, - }) = _KillHouseModel; - - factory KillHouseModel.fromJson(Map json) => _$KillHouseModelFromJson(json); -} - -@freezed -abstract class KillHouseOperatorModel with _$KillHouseOperatorModel { - factory KillHouseOperatorModel({ - UserModel? user, - }) = _KillHouseOperatorModel; - - factory KillHouseOperatorModel.fromJson(Map json) => _$KillHouseOperatorModelFromJson(json); -} - -@freezed -abstract class UserModel with _$UserModel { - factory UserModel({ - String? fullname, - String? firstName, - String? lastName, - int? baseOrder, - String? mobile, - String? nationalId, - String? nationalCode, - String? key, - CityModel? city, - String? unitName, - String? unitNationalId, - String? unitRegistrationNumber, - String? unitEconomicalNumber, - String? unitProvince, - String? unitCity, - String? unitPostalCode, - String? unitAddress, - }) = _UserModel; - - factory UserModel.fromJson(Map json) => _$UserModelFromJson(json); + factory ProvinceModel.fromJson(Map json) => _$ProvinceModelFromJson(json); } @freezed abstract class CityModel with _$CityModel { - factory CityModel({ - int? id, - String? key, - String? createDate, - String? modifyDate, - bool? trash, - int? provinceIdForeignKey, - int? cityIdKey, - String? name, - double? productPrice, - bool? provinceCenter, - int? cityNumber, - String? cityName, - int? provinceNumber, - String? provinceName, - dynamic createdBy, - dynamic modifiedBy, - int? province, - }) = _CityModel; + factory CityModel({String? key, String? name}) = _CityModel; factory CityModel.fromJson(Map json) => _$CityModelFromJson(json); -} \ No newline at end of file +} + +@freezed +abstract class GetPosStatusModel with _$GetPosStatusModel { + factory GetPosStatusModel({int? lenActiveSessions, bool? hasPons, bool? hasActivePons}) = + _GetPosStatusModel; + + factory GetPosStatusModel.fromJson(Map json) => + _$GetPosStatusModelFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart index c13a17d..da00458 100644 --- a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart +++ b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$WaitingArrivalModel { - int get count; String? get next; String? get previous; List get results; + int? get id; ProductModel? get product; dynamic get killHouse; dynamic get toKillHouse; StewardModel? get steward; StewardModel? get toSteward; dynamic get guilds; dynamic get toGuilds; dynamic get toColdHouse; int? get indexWeight; int? get dateTimestamp; int? get newState; int? get newReceiverState; int? get newAllocationState; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get numberOfCarcasses; int? get realNumberOfCarcasses; int? get receiverRealNumberOfCarcasses; double? get weightOfCarcasses; double? get realWeightOfCarcasses; double? get receiverRealWeightOfCarcasses; double? get weightLossOfCarcasses; bool? get finalRegistration; String? get sellType; String? get productName; String? get sellerType; String? get type; String? get saleType; String? get allocationType; bool? get systemRegistrationCode; int? get registrationCode; int? get amount; int? get totalAmount; int? get totalAmountPaid; int? get totalAmountRemain; dynamic get loggedRegistrationCode; String? get state; String? get receiverState; String? get allocationState; String? get date; dynamic get role; dynamic get stewardTempKey; bool? get approvedPriceStatus; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; bool? get overhead; dynamic get createdBy; dynamic get modifiedBy; dynamic get wareHouse; dynamic get stewardWareHouse; dynamic get car; dynamic get dispenser; /// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $WaitingArrivalModelCopyWith get copyWith => _$WaitingArriv @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is WaitingArrivalModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is WaitingArrivalModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.overhead, overhead) || other.overhead == overhead)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); +int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(toKillHouse),steward,toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,overhead,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); @override String toString() { - return 'WaitingArrivalModel(count: $count, next: $next, previous: $previous, results: $results)'; + return 'WaitingArrivalModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, overhead: $overhead, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; } @@ -49,11 +49,11 @@ abstract mixin class $WaitingArrivalModelCopyWith<$Res> { factory $WaitingArrivalModelCopyWith(WaitingArrivalModel value, $Res Function(WaitingArrivalModel) _then) = _$WaitingArrivalModelCopyWithImpl; @useResult $Res call({ - int count, String? next, String? previous, List results + int? id, ProductModel? product, dynamic killHouse, dynamic toKillHouse, StewardModel? steward, StewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, bool? overhead, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser }); - +$ProductModelCopyWith<$Res>? get product;$StewardModelCopyWith<$Res>? get steward;$StewardModelCopyWith<$Res>? get toSteward; } /// @nodoc @@ -66,163 +66,15 @@ class _$WaitingArrivalModelCopyWithImpl<$Res> /// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? count = null,Object? next = freezed,Object? previous = freezed,Object? results = null,}) { - return _then(_self.copyWith( -count: null == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: null == results ? _self.results : results // ignore: cast_nullable_to_non_nullable -as List, - )); -} - -} - - -/// @nodoc -@JsonSerializable() - -class _WaitingArrivalModel implements WaitingArrivalModel { - _WaitingArrivalModel({required this.count, this.next, this.previous, required final List results}): _results = results; - factory _WaitingArrivalModel.fromJson(Map json) => _$WaitingArrivalModelFromJson(json); - -@override final int count; -@override final String? next; -@override final String? previous; - final List _results; -@override List get results { - if (_results is EqualUnmodifiableListView) return _results; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_results); -} - - -/// Create a copy of WaitingArrivalModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$WaitingArrivalModelCopyWith<_WaitingArrivalModel> get copyWith => __$WaitingArrivalModelCopyWithImpl<_WaitingArrivalModel>(this, _$identity); - -@override -Map toJson() { - return _$WaitingArrivalModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _WaitingArrivalModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); - -@override -String toString() { - return 'WaitingArrivalModel(count: $count, next: $next, previous: $previous, results: $results)'; -} - - -} - -/// @nodoc -abstract mixin class _$WaitingArrivalModelCopyWith<$Res> implements $WaitingArrivalModelCopyWith<$Res> { - factory _$WaitingArrivalModelCopyWith(_WaitingArrivalModel value, $Res Function(_WaitingArrivalModel) _then) = __$WaitingArrivalModelCopyWithImpl; -@override @useResult -$Res call({ - int count, String? next, String? previous, List results -}); - - - - -} -/// @nodoc -class __$WaitingArrivalModelCopyWithImpl<$Res> - implements _$WaitingArrivalModelCopyWith<$Res> { - __$WaitingArrivalModelCopyWithImpl(this._self, this._then); - - final _WaitingArrivalModel _self; - final $Res Function(_WaitingArrivalModel) _then; - -/// Create a copy of WaitingArrivalModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? count = null,Object? next = freezed,Object? previous = freezed,Object? results = null,}) { - return _then(_WaitingArrivalModel( -count: null == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: null == results ? _self._results : results // ignore: cast_nullable_to_non_nullable -as List, - )); -} - - -} - - -/// @nodoc -mixin _$ResultModel { - - int? get id; ProductModel? get product; KillHouseModel? get killHouse; dynamic get toKillHouse; dynamic get steward;@JsonKey(name: 'to_steward') ToStewardModel? get toSteward; dynamic get guilds; dynamic get toGuilds; dynamic get toColdHouse; int? get indexWeight; int? get dateTimestamp; int? get newState; int? get newReceiverState; int? get newAllocationState; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get numberOfCarcasses; int? get realNumberOfCarcasses; int? get receiverRealNumberOfCarcasses; double? get weightOfCarcasses; double? get realWeightOfCarcasses; double? get receiverRealWeightOfCarcasses; double? get weightLossOfCarcasses; bool? get finalRegistration; String? get sellType; String? get productName; String? get sellerType; String? get type; String? get saleType; String? get allocationType; bool? get systemRegistrationCode; int? get registrationCode; int? get amount; int? get totalAmount; int? get totalAmountPaid; int? get totalAmountRemain; dynamic get loggedRegistrationCode; String? get state; String? get receiverState; String? get allocationState; String? get date; dynamic get role; dynamic get stewardTempKey; bool? get approvedPriceStatus; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get createdBy; dynamic get modifiedBy; dynamic get wareHouse; dynamic get stewardWareHouse; dynamic get car; dynamic get dispenser; -/// Create a copy of ResultModel -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$ResultModelCopyWith get copyWith => _$ResultModelCopyWithImpl(this as ResultModel, _$identity); - - /// Serializes this ResultModel to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is ResultModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); - -@override -String toString() { - return 'ResultModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; -} - - -} - -/// @nodoc -abstract mixin class $ResultModelCopyWith<$Res> { - factory $ResultModelCopyWith(ResultModel value, $Res Function(ResultModel) _then) = _$ResultModelCopyWithImpl; -@useResult -$Res call({ - int? id, ProductModel? product, KillHouseModel? killHouse, dynamic toKillHouse, dynamic steward,@JsonKey(name: 'to_steward') ToStewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser -}); - - -$ProductModelCopyWith<$Res>? get product;$KillHouseModelCopyWith<$Res>? get killHouse;$ToStewardModelCopyWith<$Res>? get toSteward; - -} -/// @nodoc -class _$ResultModelCopyWithImpl<$Res> - implements $ResultModelCopyWith<$Res> { - _$ResultModelCopyWithImpl(this._self, this._then); - - final ResultModel _self; - final $Res Function(ResultModel) _then; - -/// Create a copy of ResultModel -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? overhead = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable as ProductModel?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable -as KillHouseModel?,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable +as dynamic,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as dynamic,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable -as ToStewardModel?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as StewardModel?,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable +as StewardModel?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable as dynamic,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable @@ -265,6 +117,7 @@ as dynamic,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedP as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,overhead: freezed == overhead ? _self.overhead : overhead // ignore: cast_nullable_to_non_nullable as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable as dynamic,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable @@ -274,7 +127,7 @@ as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // igno as dynamic, )); } -/// Create a copy of ResultModel +/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -286,28 +139,28 @@ $ProductModelCopyWith<$Res>? get product { return $ProductModelCopyWith<$Res>(_self.product!, (value) { return _then(_self.copyWith(product: value)); }); -}/// Create a copy of ResultModel +}/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$KillHouseModelCopyWith<$Res>? get killHouse { - if (_self.killHouse == null) { +$StewardModelCopyWith<$Res>? get steward { + if (_self.steward == null) { return null; } - return $KillHouseModelCopyWith<$Res>(_self.killHouse!, (value) { - return _then(_self.copyWith(killHouse: value)); + return $StewardModelCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); }); -}/// Create a copy of ResultModel +}/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardModelCopyWith<$Res>? get toSteward { +$StewardModelCopyWith<$Res>? get toSteward { if (_self.toSteward == null) { return null; } - return $ToStewardModelCopyWith<$Res>(_self.toSteward!, (value) { + return $StewardModelCopyWith<$Res>(_self.toSteward!, (value) { return _then(_self.copyWith(toSteward: value)); }); } @@ -317,16 +170,16 @@ $ToStewardModelCopyWith<$Res>? get toSteward { /// @nodoc @JsonSerializable() -class _ResultModel implements ResultModel { - _ResultModel({this.id, this.product, this.killHouse, this.toKillHouse, this.steward, @JsonKey(name: 'to_steward') this.toSteward, this.guilds, this.toGuilds, this.toColdHouse, this.indexWeight, this.dateTimestamp, this.newState, this.newReceiverState, this.newAllocationState, this.key, this.createDate, this.modifyDate, this.trash, this.numberOfCarcasses, this.realNumberOfCarcasses, this.receiverRealNumberOfCarcasses, this.weightOfCarcasses, this.realWeightOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses, this.finalRegistration, this.sellType, this.productName, this.sellerType, this.type, this.saleType, this.allocationType, this.systemRegistrationCode, this.registrationCode, this.amount, this.totalAmount, this.totalAmountPaid, this.totalAmountRemain, this.loggedRegistrationCode, this.state, this.receiverState, this.allocationState, this.date, this.role, this.stewardTempKey, this.approvedPriceStatus, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy, this.wareHouse, this.stewardWareHouse, this.car, this.dispenser}); - factory _ResultModel.fromJson(Map json) => _$ResultModelFromJson(json); +class _WaitingArrivalModel implements WaitingArrivalModel { + _WaitingArrivalModel({this.id, this.product, this.killHouse, this.toKillHouse, this.steward, this.toSteward, this.guilds, this.toGuilds, this.toColdHouse, this.indexWeight, this.dateTimestamp, this.newState, this.newReceiverState, this.newAllocationState, this.key, this.createDate, this.modifyDate, this.trash, this.numberOfCarcasses, this.realNumberOfCarcasses, this.receiverRealNumberOfCarcasses, this.weightOfCarcasses, this.realWeightOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses, this.finalRegistration, this.sellType, this.productName, this.sellerType, this.type, this.saleType, this.allocationType, this.systemRegistrationCode, this.registrationCode, this.amount, this.totalAmount, this.totalAmountPaid, this.totalAmountRemain, this.loggedRegistrationCode, this.state, this.receiverState, this.allocationState, this.date, this.role, this.stewardTempKey, this.approvedPriceStatus, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.overhead, this.createdBy, this.modifiedBy, this.wareHouse, this.stewardWareHouse, this.car, this.dispenser}); + factory _WaitingArrivalModel.fromJson(Map json) => _$WaitingArrivalModelFromJson(json); @override final int? id; @override final ProductModel? product; -@override final KillHouseModel? killHouse; +@override final dynamic killHouse; @override final dynamic toKillHouse; -@override final dynamic steward; -@override@JsonKey(name: 'to_steward') final ToStewardModel? toSteward; +@override final StewardModel? steward; +@override final StewardModel? toSteward; @override final dynamic guilds; @override final dynamic toGuilds; @override final dynamic toColdHouse; @@ -370,6 +223,7 @@ class _ResultModel implements ResultModel { @override final bool? calculateStatus; @override final bool? temporaryTrash; @override final bool? temporaryDeleted; +@override final bool? overhead; @override final dynamic createdBy; @override final dynamic modifiedBy; @override final dynamic wareHouse; @@ -377,65 +231,65 @@ class _ResultModel implements ResultModel { @override final dynamic car; @override final dynamic dispenser; -/// Create a copy of ResultModel +/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -_$ResultModelCopyWith<_ResultModel> get copyWith => __$ResultModelCopyWithImpl<_ResultModel>(this, _$identity); +_$WaitingArrivalModelCopyWith<_WaitingArrivalModel> get copyWith => __$WaitingArrivalModelCopyWithImpl<_WaitingArrivalModel>(this, _$identity); @override Map toJson() { - return _$ResultModelToJson(this, ); + return _$WaitingArrivalModelToJson(this, ); } @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ResultModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _WaitingArrivalModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&(identical(other.overhead, overhead) || other.overhead == overhead)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); +int get hashCode => Object.hashAll([runtimeType,id,product,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(toKillHouse),steward,toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,overhead,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); @override String toString() { - return 'ResultModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; + return 'WaitingArrivalModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, overhead: $overhead, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; } } /// @nodoc -abstract mixin class _$ResultModelCopyWith<$Res> implements $ResultModelCopyWith<$Res> { - factory _$ResultModelCopyWith(_ResultModel value, $Res Function(_ResultModel) _then) = __$ResultModelCopyWithImpl; +abstract mixin class _$WaitingArrivalModelCopyWith<$Res> implements $WaitingArrivalModelCopyWith<$Res> { + factory _$WaitingArrivalModelCopyWith(_WaitingArrivalModel value, $Res Function(_WaitingArrivalModel) _then) = __$WaitingArrivalModelCopyWithImpl; @override @useResult $Res call({ - int? id, ProductModel? product, KillHouseModel? killHouse, dynamic toKillHouse, dynamic steward,@JsonKey(name: 'to_steward') ToStewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser + int? id, ProductModel? product, dynamic killHouse, dynamic toKillHouse, StewardModel? steward, StewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, bool? overhead, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser }); -@override $ProductModelCopyWith<$Res>? get product;@override $KillHouseModelCopyWith<$Res>? get killHouse;@override $ToStewardModelCopyWith<$Res>? get toSteward; +@override $ProductModelCopyWith<$Res>? get product;@override $StewardModelCopyWith<$Res>? get steward;@override $StewardModelCopyWith<$Res>? get toSteward; } /// @nodoc -class __$ResultModelCopyWithImpl<$Res> - implements _$ResultModelCopyWith<$Res> { - __$ResultModelCopyWithImpl(this._self, this._then); +class __$WaitingArrivalModelCopyWithImpl<$Res> + implements _$WaitingArrivalModelCopyWith<$Res> { + __$WaitingArrivalModelCopyWithImpl(this._self, this._then); - final _ResultModel _self; - final $Res Function(_ResultModel) _then; + final _WaitingArrivalModel _self; + final $Res Function(_WaitingArrivalModel) _then; -/// Create a copy of ResultModel +/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { - return _then(_ResultModel( +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? overhead = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { + return _then(_WaitingArrivalModel( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable as ProductModel?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable -as KillHouseModel?,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable +as dynamic,toKillHouse: freezed == toKillHouse ? _self.toKillHouse : toKillHouse // ignore: cast_nullable_to_non_nullable as dynamic,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable -as dynamic,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable -as ToStewardModel?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable +as StewardModel?,toSteward: freezed == toSteward ? _self.toSteward : toSteward // ignore: cast_nullable_to_non_nullable +as StewardModel?,guilds: freezed == guilds ? _self.guilds : guilds // ignore: cast_nullable_to_non_nullable as dynamic,toGuilds: freezed == toGuilds ? _self.toGuilds : toGuilds // ignore: cast_nullable_to_non_nullable as dynamic,toColdHouse: freezed == toColdHouse ? _self.toColdHouse : toColdHouse // ignore: cast_nullable_to_non_nullable as dynamic,indexWeight: freezed == indexWeight ? _self.indexWeight : indexWeight // ignore: cast_nullable_to_non_nullable @@ -478,6 +332,7 @@ as dynamic,approvedPriceStatus: freezed == approvedPriceStatus ? _self.approvedP as bool?,calculateStatus: freezed == calculateStatus ? _self.calculateStatus : calculateStatus // ignore: cast_nullable_to_non_nullable as bool?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,overhead: freezed == overhead ? _self.overhead : overhead // ignore: cast_nullable_to_non_nullable as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable as dynamic,wareHouse: freezed == wareHouse ? _self.wareHouse : wareHouse // ignore: cast_nullable_to_non_nullable @@ -488,7 +343,7 @@ as dynamic, )); } -/// Create a copy of ResultModel +/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -500,28 +355,28 @@ $ProductModelCopyWith<$Res>? get product { return $ProductModelCopyWith<$Res>(_self.product!, (value) { return _then(_self.copyWith(product: value)); }); -}/// Create a copy of ResultModel +}/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$KillHouseModelCopyWith<$Res>? get killHouse { - if (_self.killHouse == null) { +$StewardModelCopyWith<$Res>? get steward { + if (_self.steward == null) { return null; } - return $KillHouseModelCopyWith<$Res>(_self.killHouse!, (value) { - return _then(_self.copyWith(killHouse: value)); + return $StewardModelCopyWith<$Res>(_self.steward!, (value) { + return _then(_self.copyWith(steward: value)); }); -}/// Create a copy of ResultModel +}/// Create a copy of WaitingArrivalModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardModelCopyWith<$Res>? get toSteward { +$StewardModelCopyWith<$Res>? get toSteward { if (_self.toSteward == null) { return null; } - return $ToStewardModelCopyWith<$Res>(_self.toSteward!, (value) { + return $StewardModelCopyWith<$Res>(_self.toSteward!, (value) { return _then(_self.copyWith(toSteward: value)); }); } @@ -531,7 +386,7 @@ $ToStewardModelCopyWith<$Res>? get toSteward { /// @nodoc mixin _$ProductModel { - double? get weightAverage; + String? get name; double? get weightAverage; /// Create a copy of ProductModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -544,16 +399,16 @@ $ProductModelCopyWith get copyWith => _$ProductModelCopyWithImpl

    uv{EFEAOr*-fUUd~kn9$e zC4h*4AW}s!)F2_&`1k@AOUxG^ypaR~O^uPFWyJ-yXV>ya=6-j6Gv}Ur=FFKhzZ2n* zBZyWALK@e+mdVMMoFvr zn@*!ZO(MLOO0I}B3#gcyO(@ebyiX7Qd(*LCgCUk99Xk0I(09*(B-{?;MVatBV2{|5 zOz4%Y!cy@ODC-@eH~R?bIYMN16vwzDe(}#nR)Qnsr;g!So)eUPaN86Mu z!Y|}wJk=djw$ldoWM4xbtp3|fQjG<@x}r?9rXYkEWnNlcN|qHAaZsm9}1Ds zy9Q;=ML0gT21}+(U{tY|{3_MrRCy_u9&pD%PdR)n7-HKh@gnFQTI&qn8rp!nzE$XL z-h}KkRe1T>AL@Hm*b}}Ll@8T}A7aabYVvm%bZe`y+j<}Qdj|V{e*|e)E1(LMle`Rt z4@$A;YB5yD>!2Pf!kn}(wCE826^#E?1l_*BV{~;f?co;rRgCEV7CccGV@$6d=}9HD zW*4TfmS7yu@zL6os3~2@qq|Blq6*|X`JWMP<0gZJFl_ypyI-${_*xX7P=1Yn{u;#_ znr|V@G@6Gtd;@3yXs*6@2dcY~T;IJLgRPNV#kye~6UimvJ(%{1nC!^2L;U zTOUUJ**AF5to`sSHz7MQP=9F5|ELVdff^$o+ZGD1&!x22Ep#phTGYK_z*}MiDZl6Q z>KtF3+&PDv2=75hM~}ao<%5%r5?=BZU}Gxqv1jWs`^^c2dwJqe;26T9+z}Y@1bU-x zcx5|`SdZ1PR16|j<&5gq0gQg_K>64Yn^X2UyQvr5AvSbxx?mW;Sc}i3gCfy6OBc=u7cQRyWBFFsrj0hxW|F zH04181OlL-FW?=VK*%FXS=)`}{|?_0kXIdppy~A4J|zBioho6HZ*JWFB7* zlWsm!whm*P?_nl;Gz|T{vFzO&KVdpGl1;`9L7KFYUGyJ-Tg6&tXWNUHY8T>KtQ^AK~tcVj=;Jw$n(JM-N7faE@G&hGmVuS{e?OYY%OVlKOW ztqs5KEF|V@!R&+zw#@Y={DZ35H+k1!TXB}DLYpA*sbL`jjauw@{|cn2A^#ij53d?l z({vf%+19Y9_Vwu6sgYl#`%%Nv{(K&#>ucEu*UmxrMjd~nw}bf> zEAU2kC|h5ufSPS#Q{@VjU-oBH)e2a)ZDgG0uTnQ?<$Yh+vHLW4y1kHvWhwBVRJFH; z?_#W`N^N5p6*sM+ktOshDiWO0Q zG_i>Vg?PW>HVddM!1DTU*{8wB>HHqhe&ndD?P5~_xx|B=tl>o#{r7R>$+ znOL~0n@x>pqTi~AsfpK9&?t?^`3xCa&cz_VLI(ZKA5%S$VOL5dGp9= zfvHLGzLbM6C-);MA{R6Mm>F=V6OYOOBMKqs3;LW?u zqj~V4JD>b(6hC!lHSaHo;vH44S~N0tA@1Exoa;nf6;5M2Zv0&YpUSr2Gj^PpXsoK$ MGoUHZG!tv#e@Ht+y#N3J literal 0 HcmV?d00001 diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart index bb2586b..eba3191 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; + import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index d439b53..6b44fa7 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; + import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 7b85d9b..f69365d 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -9,7 +9,7 @@ import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_f import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; + import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart index 78baaa6..41451ad 100644 --- a/packages/chicken/lib/presentation/pages/profile/view.dart +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; + import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 7b5afb6..3a00c17 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -7,7 +7,6 @@ import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 8ee11f9..452576e 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -10,7 +10,6 @@ import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index e04807c..fad7bc9 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -4,7 +4,7 @@ import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buy import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; + import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index 6ea37ba..018d19a 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; + import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index b3b898d..31e3519 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_chicken/data/models/response/segmentation_model/segment import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; + import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 44a3854..9ea23c7 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -88,6 +88,9 @@ class $AssetsIconsGen { /// File path: assets/icons/convert_cube.svg SvgGenImage get convertCube => const SvgGenImage('assets/icons/convert_cube.svg'); + /// File path: assets/icons/cow.svg + SvgGenImage get cow => const SvgGenImage('assets/icons/cow.svg'); + /// File path: assets/icons/cube.svg SvgGenImage get cube => const SvgGenImage('assets/icons/cube.svg'); @@ -280,6 +283,7 @@ class $AssetsIconsGen { closeCircle, closeSquare, convertCube, + cow, cube, cubeBottomRotation, cubeRotate, @@ -429,6 +433,9 @@ class $AssetsVecGen { /// File path: assets/vec/convert_cube.svg.vec SvgGenImage get convertCubeSvg => const SvgGenImage.vec('assets/vec/convert_cube.svg.vec'); + /// File path: assets/vec/cow.svg.vec + SvgGenImage get cowSvg => const SvgGenImage.vec('assets/vec/cow.svg.vec'); + /// File path: assets/vec/cube.svg.vec SvgGenImage get cubeSvg => const SvgGenImage.vec('assets/vec/cube.svg.vec'); @@ -621,6 +628,7 @@ class $AssetsVecGen { closeCircleSvg, closeSquareSvg, convertCubeSvg, + cowSvg, cubeSvg, cubeBottomRotationSvg, cubeRotateSvg, diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart index 7d921b7..55fb489 100644 --- a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -51,7 +51,7 @@ class BaseBottomSheet extends StatelessWidget { ], ), ), - SizedBox(height: 2), + SizedBox(height:8), Expanded(child: SingleChildScrollView(child: child)), ], ), diff --git a/packages/core/lib/presentation/widget/buttons/elevated.dart b/packages/core/lib/presentation/widget/buttons/elevated.dart index 01f9743..592254b 100644 --- a/packages/core/lib/presentation/widget/buttons/elevated.dart +++ b/packages/core/lib/presentation/widget/buttons/elevated.dart @@ -5,7 +5,7 @@ import 'package:rasadyar_core/presentation/common/app_fonts.dart'; class RElevated extends StatelessWidget { const RElevated({ super.key, - required this.text, + this.text, required this.onPressed, this.foregroundColor = Colors.white, this.backgroundColor = AppColor.blueNormal, @@ -17,9 +17,11 @@ class RElevated extends StatelessWidget { this.height = 56.0, this.isFullWidth = false, this.isLoading = false, - }); + this.child, + }) : assert(text != null || child != null, 'Either text or child must be provided'); - final String text; + final String? text; + final Widget? child; final VoidCallback? onPressed; final double width; final double height; @@ -41,27 +43,23 @@ class RElevated extends StatelessWidget { style: ElevatedButton.styleFrom( backgroundColor: backgroundColor, foregroundColor: foregroundColor, - disabledBackgroundColor: - disabledBackgroundColor ?? backgroundColor.withAlpha(38), + disabledBackgroundColor: disabledBackgroundColor ?? backgroundColor.withAlpha(38), disabledForegroundColor: disabledForegroundColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(radius), - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(radius)), minimumSize: Size(isFullWidth ? double.infinity : width, height), padding: EdgeInsets.zero, textStyle: textStyle ?? AppFonts.yekan18, ), - child: - isLoading - ? SizedBox( - width: 24, - height: 24, - child: CircularProgressIndicator( - strokeWidth: 2.5, - valueColor: AlwaysStoppedAnimation(foregroundColor), - ), - ) - : Text(text), + child: isLoading + ? SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator( + strokeWidth: 2.5, + valueColor: AlwaysStoppedAnimation(foregroundColor), + ), + ) + : child ?? Text(text!), ); } } diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart index 92a109d..4d1e629 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart @@ -16,7 +16,7 @@ class ROutlinedElevated extends StatefulWidget { this.child, this.width, this.height, - }); + }):assert(text!=null || child != null, 'Either text or child must be provided'); final String? text; final VoidCallback? onPressed; @@ -120,7 +120,7 @@ class _ROutlinedElevatedState extends State { return widget.textStyle ?? AppFonts.yekan20.copyWith(color: AppColor.blueNormal); }), ), - child: Text(widget.text ?? ''), + child: widget.child ?? Text(widget.text ?? ''), ), ); } diff --git a/packages/chicken/lib/presentation/widget/list_row_item.dart b/packages/core/lib/presentation/widget/list_row_item.dart similarity index 100% rename from packages/chicken/lib/presentation/widget/list_row_item.dart rename to packages/core/lib/presentation/widget/list_row_item.dart diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 43077b5..dd55bb0 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -21,5 +21,6 @@ export 'tabs/new_tab.dart'; export 'tabs/r_segment.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; +export 'list_row_item.dart'; //inputs export 'inputs/inputs.dart'; diff --git a/packages/inspection/lib/presentation/inspection_map/logic.dart b/packages/inspection/lib/presentation/inspection_map/logic.dart index fdd97c7..944784c 100644 --- a/packages/inspection/lib/presentation/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/inspection_map/logic.dart @@ -17,6 +17,7 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin RxList markers = [].obs; Timer? _debounceTimer; RxBool isLoading = false.obs; + RxBool isSelectedDetailsLocation = false.obs; RxInt filterIndex = 0.obs; RxInt showIndex = 0.obs; diff --git a/packages/inspection/lib/presentation/inspection_map/view.dart b/packages/inspection/lib/presentation/inspection_map/view.dart index f287f66..72d174c 100644 --- a/packages/inspection/lib/presentation/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/inspection_map/view.dart @@ -56,7 +56,7 @@ class InspectionMapPage extends GetView { marker: e, onTap: () { Get.bottomSheet( - selectedLocationWidget( + selectedLocationWidget2( showHint: false, sliderController: controller.slidController.value, trigger: () {}, @@ -107,6 +107,196 @@ class InspectionMapPage extends GetView { ); }, controller.isLoading); } + + Widget selectedLocationWidget2({ + required bool showHint, + required SlidableController sliderController, + required VoidCallback trigger, + required VoidCallback toggle, + }) { + return ObxValue((data) { + return BaseBottomSheet( + height: data.value ? 450.h : 150.h, + child: ListItemWithOutCounter( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + secondChild: Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داوود خرم پور', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ بازرسی', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '1403/12/12', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + + buildRow( + title: 'تلفن خریدار', + value: '0326598653', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow(title: 'آخرین فعالیت', value: '1409/12/12'), + buildRow(title: 'موجودی', value: '5KG'), + buildRow(title: 'فروش رفته', value: '5KG'), + ], + ), + ), + Row( + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 7, + children: [ + RElevated( + width: 40.h, + height: 38.h, + backgroundColor: AppColor.greenNormal, + child: Assets.vec.messageAddSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + onPressed: () {}, + ), + RElevated( + width: 150.w, + height: 40.h, + backgroundColor: AppColor.blueNormal, + onPressed: () { + /*controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ).whenComplete(() { + + });*/ + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Text( + 'مسیریابی', + style: AppFonts.yekan14Bold.copyWith(color: Colors.white), + ), + ], + ), + ), + ROutlinedElevated( + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + // controller.denyAllocation(item.key ?? ''); + //await controller.deleteAllocation(item); + }, + onRefresh: () async {}, + ); + }, + borderColor: AppColor.bgIcon, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.securityTimeSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(AppColor.bgIcon, BlendMode.srcIn), + ), + Text( + 'سوابق بازرسی', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.bgIcon), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + labelIconColor: AppColor.bgIcon, + onTap: () => data.value = !data.value, + selected: data.value, + ), + ); + }, controller.isSelectedDetailsLocation); + } } Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { @@ -652,69 +842,3 @@ Widget selectedLocationWidget({ ), ); } - -Widget selectedLocationWidget2({ - required bool showHint, - required SlidableController sliderController, - required VoidCallback trigger, - required VoidCallback toggle, -}) { - if (showHint) { - trigger.call(); - } - return BaseBottomSheet( - height: 150.h, - child: ListItem( - index: 0, - child:Container( - height: 58, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - 'گوشت و مرغ', - style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Column( - children: [ - Text( - 'باقی مانده', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Assets.vec.scanBarcodeSvg.svg(), - ], - ), - ) , - secondChild: Container( - height: 350.h, - color: Colors.redAccent, - ), - labelColor: Colors.blue, - labelIcon: Assets.vec.mapSvg.path, - onTap: () { - - }, - selected: true, - ), - ); -} diff --git a/packages/inspection/lib/presentation/widget/list_item/list_item.dart b/packages/inspection/lib/presentation/widget/list_item/list_item.dart index fd65df6..3b48ae2 100644 --- a/packages/inspection/lib/presentation/widget/list_item/list_item.dart +++ b/packages/inspection/lib/presentation/widget/list_item/list_item.dart @@ -126,6 +126,107 @@ class ListItem extends StatelessWidget { } } +class ListItemWithOutCounter extends StatelessWidget { + const ListItemWithOutCounter({ + super.key, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + required this.onTap, + required this.selected, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + Expanded( + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + secondChild: Container( + padding: EdgeInsets.all(8), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: selected + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + Visibility( + visible: selected==false, + child: Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + colorFilter: ColorFilter.mode(labelColor, BlendMode.srcIn), + ), + ), + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} + class ListItem2 extends StatelessWidget { const ListItem2({ super.key, From bafa24543dfd9949563f8ad0c1cdb21148a2e1de Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 26 Jul 2025 15:47:22 +0330 Subject: [PATCH 240/256] feat : init statics --- assets/icons/calendar_search_outline.svg | 20 + assets/icons/profile2_outline.svg | 6 + assets/vec/calendar_search_outline.svg.vec | Bin 0 -> 2220 bytes assets/vec/profile2_outline.svg.vec | Bin 0 -> 1337 bytes lib/presentation/pages/splash/logic.dart | 1 + lib/presentation/routes/app_pages.dart | 1 + .../pages/buy_in_province_all/view.dart | 2 +- .../pages/buy_in_province_waiting/view.dart | 2 +- .../pages/buy_out_of_province/view.dart | 2 +- .../pages/sales_in_province/view.dart | 2 +- .../pages/sales_out_of_province/view.dart | 2 +- .../sales_out_of_province_buyers/view.dart | 2 +- .../view.dart | 2 +- .../presentation/pages/segmentation/view.dart | 2 +- .../lib/presentation/common/assets.gen.dart | 16 + .../widget/buttons/outline_elevated_icon.dart | 1 + .../widget/list_item/list_item.dart | 127 +++ .../widget/list_item/list_item2.dart | 117 +++ .../list_item/list_item_with_out_number.dart | 104 +++ .../widget/overlay_dropdown_widget/view.dart | 11 + .../core/lib/presentation/widget/widget.dart | 5 + packages/inspection/lib/inspection.dart | 6 +- .../lib/presentation/action/view.dart | 726 ------------------ .../{ => pages}/action/logic.dart | 12 +- .../lib/presentation/pages/action/view.dart | 443 +++++++++++ .../add_mobile_inspector/logic.dart | 0 .../add_mobile_inspector/view.dart | 0 .../{ => pages}/add_supervision/logic.dart | 0 .../{ => pages}/add_supervision/view.dart | 0 .../display_information/logic.dart | 0 .../{ => pages}/display_information/view.dart | 0 .../{ => pages}/filter/logic.dart | 4 +- .../presentation/{ => pages}/filter/view.dart | 26 +- .../{ => pages}/inspection_map/logic.dart | 0 .../{ => pages}/inspection_map/view.dart | 289 +------ .../{ => pages}/location_details/logic.dart | 0 .../{ => pages}/location_details/view.dart | 0 .../lib/presentation/pages/pages.dart | 22 + .../{ => pages}/profile/logic.dart | 0 .../{ => pages}/profile/view.dart | 0 .../lib/presentation/pages/records/logic.dart | 32 + .../lib/presentation/pages/records/view.dart | 184 +++++ .../registration_of_violation/logic.dart | 0 .../registration_of_violation/view.dart | 35 +- .../presentation/{ => pages}/root/logic.dart | 13 +- .../presentation/{ => pages}/root/view.dart | 0 .../presentation/pages/statistics/logic.dart | 63 ++ .../presentation/pages/statistics/view.dart | 324 ++++++++ .../lib/presentation/pages/users/logic.dart | 33 + .../lib/presentation/pages/users/view.dart | 190 +++++ .../lib/presentation/routes/app_pages.dart | 32 +- .../lib/presentation/widget/custom_chips.dart | 68 ++ .../widget/list_item/list_item.dart | 343 --------- tools/vecGeneratoe.sh | 4 + 54 files changed, 1853 insertions(+), 1421 deletions(-) create mode 100644 assets/icons/calendar_search_outline.svg create mode 100644 assets/icons/profile2_outline.svg create mode 100644 assets/vec/calendar_search_outline.svg.vec create mode 100644 assets/vec/profile2_outline.svg.vec create mode 100644 packages/core/lib/presentation/widget/list_item/list_item.dart create mode 100644 packages/core/lib/presentation/widget/list_item/list_item2.dart create mode 100644 packages/core/lib/presentation/widget/list_item/list_item_with_out_number.dart delete mode 100644 packages/inspection/lib/presentation/action/view.dart rename packages/inspection/lib/presentation/{ => pages}/action/logic.dart (86%) create mode 100644 packages/inspection/lib/presentation/pages/action/view.dart rename packages/inspection/lib/presentation/{ => pages}/add_mobile_inspector/logic.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/add_mobile_inspector/view.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/add_supervision/logic.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/add_supervision/view.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/display_information/logic.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/display_information/view.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/filter/logic.dart (98%) rename packages/inspection/lib/presentation/{ => pages}/filter/view.dart (95%) rename packages/inspection/lib/presentation/{ => pages}/inspection_map/logic.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/inspection_map/view.dart (74%) rename packages/inspection/lib/presentation/{ => pages}/location_details/logic.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/location_details/view.dart (100%) create mode 100644 packages/inspection/lib/presentation/pages/pages.dart rename packages/inspection/lib/presentation/{ => pages}/profile/logic.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/profile/view.dart (100%) create mode 100644 packages/inspection/lib/presentation/pages/records/logic.dart create mode 100644 packages/inspection/lib/presentation/pages/records/view.dart rename packages/inspection/lib/presentation/{ => pages}/registration_of_violation/logic.dart (100%) rename packages/inspection/lib/presentation/{ => pages}/registration_of_violation/view.dart (82%) rename packages/inspection/lib/presentation/{ => pages}/root/logic.dart (87%) rename packages/inspection/lib/presentation/{ => pages}/root/view.dart (100%) create mode 100644 packages/inspection/lib/presentation/pages/statistics/logic.dart create mode 100644 packages/inspection/lib/presentation/pages/statistics/view.dart create mode 100644 packages/inspection/lib/presentation/pages/users/logic.dart create mode 100644 packages/inspection/lib/presentation/pages/users/view.dart create mode 100644 packages/inspection/lib/presentation/widget/custom_chips.dart delete mode 100644 packages/inspection/lib/presentation/widget/list_item/list_item.dart diff --git a/assets/icons/calendar_search_outline.svg b/assets/icons/calendar_search_outline.svg new file mode 100644 index 0000000..854cf73 --- /dev/null +++ b/assets/icons/calendar_search_outline.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/assets/icons/profile2_outline.svg b/assets/icons/profile2_outline.svg new file mode 100644 index 0000000..87c10f9 --- /dev/null +++ b/assets/icons/profile2_outline.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/vec/calendar_search_outline.svg.vec b/assets/vec/calendar_search_outline.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..63a41df5e983806e5aca91d52ef1ce2486be3bba GIT binary patch literal 2220 zcmZXW3rtgI6oCKR+d|s~fm%SQGw2pkg5q$R`M{pzn4(!64zUFx(+Y?T{Uf z(Ue!fw0L}Wl5;vfwUeI;1yc4g(>^>FmV4Q5^!I}1-y2@v%kjvM@&bRw4f zqT@pq1a%RqgcygRi3?>X$6@N)Ld+dV$8|YXtRrq7T*~sasC;~L|9TugSBM6+3~SzY zVBg>xyxHKur}IlN&RK-778POayb?UK$$@FVtijFiIB=a(hVKRov31{iOflwjtmb=K zOv+0+C@1B9xfarqOlRa;t8+@Y-YM92dM2MjywH`q^W>T-GHx;3h+3XvBpaPC>nH}v zv?j8a{B4RVOw=CPDViqrbrOVV)Rp1n{926ttQ-R)b!h0QK%>7NN4=HIo!?e5x1Zd= z_LSwd?0=_XBbLsqMxuXw1(Lp5FMD&OjQh58w+kPk18>%pFeCl^&F;XT>PnEfzs1FU zc6OFwqz;>+7x7dW-`N*`YB4G0G50GNzLt!|m%f1-X9^bY>4rR?WWjM}?m(}`>HrLV zl#Byg&O>QylC)odyQU=kAu|X?&54+8z6kwK67bZ$i|~9!0=BsOAg#-a=lu-|U>jy#K`oUxfQ{g!{vF zxaEAxx{4MjbDh*@n_>_#)b|&+LZ{}CLWmQ$9|G)6!qTC~aA8|AmNq_vjH4;oDFiZu zI_8001|)mq-e@HMZehgJ<|O>J+K971PQ=%48?ozY0aKGLHD-${(Lz@K6rF<0nhIAkez3iNHfcnGfQ@w zS@Ne@+Vt~Wo-I$xTg){pW-)i}&SHB{UncvX{eBuQ*mnjNUYm+rtzR=KFX`!?Z$CL5 zMeq=OHz@t(jNDoD2GZiJ}<#PufGaiG-|2m|-3ueTTe;1S)Qi1eBqyqU7wRKuNo6KYt^59h3 z3sAe%smn+&??<|~UiQKV#P+s1Od$gH^9$+u7qCCcr@aL1THJuWV`v$WpT#q5r**`u zzI6G{8Me2#EoTZ*f#gTj)>YsNuUW>az(Hdy)_zbbW%(QstC=mHRbko5cIt!X?+mYZ zV$FeC$j(?I-(j&qwl0_qxLSb)mL@7w#Fg$Ucyq zh`me7nd$P`O|ojL3ES(#{`EM6J|g6|#RNrzPJ{g3Af;Y|K|_>=Xbtow5(@nXzAxnJ literal 0 HcmV?d00001 diff --git a/assets/vec/profile2_outline.svg.vec b/assets/vec/profile2_outline.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..47e117ed3b86c967d787b57fb8144e39d5dce821 GIT binary patch literal 1337 zcmX|>3rv+|7{|YJjtWWy95Rs0;gSd(m5ZY-0XfefI&v9;a1!XqA$CyNG==5Ja4uMQ zOAU&-D7FAcE;cW8p-sudW#Fh}ZiZaM8Y^p2f@^aKmrJ_q`?Z@)d4_j&&N@BKde z*0YKxQcN>!&Qs_L&%6c0r_8m)YEiWA8)75h~$t@>@2)V2N0z&e$xp3RV& z$}EMq^e|WUFP*V3pR-f#ONlgc?IP)0{^mWBcQPJxoMUx?tV_y0YLW{EKKq6~ zX`L2(hH39mpV%`>R`*^pf0W8nyO_P|EzVy(Ur%3`j0k;pnqSw!lym$w8pT~2qIH_Y zMv+V?N?1iSI^LcquYqV3T$`sw-x%iPK_`c9IT>S2$58Ja?Xwl4%ljU)L)*eEiYlb@ zOR1P`Uq|1&L^BK8jLUI2I%7A8e7J~>%%Z47a@I4r|3PvFT}d)Qa-S^|osM^zo`cQI z?GfE{B#y-XF|uEZ5qihTse7E(=%Y9;_;HKSJx-GcBVg}(NPazG@N0cU$F^?5cKa0F zZ`_18LuTmP^_vl$v#@-AUU;KbyrdC)Z~nhPT3xP8DvDzvh}NDfMn&x#Lc<{h-2GI< z8)YGmD$uAnV1={*e6}jv8^YDG#Bw+fb%YXVzB4GtFb0(UxySPpN_XYZ_j_ zQ*m$BeD^O+EY&gPUYRen{$O&gF(9b=tSQ1{3)A&#JoB%#bgo~xnTHjfp0tXN55z@S)Tj zibO{W^0a{nIFSk2Kap+W^G}2J^E^p8U*=c;;zu7eWb%IVSPE0>@mF-t?{wK`Cv>}| z$J0$I*tW-p*B+Ue?H3a;O^^)^8(ff+Hg55foY6?nb{r|&Gq1tNHO1nq{)qN+n9~( zsUdLNDg3-)fGIy2eTG1c>XV>E20*hb0e!#wpg%bgk*BC|%=Q#pjw)>5SXngONE zhQ~*95&TmgTI=%>SDhvF@5P+Oj2i|ULcV;J{mBh?a>ch8gLF|<4dP!Yp>;z1A4T*Z DZwBK2 literal 0 HcmV?d00001 diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 1000b9a..60bcc52 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -7,6 +7,7 @@ import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/inspection.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController scaleController; diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 534f0e8..50b39ac 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -8,6 +8,7 @@ import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/inspection.dart'; import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; + part 'app_paths.dart'; sealed class AppPages { diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart index eba3191..1b8a429 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart' hide ListItem2; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 6b44fa7..7ecf44e 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart' hide ListItem2; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index f69365d..bc73e58 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -8,7 +8,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; + import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 3a00c17..65ee593 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; + import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 452576e..827b542 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -9,7 +9,7 @@ import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; + import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index fad7bc9..fb906d6 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -3,7 +3,7 @@ import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_pr import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; + import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index 018d19a..ab1ce40 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -5,7 +5,7 @@ import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buy import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart' hide ListItem2; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index 31e3519..87a2d4a 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -5,7 +5,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; -import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; + import 'package:rasadyar_core/core.dart'; diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 9ea23c7..4bbf174 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -58,6 +58,9 @@ class $AssetsIconsGen { /// File path: assets/icons/calendar_search.svg SvgGenImage get calendarSearch => const SvgGenImage('assets/icons/calendar_search.svg'); + /// File path: assets/icons/calendar_search_outline.svg + SvgGenImage get calendarSearchOutline => const SvgGenImage('assets/icons/calendar_search_outline.svg'); + /// File path: assets/icons/call.svg SvgGenImage get call => const SvgGenImage('assets/icons/call.svg'); @@ -190,6 +193,9 @@ class $AssetsIconsGen { /// File path: assets/icons/profile2.svg SvgGenImage get profile2 => const SvgGenImage('assets/icons/profile2.svg'); + /// File path: assets/icons/profile2_outline.svg + SvgGenImage get profile2Outline => const SvgGenImage('assets/icons/profile2_outline.svg'); + /// File path: assets/icons/profile_circle.svg SvgGenImage get profileCircle => const SvgGenImage('assets/icons/profile_circle.svg'); @@ -273,6 +279,7 @@ class $AssetsIconsGen { buy, calendar, calendarSearch, + calendarSearchOutline, call, check, checkSquare, @@ -317,6 +324,7 @@ class $AssetsIconsGen { pictureFrame, placeHolder, profile2, + profile2Outline, profileCircle, profileUser, receiptDiscount, @@ -403,6 +411,9 @@ class $AssetsVecGen { /// File path: assets/vec/calendar_search.svg.vec SvgGenImage get calendarSearchSvg => const SvgGenImage.vec('assets/vec/calendar_search.svg.vec'); + /// File path: assets/vec/calendar_search_outline.svg.vec + SvgGenImage get calendarSearchOutlineSvg => const SvgGenImage.vec('assets/vec/calendar_search_outline.svg.vec'); + /// File path: assets/vec/call.svg.vec SvgGenImage get callSvg => const SvgGenImage.vec('assets/vec/call.svg.vec'); @@ -535,6 +546,9 @@ class $AssetsVecGen { /// File path: assets/vec/profile2.svg.vec SvgGenImage get profile2Svg => const SvgGenImage.vec('assets/vec/profile2.svg.vec'); + /// File path: assets/vec/profile2_outline.svg.vec + SvgGenImage get profile2OutlineSvg => const SvgGenImage.vec('assets/vec/profile2_outline.svg.vec'); + /// File path: assets/vec/profile_circle.svg.vec SvgGenImage get profileCircleSvg => const SvgGenImage.vec('assets/vec/profile_circle.svg.vec'); @@ -618,6 +632,7 @@ class $AssetsVecGen { buySvg, calendarSvg, calendarSearchSvg, + calendarSearchOutlineSvg, callSvg, checkSvg, checkSquareSvg, @@ -662,6 +677,7 @@ class $AssetsVecGen { pictureFrameSvg, placeHolderSvg, profile2Svg, + profile2OutlineSvg, profileCircleSvg, profileUserSvg, receiptDiscountSvg, diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart index d4c57a0..7260c6b 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart @@ -40,6 +40,7 @@ class _ROutlinedElevatedIconState extends State { Widget build(BuildContext context) { return OutlinedButton.icon( icon: widget.icon, + label: Text(widget.text), onPressed: widget.onPressed, style: ButtonStyle( diff --git a/packages/core/lib/presentation/widget/list_item/list_item.dart b/packages/core/lib/presentation/widget/list_item/list_item.dart new file mode 100644 index 0000000..01a146d --- /dev/null +++ b/packages/core/lib/presentation/widget/list_item/list_item.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class ListItem extends StatelessWidget { + const ListItem({ + super.key, + required this.index, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + required this.onTap, + required this.selected, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final int index; + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + Expanded( + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: selected + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + colorFilter: ColorFilter.mode(labelColor, BlendMode.srcIn), + ), + ), + ), + ], + ), + ), + ), + + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/list_item/list_item2.dart b/packages/core/lib/presentation/widget/list_item/list_item2.dart new file mode 100644 index 0000000..fb8eb81 --- /dev/null +++ b/packages/core/lib/presentation/widget/list_item/list_item2.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class ListItem2 extends StatelessWidget { + const ListItem2({ + super.key, + required this.index, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + required this.onTap, + required this.selected, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final int index; + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedCrossFade( + firstChild: Row( + children: [ + Expanded( + child: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + ), + Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + //TODO + colorFilter: ColorFilter.mode( + labelIconColor ?? AppColor.mediumGreyDarkActive, + BlendMode.srcIn, + ), + ), + ), + ), + ], + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 8, 12, 12), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: selected ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/list_item/list_item_with_out_number.dart b/packages/core/lib/presentation/widget/list_item/list_item_with_out_number.dart new file mode 100644 index 0000000..5e392e0 --- /dev/null +++ b/packages/core/lib/presentation/widget/list_item/list_item_with_out_number.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class ListItemWithOutCounter extends StatelessWidget { + const ListItemWithOutCounter({ + super.key, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + required this.onTap, + required this.selected, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + Expanded( + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + secondChild: Container( + padding: EdgeInsets.all(8), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: selected + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + Visibility( + visible: selected==false, + child: Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + colorFilter: ColorFilter.mode(labelColor, BlendMode.srcIn), + ), + ), + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} + diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index 80394cc..86a7ba1 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -46,6 +46,17 @@ class _OverlayDropdownState extends State> { selectedItem = widget.selectedItem ?? widget.initialValue; } + + @override + void didUpdateWidget(covariant OverlayDropdownWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.selectedItem != oldWidget.selectedItem) { + setState(() { + selectedItem = widget.selectedItem; + }); + } + } + void _showOverlay() { final renderBox = _key.currentContext!.findRenderObject() as RenderBox; final size = renderBox.size; diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index dd55bb0..42bb4a4 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -24,3 +24,8 @@ export 'vec_widget.dart'; export 'list_row_item.dart'; //inputs export 'inputs/inputs.dart'; +//list_item +export 'list_item/list_item.dart'; +export 'list_item/list_item2.dart'; +export 'list_item/list_item_with_out_number.dart'; + diff --git a/packages/inspection/lib/inspection.dart b/packages/inspection/lib/inspection.dart index 66fd106..cfd321b 100644 --- a/packages/inspection/lib/inspection.dart +++ b/packages/inspection/lib/inspection.dart @@ -1,7 +1,5 @@ library; -export 'presentation/filter/logic.dart'; -export 'presentation/filter/view.dart'; -export 'presentation/routes/app_pages.dart'; +export 'presentation/pages/pages.dart'; export 'presentation/routes/app_routes.dart'; - +export 'presentation/routes/app_pages.dart'; diff --git a/packages/inspection/lib/presentation/action/view.dart b/packages/inspection/lib/presentation/action/view.dart deleted file mode 100644 index a0d2ac5..0000000 --- a/packages/inspection/lib/presentation/action/view.dart +++ /dev/null @@ -1,726 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class ActionPage extends GetView { - const ActionPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColor.bgLight, - body: SafeArea( - child: Column( - children: [ - SizedBox(height: 20), - ObxValue((data) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: List.generate(4, (index) { - return headerWidget( - icon: controller.headersIcons[index], - title: controller.headersTitle[index], - onTap: () { - controller.updateSelectedIndex(index); - }, - isSelected: controller.selectedIndex.value == index, - ); - }), - ); - }, controller.selectedIndex), - Expanded( - child: ObxValue((index) { - if (index.value == 3) { - WidgetsBinding.instance.addPostFrameCallback((_) { - showCupertinoDialog( - context: context, - barrierDismissible: true, - builder: (context) { - return CupertinoAlertDialog( - title: Text( - 'از سامانه خارج می شوید؟', - style: AppFonts.yekan18.copyWith( - color: AppColor.lightGreyDarkActive, - ), - ), - actions: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - spacing: 16, - children: [ - Expanded( - child: RElevated( - text: 'بله', - onPressed: () { - exit(0); - }, - ), - ), - Expanded( - child: ROutlinedElevated( - text: 'خیر', - onPressed: () { - controller.updateSelectedIndex( - controller.previousIndex.value, - ); - - Get.back(); - }, - ), - ), - ], - ), - ), - ], - ); - }, - ); - }); - } - - return switch (index.value) { - 0 => profileWidget(), - 1 => supervisionHistoryWidget(), - 2 => statisticsWidget(), - - int() => Container(), - }; - }, controller.selectedIndex), - ), - ], - ), - ), - ); - } - - Container statisticsWidget() => Container( - margin: EdgeInsets.only(top: 50), - padding: EdgeInsets.symmetric(vertical: 50), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(30), - topRight: Radius.circular(30), - ), - ), - child: Column( - children: [ - Container( - height: 32, - margin: EdgeInsets.symmetric(horizontal: 22, vertical: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 10, - children: [ - Expanded( - child: ROutlinedElevatedIcon( - icon: FaIcon(FontAwesomeIcons.calendar), - onPressed: () {}, - text: 'از تاریخ', - textStyle: AppFonts.yekan16.copyWith( - color: AppColor.blueNormal, - ), - ), - ), - Expanded( - child: ROutlinedElevatedIcon( - icon: FaIcon(FontAwesomeIcons.calendar), - onPressed: () {}, - text: 'تا تاریخ', - textStyle: AppFonts.yekan16.copyWith( - color: AppColor.blueNormal, - ), - ), - ), - ], - ), - ), - - optionWidget( - selected: controller.filter1Index, - title: 'فیلترتراکنش ها', - options: controller.tmpLs, - ), - optionWidget( - selected: controller.filter2Index, - title: 'فیلتر شهرستان', - options: controller.hamadanCities, - ), - - SizedBox(height: 10), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - vecWidgetWithOnTap( - child: Assets.vec.pdfDownloadSvg.svg(), - onTap: () {}, - width: 64, - height: 64, - ), - vecWidgetWithOnTap( - child: Assets.vec.excelDownloadSvg.svg(), - onTap: () {}, - width: 64, - height: 64, - ), - ], - ), - ), - SizedBox(height: 16), - Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 20, - children: [ - headerInfo(title: 'تعداد تراکنش ها', description: '183 '), - headerInfo( - title: 'جمع تراکنش ها', - description: '183 ریال', - background: AppColor.green1Light, - ), - ], - ), - ], - ), - ); - - Widget supervisionHistoryWidget() { - return ObxValue((data) { - return ListView.builder( - itemBuilder: (context, index) { - return historyItem(data[index], () { - data[index] = !data[index]; - }); - }, - shrinkWrap: true, - physics: BouncingScrollPhysics(), - itemCount: data.length, - ); - }, controller.supervisionHistoryList); - } - - Column profileWidget() { - return Column( - children: [ - slidableWidgetOne(), - slidableWidgetOne(), - slidableWidgetOne(), - slidableWidgetOne(), - slidableWidgetOne(), - ], - ); - } - - Widget headerWidget({ - required Widget icon, - required String title, - required VoidCallback onTap, - bool isSelected = false, - }) { - return GestureDetector( - onTap: onTap, - child: Column( - spacing: 8, - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(8), - decoration: ShapeDecoration( - color: isSelected ? AppColor.blueLightActive : AppColor.blueLight, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - ), - child: icon, - ), - Text( - title, - style: AppFonts.yekan12.copyWith( - color: - isSelected ? AppColor.blueNormalActive : AppColor.blueNormal, - ), - ), - ], - ), - ); - } - - Widget slidableWidgetOne() { - if (controller.showSlideHint) { - controller.triggerSlidableAnimation(); - } - - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), - child: Slidable( - key: Key('selectedLocationWidget'), - controller: controller.slidController.value, - endActionPane: ActionPane( - motion: StretchMotion(), - children: [ - CustomSlidableAction( - onPressed: (context) {}, - backgroundColor: AppColor.redNormal, - foregroundColor: Colors.white, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.circular(8), - autoClose: true, - child: Assets.vec.trashSvg.svg( - width: 24, - height: 24, - ), - ), - ], - ), - child: GestureDetector( - onTap: () {}, - child: Container( - height: 62, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - spacing: 4, - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '03295224154', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - children: [ - Text( - 'افزودن کاربر', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'ثبت بازرسی', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - children: [ - Text( - 'همدان', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'همدان', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ], - ), - ), - ), - ), - ); - } - - Widget slidableWidgetTwo({required VoidCallback onTap}) { - return Slidable( - key: Key('selectedLocationWidget'), - controller: controller.slidController.value, - endActionPane: ActionPane( - motion: StretchMotion(), - children: [ - CustomSlidableAction( - onPressed: (context) {}, - backgroundColor: AppColor.blueNormal, - foregroundColor: Colors.white, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - topRight: Radius.circular(8), - bottomRight: Radius.circular(8), - ), - autoClose: true, - child: Assets.vec.trashSvg.svg( - width: 24, - height: 24, - ), - ), - CustomSlidableAction( - onPressed: (context) {}, - backgroundColor: AppColor.redNormal, - foregroundColor: Colors.white, - padding: EdgeInsets.all(16), - borderRadius: BorderRadius.only( - topLeft: Radius.circular(8), - bottomLeft: Radius.circular(8), - ), - autoClose: true, - child: Assets.vec.trashSvg.svg( - width: 24, - height: 24, - ), - ), - ], - ), - child: GestureDetector( - onTap: onTap, - child: Container( - height: 62, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLightHover), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - spacing: 4, - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '03295224154', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - children: [ - Text( - 'افزودن کاربر', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'ثبت بازرسی', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - spacing: 4, - children: [ - Text( - 'همدان', - style: AppFonts.yekan10.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'همدان', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ], - ), - ), - ), - ); - } - - Widget historyItem(bool isExpanded, VoidCallback onTap) { - return AnimatedContainer( - margin: EdgeInsets.symmetric(horizontal: 30, vertical: 10), - curve: Curves.easeInOut, - duration: Duration(seconds: 1), - height: isExpanded ? 364 : 62, - child: - isExpanded - ? markerDetailsWidget(ontap: onTap) - : slidableWidgetTwo(onTap: onTap), - ); - } - - Widget markerDetailsWidget({required VoidCallback ontap}) { - return GestureDetector( - onTap: ontap, - behavior: HitTestBehavior.opaque, - child: Container( - clipBehavior: Clip.antiAlias, - - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - decoration: ShapeDecoration( - color: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Column( - spacing: 15, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 12, - children: [ - vecWidgetWithOnTap( - child: Assets.vec.editSvg.svg(), - onTap: () {}, - width: 24, - height: 24, - color: AppColor.blueNormal, - ), - Text( - 'سوابق بازرسی من', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - vecWidgetWithOnTap( - child: Assets.vec.trashSvg.svg(), - width: 24, - height: 24, - color: AppColor.redNormal, - onTap: () {}, - ), - ], - ), - Container( - height: 32, - clipBehavior: Clip.antiAlias, - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'تاریخ بازرسی', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '1403/12/12', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ), - - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'شماره همراه', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '0326598653', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'آخرین فعالیت', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - - Text( - '1409/12/12', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'موجودی', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '5کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - - ...List.generate( - 5, - (index) => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'فروش رفته', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - ), - ], - ), - ), - ); - } - - Column optionWidget({ - required RxInt selected, - required String title, - required List options, - }) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row(), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 22, vertical: 10), - child: Text( - title, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), - ), - ), - - Padding( - padding: const EdgeInsets.symmetric(horizontal: 30), - child: Wrap( - runSpacing: 8, - spacing: 8, - children: - options - .map( - (e) => ObxValue((data) { - return ChoiceChip( - onSelected: (value) { - selected.value = options.indexOf(e); - }, - selectedColor: AppColor.blueNormal, - labelStyle: - data.value == options.indexOf(e) - ? AppFonts.yekan13.copyWith( - color: AppColor.whiteLight, - ) - : AppFonts.yekan12.copyWith( - color: AppColor.darkGreyNormalActive, - ), - checkmarkColor: Colors.white, - label: Text(e), - selected: options.indexOf(e) == data.value, - ); - }, selected), - ) - .toList(), - ), - ), - ], - ); - } - - Container headerInfo({ - required String title, - required String description, - Color? background, - }) { - return Container( - clipBehavior: Clip.antiAlias, - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), - decoration: ShapeDecoration( - color: background ?? AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blackLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - alignment: AlignmentDirectional.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 10, - children: [ - Text(title, style: AppFonts.yekan10), - - Text(description, style: AppFonts.yekan12), - ], - ), - ); - } -} diff --git a/packages/inspection/lib/presentation/action/logic.dart b/packages/inspection/lib/presentation/pages/action/logic.dart similarity index 86% rename from packages/inspection/lib/presentation/action/logic.dart rename to packages/inspection/lib/presentation/pages/action/logic.dart index 6692de2..3d2a504 100644 --- a/packages/inspection/lib/presentation/action/logic.dart +++ b/packages/inspection/lib/presentation/pages/action/logic.dart @@ -10,16 +10,14 @@ class ActionLogic extends GetxController with GetTickerProviderStateMixin { List headersTitle = [ 'کاربران', - 'سوابق بازرسی من', + 'سوابق', 'آمار', - 'خروج از سامانه', ]; - List headersIcons = [ - Assets.vec.profileUserSvg.svg(), - Assets.vec.calendarSearchSvg.svg(), - Assets.vec.diagramSvg.svg(), - Assets.vec.logoutSvg.svg(), + List headersIcons = [ + Assets.vec.profileUserSvg.path, + Assets.vec.calendarSearchSvg.path, + Assets.vec.diagramSvg.path, ]; RxList supervisionHistoryList = [false, false, false, false].obs; diff --git a/packages/inspection/lib/presentation/pages/action/view.dart b/packages/inspection/lib/presentation/pages/action/view.dart new file mode 100644 index 0000000..062a66b --- /dev/null +++ b/packages/inspection/lib/presentation/pages/action/view.dart @@ -0,0 +1,443 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/pages/records/view.dart'; +import 'package:rasadyar_inspection/presentation/pages/statistics/view.dart'; +import 'package:rasadyar_inspection/presentation/pages/users/view.dart'; +import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; + +import 'logic.dart'; + +class ActionPage extends GetView { + const ActionPage({super.key}); + + @override + Widget build(BuildContext context) { + return BasePage( + hasBack: false, + hasFilter: true, + hasSearch: true, + widgets: [ + SizedBox(height: 20), + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(controller.headersIcons.length, (index) { + return headerWidget( + iconPath: controller.headersIcons[index], + title: controller.headersTitle[index], + onTap: () { + controller.updateSelectedIndex(index); + }, + isSelected: controller.selectedIndex.value == index, + ); + }), + ); + }, controller.selectedIndex), + Expanded( + child: Container( + color: Colors.white, + child: ObxValue((index) { + return switch (index.value) { + 0 => UsersPage(), + 1 => RecordsPage(), + 2 => StatisticsPage(), + int() => throw UnimplementedError(), + }; + }, controller.selectedIndex), + ), + ), + ], + ); + } + + + + Widget supervisionHistoryWidget() { + return ObxValue((data) { + return ListView.builder( + itemBuilder: (context, index) { + return historyItem(data[index], () { + data[index] = !data[index]; + }); + }, + shrinkWrap: true, + physics: BouncingScrollPhysics(), + itemCount: data.length, + ); + }, controller.supervisionHistoryList); + } + + + + Widget headerWidget({ + required String iconPath, + required String title, + required VoidCallback onTap, + bool isSelected = false, + }) { + return GestureDetector( + onTap: onTap, + child: Container( + width: 93.w, + height: 104.h, + margin: EdgeInsets.symmetric(horizontal: 8.w), + padding: EdgeInsets.symmetric(horizontal: 12.w,vertical: 8.h), + decoration: BoxDecoration( + color: isSelected ? Colors.white : Colors.transparent, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Container( + width: 48.w, + height: 48.h, + padding: EdgeInsets.all(8), + decoration: ShapeDecoration( + color: isSelected ? AppColor.blueLightActive : Colors.transparent, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: SvgGenImage.vec(iconPath).svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + isSelected ? AppColor.blueNormalActive : AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), + + Text( + title, + style: AppFonts.yekan12.copyWith( + + color: isSelected ? AppColor.blueNormalActive : AppColor.blueNormal, + ), + ), + ], + ), + ), + ); + } + + + Widget slidableWidgetTwo({required VoidCallback onTap}) { + return Slidable( + key: Key('selectedLocationWidget'), + controller: controller.slidController.value, + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.blueNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + autoClose: true, + child: Assets.vec.trashSvg.svg(width: 24, height: 24), + ), + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.redNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), + autoClose: true, + child: Assets.vec.trashSvg.svg(width: 24, height: 24), + ), + ], + ), + child: GestureDetector( + onTap: onTap, + child: Container( + height: 62, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + spacing: 4, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + '03295224154', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + spacing: 4, + children: [ + Text( + 'افزودن کاربر', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + 'ثبت بازرسی', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + spacing: 4, + children: [ + Text('همدان', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text( + 'همدان', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + ], + ), + ), + ), + ); + } + + Widget historyItem(bool isExpanded, VoidCallback onTap) { + return AnimatedContainer( + margin: EdgeInsets.symmetric(horizontal: 30, vertical: 10), + curve: Curves.easeInOut, + duration: Duration(seconds: 1), + height: isExpanded ? 364 : 62, + child: isExpanded ? markerDetailsWidget(ontap: onTap) : slidableWidgetTwo(onTap: onTap), + ); + } + + Widget markerDetailsWidget({required VoidCallback ontap}) { + return GestureDetector( + onTap: ontap, + behavior: HitTestBehavior.opaque, + child: Container( + clipBehavior: Clip.antiAlias, + + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 12, + children: [ + vecWidgetWithOnTap( + child: Assets.vec.editSvg.svg(), + onTap: () {}, + width: 24, + height: 24, + color: AppColor.blueNormal, + ), + Text( + 'سوابق بازرسی من', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + vecWidgetWithOnTap( + child: Assets.vec.trashSvg.svg(), + width: 24, + height: 24, + color: AppColor.redNormal, + onTap: () {}, + ), + ], + ), + Container( + height: 32, + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'تاریخ بازرسی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '1403/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + + ...List.generate( + 5, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + ), + ], + ), + ), + ); + } + + Column optionWidget({ + required RxInt selected, + required String title, + required List options, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 22, vertical: 10), + child: Text( + title, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Wrap( + runSpacing: 8, + spacing: 8, + children: options + .map( + (e) => ObxValue((data) { + return ChoiceChip( + onSelected: (value) { + selected.value = options.indexOf(e); + }, + selectedColor: AppColor.blueNormal, + labelStyle: data.value == options.indexOf(e) + ? AppFonts.yekan13.copyWith(color: AppColor.whiteLight) + : AppFonts.yekan12.copyWith(color: AppColor.darkGreyNormalActive), + checkmarkColor: Colors.white, + label: Text(e), + selected: options.indexOf(e) == data.value, + ); + }, selected), + ) + .toList(), + ), + ), + ], + ); + } + + Container headerInfo({required String title, required String description, Color? background}) { + return Container( + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: ShapeDecoration( + color: background ?? AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blackLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + alignment: AlignmentDirectional.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 10, + children: [ + Text(title, style: AppFonts.yekan10), + + Text(description, style: AppFonts.yekan12), + ], + ), + ); + } +} diff --git a/packages/inspection/lib/presentation/add_mobile_inspector/logic.dart b/packages/inspection/lib/presentation/pages/add_mobile_inspector/logic.dart similarity index 100% rename from packages/inspection/lib/presentation/add_mobile_inspector/logic.dart rename to packages/inspection/lib/presentation/pages/add_mobile_inspector/logic.dart diff --git a/packages/inspection/lib/presentation/add_mobile_inspector/view.dart b/packages/inspection/lib/presentation/pages/add_mobile_inspector/view.dart similarity index 100% rename from packages/inspection/lib/presentation/add_mobile_inspector/view.dart rename to packages/inspection/lib/presentation/pages/add_mobile_inspector/view.dart diff --git a/packages/inspection/lib/presentation/add_supervision/logic.dart b/packages/inspection/lib/presentation/pages/add_supervision/logic.dart similarity index 100% rename from packages/inspection/lib/presentation/add_supervision/logic.dart rename to packages/inspection/lib/presentation/pages/add_supervision/logic.dart diff --git a/packages/inspection/lib/presentation/add_supervision/view.dart b/packages/inspection/lib/presentation/pages/add_supervision/view.dart similarity index 100% rename from packages/inspection/lib/presentation/add_supervision/view.dart rename to packages/inspection/lib/presentation/pages/add_supervision/view.dart diff --git a/packages/inspection/lib/presentation/display_information/logic.dart b/packages/inspection/lib/presentation/pages/display_information/logic.dart similarity index 100% rename from packages/inspection/lib/presentation/display_information/logic.dart rename to packages/inspection/lib/presentation/pages/display_information/logic.dart diff --git a/packages/inspection/lib/presentation/display_information/view.dart b/packages/inspection/lib/presentation/pages/display_information/view.dart similarity index 100% rename from packages/inspection/lib/presentation/display_information/view.dart rename to packages/inspection/lib/presentation/pages/display_information/view.dart diff --git a/packages/inspection/lib/presentation/filter/logic.dart b/packages/inspection/lib/presentation/pages/filter/logic.dart similarity index 98% rename from packages/inspection/lib/presentation/filter/logic.dart rename to packages/inspection/lib/presentation/pages/filter/logic.dart index 5caf8ed..1cd48a2 100644 --- a/packages/inspection/lib/presentation/filter/logic.dart +++ b/packages/inspection/lib/presentation/pages/filter/logic.dart @@ -1,9 +1,9 @@ import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/data/utils/marker_generator.dart'; -import 'package:rasadyar_inspection/presentation/filter/view.dart'; +import 'package:rasadyar_inspection/presentation/pages/filter/view.dart'; + class InspectorFilterLogic extends GetxController with GetTickerProviderStateMixin { diff --git a/packages/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/pages/filter/view.dart similarity index 95% rename from packages/inspection/lib/presentation/filter/view.dart rename to packages/inspection/lib/presentation/pages/filter/view.dart index 6dad128..a523041 100644 --- a/packages/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/pages/filter/view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; import 'logic.dart'; @@ -440,31 +441,6 @@ Widget markerDetailsWidget() { ), ); } - -Widget customChip({bool isSelected = false, required String title, required int index, required Function(int) onTap}) { - return GestureDetector( - onTap: () { - onTap.call(index); - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: isSelected ? AppColor.blueNormal : AppColor.whiteGreyNormal, - borderRadius: BorderRadius.circular(8), - border: isSelected - ? Border.fromBorderSide(BorderSide.none) - : Border.all(width: 0.25, color: const Color(0xFFB0B0B0)), - ), - child: Text( - title, - textAlign: TextAlign.center, - style: isSelected ? AppFonts.yekan10.copyWith(color: AppColor.whiteLight) : AppFonts.yekan10, - ), - ), - ); -} - Widget selectedLocationWidget({ required bool showHint, required SlidableController sliderController, diff --git a/packages/inspection/lib/presentation/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart similarity index 100% rename from packages/inspection/lib/presentation/inspection_map/logic.dart rename to packages/inspection/lib/presentation/pages/inspection_map/logic.dart diff --git a/packages/inspection/lib/presentation/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart similarity index 74% rename from packages/inspection/lib/presentation/inspection_map/view.dart rename to packages/inspection/lib/presentation/pages/inspection_map/view.dart index 72d174c..9932fe0 100644 --- a/packages/inspection/lib/presentation/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/pages/filter/view.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; -import 'package:rasadyar_inspection/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; import 'package:rasadyar_inspection/presentation/widget/search.dart'; import 'logic.dart'; @@ -118,35 +119,6 @@ class InspectionMapPage extends GetView { return BaseBottomSheet( height: data.value ? 450.h : 150.h, child: ListItemWithOutCounter( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - 'گوشت و مرغ', - style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Assets.vec.scanBarcodeSvg.svg(), - ], - ), secondChild: Column( spacing: 8, children: [ @@ -256,13 +228,7 @@ class InspectionMapPage extends GetView { width: 150.w, height: 40.h, onPressed: () { - buildDeleteDialog( - onConfirm: () async { - // controller.denyAllocation(item.key ?? ''); - //await controller.deleteAllocation(item); - }, - onRefresh: () async {}, - ); + buildDeleteDialog(onConfirm: () async {}, onRefresh: () async {}); }, borderColor: AppColor.bgIcon, child: Row( @@ -293,6 +259,35 @@ class InspectionMapPage extends GetView { labelIconColor: AppColor.bgIcon, onTap: () => data.value = !data.value, selected: data.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), ), ); }, controller.isSelectedDetailsLocation); @@ -428,6 +423,7 @@ Widget filterWidget({required RxInt filterIndex, required RxInt showIndex}) { }, index: 1, ), + customChip( isSelected: data.value == 2, title: 'بازرسی شده ها', @@ -524,225 +520,6 @@ Widget cardWithLabel({ ); } -Widget markerDetailsWidget() { - return Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.all(35), - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - decoration: ShapeDecoration( - color: Colors.white, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Column( - spacing: 15, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 12, - children: [ - Text( - 'داود خرم پور', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover), - ), - Spacer(), - vecWidgetWithOnTap( - child: Assets.vec.mapSvg.svg(), - onTap: () { - Get.toNamed(InspectionRoutes.inspectionLocationDetails); - }, - width: 24, - height: 24, - color: AppColor.blueNormal, - ), - vecWidgetWithOnTap( - child: Assets.vec.messageAddSvg.svg(), - width: 24, - height: 24, - color: AppColor.greenNormal, - onTap: () { - Get.toNamed(InspectionRoutes.inspectionAddSupervision); - }, - ), - - vecWidgetWithOnTap( - child: Assets.vec.securityTimeSvg.svg(), - color: AppColor.warning, - height: 24, - width: 24, - onTap: () {}, - ), - ], - ), - Container( - height: 32, - clipBehavior: Clip.antiAlias, - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'باقی مانده', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - ), - - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'شماره همراه', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '0326598653', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'آخرین فعالیت', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - - Text( - '1409/12/12', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'موجودی', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '5کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - - ...List.generate( - 5, - (index) => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - - children: [ - Text( - 'فروش رفته', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - Text( - '0 کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ], - ), - ), - ], - ), - ); -} - -Widget customChip({ - bool isSelected = false, - required String title, - required int index, - required Function(int) onTap, -}) { - return GestureDetector( - onTap: () { - onTap.call(index); - }, - child: Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.h), - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: AppColor.whiteGreyNormal, - borderRadius: BorderRadius.circular(8), - border: Border.all( - width: 1, - color: isSelected ? AppColor.blueNormal : AppColor.blackLightActive, - ), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - - children: [ - SizedBox( - width: 12.w, - height: 12.h, - child: Transform.scale( - scale: 0.70, - child: Checkbox( - value: isSelected, - side: BorderSide(color: AppColor.whiteDarkHover, width: 1), - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: VisualDensity.compact, - overlayColor: WidgetStateProperty.all(AppColor.blueNormal), - fillColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.selected)) { - return AppColor.blueNormal; - } else { - return AppColor.whiteGreyNormal; - } - }), - - onChanged: (value) { - onTap.call(index); - }, - ), - ), - ), - SizedBox(width: 8.w), - Text( - title, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: isSelected ? AppColor.blueNormal : AppColor.whiteDarkHover, - ), - ), - ], - ), - ), - ); -} Widget selectedLocationWidget({ required bool showHint, diff --git a/packages/inspection/lib/presentation/location_details/logic.dart b/packages/inspection/lib/presentation/pages/location_details/logic.dart similarity index 100% rename from packages/inspection/lib/presentation/location_details/logic.dart rename to packages/inspection/lib/presentation/pages/location_details/logic.dart diff --git a/packages/inspection/lib/presentation/location_details/view.dart b/packages/inspection/lib/presentation/pages/location_details/view.dart similarity index 100% rename from packages/inspection/lib/presentation/location_details/view.dart rename to packages/inspection/lib/presentation/pages/location_details/view.dart diff --git a/packages/inspection/lib/presentation/pages/pages.dart b/packages/inspection/lib/presentation/pages/pages.dart new file mode 100644 index 0000000..35043b5 --- /dev/null +++ b/packages/inspection/lib/presentation/pages/pages.dart @@ -0,0 +1,22 @@ +export 'action/logic.dart'; +export 'action/view.dart'; +export 'add_mobile_inspector/logic.dart'; +export 'add_mobile_inspector/view.dart'; +export 'add_supervision/logic.dart'; +export 'add_supervision/view.dart'; +export 'display_information/logic.dart'; +export 'display_information/view.dart'; +export 'inspection_map/logic.dart'; +export 'inspection_map/view.dart'; +export 'location_details/logic.dart'; +export 'location_details/view.dart'; +export 'profile/logic.dart'; +export 'profile/view.dart'; +export 'records/logic.dart'; +export 'records/view.dart'; +export 'registration_of_violation/logic.dart'; +export 'registration_of_violation/view.dart'; +export 'root/logic.dart'; +export 'root/view.dart'; +export 'statistics/logic.dart'; +export 'statistics/view.dart'; diff --git a/packages/inspection/lib/presentation/profile/logic.dart b/packages/inspection/lib/presentation/pages/profile/logic.dart similarity index 100% rename from packages/inspection/lib/presentation/profile/logic.dart rename to packages/inspection/lib/presentation/pages/profile/logic.dart diff --git a/packages/inspection/lib/presentation/profile/view.dart b/packages/inspection/lib/presentation/pages/profile/view.dart similarity index 100% rename from packages/inspection/lib/presentation/profile/view.dart rename to packages/inspection/lib/presentation/pages/profile/view.dart diff --git a/packages/inspection/lib/presentation/pages/records/logic.dart b/packages/inspection/lib/presentation/pages/records/logic.dart new file mode 100644 index 0000000..a4c1fce --- /dev/null +++ b/packages/inspection/lib/presentation/pages/records/logic.dart @@ -0,0 +1,32 @@ +import 'package:rasadyar_core/core.dart'; + +class RecordsLogic extends GetxController { + Rx>> countList = Resource>.success( + PaginationModel(results: [1, 2, 3, 4, 5, 6], count: 1, next: null, previous: null), + ).obs; + + RxBool isLoadingMore = false.obs; + RxInt currentPage = 1.obs; + RxInt indexExpanded = (-1).obs; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } + + void toggleExpandedList(int index) { + if (indexExpanded.value == index) { + indexExpanded.value = -1; + } else { + indexExpanded.value = index; + } + } + +} diff --git a/packages/inspection/lib/presentation/pages/records/view.dart b/packages/inspection/lib/presentation/pages/records/view.dart new file mode 100644 index 0000000..24c34cf --- /dev/null +++ b/packages/inspection/lib/presentation/pages/records/view.dart @@ -0,0 +1,184 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class RecordsPage extends GetView { + const RecordsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + hasMore: data.value.data?.next != null, + isPaginating: controller.isLoadingMore.value, + onRefresh: () async { + controller.currentPage.value = 1; + //await controller.getAllocatedMade(); + }, + onLoadMore: () async { + controller.currentPage.value++; + iLog(controller.currentPage.value); + // await controller.getAllocatedMade(true); + }, + padding: EdgeInsets.fromLTRB(8, 12, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.value == index, + onTap: () => controller.toggleExpandedList(index), + index: index, + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.calendarSearchOutlineSvg.path, + labelIconColor: AppColor.bgIcon, + secondChild: itemListExpandedWidget(item, index), + child: itemListWidget(item), + ); + }, controller.indexExpanded); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.countList), + floatingActionButton: RFab.add(onPressed: () {}), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + Widget itemListWidget(int item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 3, + children: [ + Text('داود خرم مهری پور', style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), + Text( + '09302545455', + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text('0 کیلوگرم', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover)), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ); + } + + Widget itemListExpandedWidget(int item, int index) { + return Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داوود خرم پور', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ بازرسی', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '1403/12/12', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + + buildRow( + title: 'تلفن خریدار', + value: '0326598653', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow(title: 'آخرین فعالیت', value: '1409/12/12'), + buildRow(title: 'موجودی', value: '5KG'), + buildRow(title: 'فروش رفته', value: '5KG'), + ], + ), + ), + Visibility( + visible: true, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + + onPressed: () { + /* controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ).whenComplete(() { + controller.clearForm(); + });*/ + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.blueDark, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + // controller.isExpandedList.remove(index); + // controller.denyAllocation(item.key ?? ''); + //await controller.deleteAllocation(item); + }, + onRefresh: () async {}, + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ), + ], + ); + } +} diff --git a/packages/inspection/lib/presentation/registration_of_violation/logic.dart b/packages/inspection/lib/presentation/pages/registration_of_violation/logic.dart similarity index 100% rename from packages/inspection/lib/presentation/registration_of_violation/logic.dart rename to packages/inspection/lib/presentation/pages/registration_of_violation/logic.dart diff --git a/packages/inspection/lib/presentation/registration_of_violation/view.dart b/packages/inspection/lib/presentation/pages/registration_of_violation/view.dart similarity index 82% rename from packages/inspection/lib/presentation/registration_of_violation/view.dart rename to packages/inspection/lib/presentation/pages/registration_of_violation/view.dart index 2efa87f..371d368 100644 --- a/packages/inspection/lib/presentation/registration_of_violation/view.dart +++ b/packages/inspection/lib/presentation/pages/registration_of_violation/view.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'logic.dart'; -class RegistrationOfViolationPage - extends GetView { +class RegistrationOfViolationPage extends GetView { const RegistrationOfViolationPage({super.key}); @override @@ -15,17 +13,12 @@ class RegistrationOfViolationPage backgroundColor: AppColor.bgLight, appBar: RAppBar( title: 'ثبت تخلف', - leading: Assets.vec.messageAddSvg.svg( + leading: Assets.vec.messageAddSvg.svg( width: 16, height: 16, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), ), - additionalActions: [ - RFab.smallAdd(onPressed: () => controller.countViolation.value++), - ], + additionalActions: [RFab.smallAdd(onPressed: () => controller.countViolation.value++)], ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), @@ -34,7 +27,7 @@ class RegistrationOfViolationPage Expanded( child: ObxValue((data) { return ListView.separated( - itemBuilder: (context, index) => violationWidget(), + itemBuilder: (context, index) => violationWidget22(), separatorBuilder: (context, index) => SizedBox(height: 15), itemCount: data.value, ); @@ -61,7 +54,7 @@ class RegistrationOfViolationPage } } -Container violationWidget() { +Container violationWidget22() { return Container( padding: EdgeInsets.symmetric(horizontal: 8, vertical: 12), decoration: BoxDecoration( @@ -71,13 +64,13 @@ Container violationWidget() { child: Column( spacing: 16, children: [ - RTextField( + RTextField( controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( controller: TextEditingController(), label: 'توضیحات تخلف', filled: true, @@ -85,19 +78,19 @@ Container violationWidget() { maxLines: 3, minLines: 3, ), - RTextField( + RTextField( controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( controller: TextEditingController(), label: 'عنوان تخلف', filled: true, filledColor: AppColor.whiteLight, ), - RTextField( + RTextField( controller: TextEditingController(), label: 'توضیحات تخلف', filled: true, @@ -111,7 +104,9 @@ Container violationWidget() { child: Row( spacing: 16, children: [ - Expanded(child: RElevated(text: 'ثبت', onPressed: () {})), + Expanded( + child: RElevated(text: 'ثبت', onPressed: () {}), + ), Expanded( child: ROutlinedElevated(text: 'انصراف', onPressed: () {}), ), diff --git a/packages/inspection/lib/presentation/root/logic.dart b/packages/inspection/lib/presentation/pages/root/logic.dart similarity index 87% rename from packages/inspection/lib/presentation/root/logic.dart rename to packages/inspection/lib/presentation/pages/root/logic.dart index 26c3d93..3e2df1e 100644 --- a/packages/inspection/lib/presentation/root/logic.dart +++ b/packages/inspection/lib/presentation/pages/root/logic.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart' ; -import 'package:rasadyar_inspection/presentation/action/view.dart'; -import 'package:rasadyar_inspection/presentation/filter/view.dart'; -import 'package:rasadyar_inspection/presentation/inspection_map/view.dart'; -import 'package:rasadyar_inspection/presentation/profile/view.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/pages/action/view.dart'; +import 'package:rasadyar_inspection/presentation/pages/inspection_map/view.dart'; +import 'package:rasadyar_inspection/presentation/pages/profile/view.dart'; + enum ErrorLocationType { serviceDisabled, permissionDenied, none } @@ -37,19 +37,16 @@ class RootLogic extends GetxController { requestResult != LocationPermission.deniedForever; case LocationPermission.deniedForever: - return request ? await Geolocator.openAppSettings() : false; case LocationPermission.always: case LocationPermission.whileInUse: - return true; default: return false; } } catch (e) { - eLog(e); return await Geolocator.openLocationSettings(); } diff --git a/packages/inspection/lib/presentation/root/view.dart b/packages/inspection/lib/presentation/pages/root/view.dart similarity index 100% rename from packages/inspection/lib/presentation/root/view.dart rename to packages/inspection/lib/presentation/pages/root/view.dart diff --git a/packages/inspection/lib/presentation/pages/statistics/logic.dart b/packages/inspection/lib/presentation/pages/statistics/logic.dart new file mode 100644 index 0000000..256523a --- /dev/null +++ b/packages/inspection/lib/presentation/pages/statistics/logic.dart @@ -0,0 +1,63 @@ +import 'package:rasadyar_core/core.dart'; + +class StatisticsLogic extends GetxController { + List transactionFilters = ['همه', 'دارای تراکنش', 'بدون تراکنش']; + RxList transactionFiltersSelected = RxList(); + RxList iranProvinces = [ + 'آذربایجان شرقی', + 'آذربایجان غربی', + 'اردبیل', + 'اصفهان', + 'البرز', + 'ایلام', + 'بوشهر', + 'تهران', + 'چهارمحال و بختیاری', + 'خراسان جنوبی', + 'خراسان رضوی', + 'خراسان شمالی', + 'خوزستان', + 'زنجان', + 'سمنان', + 'سیستان و بلوچستان', + 'فارس', + 'قزوین', + 'قم', + 'کردستان', + 'کرمان', + 'کرمانشاه', + 'کهگیلویه و بویراحمد', + 'گلستان', + 'گیلان', + 'لرستان', + 'مازندران', + 'مرکزی', + 'هرمزگان', + 'همدان', + 'یزد', + ].obs; + RxnString iranProvincesSelected = RxnString(); + RxInt s1 =2536524448.obs; + RxInt s2 =2536524448.obs; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } + + void onTransactionFilterSelected(int index) { + if (transactionFiltersSelected.contains(index)) { + transactionFiltersSelected.remove(index); + } else { + transactionFiltersSelected.add(index); + } + update(); + } +} diff --git a/packages/inspection/lib/presentation/pages/statistics/view.dart b/packages/inspection/lib/presentation/pages/statistics/view.dart new file mode 100644 index 0000000..e369e6f --- /dev/null +++ b/packages/inspection/lib/presentation/pages/statistics/view.dart @@ -0,0 +1,324 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; + +import 'logic.dart'; + +class StatisticsPage extends GetView { + const StatisticsPage({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 10, + children: [ + Expanded( + child: Container( + height: 32.h, + decoration: BoxDecoration( + border: Border.all(color: AppColor.blueNormal, width: 1), + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.symmetric(horizontal: 11.w, vertical: 4.h), + child: Row( + children: [ + Assets.vec.calendarSvg.svg( + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + SizedBox(width: 4.w), + Text('از', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + SizedBox(width: 22.w), + + Text( + '1404/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + ), + ], + ), + ), + ), + Expanded( + child: Container( + height: 32.h, + decoration: BoxDecoration( + border: Border.all(color: AppColor.blueNormal, width: 1), + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.symmetric(horizontal: 11.w, vertical: 4.h), + child: Row( + children: [ + Assets.vec.calendarSvg.svg( + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + SizedBox(width: 4.w), + Text('تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + SizedBox(width: 22.w), + + Text( + '1404/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + ), + ], + ), + ), + ), + ], + ), + ), + + SizedBox(height: 16.h), + + Container( + height: 80.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.lightGreyNormalHover, width: 1), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8, + children: [ + Row( + children: [ + Text( + 'فیلتر تراکنش ها', + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + Expanded( + child: ListView.separated( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) => ObxValue((selectedIndex) { + return customChip( + title: controller.transactionFilters[index], + isSelected: selectedIndex.contains(index), + index: index, + onTap: (data) => controller.onTransactionFilterSelected(data), + ); + }, controller.transactionFiltersSelected), + separatorBuilder: (context, index) => SizedBox(width: 8), + itemCount: controller.transactionFilters.length, + ), + ), + ], + ), + ), + ), + SizedBox(height: 8.h), + Container( + height: 80.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.lightGreyNormalHover, width: 1), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8, + children: [ + Row( + children: [ + Text( + 'فیلتر شهرستان', + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + Expanded(child: _provinceDropdownWidget()), + ], + ), + ), + ), + SizedBox(height: 8.h), + Container( + height: 152.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.lightGreyNormalHover, width: 1), + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: ObxValue( + (data) => _informationLabelCard( + title: 'تعداد تراکنش ها', + titleColor: AppColor.blueNormal, + isLoading: data.value == null, + description: 25369654.separatedByComma, + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: AppColor.blueNormal, + bgDescriptionColor: Colors.white, + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [AppColor.blueLight, Colors.white], + ), + ), + controller.s1, + ), + ), + + Expanded( + child: ObxValue((data) { + return _informationLabelCard( + title: 'جمع تراکنش ها', + isLoading: data.value == null, + description: data.value.separatedByComma ?? '0', + unit: 'ريال', + iconPath: Assets.vec.cubeWattingSvg.path, + bgDescriptionColor: Colors.white, + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [const Color(0xFFFFE7BB), Colors.white], + ), + ); + }, controller.s2), + ), + ], + ), + ), + ), + ], + ), + ); + } + + Widget _provinceDropdownWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: data, + onChanged: (value) { + controller.iranProvincesSelected.value = value; + controller.iranProvincesSelected.refresh(); + }, + selectedItem: controller.iranProvincesSelected.value, + itemBuilder: (item) => Text( + item ?? 'بدون نام', + style: AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarker), + ), + labelBuilder: (item) => + Text('انتخاب استان', style: AppFonts.yekan14.copyWith(color: AppColor.textColorLight)), + ); + }, controller.iranProvinces); + } + + Container _informationLabelCard({ + required String title, + required String description, + required String iconPath, + required Color bgDescriptionColor, + String? unit, + bool isLoading = false, + Color? iconColor, + Color? titleColor, + Color? bgLabelColor, + LinearGradient? gradient, + }) { + return Container( + height: 82.h, + margin: EdgeInsets.symmetric(horizontal: 12.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.lightGreyNormalHover, width: 1), + ), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + // Left side with icon and title + Expanded( + flex: 2, + child: Container( + height: 82.h, + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: gradient == null ? bgLabelColor : null, + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), + gradient: gradient, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: iconColor != null + ? ColorFilter.mode(iconColor, BlendMode.srcIn) + : null, + ), + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan10.copyWith( + color: titleColor ?? AppColor.mediumGreyDarkActive, + ), + ), + ], + ), + ), + ), + // Right side with description and unit + Expanded( + flex: 3, + child: Container( + decoration: BoxDecoration( + color: bgDescriptionColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), + ), + child: isLoading + ? Center(child: CupertinoActivityIndicator()) + : Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Visibility( + visible: unit != null, + child: Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/packages/inspection/lib/presentation/pages/users/logic.dart b/packages/inspection/lib/presentation/pages/users/logic.dart new file mode 100644 index 0000000..d7490ba --- /dev/null +++ b/packages/inspection/lib/presentation/pages/users/logic.dart @@ -0,0 +1,33 @@ +import 'package:rasadyar_core/core.dart'; + +class UsersLogic extends GetxController { + Rx>> countList = Resource>.success( + PaginationModel(results: [1, 2, 3, 4, 5, 6], count: 1, next: null, previous: null), + ).obs; + + RxBool isLoadingMore = false.obs; + RxInt currentPage = 1.obs; + RxInt indexExpanded = (-1).obs; + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } + + + + void toggleExpandedList(int index) { + if (indexExpanded.value == index) { + indexExpanded.value = -1; + } else { + indexExpanded.value = index; + } + } +} diff --git a/packages/inspection/lib/presentation/pages/users/view.dart b/packages/inspection/lib/presentation/pages/users/view.dart new file mode 100644 index 0000000..3ac9419 --- /dev/null +++ b/packages/inspection/lib/presentation/pages/users/view.dart @@ -0,0 +1,190 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class UsersPage extends GetView { + const UsersPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + hasMore: data.value.data?.next != null, + isPaginating: controller.isLoadingMore.value, + onRefresh: () async { + controller.currentPage.value = 1; + //await controller.getAllocatedMade(); + }, + onLoadMore: () async { + controller.currentPage.value++; + iLog(controller.currentPage.value); + // await controller.getAllocatedMade(true); + }, + padding: EdgeInsets.fromLTRB(8, 12, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.value == index, + onTap: () => controller.toggleExpandedList(index), + index: index, + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.profile2OutlineSvg.path, + labelIconColor: AppColor.bgIcon, + secondChild: itemListExpandedWidget(item, index), + child: itemListWidget(item), + ); + }, controller.indexExpanded); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.countList), + floatingActionButton: RFab.add(onPressed: () {}), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + Widget itemListWidget(int item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 3, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + Text( + '09302545455', + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ); + } + + Widget itemListExpandedWidget(int item, int index) { + return Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داوود خرم پور', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ بازرسی', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '1403/12/12', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + + buildRow( + title: 'تلفن خریدار', + value: '0326598653', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow(title: 'آخرین فعالیت', value: '1409/12/12'), + buildRow(title: 'موجودی', value: '5KG'), + buildRow(title: 'فروش رفته', value: '5KG'), + ], + ), + ), + Visibility( + visible:true, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + + onPressed: () { + /* controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ).whenComplete(() { + controller.clearForm(); + });*/ + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.blueDark, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + // controller.isExpandedList.remove(index); + // controller.denyAllocation(item.key ?? ''); + //await controller.deleteAllocation(item); + }, + onRefresh: () async{} + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ), + ], + ); + } +} diff --git a/packages/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart index 816ae56..5492bfe 100644 --- a/packages/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -1,22 +1,7 @@ -import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/presentation/action/logic.dart'; -import 'package:rasadyar_inspection/presentation/add_mobile_inspector/logic.dart'; -import 'package:rasadyar_inspection/presentation/add_mobile_inspector/view.dart'; -import 'package:rasadyar_inspection/presentation/add_supervision/logic.dart'; -import 'package:rasadyar_inspection/presentation/add_supervision/view.dart'; -import 'package:rasadyar_inspection/presentation/display_information/logic.dart'; -import 'package:rasadyar_inspection/presentation/display_information/view.dart'; -import 'package:rasadyar_inspection/presentation/filter/logic.dart'; -import 'package:rasadyar_inspection/presentation/inspection_map/logic.dart'; -import 'package:rasadyar_inspection/presentation/location_details/logic.dart'; -import 'package:rasadyar_inspection/presentation/location_details/view.dart'; -import 'package:rasadyar_inspection/presentation/profile/logic.dart'; -import 'package:rasadyar_inspection/presentation/profile/view.dart'; -import 'package:rasadyar_inspection/presentation/registration_of_violation/logic.dart'; -import 'package:rasadyar_inspection/presentation/registration_of_violation/view.dart'; -import 'package:rasadyar_inspection/presentation/root/logic.dart'; -import 'package:rasadyar_inspection/presentation/root/view.dart'; +import 'package:rasadyar_inspection/presentation/pages/filter/logic.dart'; +import 'package:rasadyar_inspection/presentation/pages/pages.dart'; +import 'package:rasadyar_inspection/presentation/pages/users/logic.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; @@ -29,10 +14,13 @@ sealed class InspectionPages { page: () => RootPage(), binding: BindingsBuilder(() { - Get.put(RootLogic()); - Get.put(InspectorFilterLogic()); - Get.lazyPut(()=>InspectionMapLogic()); - Get.lazyPut(()=>BaseLogic()); + Get.lazyPut(() =>RootLogic()); + Get.lazyPut(() =>InspectorFilterLogic()); + Get.lazyPut(() => InspectionMapLogic()); + Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => UsersLogic()); + Get.lazyPut(() => RecordsLogic()); + Get.lazyPut(() => StatisticsLogic()); Get.lazyPut(() => LocationDetailsLogic(), fenix: true); Get.lazyPut(() => ActionLogic(), fenix: true); Get.lazyPut(() => ProfileLogic(), fenix: true); diff --git a/packages/inspection/lib/presentation/widget/custom_chips.dart b/packages/inspection/lib/presentation/widget/custom_chips.dart new file mode 100644 index 0000000..07e4a4b --- /dev/null +++ b/packages/inspection/lib/presentation/widget/custom_chips.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +Widget customChip({ + bool isSelected = false, + required String title, + required int index, + required Function(int) onTap, +}) { + return GestureDetector( + onTap: () { + onTap.call(index); + }, + child: Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.h), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: AppColor.whiteGreyNormal, + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 1, + color: isSelected ? AppColor.blueNormal : AppColor.blackLightActive, + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + SizedBox( + width: 12.w, + height: 12.h, + child: Transform.scale( + scale: 0.70, + child: Checkbox( + value: isSelected, + side: BorderSide(color: AppColor.whiteDarkHover, width: 1), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + visualDensity: VisualDensity.compact, + overlayColor: WidgetStateProperty.all(AppColor.blueNormal), + fillColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return AppColor.blueNormal; + } else { + return AppColor.whiteGreyNormal; + } + }), + + onChanged: (value) { + onTap.call(index); + }, + ), + ), + ), + SizedBox(width: 8.w), + Text( + title, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: isSelected ? AppColor.blueNormal : AppColor.whiteDarkHover, + ), + ), + ], + ), + ), + ); +} diff --git a/packages/inspection/lib/presentation/widget/list_item/list_item.dart b/packages/inspection/lib/presentation/widget/list_item/list_item.dart deleted file mode 100644 index 3b48ae2..0000000 --- a/packages/inspection/lib/presentation/widget/list_item/list_item.dart +++ /dev/null @@ -1,343 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -class ListItem extends StatelessWidget { - const ListItem({ - super.key, - required this.index, - required this.child, - required this.secondChild, - required this.labelColor, - required this.labelIcon, - required this.onTap, - required this.selected, - this.labelIconColor = AppColor.mediumGreyDarkHover, - }); - - final int index; - final Widget child; - final Widget secondChild; - final Color labelColor; - final String labelIcon; - final Color? labelIconColor; - final VoidCallback onTap; - final bool selected; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - decoration: BoxDecoration( - color: labelColor, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), - ), - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - AnimatedSize( - duration: Duration(milliseconds: 300), - child: Container( - width: Get.width - 30, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - ), - child: Row( - children: [ - Expanded( - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Container( - height: 75, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - bottomLeft: Radius.zero, - bottomRight: Radius.circular(8), - topLeft: Radius.zero, - topRight: Radius.circular(8), - ), - ), - clipBehavior: Clip.antiAlias, - child: child, - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: secondChild, - ), - crossFadeState: selected - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - ), - Container( - width: 20, - child: Center( - child: SvgGenImage.vec(labelIcon).svg( - width: 16.w, - height: 16.h, - colorFilter: ColorFilter.mode(labelColor, BlendMode.srcIn), - ), - ), - ), - ], - ), - ), - ), - - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), - ), - alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), - ), - ), - ], - ), - ), - ), - ); - } -} - -class ListItemWithOutCounter extends StatelessWidget { - const ListItemWithOutCounter({ - super.key, - required this.child, - required this.secondChild, - required this.labelColor, - required this.labelIcon, - required this.onTap, - required this.selected, - this.labelIconColor = AppColor.mediumGreyDarkHover, - }); - - final Widget child; - final Widget secondChild; - final Color labelColor; - final String labelIcon; - final Color? labelIconColor; - final VoidCallback onTap; - final bool selected; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - decoration: BoxDecoration( - color: labelColor, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), - ), - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: AnimatedSize( - duration: Duration(milliseconds: 300), - child: Container( - width: Get.width - 30, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - ), - child: Row( - children: [ - Expanded( - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Container( - height: 75, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - bottomLeft: Radius.zero, - bottomRight: Radius.circular(8), - topLeft: Radius.zero, - topRight: Radius.circular(8), - ), - ), - clipBehavior: Clip.antiAlias, - child: child, - ), - secondChild: Container( - padding: EdgeInsets.all(8), - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: secondChild, - ), - crossFadeState: selected - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - ), - Visibility( - visible: selected==false, - child: Container( - width: 20, - child: Center( - child: SvgGenImage.vec(labelIcon).svg( - width: 16.w, - height: 16.h, - colorFilter: ColorFilter.mode(labelColor, BlendMode.srcIn), - ), - ), - ), - ), - ], - ), - ), - ), - ), - ), - ); - } -} - -class ListItem2 extends StatelessWidget { - const ListItem2({ - super.key, - required this.index, - required this.child, - required this.secondChild, - required this.labelColor, - required this.labelIcon, - required this.onTap, - required this.selected, - this.labelIconColor = AppColor.mediumGreyDarkHover, - }); - - final int index; - final Widget child; - final Widget secondChild; - final Color labelColor; - final String labelIcon; - final Color? labelIconColor; - final VoidCallback onTap; - final bool selected; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - decoration: BoxDecoration( - color: labelColor, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), - ), - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - AnimatedCrossFade( - firstChild: Row( - children: [ - Expanded( - child: Container( - height: 75, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - bottomLeft: Radius.zero, - bottomRight: Radius.circular(8), - topLeft: Radius.zero, - topRight: Radius.circular(8), - ), - ), - clipBehavior: Clip.antiAlias, - child: child, - ), - ), - Container( - width: 20, - child: Center( - child: SvgGenImage.vec(labelIcon).svg( - width: 16.w, - height: 16.h, - //TODO - colorFilter: ColorFilter.mode( - labelIconColor ?? AppColor.mediumGreyDarkActive, - BlendMode.srcIn, - ), - ), - ), - ), - ], - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 8, 12, 12), - clipBehavior: Clip.antiAlias, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: secondChild, - ), - crossFadeState: selected ? CrossFadeState.showSecond : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), - ), - alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/tools/vecGeneratoe.sh b/tools/vecGeneratoe.sh index 178436a..0240a5d 100644 --- a/tools/vecGeneratoe.sh +++ b/tools/vecGeneratoe.sh @@ -74,3 +74,7 @@ find "$sourcePath" -type f | xargs -P 10 -I {} bash -c ' ' git add . + +cd ../ + +dart run build_runner build --delete-conflicting-outputs From d192419ac8286daeff9b354fb9aaf4d652e081c0 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 27 Jul 2025 09:26:48 +0330 Subject: [PATCH 241/256] feat : statistics page --- assets/icons/cube_card.svg | 6 + assets/icons/excel_download.svg | 28 ++-- assets/icons/pdf_download.svg | 25 +-- assets/vec/cube_card.svg.vec | Bin 0 -> 977 bytes assets/vec/excel_download.svg.vec | Bin 9183 -> 1297 bytes assets/vec/pdf_download.svg.vec | Bin 7647 -> 1940 bytes .../lib/presentation/common/assets.gen.dart | 8 + .../presentation/pages/statistics/view.dart | 142 ++++++++++++------ 8 files changed, 138 insertions(+), 71 deletions(-) create mode 100644 assets/icons/cube_card.svg create mode 100644 assets/vec/cube_card.svg.vec diff --git a/assets/icons/cube_card.svg b/assets/icons/cube_card.svg new file mode 100644 index 0000000..d20d965 --- /dev/null +++ b/assets/icons/cube_card.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/excel_download.svg b/assets/icons/excel_download.svg index a1c7e4b..b2597c5 100644 --- a/assets/icons/excel_download.svg +++ b/assets/icons/excel_download.svg @@ -1,12 +1,18 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/assets/icons/pdf_download.svg b/assets/icons/pdf_download.svg index bb80401..fb17107 100644 --- a/assets/icons/pdf_download.svg +++ b/assets/icons/pdf_download.svg @@ -1,12 +1,15 @@ - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/assets/vec/cube_card.svg.vec b/assets/vec/cube_card.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..786a6e3e78b2d57eff69ffbc474fbb8d44a890b6 GIT binary patch literal 977 zcmZvbPiPZS5XRrzJxI4gFTqQ~RxgqSTBPf#Sa_cY?aA2a$+Ut><3XW{f?5OhPg~-t z6fd=UvIRkiQ79Tk8rq;iXh9IHJvGJNBHDxYy1tpss0ZJ&d~bH>+pqP(~8wU`&LaiVpY;QsL20<0n=VojX)K_@pTC3eO zfOaBRwc~c%Q09<2IVbnXz0ybe3WsnBr*O+0GMCILbBhn+i})nIiI3u|_$<6}?I^D` z4-e$-r%3g0<}vQy18JjFWz8+Wv%a1}Zux`tBV+S*WGmfh^Qt(M|854FZT|E z6k+a(DUCj2ZS$sCUyf&3HyVeLYc83MMlYJBHIwmS`<%u=^R~VJ97ZnP<-SYFNmk;C zEBC*=`#NthFDdbo67OW?4)dl{MdodvpJCpI`32jj4AFFI5yYELy$A7<5-%z7k`nKU riK^9Jlw)r|ywg*+nD=D1z`WF#c!lSHPi}^xuND2Ez7vW4FKzT20}oTi literal 0 HcmV?d00001 diff --git a/assets/vec/excel_download.svg.vec b/assets/vec/excel_download.svg.vec index 623671dcb4c7de7db1ad5b8dd70a6f7b3937b50f..9d5ec2e1abe24c478d4956d74151baa6113c3c36 100644 GIT binary patch literal 1297 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 const SvgGenImage('assets/icons/cube_bottom_rotation.svg'); + /// File path: assets/icons/cube_card.svg + SvgGenImage get cubeCard => const SvgGenImage('assets/icons/cube_card.svg'); + /// File path: assets/icons/cube_rotate.svg SvgGenImage get cubeRotate => const SvgGenImage('assets/icons/cube_rotate.svg'); @@ -293,6 +296,7 @@ class $AssetsIconsGen { cow, cube, cubeBottomRotation, + cubeCard, cubeRotate, cubeScan, cubeSearch, @@ -453,6 +457,9 @@ class $AssetsVecGen { /// File path: assets/vec/cube_bottom_rotation.svg.vec SvgGenImage get cubeBottomRotationSvg => const SvgGenImage.vec('assets/vec/cube_bottom_rotation.svg.vec'); + /// File path: assets/vec/cube_card.svg.vec + SvgGenImage get cubeCardSvg => const SvgGenImage.vec('assets/vec/cube_card.svg.vec'); + /// File path: assets/vec/cube_rotate.svg.vec SvgGenImage get cubeRotateSvg => const SvgGenImage.vec('assets/vec/cube_rotate.svg.vec'); @@ -646,6 +653,7 @@ class $AssetsVecGen { cowSvg, cubeSvg, cubeBottomRotationSvg, + cubeCardSvg, cubeRotateSvg, cubeScanSvg, cubeSearchSvg, diff --git a/packages/inspection/lib/presentation/pages/statistics/view.dart b/packages/inspection/lib/presentation/pages/statistics/view.dart index e369e6f..4d05d6e 100644 --- a/packages/inspection/lib/presentation/pages/statistics/view.dart +++ b/packages/inspection/lib/presentation/pages/statistics/view.dart @@ -150,57 +150,102 @@ class StatisticsPage extends GetView { ), SizedBox(height: 8.h), Container( - height: 152.h, + decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), border: Border.all(color: AppColor.lightGreyNormalHover, width: 1), ), - child: Padding( - padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), - child: Row( - spacing: 8, - children: [ - Expanded( - child: ObxValue( - (data) => _informationLabelCard( - title: 'تعداد تراکنش ها', - titleColor: AppColor.blueNormal, - isLoading: data.value == null, - description: 25369654.separatedByComma, - iconPath: Assets.vec.cubeSearchSvg.path, - iconColor: AppColor.blueNormal, - bgDescriptionColor: Colors.white, - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [AppColor.blueLight, Colors.white], + padding: EdgeInsets.all(8), + child: Column( + spacing: 8, + children: [ + Row( + spacing: 8, + children: [ + Expanded( + child: ObxValue( + (data) => _informationLabelCard( + title: 'تعداد تراکنش ها', + titleColor: AppColor.blueNormal, + isLoading: data.value == null, + description: 25369654.separatedByComma, + iconPath: Assets.vec.cubeScanSvg.path, + bgDescriptionColor: Colors.white, + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [AppColor.blueLight, Colors.white], + ), ), + controller.s1, ), - controller.s1, ), - ), - Expanded( - child: ObxValue((data) { - return _informationLabelCard( - title: 'جمع تراکنش ها', - isLoading: data.value == null, - description: data.value.separatedByComma ?? '0', - unit: 'ريال', - iconPath: Assets.vec.cubeWattingSvg.path, - bgDescriptionColor: Colors.white, - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [const Color(0xFFFFE7BB), Colors.white], - ), - ); - }, controller.s2), - ), - ], - ), + Expanded( + child: ObxValue((data) { + return _informationLabelCard( + title: 'جمع تراکنش ها', + isLoading: data.value == null, + description: data.value.separatedByComma ?? '0', + unit: 'ريال', + iconPath: Assets.vec.cubeCardSvg.path, + bgDescriptionColor: Colors.white, + titleColor: AppColor.greenDarkHover, + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [AppColor.greenLightHover, Colors.white], + ), + ); + }, controller.s2), + ), + ], + ), + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + width: 160.w, + height: 40.h, + backgroundColor: AppColor.greenNormal, + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Assets.vec.excelDownloadSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + SizedBox(width: 4.w), + Text('EXCEL', style: AppFonts.yekan14.copyWith(color: Colors.white)), + ], + ), + ), + ROutlinedElevated( + width: 160.w, + height: 40.h, + borderColor: AppColor.error, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Assets.vec.pdfDownloadSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: const ColorFilter.mode(AppColor.error, BlendMode.srcIn), + ), + SizedBox(width: 4.w), + Text('PDF', style: AppFonts.yekan14.copyWith(color: AppColor.error)), + ], + ), + ), + ], + ), + ], ), ), + SizedBox(height: 8.h), ], ), ); @@ -239,7 +284,6 @@ class StatisticsPage extends GetView { }) { return Container( height: 82.h, - margin: EdgeInsets.symmetric(horizontal: 12.w), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), border: Border.all(color: AppColor.lightGreyNormalHover, width: 1), @@ -249,10 +293,10 @@ class StatisticsPage extends GetView { children: [ // Left side with icon and title Expanded( - flex: 2, + flex: 91, child: Container( height: 82.h, - padding: EdgeInsets.all(8), + padding: EdgeInsets.all(4), decoration: BoxDecoration( color: gradient == null ? bgLabelColor : null, borderRadius: BorderRadius.only( @@ -263,7 +307,7 @@ class StatisticsPage extends GetView { ), child: Column( mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, + spacing: 8, children: [ SvgGenImage.vec(iconPath).svg( width: 24, @@ -285,7 +329,7 @@ class StatisticsPage extends GetView { ), // Right side with description and unit Expanded( - flex: 3, + flex: 109, child: Container( decoration: BoxDecoration( color: bgDescriptionColor, @@ -302,13 +346,13 @@ class StatisticsPage extends GetView { children: [ Text( description, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), ), Visibility( visible: unit != null, child: Text( - unit, + unit ?? '', textAlign: TextAlign.center, style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), ), From 94513867f601cf9691fe7fe2c192c6871bb58cf9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 27 Jul 2025 15:13:37 +0330 Subject: [PATCH 242/256] chore : delete auth package because each project has different auth , must be separated auth logic --- lib/infrastructure/di/di.dart | 3 +- lib/infrastructure/service/auth_service.dart | 33 ----- .../service/token_storage_service.dart | 0 lib/main.dart | 9 +- .../presentation/pages/modules/logic.dart | 3 +- .../presentation/pages/modules/view.dart | 17 ++- lib/presentation/pages/splash/logic.dart | 6 +- lib/presentation/routes/app_pages.dart | 7 +- lib/presentation/routes/app_paths.dart | 1 + .../routes/auth_route_resolver_impl.dart | 24 ++++ packages/auth/.gitignore | 31 ---- packages/auth/.metadata | 10 -- packages/auth/CHANGELOG.md | 3 - packages/auth/LICENSE | 1 - packages/auth/README.md | 39 ----- packages/auth/analysis_options.yaml | 4 - packages/auth/build.yaml | 6 - packages/auth/lib/auth.dart | 8 -- packages/auth/lib/data/common/constant.dart | 14 -- .../lib/data/common/dio_error_handler.dart | 58 -------- .../auth/lib/data/common/dio_manager.dart | 50 ------- packages/auth/lib/data/di/auth_di.dart | 62 -------- .../data/repositories/auth_repository.dart | 21 --- .../lib/data/services/auth_middelware.dart | 21 --- .../auth/lib/presentation/routes/pages.dart | 32 ----- .../auth/lib/presentation/routes/paths.dart | 8 -- packages/auth/pubspec.yaml | 35 ----- .../chicken/lib/data/common/dio_manager.dart | 33 ----- packages/chicken/lib/data/di/chicken_di.dart | 6 +- .../pages/buy_in_province_all/logic.dart | 1 - .../pages/buy_in_province_waiting/logic.dart | 1 - .../pages/buy_out_of_province/logic.dart | 2 +- .../lib/presentation/pages/home/logic.dart | 2 +- .../lib/presentation/pages/profile/logic.dart | 2 +- .../lib/presentation/pages/profile/view.dart | 5 +- .../lib/presentation/pages/root/logic.dart | 2 - .../lib/presentation/pages/sale/logic.dart | 2 +- .../pages/sales_in_province/logic.dart | 2 +- .../pages/sales_out_of_province/logic.dart | 2 +- .../sales_out_of_province_buyers/logic.dart | 2 +- .../logic.dart | 2 +- .../pages/segmentation/logic.dart | 2 +- .../lib/presentation/routes/pages.dart | 1 - .../lib/presentation/routes/routes.dart | 1 + .../chicken/lib/presentation/utils/utils.dart | 12 +- packages/chicken/pubspec.yaml | 3 +- packages/core/lib/core.dart | 6 +- .../model}/local/module/module_model.dart | 2 +- .../local/module/module_model.freezed.dart | 133 +++++++++++++++++- .../local/user_local/user_local_model.dart | 0 .../local/user_local/user_local_model.g.dart | 0 packages/core/lib/data/model/model.dart | 3 + .../pagination_model.freezed.dart | 133 +++++++++++++++++- .../login_request/login_request_model.dart | 0 .../login_request_model.freezed.dart | 133 +++++++++++++++++- .../login_request/login_request_model.g.dart | 8 +- .../response/auth/auth_response_model.dart | 0 .../auth/auth_response_model.freezed.dart | 133 +++++++++++++++++- .../response/auth/auth_response_model.g.dart | 4 +- .../captcha/captcha_response_model.dart | 0 .../captcha_response_model.freezed.dart | 133 +++++++++++++++++- .../captcha/captcha_response_model.g.dart | 16 +-- .../response/user_info/user_info_model.dart | 0 .../user_info/user_info_model.freezed.dart | 133 +++++++++++++++++- .../response/user_info/user_info_model.g.dart | 8 +- .../user_profile_model.dart | 0 .../user_profile_model.freezed.dart | 133 +++++++++++++++++- .../user_profile_model.g.dart | 24 ++-- .../lib/data/services/auth_middelware.dart | 23 +++ packages/core/lib/data/services/services.dart | 2 + .../data/services/token_storage_service.dart | 4 +- .../{auth => core}/lib/hive_registrar.g.dart | 2 +- packages/core/lib/injection/di.dart | 9 +- .../core/lib/routing/auth_route_resolver.dart | 6 + packages/core/lib/utils/network/network.dart | 3 +- .../lib/utils/network}/safe_call.dart | 0 .../data/repositories/auth_repository.dart | 18 +++ .../repositories/auth_repository_imp.dart | 21 +-- .../lib/presentation/pages/auth/logic.dart | 35 ++--- .../lib/presentation/pages/auth/view.dart | 13 +- .../lib/presentation/routes/app_pages.dart | 13 +- .../lib/presentation/routes/app_routes.dart | 8 +- .../presentation/widget/captcha/logic.dart | 10 +- .../lib/presentation/widget/captcha/view.dart | 4 +- .../lib/presentation/widget/clear_button.dart | 0 .../lib/presentation/widget/logo_widget.dart | 0 packages/inspection/pubspec.lock | 7 - packages/inspection/pubspec.yaml | 2 - .../lib/presentation/routes/app_pages.dart | 1 - .../lib/presentation/routes/app_routes.dart | 1 + packages/livestock/pubspec.yaml | 3 +- pubspec.lock | 37 ++--- pubspec.yaml | 5 - 93 files changed, 1140 insertions(+), 678 deletions(-) delete mode 100644 lib/infrastructure/service/auth_service.dart create mode 100644 lib/infrastructure/service/token_storage_service.dart rename {packages/auth/lib => lib}/presentation/pages/modules/logic.dart (78%) rename {packages/auth/lib => lib}/presentation/pages/modules/view.dart (68%) create mode 100644 lib/presentation/routes/auth_route_resolver_impl.dart delete mode 100644 packages/auth/.gitignore delete mode 100644 packages/auth/.metadata delete mode 100644 packages/auth/CHANGELOG.md delete mode 100644 packages/auth/LICENSE delete mode 100644 packages/auth/README.md delete mode 100644 packages/auth/analysis_options.yaml delete mode 100644 packages/auth/build.yaml delete mode 100644 packages/auth/lib/auth.dart delete mode 100644 packages/auth/lib/data/common/constant.dart delete mode 100644 packages/auth/lib/data/common/dio_error_handler.dart delete mode 100644 packages/auth/lib/data/common/dio_manager.dart delete mode 100644 packages/auth/lib/data/di/auth_di.dart delete mode 100644 packages/auth/lib/data/repositories/auth_repository.dart delete mode 100644 packages/auth/lib/data/services/auth_middelware.dart delete mode 100644 packages/auth/lib/presentation/routes/pages.dart delete mode 100644 packages/auth/lib/presentation/routes/paths.dart delete mode 100644 packages/auth/pubspec.yaml delete mode 100644 packages/chicken/lib/data/common/dio_manager.dart rename packages/{auth/lib/data/models => core/lib/data/model}/local/module/module_model.dart (78%) rename packages/{auth/lib/data/models => core/lib/data/model}/local/module/module_model.freezed.dart (58%) rename packages/{auth/lib/data/models => core/lib/data/model}/local/user_local/user_local_model.dart (100%) rename packages/{auth/lib/data/models => core/lib/data/model}/local/user_local/user_local_model.g.dart (100%) create mode 100644 packages/core/lib/data/model/model.dart rename packages/{auth/lib/data/models => core/lib/data/model}/request/login_request/login_request_model.dart (100%) rename packages/{auth/lib/data/models => core/lib/data/model}/request/login_request/login_request_model.freezed.dart (63%) rename packages/{auth/lib/data/models => core/lib/data/model}/request/login_request/login_request_model.g.dart (77%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/auth/auth_response_model.dart (100%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/auth/auth_response_model.freezed.dart (61%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/auth/auth_response_model.g.dart (88%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/captcha/captcha_response_model.dart (100%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/captcha/captcha_response_model.freezed.dart (64%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/captcha/captcha_response_model.g.dart (59%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/user_info/user_info_model.dart (100%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/user_info/user_info_model.freezed.dart (62%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/user_info/user_info_model.g.dart (80%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/user_profile_model/user_profile_model.dart (100%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/user_profile_model/user_profile_model.freezed.dart (73%) rename packages/{auth/lib/data/models => core/lib/data/model}/response/user_profile_model/user_profile_model.g.dart (69%) create mode 100644 packages/core/lib/data/services/auth_middelware.dart create mode 100644 packages/core/lib/data/services/services.dart rename packages/{auth => core}/lib/data/services/token_storage_service.dart (95%) rename packages/{auth => core}/lib/hive_registrar.g.dart (84%) create mode 100644 packages/core/lib/routing/auth_route_resolver.dart rename packages/{auth/lib/data/utils => core/lib/utils/network}/safe_call.dart (100%) create mode 100644 packages/inspection/lib/data/repositories/auth_repository.dart rename packages/{auth => inspection}/lib/data/repositories/auth_repository_imp.dart (74%) rename packages/{auth => inspection}/lib/presentation/pages/auth/logic.dart (80%) rename packages/{auth => inspection}/lib/presentation/pages/auth/view.dart (98%) rename packages/{auth => inspection}/lib/presentation/widget/captcha/logic.dart (69%) rename packages/{auth => inspection}/lib/presentation/widget/captcha/view.dart (95%) rename packages/{auth => inspection}/lib/presentation/widget/clear_button.dart (100%) rename packages/{auth => inspection}/lib/presentation/widget/logo_widget.dart (100%) diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index c1aebef..c692350 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -1,4 +1,4 @@ -import 'package:rasadyar_auth/auth.dart'; + import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_core/core.dart'; @@ -6,7 +6,6 @@ final di = GetIt.instance; Future setupPreInjection() async { await setupAllCoreProvider(); - await setupAuthDI(); di.registerSingleton( DioRemote(baseUrl: 'https://everestacademy.ir/'), instanceName: 'baseRemote', diff --git a/lib/infrastructure/service/auth_service.dart b/lib/infrastructure/service/auth_service.dart deleted file mode 100644 index 6ad04fa..0000000 --- a/lib/infrastructure/service/auth_service.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import 'package:rasadyar_auth/data/models/local/module/module_model.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; -import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/inspection.dart'; -import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; - -class AuthService extends GetxService { - var tokenService = Get.find(); - RxBool accessRes = false.obs; - RxBool refAccessRes = false.obs; - - @override - void onInit() { - super.onInit(); - - ever(tokenService.accessToken, (callback) { - accessRes.value = (callback != null); - }); - - ever(tokenService.refreshToken, (callback) { - refAccessRes.value = (callback != null); - }); - - everAll([accessRes, refAccessRes], (_) { - if (accessRes.value && refAccessRes.value) { - var targetPage = getTargetPage(tokenService.appModule.value); - Get.offAllNamed(targetPage); - } - }); - } - -} diff --git a/lib/infrastructure/service/token_storage_service.dart b/lib/infrastructure/service/token_storage_service.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/main.dart b/lib/main.dart index 3fdd903..645b2a7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,22 +1,19 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import 'package:rasadyar_auth/auth.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; - import 'infrastructure/di/di.dart'; -import 'infrastructure/service/auth_service.dart'; + Future main() async { WidgetsFlutterBinding.ensureInitialized(); - await setupPreInjection(); + await setupPreInjection(); Get.put(TokenStorageService()); await Get.find().init(); + Get.put(AuthMiddleware()); - Get.put(AuthService()); runApp(MyApp()); // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); diff --git a/packages/auth/lib/presentation/pages/modules/logic.dart b/lib/presentation/pages/modules/logic.dart similarity index 78% rename from packages/auth/lib/presentation/pages/modules/logic.dart rename to lib/presentation/pages/modules/logic.dart index 56637e5..628b7a8 100644 --- a/packages/auth/lib/presentation/pages/modules/logic.dart +++ b/lib/presentation/pages/modules/logic.dart @@ -1,5 +1,4 @@ -import 'package:rasadyar_auth/data/models/local/module/module_model.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; + import 'package:rasadyar_core/core.dart'; class ModulesLogic extends GetxController { diff --git a/packages/auth/lib/presentation/pages/modules/view.dart b/lib/presentation/pages/modules/view.dart similarity index 68% rename from packages/auth/lib/presentation/pages/modules/view.dart rename to lib/presentation/pages/modules/view.dart index e3ebe32..464b741 100644 --- a/packages/auth/lib/presentation/pages/modules/view.dart +++ b/lib/presentation/pages/modules/view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/inspection.dart'; import 'logic.dart'; @@ -11,10 +11,7 @@ class ModulesPage extends GetView { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text( - 'انتخاب سامانه', - style: AppFonts.yekan18.copyWith(color: Colors.white), - ), + title: Text('انتخاب سامانه', style: AppFonts.yekan18.copyWith(color: Colors.white)), centerTitle: true, backgroundColor: AppColor.blueNormal, ), @@ -28,7 +25,15 @@ class ModulesPage extends GetView { icon: module.icon, onTap: () { controller.selectedIndex.value = index; - Get.toNamed(AuthPaths.auth, arguments: module.module); + switch (module.module) { + case Module.inspection: + Get.toNamed(InspectionRoutes.init); + break; + case Module.liveStocks: + case Module.chicken: + Get.toNamed(InspectionRoutes.init); + break; + } }, ); }, diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 60bcc52..1b62220 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -4,10 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:rasadyar_app/data/model/app_info_model.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/inspection.dart'; -import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController scaleController; @@ -158,7 +155,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { final module = tokenService.appModule.value; final target = getTargetPage(module); - Get.offAndToNamed(InspectionRoutes.init); + Get.offAndToNamed(target); } catch (e, st) { debugPrint("onReady error: $e\n$st"); } @@ -227,7 +224,6 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { if (success) { _updateFilePath.value = filePath; - } onUpdateDownload.value = false; diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 50b39ac..2b52dad 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -1,14 +1,11 @@ import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; import 'package:rasadyar_app/presentation/pages/splash/view.dart'; import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; -import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/inspection.dart'; import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; - part 'app_paths.dart'; sealed class AppPages { @@ -26,7 +23,7 @@ sealed class AppPages { ), ...InspectionPages.pages, - ...AuthPages.pages, + ...LiveStockPages.pages, ...ChickenPages.pages, ]; @@ -41,6 +38,6 @@ String getTargetPage(Module? value) { case Module.chicken: return ChickenRoutes.init; default: - return InspectionRoutes.init; + return AppPaths.moduleList; } } diff --git a/lib/presentation/routes/app_paths.dart b/lib/presentation/routes/app_paths.dart index cd31b8f..2003dcd 100644 --- a/lib/presentation/routes/app_paths.dart +++ b/lib/presentation/routes/app_paths.dart @@ -4,5 +4,6 @@ sealed class AppPaths { AppPaths._(); static const String splash = '/splash'; + static const String moduleList = '/moduleList'; static const String systemDesignPage = '/systemDesignPage'; } diff --git a/lib/presentation/routes/auth_route_resolver_impl.dart b/lib/presentation/routes/auth_route_resolver_impl.dart new file mode 100644 index 0000000..c932919 --- /dev/null +++ b/lib/presentation/routes/auth_route_resolver_impl.dart @@ -0,0 +1,24 @@ +import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/inspection.dart'; +import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; + +class AppAuthRouteResolver implements AuthRouteResolver { + @override + String getAuthRouteForModule(Module module) { + switch (module) { + case Module.inspection: + return InspectionRoutes.auth; + case Module.liveStocks: + return LiveStockRoutes.auth; + case Module.chicken: + return ChickenRoutes.auth; + default: + throw UnimplementedError('No auth route for module: $module'); + } + } + + @override + String getFallbackRoute() => AppPaths.moduleList; +} diff --git a/packages/auth/.gitignore b/packages/auth/.gitignore deleted file mode 100644 index eb6c05c..0000000 --- a/packages/auth/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. -/pubspec.lock -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -build/ diff --git a/packages/auth/.metadata b/packages/auth/.metadata deleted file mode 100644 index dfbc19f..0000000 --- a/packages/auth/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# 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: "ea121f8859e4b13e47a8f845e4586164519588bc" - channel: "stable" - -project_type: package diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md deleted file mode 100644 index 41cc7d8..0000000 --- a/packages/auth/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 0.0.1 - -* TODO: Describe initial release. diff --git a/packages/auth/LICENSE b/packages/auth/LICENSE deleted file mode 100644 index ba75c69..0000000 --- a/packages/auth/LICENSE +++ /dev/null @@ -1 +0,0 @@ -TODO: Add your license here. diff --git a/packages/auth/README.md b/packages/auth/README.md deleted file mode 100644 index 4a260d8..0000000 --- a/packages/auth/README.md +++ /dev/null @@ -1,39 +0,0 @@ - - -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. - -## Features - -TODO: List what your package can do. Maybe include images, gifs, or videos. - -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. - -## Usage - -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. - -```dart -const like = 'sample'; -``` - -## Additional information - -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. diff --git a/packages/auth/analysis_options.yaml b/packages/auth/analysis_options.yaml deleted file mode 100644 index a5744c1..0000000 --- a/packages/auth/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/packages/auth/build.yaml b/packages/auth/build.yaml deleted file mode 100644 index 840029b..0000000 --- a/packages/auth/build.yaml +++ /dev/null @@ -1,6 +0,0 @@ -targets: - $default: - builders: - json_serializable: - options: - field_rename: snake \ No newline at end of file diff --git a/packages/auth/lib/auth.dart b/packages/auth/lib/auth.dart deleted file mode 100644 index 30c7f5f..0000000 --- a/packages/auth/lib/auth.dart +++ /dev/null @@ -1,8 +0,0 @@ -/// Support for doing something awesome. -/// -/// More dartdocs go here. -library; - -export 'data/services/auth_middelware.dart'; -export 'data/di/auth_di.dart'; -export 'data/models/local/module/module_model.dart'; diff --git a/packages/auth/lib/data/common/constant.dart b/packages/auth/lib/data/common/constant.dart deleted file mode 100644 index c0b0982..0000000 --- a/packages/auth/lib/data/common/constant.dart +++ /dev/null @@ -1,14 +0,0 @@ -enum ApiEnvironment { - dam(url: 'https://api.dam.rasadyar.net/'); - - const ApiEnvironment({required this.url}); - - final String url; - - String get baseUrl { - switch (this) { - case ApiEnvironment.dam: - return url; - } - } -} diff --git a/packages/auth/lib/data/common/dio_error_handler.dart b/packages/auth/lib/data/common/dio_error_handler.dart deleted file mode 100644 index 57f29bc..0000000 --- a/packages/auth/lib/data/common/dio_error_handler.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -class DioErrorHandler { - void handle(DioException error) { - switch (error.response?.statusCode) { - case 401: - _handleGeneric(error); - break; - case 403: - _handleGeneric(error); - break; - - case 410: - _handle410(); - break; - default: - _handleGeneric(error); - } - } - - //wrong password/user name => "detail": "No active account found with the given credentials" - 401 - void _handle410() { - Get.showSnackbar(_errorSnackBar('نام کاربری یا رمز عبور اشتباه است')); - } - - //wrong captcha => "detail": "Captcha code is incorrect" - 403 - void _handle403() {} - - void _handleGeneric(DioException error) { - Get.showSnackbar( - _errorSnackBar( - error.response?.data.keys.first == 'is_user' - ? 'کاربر با این شماره تلفن وجود ندارد' - : error.response?.data[error.response?.data.keys.first] ?? - 'خطا در برقراری ارتباط با سرور', - ), - ); - } - - GetSnackBar _errorSnackBar(String message) { - return GetSnackBar( - titleText: Text( - 'خطا', - style: AppFonts.yekan14.copyWith(color: Colors.white), - ), - messageText: Text( - message, - style: AppFonts.yekan12.copyWith(color: Colors.white), - ), - backgroundColor: AppColor.error, - margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), - borderRadius: 12, - duration: Duration(milliseconds: 3500), - snackPosition: SnackPosition.TOP, - ); - } -} diff --git a/packages/auth/lib/data/common/dio_manager.dart b/packages/auth/lib/data/common/dio_manager.dart deleted file mode 100644 index bbc17b5..0000000 --- a/packages/auth/lib/data/common/dio_manager.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_core/core.dart'; - -import '../di/auth_di.dart'; -import 'constant.dart'; - -/* -class DioRemoteManager { - DioRemote? _currentClient; - ApiEnvironment? _currentEnv; - - Future setEnvironment([ApiEnvironment env = ApiEnvironment.dam]) async { - if (_currentEnv != env) { - _currentClient = DioRemote( - baseUrl: env.baseUrl, - interceptors: AppInterceptor( - refreshTokenCallback: () async{ - return null; - }, - ), - ); - await _currentClient?.init(); - _currentEnv = env; - } - return _currentClient!; - } - - DioRemote get currentClient { - if (_currentClient == null) { - throw Exception('Call setEnvironment() before accessing DioRemote.'); - } - - return _currentClient!; - } - - ApiEnvironment? get currentEnv => _currentEnv; -} - -Future switchAuthEnvironment(ApiEnvironment env) async { - final manager = diAuth.get(); - - final dioRemote = await manager.setEnvironment(env); - - if (diAuth.isRegistered()) { - await diAuth.unregister(); - } - - diAuth.registerLazySingleton(() => AuthRepositoryImpl(dioRemote)); -} -*/ diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart deleted file mode 100644 index 3cb2747..0000000 --- a/packages/auth/lib/data/di/auth_di.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; -import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; -import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; -import 'package:rasadyar_core/core.dart'; - -import '../common/dio_manager.dart'; - -GetIt diAuth = GetIt.instance; - -Future setupAuthDI() async { - - diAuth.registerLazySingleton( - () => AppInterceptor( - refreshTokenCallback: () async { - var tokenService = Get.find(); - final authRepo = diAuth.get(); - - final refreshToken = tokenService.refreshToken.value; - if (refreshToken == null) return null; - - final result = await authRepo.loginWithRefreshToken( - authRequest: {"refresh_token": refreshToken}, - ); - - if (result is AuthResponseModel) { - await tokenService.saveAccessToken(result.access!); - return result.access; - } - return null; - }, - saveTokenCallback: (String newToken) async { - // - }, - clearTokenCallback: () async { - //await tokenService.clearTokens(); // حذف همه توکن‌ها - }, - ), - ); - - diAuth.registerLazySingleton( - () => DioRemote(interceptors: diAuth.get()), - ); - - final dioRemote = diAuth.get(); - await dioRemote.init(); - diAuth.registerSingleton(AuthRepositoryImpl(dioRemote)); - diAuth.registerLazySingleton(() => DioErrorHandler()); -} - -Future newSetupAuthDI(String newUrl) async { - diAuth.registerLazySingleton( - () => DioRemote(baseUrl: newUrl, interceptors: diAuth.get()), - instanceName: 'newRemote', - ); - final dioRemote = diAuth.get(instanceName: 'newRemote'); - await dioRemote.init(); - diAuth.registerSingleton( - AuthRepositoryImpl(dioRemote), - instanceName: 'newUrl', - ); -} diff --git a/packages/auth/lib/data/repositories/auth_repository.dart b/packages/auth/lib/data/repositories/auth_repository.dart deleted file mode 100644 index 2f5464c..0000000 --- a/packages/auth/lib/data/repositories/auth_repository.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:rasadyar_auth/data/models/response/user_info/user_info_model.dart'; - -import '../models/response/auth/auth_response_model.dart'; -import '../models/response/captcha/captcha_response_model.dart'; -import '../models/response/user_profile_model/user_profile_model.dart'; - -abstract class AuthRepository { - Future login({required Map authRequest}); - - Future captcha(); - - Future logout(); - - Future hasAuthenticated(); - - Future loginWithRefreshToken({ - required Map authRequest, - }); - - Future getUserInfo(String phoneNumber); -} diff --git a/packages/auth/lib/data/services/auth_middelware.dart b/packages/auth/lib/data/services/auth_middelware.dart deleted file mode 100644 index 14b6227..0000000 --- a/packages/auth/lib/data/services/auth_middelware.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; -import 'package:rasadyar_core/core.dart'; - -import '../../presentation/routes/pages.dart'; - -class AuthMiddleware extends GetMiddleware { - var tokenService = Get.find(); - - @override - RouteSettings? redirect(String? route) { - final refreshToken = tokenService.refreshToken.value; - final accessToken = tokenService.accessToken.value; - - if (refreshToken == null || accessToken == null) { - return RouteSettings(name: AuthPaths.auth, arguments: Module.chicken); - } - return super.redirect(route); - } -} diff --git a/packages/auth/lib/presentation/routes/pages.dart b/packages/auth/lib/presentation/routes/pages.dart deleted file mode 100644 index 5248b3d..0000000 --- a/packages/auth/lib/presentation/routes/pages.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:rasadyar_auth/presentation/pages/modules/logic.dart'; -import 'package:rasadyar_auth/presentation/pages/modules/view.dart'; -import 'package:rasadyar_auth/presentation/widget/captcha/logic.dart'; -import 'package:rasadyar_core/core.dart'; - -import '../pages/auth/logic.dart'; -import '../pages/auth/view.dart'; - -part 'paths.dart'; - -sealed class AuthPages { - AuthPages._(); - - static List pages = [ - GetPage( - name: AuthPaths.moduleList, - page: () => ModulesPage(), - binding: BindingsBuilder(() { - Get.lazyPut(() => ModulesLogic()); - }), - ), - - GetPage( - name: AuthPaths.auth, - page: () => AuthPage(), - binding: BindingsBuilder(() { - Get.lazyPut(() => AuthLogic()); - Get.lazyPut(() => CaptchaWidgetLogic()); - }), - ), - ]; -} diff --git a/packages/auth/lib/presentation/routes/paths.dart b/packages/auth/lib/presentation/routes/paths.dart deleted file mode 100644 index 85dfe5c..0000000 --- a/packages/auth/lib/presentation/routes/paths.dart +++ /dev/null @@ -1,8 +0,0 @@ -part of 'pages.dart'; - -sealed class AuthPaths { - AuthPaths._(); - - static const String moduleList = '/moduleList'; - static const String auth = '/Auth'; -} diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml deleted file mode 100644 index 15678f6..0000000 --- a/packages/auth/pubspec.yaml +++ /dev/null @@ -1,35 +0,0 @@ -name: rasadyar_auth -description: "A new Flutter project." -version: 1.0.3 -publish_to: 'none' - - -environment: - sdk: ^3.8.1 - flutter: ">=1.17.0" - -dependencies: - flutter: - sdk: flutter - - rasadyar_core: - path: ../core - ##code generation - freezed_annotation: ^3.1.0 - json_annotation: ^4.9.0 -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^6.0.0 - ##code generation - build_runner: ^2.6.0 - hive_ce_generator: ^1.9.3 - freezed: ^3.2.0 - json_serializable: ^6.10.0 - - ##test - mocktail: ^1.0.4 - get_test: ^4.0.1 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/packages/chicken/lib/data/common/dio_manager.dart b/packages/chicken/lib/data/common/dio_manager.dart deleted file mode 100644 index 3b1a566..0000000 --- a/packages/chicken/lib/data/common/dio_manager.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_core/core.dart'; - -import '../di/chicken_di.dart'; -import 'constant.dart'; - -/*class DioRemoteManager { - DioRemote? _currentClient; - ApiEnvironment? _currentEnv; - - Future setEnvironment([ - ApiEnvironment env = ApiEnvironment.dam, - ]) async { - if (_currentEnv != env) { - _currentClient = DioRemote(baseUrl: env.baseUrl); - await _currentClient?.init(); - _currentEnv = env; - } - return _currentClient!; - } - - DioRemote get currentClient { - if (_currentClient == null) { - throw Exception('Call setEnvironment() before accessing DioRemote.'); - } - - return _currentClient!; - } - - ApiEnvironment? get currentEnv => _currentEnv; -}*/ - - diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index bf68d7b..45bf9ef 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -1,10 +1,8 @@ -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; -import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/hive_registrar.g.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; GetIt diChicken = GetIt.instance; @@ -24,7 +22,7 @@ Future setupChickenDI() async { }, clearTokenCallback: () async { await tokenService.deleteTokens(); - Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); + Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken); }, authArguments: Module.chicken, ), diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart index b9dfcef..8c08473 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart @@ -1,4 +1,3 @@ -import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/models/request/steward_allocation/steward_allocation_request.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart index c2efb00..8d3ccd4 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/models/request/steward_allocation/steward_allocation_request.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index 2defabc..4a0e78a 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/cupertino.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index d1b89f9..e348934 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -1,4 +1,4 @@ -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; diff --git a/packages/chicken/lib/presentation/pages/profile/logic.dart b/packages/chicken/lib/presentation/pages/profile/logic.dart index 65b318f..e339341 100644 --- a/packages/chicken/lib/presentation/pages/profile/logic.dart +++ b/packages/chicken/lib/presentation/pages/profile/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart index 41451ad..23ccba7 100644 --- a/packages/chicken/lib/presentation/pages/profile/view.dart +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -2,8 +2,7 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; -import 'package:rasadyar_auth/presentation/routes/pages.dart'; +import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; @@ -621,7 +620,7 @@ class ProfilePage extends GetView { onPressed: () async { await controller.rootLogic.tokenService.deleteTokens().then((value) { Get.back(); - Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); + Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken); }); }, ), diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 1994afc..bc67ca1 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,8 +1,6 @@ import 'dart:async'; import 'package:flutter/widgets.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; diff --git a/packages/chicken/lib/presentation/pages/sale/logic.dart b/packages/chicken/lib/presentation/pages/sale/logic.dart index 5f3ff7e..0b39907 100644 --- a/packages/chicken/lib/presentation/pages/sale/logic.dart +++ b/packages/chicken/lib/presentation/pages/sale/logic.dart @@ -1,4 +1,4 @@ -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 27f86a7..2d255d8 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 53c3f3a..d031d0b 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart index 39344b8..9893557 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart index 944f546..8713c36 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 7844168..3e673d0 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; + import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 531fa16..09f4f78 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,4 +1,3 @@ -import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province/logic.dart'; diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index f880d94..ae174ee 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -1,6 +1,7 @@ sealed class ChickenRoutes { ChickenRoutes._(); + static const auth = '/AuthChicken'; static const _base = '/chicken'; static const init = '$_base/'; static const home = '$_base/home'; diff --git a/packages/chicken/lib/presentation/utils/utils.dart b/packages/chicken/lib/presentation/utils/utils.dart index e3fd48d..f6f89f3 100644 --- a/packages/chicken/lib/presentation/utils/utils.dart +++ b/packages/chicken/lib/presentation/utils/utils.dart @@ -1,17 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; -import 'package:rasadyar_auth/presentation/routes/pages.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_core/core.dart'; - - const int timeDebounce = 1200; - -void handleGeneric(DioException error,[void Function()? onError]) { +void handleGeneric(DioException error, [void Function()? onError]) { Get.showSnackbar(_errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید')); - Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); + Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken); } GetSnackBar _errorSnackBar(String message) { @@ -24,4 +20,4 @@ GetSnackBar _errorSnackBar(String message) { duration: Duration(milliseconds: 3500), snackPosition: SnackPosition.TOP, ); -} \ No newline at end of file +} diff --git a/packages/chicken/pubspec.yaml b/packages/chicken/pubspec.yaml index ed00202..55b6790 100644 --- a/packages/chicken/pubspec.yaml +++ b/packages/chicken/pubspec.yaml @@ -11,8 +11,7 @@ dependencies: sdk: flutter rasadyar_core: path: ../core - rasadyar_auth: - path: ../auth + ##code generation freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index c4a96f8..ce05d09 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -38,11 +38,15 @@ export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; //models -export 'data/model/pagination_model/pagination_model.dart'; +export 'data/model/model.dart'; +//data +export 'data/services/services.dart'; //infrastructure export 'infrastructure/infrastructure.dart'; export 'infrastructure/local/hive_local_storage.dart'; export 'injection/di.dart'; +//routing +export 'routing/auth_route_resolver.dart'; export 'utils/extension/date_time_utils.dart'; export 'utils/extension/num_utils.dart'; export 'utils/extension/string_utils.dart'; diff --git a/packages/auth/lib/data/models/local/module/module_model.dart b/packages/core/lib/data/model/local/module/module_model.dart similarity index 78% rename from packages/auth/lib/data/models/local/module/module_model.dart rename to packages/core/lib/data/model/local/module/module_model.dart index f543681..3ca5760 100644 --- a/packages/auth/lib/data/models/local/module/module_model.dart +++ b/packages/core/lib/data/model/local/module/module_model.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/model/local/user_local/user_local_model.dart'; part 'module_model.freezed.dart'; diff --git a/packages/auth/lib/data/models/local/module/module_model.freezed.dart b/packages/core/lib/data/model/local/module/module_model.freezed.dart similarity index 58% rename from packages/auth/lib/data/models/local/module/module_model.freezed.dart rename to packages/core/lib/data/model/local/module/module_model.freezed.dart index 48feb37..aedd18f 100644 --- a/packages/auth/lib/data/models/local/module/module_model.freezed.dart +++ b/packages/core/lib/data/model/local/module/module_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -75,6 +74,136 @@ as Module, } +/// Adds pattern-matching-related methods to [ModuleModel]. +extension ModuleModelPatterns on ModuleModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ModuleModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ModuleModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ModuleModel value) $default,){ +final _that = this; +switch (_that) { +case _ModuleModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ModuleModel value)? $default,){ +final _that = this; +switch (_that) { +case _ModuleModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String title, String icon, Module module)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ModuleModel() when $default != null: +return $default(_that.title,_that.icon,_that.module);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String title, String icon, Module module) $default,) {final _that = this; +switch (_that) { +case _ModuleModel(): +return $default(_that.title,_that.icon,_that.module);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String title, String icon, Module module)? $default,) {final _that = this; +switch (_that) { +case _ModuleModel() when $default != null: +return $default(_that.title,_that.icon,_that.module);case _: + return null; + +} +} + +} + /// @nodoc diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.dart b/packages/core/lib/data/model/local/user_local/user_local_model.dart similarity index 100% rename from packages/auth/lib/data/models/local/user_local/user_local_model.dart rename to packages/core/lib/data/model/local/user_local/user_local_model.dart diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.g.dart b/packages/core/lib/data/model/local/user_local/user_local_model.g.dart similarity index 100% rename from packages/auth/lib/data/models/local/user_local/user_local_model.g.dart rename to packages/core/lib/data/model/local/user_local/user_local_model.g.dart diff --git a/packages/core/lib/data/model/model.dart b/packages/core/lib/data/model/model.dart new file mode 100644 index 0000000..4a8a622 --- /dev/null +++ b/packages/core/lib/data/model/model.dart @@ -0,0 +1,3 @@ +export 'local/module/module_model.dart'; +export 'local/user_local/user_local_model.dart'; +export 'pagination_model/pagination_model.dart'; diff --git a/packages/core/lib/data/model/pagination_model/pagination_model.freezed.dart b/packages/core/lib/data/model/pagination_model/pagination_model.freezed.dart index cb35b63..2d77be8 100644 --- a/packages/core/lib/data/model/pagination_model/pagination_model.freezed.dart +++ b/packages/core/lib/data/model/pagination_model/pagination_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -79,6 +78,136 @@ as List?, } +/// Adds pattern-matching-related methods to [PaginationModel]. +extension PaginationModelPatterns on PaginationModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _PaginationModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _PaginationModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _PaginationModel value) $default,){ +final _that = this; +switch (_that) { +case _PaginationModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _PaginationModel value)? $default,){ +final _that = this; +switch (_that) { +case _PaginationModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? count, String? next, String? previous, List? results)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _PaginationModel() when $default != null: +return $default(_that.count,_that.next,_that.previous,_that.results);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? count, String? next, String? previous, List? results) $default,) {final _that = this; +switch (_that) { +case _PaginationModel(): +return $default(_that.count,_that.next,_that.previous,_that.results);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? count, String? next, String? previous, List? results)? $default,) {final _that = this; +switch (_that) { +case _PaginationModel() when $default != null: +return $default(_that.count,_that.next,_that.previous,_that.results);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable(genericArgumentFactories: true) diff --git a/packages/auth/lib/data/models/request/login_request/login_request_model.dart b/packages/core/lib/data/model/request/login_request/login_request_model.dart similarity index 100% rename from packages/auth/lib/data/models/request/login_request/login_request_model.dart rename to packages/core/lib/data/model/request/login_request/login_request_model.dart diff --git a/packages/auth/lib/data/models/request/login_request/login_request_model.freezed.dart b/packages/core/lib/data/model/request/login_request/login_request_model.freezed.dart similarity index 63% rename from packages/auth/lib/data/models/request/login_request/login_request_model.freezed.dart rename to packages/core/lib/data/model/request/login_request/login_request_model.freezed.dart index c9f60aa..9b91ad6 100644 --- a/packages/auth/lib/data/models/request/login_request/login_request_model.freezed.dart +++ b/packages/core/lib/data/model/request/login_request/login_request_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -79,6 +78,136 @@ as String?, } +/// Adds pattern-matching-related methods to [LoginRequestModel]. +extension LoginRequestModelPatterns on LoginRequestModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _LoginRequestModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _LoginRequestModel value) $default,){ +final _that = this; +switch (_that) { +case _LoginRequestModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _LoginRequestModel value)? $default,){ +final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? username, String? password, String? captchaCode, String? captchaKey)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that.username,_that.password,_that.captchaCode,_that.captchaKey);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? username, String? password, String? captchaCode, String? captchaKey) $default,) {final _that = this; +switch (_that) { +case _LoginRequestModel(): +return $default(_that.username,_that.password,_that.captchaCode,_that.captchaKey);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? username, String? password, String? captchaCode, String? captchaKey)? $default,) {final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that.username,_that.password,_that.captchaCode,_that.captchaKey);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/auth/lib/data/models/request/login_request/login_request_model.g.dart b/packages/core/lib/data/model/request/login_request/login_request_model.g.dart similarity index 77% rename from packages/auth/lib/data/models/request/login_request/login_request_model.g.dart rename to packages/core/lib/data/model/request/login_request/login_request_model.g.dart index 4504142..f10c8a6 100644 --- a/packages/auth/lib/data/models/request/login_request/login_request_model.g.dart +++ b/packages/core/lib/data/model/request/login_request/login_request_model.g.dart @@ -10,14 +10,14 @@ _LoginRequestModel _$LoginRequestModelFromJson(Map json) => _LoginRequestModel( username: json['username'] as String?, password: json['password'] as String?, - captchaCode: json['captcha_code'] as String?, - captchaKey: json['captcha_key'] as String?, + captchaCode: json['captchaCode'] as String?, + captchaKey: json['captchaKey'] as String?, ); Map _$LoginRequestModelToJson(_LoginRequestModel instance) => { 'username': instance.username, 'password': instance.password, - 'captcha_code': instance.captchaCode, - 'captcha_key': instance.captchaKey, + 'captchaCode': instance.captchaCode, + 'captchaKey': instance.captchaKey, }; diff --git a/packages/auth/lib/data/models/response/auth/auth_response_model.dart b/packages/core/lib/data/model/response/auth/auth_response_model.dart similarity index 100% rename from packages/auth/lib/data/models/response/auth/auth_response_model.dart rename to packages/core/lib/data/model/response/auth/auth_response_model.dart diff --git a/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart b/packages/core/lib/data/model/response/auth/auth_response_model.freezed.dart similarity index 61% rename from packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart rename to packages/core/lib/data/model/response/auth/auth_response_model.freezed.dart index c0c505f..fdca0fc 100644 --- a/packages/auth/lib/data/models/response/auth/auth_response_model.freezed.dart +++ b/packages/core/lib/data/model/response/auth/auth_response_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -78,6 +77,136 @@ as bool?, } +/// Adds pattern-matching-related methods to [AuthResponseModel]. +extension AuthResponseModelPatterns on AuthResponseModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _AuthResponseModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _AuthResponseModel value) $default,){ +final _that = this; +switch (_that) { +case _AuthResponseModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _AuthResponseModel value)? $default,){ +final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? refresh, String? access, bool? otpStatus)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that.refresh,_that.access,_that.otpStatus);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? refresh, String? access, bool? otpStatus) $default,) {final _that = this; +switch (_that) { +case _AuthResponseModel(): +return $default(_that.refresh,_that.access,_that.otpStatus);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? refresh, String? access, bool? otpStatus)? $default,) {final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that.refresh,_that.access,_that.otpStatus);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/auth/lib/data/models/response/auth/auth_response_model.g.dart b/packages/core/lib/data/model/response/auth/auth_response_model.g.dart similarity index 88% rename from packages/auth/lib/data/models/response/auth/auth_response_model.g.dart rename to packages/core/lib/data/model/response/auth/auth_response_model.g.dart index dc5d66d..642fa02 100644 --- a/packages/auth/lib/data/models/response/auth/auth_response_model.g.dart +++ b/packages/core/lib/data/model/response/auth/auth_response_model.g.dart @@ -10,12 +10,12 @@ _AuthResponseModel _$AuthResponseModelFromJson(Map json) => _AuthResponseModel( refresh: json['refresh'] as String?, access: json['access'] as String?, - otpStatus: json['otp_status'] as bool?, + otpStatus: json['otpStatus'] as bool?, ); Map _$AuthResponseModelToJson(_AuthResponseModel instance) => { 'refresh': instance.refresh, 'access': instance.access, - 'otp_status': instance.otpStatus, + 'otpStatus': instance.otpStatus, }; diff --git a/packages/auth/lib/data/models/response/captcha/captcha_response_model.dart b/packages/core/lib/data/model/response/captcha/captcha_response_model.dart similarity index 100% rename from packages/auth/lib/data/models/response/captcha/captcha_response_model.dart rename to packages/core/lib/data/model/response/captcha/captcha_response_model.dart diff --git a/packages/auth/lib/data/models/response/captcha/captcha_response_model.freezed.dart b/packages/core/lib/data/model/response/captcha/captcha_response_model.freezed.dart similarity index 64% rename from packages/auth/lib/data/models/response/captcha/captcha_response_model.freezed.dart rename to packages/core/lib/data/model/response/captcha/captcha_response_model.freezed.dart index 0e12301..33d0167 100644 --- a/packages/auth/lib/data/models/response/captcha/captcha_response_model.freezed.dart +++ b/packages/core/lib/data/model/response/captcha/captcha_response_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -79,6 +78,136 @@ as String?, } +/// Adds pattern-matching-related methods to [CaptchaResponseModel]. +extension CaptchaResponseModelPatterns on CaptchaResponseModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _CaptchaResponseModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _CaptchaResponseModel value) $default,){ +final _that = this; +switch (_that) { +case _CaptchaResponseModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _CaptchaResponseModel value)? $default,){ +final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? captchaKey, String? captchaImage, String? imageType, String? imageDecode)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that.captchaKey,_that.captchaImage,_that.imageType,_that.imageDecode);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? captchaKey, String? captchaImage, String? imageType, String? imageDecode) $default,) {final _that = this; +switch (_that) { +case _CaptchaResponseModel(): +return $default(_that.captchaKey,_that.captchaImage,_that.imageType,_that.imageDecode);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? captchaKey, String? captchaImage, String? imageType, String? imageDecode)? $default,) {final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that.captchaKey,_that.captchaImage,_that.imageType,_that.imageDecode);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart b/packages/core/lib/data/model/response/captcha/captcha_response_model.g.dart similarity index 59% rename from packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart rename to packages/core/lib/data/model/response/captcha/captcha_response_model.g.dart index 8d69248..a0ffdcb 100644 --- a/packages/auth/lib/data/models/response/captcha/captcha_response_model.g.dart +++ b/packages/core/lib/data/model/response/captcha/captcha_response_model.g.dart @@ -9,17 +9,17 @@ part of 'captcha_response_model.dart'; _CaptchaResponseModel _$CaptchaResponseModelFromJson( Map json, ) => _CaptchaResponseModel( - captchaKey: json['captcha_key'] as String?, - captchaImage: json['captcha_image'] as String?, - imageType: json['image_type'] as String?, - imageDecode: json['image_decode'] as String?, + captchaKey: json['captchaKey'] as String?, + captchaImage: json['captchaImage'] as String?, + imageType: json['imageType'] as String?, + imageDecode: json['imageDecode'] as String?, ); Map _$CaptchaResponseModelToJson( _CaptchaResponseModel instance, ) => { - 'captcha_key': instance.captchaKey, - 'captcha_image': instance.captchaImage, - 'image_type': instance.imageType, - 'image_decode': instance.imageDecode, + 'captchaKey': instance.captchaKey, + 'captchaImage': instance.captchaImage, + 'imageType': instance.imageType, + 'imageDecode': instance.imageDecode, }; diff --git a/packages/auth/lib/data/models/response/user_info/user_info_model.dart b/packages/core/lib/data/model/response/user_info/user_info_model.dart similarity index 100% rename from packages/auth/lib/data/models/response/user_info/user_info_model.dart rename to packages/core/lib/data/model/response/user_info/user_info_model.dart diff --git a/packages/auth/lib/data/models/response/user_info/user_info_model.freezed.dart b/packages/core/lib/data/model/response/user_info/user_info_model.freezed.dart similarity index 62% rename from packages/auth/lib/data/models/response/user_info/user_info_model.freezed.dart rename to packages/core/lib/data/model/response/user_info/user_info_model.freezed.dart index bbb225d..7d28ca0 100644 --- a/packages/auth/lib/data/models/response/user_info/user_info_model.freezed.dart +++ b/packages/core/lib/data/model/response/user_info/user_info_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -79,6 +78,136 @@ as String?, } +/// Adds pattern-matching-related methods to [UserInfoModel]. +extension UserInfoModelPatterns on UserInfoModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _UserInfoModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _UserInfoModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _UserInfoModel value) $default,){ +final _that = this; +switch (_that) { +case _UserInfoModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _UserInfoModel value)? $default,){ +final _that = this; +switch (_that) { +case _UserInfoModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( bool? isUser, String? address, String? backend, String? apiKey)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _UserInfoModel() when $default != null: +return $default(_that.isUser,_that.address,_that.backend,_that.apiKey);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( bool? isUser, String? address, String? backend, String? apiKey) $default,) {final _that = this; +switch (_that) { +case _UserInfoModel(): +return $default(_that.isUser,_that.address,_that.backend,_that.apiKey);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( bool? isUser, String? address, String? backend, String? apiKey)? $default,) {final _that = this; +switch (_that) { +case _UserInfoModel() when $default != null: +return $default(_that.isUser,_that.address,_that.backend,_that.apiKey);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/auth/lib/data/models/response/user_info/user_info_model.g.dart b/packages/core/lib/data/model/response/user_info/user_info_model.g.dart similarity index 80% rename from packages/auth/lib/data/models/response/user_info/user_info_model.g.dart rename to packages/core/lib/data/model/response/user_info/user_info_model.g.dart index 2c8f1c4..13ceb8e 100644 --- a/packages/auth/lib/data/models/response/user_info/user_info_model.g.dart +++ b/packages/core/lib/data/model/response/user_info/user_info_model.g.dart @@ -8,16 +8,16 @@ part of 'user_info_model.dart'; _UserInfoModel _$UserInfoModelFromJson(Map json) => _UserInfoModel( - isUser: json['is_user'] as bool?, + isUser: json['isUser'] as bool?, address: json['address'] as String?, backend: json['backend'] as String?, - apiKey: json['api_key'] as String?, + apiKey: json['apiKey'] as String?, ); Map _$UserInfoModelToJson(_UserInfoModel instance) => { - 'is_user': instance.isUser, + 'isUser': instance.isUser, 'address': instance.address, 'backend': instance.backend, - 'api_key': instance.apiKey, + 'apiKey': instance.apiKey, }; diff --git a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.dart b/packages/core/lib/data/model/response/user_profile_model/user_profile_model.dart similarity index 100% rename from packages/auth/lib/data/models/response/user_profile_model/user_profile_model.dart rename to packages/core/lib/data/model/response/user_profile_model/user_profile_model.dart diff --git a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart b/packages/core/lib/data/model/response/user_profile_model/user_profile_model.freezed.dart similarity index 73% rename from packages/auth/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart rename to packages/core/lib/data/model/response/user_profile_model/user_profile_model.freezed.dart index 0f5e570..407cb7c 100644 --- a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart +++ b/packages/core/lib/data/model/response/user_profile_model/user_profile_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -91,6 +90,136 @@ as List?, } +/// Adds pattern-matching-related methods to [UserProfileModel]. +extension UserProfileModelPatterns on UserProfileModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _UserProfileModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _UserProfileModel value) $default,){ +final _that = this; +switch (_that) { +case _UserProfileModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _UserProfileModel value)? $default,){ +final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? accessToken, String? expiresIn, String? scope, String? expireTime, String? mobile, String? fullname, String? firstname, String? lastname, String? city, String? province, String? nationalCode, String? nationalId, String? birthday, String? image, int? baseOrder, List? role)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that.accessToken,_that.expiresIn,_that.scope,_that.expireTime,_that.mobile,_that.fullname,_that.firstname,_that.lastname,_that.city,_that.province,_that.nationalCode,_that.nationalId,_that.birthday,_that.image,_that.baseOrder,_that.role);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? accessToken, String? expiresIn, String? scope, String? expireTime, String? mobile, String? fullname, String? firstname, String? lastname, String? city, String? province, String? nationalCode, String? nationalId, String? birthday, String? image, int? baseOrder, List? role) $default,) {final _that = this; +switch (_that) { +case _UserProfileModel(): +return $default(_that.accessToken,_that.expiresIn,_that.scope,_that.expireTime,_that.mobile,_that.fullname,_that.firstname,_that.lastname,_that.city,_that.province,_that.nationalCode,_that.nationalId,_that.birthday,_that.image,_that.baseOrder,_that.role);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? accessToken, String? expiresIn, String? scope, String? expireTime, String? mobile, String? fullname, String? firstname, String? lastname, String? city, String? province, String? nationalCode, String? nationalId, String? birthday, String? image, int? baseOrder, List? role)? $default,) {final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that.accessToken,_that.expiresIn,_that.scope,_that.expireTime,_that.mobile,_that.fullname,_that.firstname,_that.lastname,_that.city,_that.province,_that.nationalCode,_that.nationalId,_that.birthday,_that.image,_that.baseOrder,_that.role);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.g.dart b/packages/core/lib/data/model/response/user_profile_model/user_profile_model.g.dart similarity index 69% rename from packages/auth/lib/data/models/response/user_profile_model/user_profile_model.g.dart rename to packages/core/lib/data/model/response/user_profile_model/user_profile_model.g.dart index df72e0e..170f03f 100644 --- a/packages/auth/lib/data/models/response/user_profile_model/user_profile_model.g.dart +++ b/packages/core/lib/data/model/response/user_profile_model/user_profile_model.g.dart @@ -8,40 +8,40 @@ part of 'user_profile_model.dart'; _UserProfileModel _$UserProfileModelFromJson(Map json) => _UserProfileModel( - accessToken: json['access_token'] as String?, - expiresIn: json['expires_in'] as String?, + accessToken: json['accessToken'] as String?, + expiresIn: json['expiresIn'] as String?, scope: json['scope'] as String?, - expireTime: json['expire_time'] as String?, + expireTime: json['expireTime'] as String?, mobile: json['mobile'] as String?, fullname: json['fullname'] as String?, firstname: json['firstname'] as String?, lastname: json['lastname'] as String?, city: json['city'] as String?, province: json['province'] as String?, - nationalCode: json['national_code'] as String?, - nationalId: json['national_id'] as String?, + nationalCode: json['nationalCode'] as String?, + nationalId: json['nationalId'] as String?, birthday: json['birthday'] as String?, image: json['image'] as String?, - baseOrder: (json['base_order'] as num?)?.toInt(), + baseOrder: (json['baseOrder'] as num?)?.toInt(), role: (json['role'] as List?)?.map((e) => e as String).toList(), ); Map _$UserProfileModelToJson(_UserProfileModel instance) => { - 'access_token': instance.accessToken, - 'expires_in': instance.expiresIn, + 'accessToken': instance.accessToken, + 'expiresIn': instance.expiresIn, 'scope': instance.scope, - 'expire_time': instance.expireTime, + 'expireTime': instance.expireTime, 'mobile': instance.mobile, 'fullname': instance.fullname, 'firstname': instance.firstname, 'lastname': instance.lastname, 'city': instance.city, 'province': instance.province, - 'national_code': instance.nationalCode, - 'national_id': instance.nationalId, + 'nationalCode': instance.nationalCode, + 'nationalId': instance.nationalId, 'birthday': instance.birthday, 'image': instance.image, - 'base_order': instance.baseOrder, + 'baseOrder': instance.baseOrder, 'role': instance.role, }; diff --git a/packages/core/lib/data/services/auth_middelware.dart b/packages/core/lib/data/services/auth_middelware.dart new file mode 100644 index 0000000..d0ec70c --- /dev/null +++ b/packages/core/lib/data/services/auth_middelware.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class AuthMiddleware extends GetMiddleware { + final tokenService = Get.find(); + final authRouteResolver = Get.find(); + + @override + RouteSettings? redirect(String? route) { + final refreshToken = tokenService.refreshToken.value; + final accessToken = tokenService.accessToken.value; + final module = tokenService.appModule.value; + + if (refreshToken == null || accessToken == null) { + if (module != null) { + final authRoute = authRouteResolver.getAuthRouteForModule(module); + return RouteSettings(name: authRoute, arguments: module); + } + return RouteSettings(name: authRouteResolver.getFallbackRoute()); + } + return super.redirect(route); + } +} diff --git a/packages/core/lib/data/services/services.dart b/packages/core/lib/data/services/services.dart new file mode 100644 index 0000000..893fe8b --- /dev/null +++ b/packages/core/lib/data/services/services.dart @@ -0,0 +1,2 @@ +export 'auth_middelware.dart'; +export 'token_storage_service.dart'; diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/core/lib/data/services/token_storage_service.dart similarity index 95% rename from packages/auth/lib/data/services/token_storage_service.dart rename to packages/core/lib/data/services/token_storage_service.dart index d81c591..c62c2ba 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/core/lib/data/services/token_storage_service.dart @@ -1,8 +1,6 @@ import 'dart:convert'; - -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; -import 'package:rasadyar_auth/hive_registrar.g.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/hive_registrar.g.dart'; class TokenStorageService extends GetxService { static const String _tokenBoxName = 'TokenBox'; diff --git a/packages/auth/lib/hive_registrar.g.dart b/packages/core/lib/hive_registrar.g.dart similarity index 84% rename from packages/auth/lib/hive_registrar.g.dart rename to packages/core/lib/hive_registrar.g.dart index 166b5cb..b5b6dfa 100644 --- a/packages/auth/lib/hive_registrar.g.dart +++ b/packages/core/lib/hive_registrar.g.dart @@ -3,7 +3,7 @@ // Check in to version control import 'package:hive_ce/hive.dart'; -import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_core/data/model/local/user_local/user_local_model.dart'; extension HiveRegistrar on HiveInterface { void registerAdapters() { diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index 9df3a5f..d2308c4 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -1,27 +1,26 @@ import 'package:get_it/get_it.dart'; import 'package:logger/logger.dart'; +import 'package:rasadyar_core/data/services/auth_middelware.dart'; import 'package:rasadyar_core/infrastructure/local/hive_local_storage.dart'; final diCore = GetIt.instance; Future setupAllCoreProvider() async { + diCore.registerSingleton(AuthMiddleware()); await _setUpLogger(); await _setupLocalStorage(); await _setupRemote(); await diCore.allReady(); } -Future _setUpLogger() async{ +Future _setUpLogger() async { diCore.registerSingleton(Logger()); } Future _setupLocalStorage() async { diCore.registerSingleton(HiveLocalStorage()); - print('====> HiveLocalStorage registered'); } - - Future _setupRemote() async { -// diCore.registerSingleton(HiveLocalStorage()); + // diCore.registerSingleton(HiveLocalStorage()); } diff --git a/packages/core/lib/routing/auth_route_resolver.dart b/packages/core/lib/routing/auth_route_resolver.dart new file mode 100644 index 0000000..b79adac --- /dev/null +++ b/packages/core/lib/routing/auth_route_resolver.dart @@ -0,0 +1,6 @@ +import 'package:rasadyar_core/data/model/local/user_local/user_local_model.dart'; + +abstract class AuthRouteResolver { + String getAuthRouteForModule(Module module); + String getFallbackRoute(); +} \ No newline at end of file diff --git a/packages/core/lib/utils/network/network.dart b/packages/core/lib/utils/network/network.dart index 0ff8a3c..ae65c6a 100644 --- a/packages/core/lib/utils/network/network.dart +++ b/packages/core/lib/utils/network/network.dart @@ -1,2 +1,3 @@ export 'resource.dart'; -export 'safe_call_utils.dart'; \ No newline at end of file +export 'safe_call_utils.dart'; +export 'safe_call.dart'; \ No newline at end of file diff --git a/packages/auth/lib/data/utils/safe_call.dart b/packages/core/lib/utils/network/safe_call.dart similarity index 100% rename from packages/auth/lib/data/utils/safe_call.dart rename to packages/core/lib/utils/network/safe_call.dart diff --git a/packages/inspection/lib/data/repositories/auth_repository.dart b/packages/inspection/lib/data/repositories/auth_repository.dart new file mode 100644 index 0000000..179483a --- /dev/null +++ b/packages/inspection/lib/data/repositories/auth_repository.dart @@ -0,0 +1,18 @@ +import 'package:rasadyar_core/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_core/data/model/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_core/data/model/response/user_info/user_info_model.dart'; +import 'package:rasadyar_core/data/model/response/user_profile_model/user_profile_model.dart'; + +abstract class AuthRepository { + Future login({required Map authRequest}); + + Future captcha(); + + Future logout(); + + Future hasAuthenticated(); + + Future loginWithRefreshToken({required Map authRequest}); + + Future getUserInfo(String phoneNumber); +} diff --git a/packages/auth/lib/data/repositories/auth_repository_imp.dart b/packages/inspection/lib/data/repositories/auth_repository_imp.dart similarity index 74% rename from packages/auth/lib/data/repositories/auth_repository_imp.dart rename to packages/inspection/lib/data/repositories/auth_repository_imp.dart index c2ef5d1..25a3ff6 100644 --- a/packages/auth/lib/data/repositories/auth_repository_imp.dart +++ b/packages/inspection/lib/data/repositories/auth_repository_imp.dart @@ -1,9 +1,8 @@ -import 'package:rasadyar_auth/data/models/response/user_info/user_info_model.dart'; -import 'package:rasadyar_auth/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_core/core.dart'; - -import '../models/response/auth/auth_response_model.dart'; -import '../models/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_core/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_core/data/model/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_core/data/model/response/user_info/user_info_model.dart'; +import 'package:rasadyar_core/data/model/response/user_profile_model/user_profile_model.dart'; import 'auth_repository.dart'; class AuthRepositoryImpl implements AuthRepository { @@ -13,10 +12,8 @@ class AuthRepositoryImpl implements AuthRepository { AuthRepositoryImpl(this._httpClient); @override - Future login({ - required Map authRequest, - }) async { - var res = await _httpClient.post( + Future login({required Map authRequest}) async { + var res = await _httpClient.post( '/api/login/', data: authRequest, fromJson: UserProfileModel.fromJson, @@ -66,14 +63,10 @@ class AuthRepositoryImpl implements AuthRepository { Future getUserInfo(String phoneNumber) async { var res = await _httpClient.post( 'https://userbackend.rasadyaar.ir/api/send_otp/', - data: { - "mobile": phoneNumber, - "state": "" - }, + data: {"mobile": phoneNumber, "state": ""}, fromJson: UserInfoModel.fromJson, headers: {'Content-Type': 'application/json'}, ); return res.data; - } } diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/inspection/lib/presentation/pages/auth/logic.dart similarity index 80% rename from packages/auth/lib/presentation/pages/auth/logic.dart rename to packages/inspection/lib/presentation/pages/auth/logic.dart index 76fdc40..126589b 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/inspection/lib/presentation/pages/auth/logic.dart @@ -1,18 +1,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/auth.dart'; -import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; -import 'package:rasadyar_auth/data/models/request/login_request/login_request_model.dart'; -import 'package:rasadyar_auth/data/models/response/user_info/user_info_model.dart'; -import 'package:rasadyar_auth/data/models/response/user_profile_model/user_profile_model.dart'; -import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; -import 'package:rasadyar_auth/data/services/token_storage_service.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_auth/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_core/core.dart'; - -import '../../../data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_core/data/model/request/login_request/login_request_model.dart'; +import 'package:rasadyar_core/data/model/response/user_info/user_info_model.dart'; +import 'package:rasadyar_core/data/model/response/user_profile_model/user_profile_model.dart'; +import 'package:rasadyar_inspection/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_inspection/presentation/widget/captcha/logic.dart'; enum AuthType { useAndPass, otp } @@ -44,7 +38,7 @@ class AuthLogic extends GetxController { RxInt secondsRemaining = 120.obs; Timer? _timer; - AuthRepositoryImpl authRepository = diAuth.get(); + //AuthRepositoryImpl authRepository = diAuth.get(); final Module _module = Get.arguments; @@ -71,7 +65,6 @@ class AuthLogic extends GetxController { return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; } - @override void onReady() { super.onReady(); @@ -128,9 +121,9 @@ class AuthLogic extends GetxController { Future submitLoginForm2() async { if (!_isFormValid()) return; - AuthRepositoryImpl authTmp = diAuth.get(instanceName: 'newUrl'); + //AuthRepositoryImpl authTmp = diAuth.get(instanceName: 'newUrl'); isLoading.value = true; - await safeCall( + /* await safeCall( call: () => authTmp.login( authRequest: { "username": usernameController.value.text, @@ -144,32 +137,32 @@ class AuthLogic extends GetxController { }, onError: (error, stackTrace) { if (error is DioException) { - diAuth.get().handle(error); + // diAuth.get().handle(error); } captchaController.getCaptcha(); }, - ); + );*/ isLoading.value = false; } Future getUserInfo(String value) async { isLoading.value = true; - await safeCall( + /*await safeCall( call: () async => await authRepository.getUserInfo(value), onSuccess: (result) async { if (result != null) { - await newSetupAuthDI(result.backend ?? ''); + //await newSetupAuthDI(result.backend ?? ''); await tokenStorageService.saveApiKey(result.apiKey ?? ''); await tokenStorageService.saveBaseUrl(result.backend ?? ''); } }, onError: (error, stackTrace) { if (error is DioException) { - diAuth.get().handle(error); + // diAuth.get().handle(error); } captchaController.getCaptcha(); }, - ); + );*/ isLoading.value = false; } } diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/inspection/lib/presentation/pages/auth/view.dart similarity index 98% rename from packages/auth/lib/presentation/pages/auth/view.dart rename to packages/inspection/lib/presentation/pages/auth/view.dart index 60fe93a..213c747 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/inspection/lib/presentation/pages/auth/view.dart @@ -1,9 +1,9 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/presentation/widget/captcha/view.dart'; -import 'package:rasadyar_auth/presentation/widget/clear_button.dart'; -import 'package:rasadyar_auth/presentation/widget/logo_widget.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/widget/captcha/view.dart'; +import 'package:rasadyar_inspection/presentation/widget/clear_button.dart'; +import 'package:rasadyar_inspection/presentation/widget/logo_widget.dart'; import 'logic.dart'; @@ -109,9 +109,6 @@ class AuthPage extends GetView { onChanged: (value) async { controller.usernameController.value.text = value; controller.usernameController.refresh(); - if (value.length == 11) { - await controller.getUserInfo(value); - } }, prefixIcon: Padding( padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), @@ -124,11 +121,11 @@ class AuthPage extends GetView { }) : null, validator: (value) { - /* if (value == null || value.isEmpty) { + if (value == null || value.isEmpty) { return '⚠️ شماره موبایل را وارد کنید'; } else if (value.length < 10) { return '⚠️ شماره موبایل باید 11 رقم باشد'; - }*/ + } return null; }, style: AppFonts.yekan13, diff --git a/packages/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart index 5492bfe..dcf3ac9 100644 --- a/packages/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -1,4 +1,6 @@ import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/pages/auth/logic.dart'; +import 'package:rasadyar_inspection/presentation/pages/auth/view.dart'; import 'package:rasadyar_inspection/presentation/pages/filter/logic.dart'; import 'package:rasadyar_inspection/presentation/pages/pages.dart'; import 'package:rasadyar_inspection/presentation/pages/users/logic.dart'; @@ -12,10 +14,10 @@ sealed class InspectionPages { GetPage( name: InspectionRoutes.init, page: () => RootPage(), - + middlewares:[ AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(() =>RootLogic()); - Get.lazyPut(() =>InspectorFilterLogic()); + Get.lazyPut(() => RootLogic()); + Get.lazyPut(() => InspectorFilterLogic()); Get.lazyPut(() => InspectionMapLogic()); Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => UsersLogic()); @@ -59,5 +61,10 @@ sealed class InspectionPages { page: () => AddMobileInspectorPage(), binding: BindingsBuilder.put(() => AddMobileInspectorLogic()), ), + GetPage( + name: InspectionRoutes.auth, + page: () => AuthPage(), + binding: BindingsBuilder.put(() => AuthLogic()), + ), ]; } diff --git a/packages/inspection/lib/presentation/routes/app_routes.dart b/packages/inspection/lib/presentation/routes/app_routes.dart index 97b9549..72c0c48 100644 --- a/packages/inspection/lib/presentation/routes/app_routes.dart +++ b/packages/inspection/lib/presentation/routes/app_routes.dart @@ -2,11 +2,13 @@ sealed class InspectionRoutes { InspectionRoutes._(); static const init = '/supervision'; - static const inspectionAction = '$init/action'; + static const auth = '/AuthSupervision'; static const inspectionUserProfile = '$init/userSettings'; static const inspectionLocationDetails = '$init/locationDetails'; static const inspectionAddSupervision = '$inspectionLocationDetails/addSupervision'; static const inspectionAddMobileInspector = '$inspectionLocationDetails/addMobileInspector'; - static const inspectionRegistrationOfViolation = '$inspectionAddSupervision/RegistrationOfViolation'; - static const inspectionDisplayInformation = '$inspectionRegistrationOfViolation/DisplayInformation'; + static const inspectionRegistrationOfViolation = + '$inspectionAddSupervision/RegistrationOfViolation'; + static const inspectionDisplayInformation = + '$inspectionRegistrationOfViolation/DisplayInformation'; } diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/inspection/lib/presentation/widget/captcha/logic.dart similarity index 69% rename from packages/auth/lib/presentation/widget/captcha/logic.dart rename to packages/inspection/lib/presentation/widget/captcha/logic.dart index 7a5ebcf..1ed9b15 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/inspection/lib/presentation/widget/captcha/logic.dart @@ -1,16 +1,15 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/di/auth_di.dart'; -import 'package:rasadyar_auth/data/models/response/captcha/captcha_response_model.dart'; -import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/model/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_inspection/data/repositories/auth_repository_imp.dart'; class CaptchaWidgetLogic extends GetxController with StateMixin { TextEditingController textController = TextEditingController(); RxnString captchaKey = RxnString(); GlobalKey formKey = GlobalKey(); - AuthRepositoryImpl authRepository = diAuth.get(); + //AuthRepositoryImpl authRepository = .get(); final Random random = Random(); @override @@ -31,8 +30,7 @@ class CaptchaWidgetLogic extends GetxController with StateMixin Date: Sun, 27 Jul 2025 15:36:28 +0330 Subject: [PATCH 243/256] fix : di --- lib/infrastructure/di/di.dart | 4 ---- lib/main.dart | 4 ++-- lib/presentation/routes/app_pages.dart | 9 +++++++++ packages/core/lib/injection/di.dart | 4 ++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index c692350..fdf6b7a 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -6,10 +6,6 @@ final di = GetIt.instance; Future setupPreInjection() async { await setupAllCoreProvider(); - di.registerSingleton( - DioRemote(baseUrl: 'https://everestacademy.ir/'), - instanceName: 'baseRemote', - ); } Future setupInjection() async { diff --git a/lib/main.dart b/lib/main.dart index 645b2a7..ec1cee0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_core/core.dart'; import 'infrastructure/di/di.dart'; +import 'presentation/routes/auth_route_resolver_impl.dart'; Future main() async { @@ -11,8 +12,7 @@ Future main() async { await setupPreInjection(); Get.put(TokenStorageService()); await Get.find().init(); - - + Get.put(AppAuthRouteResolver()); Get.put(AuthMiddleware()); runApp(MyApp()); diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 2b52dad..44675f4 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -1,3 +1,5 @@ +import 'package:rasadyar_app/presentation/pages/modules/logic.dart'; +import 'package:rasadyar_app/presentation/pages/modules/view.dart'; import 'package:rasadyar_app/presentation/pages/splash/logic.dart'; import 'package:rasadyar_app/presentation/pages/splash/view.dart'; import 'package:rasadyar_app/presentation/pages/system_design/system_design.dart'; @@ -16,6 +18,13 @@ sealed class AppPages { static List pages = [ GetPage(name: AppPaths.systemDesignPage, page: () => SystemDesignPage()), + + GetPage( + name: AppPaths.moduleList, + page: () => ModulesPage(), + binding: BindingsBuilder.put(() => ModulesLogic()), + ), + GetPage( name: AppPaths.splash, page: () => SplashPage(), diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index d2308c4..d5bc011 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -6,7 +6,7 @@ import 'package:rasadyar_core/infrastructure/local/hive_local_storage.dart'; final diCore = GetIt.instance; Future setupAllCoreProvider() async { - diCore.registerSingleton(AuthMiddleware()); + await _setUpLogger(); await _setupLocalStorage(); await _setupRemote(); @@ -23,4 +23,4 @@ Future _setupLocalStorage() async { Future _setupRemote() async { // diCore.registerSingleton(HiveLocalStorage()); -} +} \ No newline at end of file From d9724f681cb19b4074c5d46f4744d7c3250256ce Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 28 Jul 2025 15:57:30 +0330 Subject: [PATCH 244/256] feat : profile and map --- assets/icons/bg_auth.svg | 57 ++ assets/icons/chicken_marker_location.svg | 116 +++ lib/infrastructure/di/di.dart | 6 - .../service/app_navigation_observer.dart | 10 +- lib/main.dart | 1 + lib/presentation/pages/modules/logic.dart | 14 +- lib/presentation/pages/modules/view.dart | 3 + lib/presentation/pages/splash/logic.dart | 2 +- .../login_request/login_request_model.dart | 0 .../login_request_model.freezed.dart | 0 .../login_request/login_request_model.g.dart | 8 +- .../response/auth/auth_response_model.dart | 0 .../auth/auth_response_model.freezed.dart | 0 .../response/auth/auth_response_model.g.dart | 4 +- .../captcha/captcha_response_model.dart | 0 .../captcha_response_model.freezed.dart | 0 .../captcha/captcha_response_model.g.dart | 16 +- .../response/user_info/user_info_model.dart | 0 .../user_info/user_info_model.freezed.dart | 0 .../response/user_info/user_info_model.g.dart | 8 +- .../user_profile_model.dart | 0 .../user_profile_model.freezed.dart | 0 .../user_profile_model.g.dart | 24 +- packages/core/build.yaml | 6 + packages/core/lib/data/model/model.dart | 3 +- .../data/services/token_storage_service.dart | 7 +- .../lib/presentation/common/assets.gen.dart | 8 + packages/inspection/build.yaml | 6 + .../data_source/remote/auth/auth_remote.dart | 14 + .../remote/auth/auth_remote_imp.dart} | 32 +- .../remote/inspection/inspection_remote.dart | 22 + .../inspection/inspection_remote_imp.dart | 42 + .../remote/user/user_data_source.dart | 8 + .../remote/user/user_data_source_imp.dart | 25 + .../login_request/login_request_model.dart | 34 + .../login_request_model.freezed.dart | 286 +++++++ .../login_request/login_request_model.g.dart | 23 + .../response/auth/auth_response_model.dart | 20 + .../auth/auth_response_model.freezed.dart | 283 +++++++ .../response/auth/auth_response_model.g.dart | 21 + .../captcha/captcha_response_model.dart | 17 + .../captcha_response_model.freezed.dart | 286 +++++++ .../captcha/captcha_response_model.g.dart | 25 + .../poultry_location_model.dart | 68 ++ .../user_profile/user_profile_model.dart | 73 ++ .../repositories/auth/auth_repository.dart | 17 + .../auth/auth_repository_imp.dart | 37 + .../data/repositories/auth_repository.dart | 18 - .../inspection/inspection_repository.dart | 24 + .../inspection/inspection_repository_imp.dart | 34 + .../repositories/user/user_repository.dart | 19 + .../user/user_repository_imp.dart | 28 + .../data/utils/dio_exception_handeler.dart | 58 ++ .../lib/injection/inspection_di.dart | 71 ++ .../lib/presentation/pages/auth/logic.dart | 25 +- .../lib/presentation/pages/auth/view.dart | 2 +- .../pages/inspection_map/logic.dart | 159 ++-- .../pages/inspection_map/view.dart | 3 +- .../lib/presentation/pages/profile/logic.dart | 51 +- .../lib/presentation/pages/profile/view.dart | 717 +++++++++++++----- .../lib/presentation/pages/root/logic.dart | 77 +- .../lib/presentation/pages/root/view.dart | 76 +- .../lib/presentation/routes/app_pages.dart | 6 +- .../presentation/widget/captcha/logic.dart | 27 +- .../lib/presentation/widget/captcha/view.dart | 11 +- packages/inspection/pubspec.lock | 223 +++++- packages/inspection/pubspec.yaml | 18 + 67 files changed, 2835 insertions(+), 444 deletions(-) create mode 100644 assets/icons/bg_auth.svg create mode 100644 assets/icons/chicken_marker_location.svg rename packages/{core/lib/data/model => chicken/lib/data/models}/request/login_request/login_request_model.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/request/login_request/login_request_model.freezed.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/request/login_request/login_request_model.g.dart (77%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/auth/auth_response_model.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/auth/auth_response_model.freezed.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/auth/auth_response_model.g.dart (88%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/captcha/captcha_response_model.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/captcha/captcha_response_model.freezed.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/captcha/captcha_response_model.g.dart (59%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/user_info/user_info_model.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/user_info/user_info_model.freezed.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/user_info/user_info_model.g.dart (80%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/user_profile_model/user_profile_model.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/user_profile_model/user_profile_model.freezed.dart (100%) rename packages/{core/lib/data/model => chicken/lib/data/models}/response/user_profile_model/user_profile_model.g.dart (69%) create mode 100644 packages/core/build.yaml create mode 100644 packages/inspection/build.yaml create mode 100644 packages/inspection/lib/data/data_source/remote/auth/auth_remote.dart rename packages/inspection/lib/data/{repositories/auth_repository_imp.dart => data_source/remote/auth/auth_remote_imp.dart} (65%) create mode 100644 packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart create mode 100644 packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart create mode 100644 packages/inspection/lib/data/data_source/remote/user/user_data_source.dart create mode 100644 packages/inspection/lib/data/data_source/remote/user/user_data_source_imp.dart create mode 100644 packages/inspection/lib/data/model/request/login_request/login_request_model.dart create mode 100644 packages/inspection/lib/data/model/request/login_request/login_request_model.freezed.dart create mode 100644 packages/inspection/lib/data/model/request/login_request/login_request_model.g.dart create mode 100644 packages/inspection/lib/data/model/response/auth/auth_response_model.dart create mode 100644 packages/inspection/lib/data/model/response/auth/auth_response_model.freezed.dart create mode 100644 packages/inspection/lib/data/model/response/auth/auth_response_model.g.dart create mode 100644 packages/inspection/lib/data/model/response/captcha/captcha_response_model.dart create mode 100644 packages/inspection/lib/data/model/response/captcha/captcha_response_model.freezed.dart create mode 100644 packages/inspection/lib/data/model/response/captcha/captcha_response_model.g.dart create mode 100644 packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart create mode 100644 packages/inspection/lib/data/model/response/user_profile/user_profile_model.dart create mode 100644 packages/inspection/lib/data/repositories/auth/auth_repository.dart create mode 100644 packages/inspection/lib/data/repositories/auth/auth_repository_imp.dart delete mode 100644 packages/inspection/lib/data/repositories/auth_repository.dart create mode 100644 packages/inspection/lib/data/repositories/inspection/inspection_repository.dart create mode 100644 packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart create mode 100644 packages/inspection/lib/data/repositories/user/user_repository.dart create mode 100644 packages/inspection/lib/data/repositories/user/user_repository_imp.dart create mode 100644 packages/inspection/lib/data/utils/dio_exception_handeler.dart create mode 100644 packages/inspection/lib/injection/inspection_di.dart diff --git a/assets/icons/bg_auth.svg b/assets/icons/bg_auth.svg new file mode 100644 index 0000000..3863899 --- /dev/null +++ b/assets/icons/bg_auth.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/chicken_marker_location.svg b/assets/icons/chicken_marker_location.svg new file mode 100644 index 0000000..6d79658 --- /dev/null +++ b/assets/icons/chicken_marker_location.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index fdf6b7a..9a5a287 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -1,5 +1,3 @@ - -import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_core/core.dart'; final di = GetIt.instance; @@ -7,7 +5,3 @@ final di = GetIt.instance; Future setupPreInjection() async { await setupAllCoreProvider(); } - -Future setupInjection() async { - await setupChickenDI(); -} diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart index 9ad7b38..3cebc64 100644 --- a/lib/infrastructure/service/app_navigation_observer.dart +++ b/lib/infrastructure/service/app_navigation_observer.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_app/infrastructure/di/di.dart'; import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; +import 'package:rasadyar_inspection/inspection.dart'; class CustomNavigationObserver extends NavigatorObserver { bool _isWorkDone = false; @@ -16,7 +18,11 @@ class CustomNavigationObserver extends NavigatorObserver { final routeName = route.settings.name; if (!_isWorkDone && routeName == ChickenRoutes.init) { _isWorkDone = true; - await setupInjection(); + setupChickenDI(); + } else if (!_isWorkDone && (routeName == InspectionRoutes.init || routeName == InspectionRoutes.auth)) { + _isWorkDone = true; + + await setupInspectionDI(); } tLog('CustomNavigationObserver: didPush - $routeName'); } diff --git a/lib/main.dart b/lib/main.dart index ec1cee0..09db360 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ Future main() async { await Get.find().init(); Get.put(AppAuthRouteResolver()); Get.put(AuthMiddleware()); + runApp(MyApp()); // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); diff --git a/lib/presentation/pages/modules/logic.dart b/lib/presentation/pages/modules/logic.dart index 628b7a8..d35b096 100644 --- a/lib/presentation/pages/modules/logic.dart +++ b/lib/presentation/pages/modules/logic.dart @@ -1,28 +1,28 @@ - import 'package:rasadyar_core/core.dart'; class ModulesLogic extends GetxController { + TokenStorageService tokenService = Get.find(); - List moduleList=[ + List moduleList = [ ModuleModel(title: 'بازرسی', icon: Assets.icons.inspection.path, module: Module.inspection), ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks), ModuleModel(title: 'مرغ', icon: Assets.icons.liveStock.path, module: Module.chicken), ]; - RxnInt selectedIndex = RxnInt(null); - @override void onReady() { super.onReady(); } - - - @override void onClose() { super.onClose(); } + + void saveModule(Module module) { + tokenService.saveModule(module); + tokenService.appModule.value = module; + } } diff --git a/lib/presentation/pages/modules/view.dart b/lib/presentation/pages/modules/view.dart index 464b741..b1d1bbf 100644 --- a/lib/presentation/pages/modules/view.dart +++ b/lib/presentation/pages/modules/view.dart @@ -25,6 +25,9 @@ class ModulesPage extends GetView { icon: module.icon, onTap: () { controller.selectedIndex.value = index; + controller.saveModule(module.module); + + // Navigate to the appropriate route based on the selected module switch (module.module) { case Module.inspection: Get.toNamed(InspectionRoutes.init); diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 1b62220..a9f1a8d 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -152,7 +152,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { try { final isUpdateNeeded = await checkVersion(); if (isUpdateNeeded) return; - + tokenService.getModule(); final module = tokenService.appModule.value; final target = getTargetPage(module); Get.offAndToNamed(target); diff --git a/packages/core/lib/data/model/request/login_request/login_request_model.dart b/packages/chicken/lib/data/models/request/login_request/login_request_model.dart similarity index 100% rename from packages/core/lib/data/model/request/login_request/login_request_model.dart rename to packages/chicken/lib/data/models/request/login_request/login_request_model.dart diff --git a/packages/core/lib/data/model/request/login_request/login_request_model.freezed.dart b/packages/chicken/lib/data/models/request/login_request/login_request_model.freezed.dart similarity index 100% rename from packages/core/lib/data/model/request/login_request/login_request_model.freezed.dart rename to packages/chicken/lib/data/models/request/login_request/login_request_model.freezed.dart diff --git a/packages/core/lib/data/model/request/login_request/login_request_model.g.dart b/packages/chicken/lib/data/models/request/login_request/login_request_model.g.dart similarity index 77% rename from packages/core/lib/data/model/request/login_request/login_request_model.g.dart rename to packages/chicken/lib/data/models/request/login_request/login_request_model.g.dart index f10c8a6..4504142 100644 --- a/packages/core/lib/data/model/request/login_request/login_request_model.g.dart +++ b/packages/chicken/lib/data/models/request/login_request/login_request_model.g.dart @@ -10,14 +10,14 @@ _LoginRequestModel _$LoginRequestModelFromJson(Map json) => _LoginRequestModel( username: json['username'] as String?, password: json['password'] as String?, - captchaCode: json['captchaCode'] as String?, - captchaKey: json['captchaKey'] as String?, + captchaCode: json['captcha_code'] as String?, + captchaKey: json['captcha_key'] as String?, ); Map _$LoginRequestModelToJson(_LoginRequestModel instance) => { 'username': instance.username, 'password': instance.password, - 'captchaCode': instance.captchaCode, - 'captchaKey': instance.captchaKey, + 'captcha_code': instance.captchaCode, + 'captcha_key': instance.captchaKey, }; diff --git a/packages/core/lib/data/model/response/auth/auth_response_model.dart b/packages/chicken/lib/data/models/response/auth/auth_response_model.dart similarity index 100% rename from packages/core/lib/data/model/response/auth/auth_response_model.dart rename to packages/chicken/lib/data/models/response/auth/auth_response_model.dart diff --git a/packages/core/lib/data/model/response/auth/auth_response_model.freezed.dart b/packages/chicken/lib/data/models/response/auth/auth_response_model.freezed.dart similarity index 100% rename from packages/core/lib/data/model/response/auth/auth_response_model.freezed.dart rename to packages/chicken/lib/data/models/response/auth/auth_response_model.freezed.dart diff --git a/packages/core/lib/data/model/response/auth/auth_response_model.g.dart b/packages/chicken/lib/data/models/response/auth/auth_response_model.g.dart similarity index 88% rename from packages/core/lib/data/model/response/auth/auth_response_model.g.dart rename to packages/chicken/lib/data/models/response/auth/auth_response_model.g.dart index 642fa02..dc5d66d 100644 --- a/packages/core/lib/data/model/response/auth/auth_response_model.g.dart +++ b/packages/chicken/lib/data/models/response/auth/auth_response_model.g.dart @@ -10,12 +10,12 @@ _AuthResponseModel _$AuthResponseModelFromJson(Map json) => _AuthResponseModel( refresh: json['refresh'] as String?, access: json['access'] as String?, - otpStatus: json['otpStatus'] as bool?, + otpStatus: json['otp_status'] as bool?, ); Map _$AuthResponseModelToJson(_AuthResponseModel instance) => { 'refresh': instance.refresh, 'access': instance.access, - 'otpStatus': instance.otpStatus, + 'otp_status': instance.otpStatus, }; diff --git a/packages/core/lib/data/model/response/captcha/captcha_response_model.dart b/packages/chicken/lib/data/models/response/captcha/captcha_response_model.dart similarity index 100% rename from packages/core/lib/data/model/response/captcha/captcha_response_model.dart rename to packages/chicken/lib/data/models/response/captcha/captcha_response_model.dart diff --git a/packages/core/lib/data/model/response/captcha/captcha_response_model.freezed.dart b/packages/chicken/lib/data/models/response/captcha/captcha_response_model.freezed.dart similarity index 100% rename from packages/core/lib/data/model/response/captcha/captcha_response_model.freezed.dart rename to packages/chicken/lib/data/models/response/captcha/captcha_response_model.freezed.dart diff --git a/packages/core/lib/data/model/response/captcha/captcha_response_model.g.dart b/packages/chicken/lib/data/models/response/captcha/captcha_response_model.g.dart similarity index 59% rename from packages/core/lib/data/model/response/captcha/captcha_response_model.g.dart rename to packages/chicken/lib/data/models/response/captcha/captcha_response_model.g.dart index a0ffdcb..8d69248 100644 --- a/packages/core/lib/data/model/response/captcha/captcha_response_model.g.dart +++ b/packages/chicken/lib/data/models/response/captcha/captcha_response_model.g.dart @@ -9,17 +9,17 @@ part of 'captcha_response_model.dart'; _CaptchaResponseModel _$CaptchaResponseModelFromJson( Map json, ) => _CaptchaResponseModel( - captchaKey: json['captchaKey'] as String?, - captchaImage: json['captchaImage'] as String?, - imageType: json['imageType'] as String?, - imageDecode: json['imageDecode'] as String?, + captchaKey: json['captcha_key'] as String?, + captchaImage: json['captcha_image'] as String?, + imageType: json['image_type'] as String?, + imageDecode: json['image_decode'] as String?, ); Map _$CaptchaResponseModelToJson( _CaptchaResponseModel instance, ) => { - 'captchaKey': instance.captchaKey, - 'captchaImage': instance.captchaImage, - 'imageType': instance.imageType, - 'imageDecode': instance.imageDecode, + 'captcha_key': instance.captchaKey, + 'captcha_image': instance.captchaImage, + 'image_type': instance.imageType, + 'image_decode': instance.imageDecode, }; diff --git a/packages/core/lib/data/model/response/user_info/user_info_model.dart b/packages/chicken/lib/data/models/response/user_info/user_info_model.dart similarity index 100% rename from packages/core/lib/data/model/response/user_info/user_info_model.dart rename to packages/chicken/lib/data/models/response/user_info/user_info_model.dart diff --git a/packages/core/lib/data/model/response/user_info/user_info_model.freezed.dart b/packages/chicken/lib/data/models/response/user_info/user_info_model.freezed.dart similarity index 100% rename from packages/core/lib/data/model/response/user_info/user_info_model.freezed.dart rename to packages/chicken/lib/data/models/response/user_info/user_info_model.freezed.dart diff --git a/packages/core/lib/data/model/response/user_info/user_info_model.g.dart b/packages/chicken/lib/data/models/response/user_info/user_info_model.g.dart similarity index 80% rename from packages/core/lib/data/model/response/user_info/user_info_model.g.dart rename to packages/chicken/lib/data/models/response/user_info/user_info_model.g.dart index 13ceb8e..2c8f1c4 100644 --- a/packages/core/lib/data/model/response/user_info/user_info_model.g.dart +++ b/packages/chicken/lib/data/models/response/user_info/user_info_model.g.dart @@ -8,16 +8,16 @@ part of 'user_info_model.dart'; _UserInfoModel _$UserInfoModelFromJson(Map json) => _UserInfoModel( - isUser: json['isUser'] as bool?, + isUser: json['is_user'] as bool?, address: json['address'] as String?, backend: json['backend'] as String?, - apiKey: json['apiKey'] as String?, + apiKey: json['api_key'] as String?, ); Map _$UserInfoModelToJson(_UserInfoModel instance) => { - 'isUser': instance.isUser, + 'is_user': instance.isUser, 'address': instance.address, 'backend': instance.backend, - 'apiKey': instance.apiKey, + 'api_key': instance.apiKey, }; diff --git a/packages/core/lib/data/model/response/user_profile_model/user_profile_model.dart b/packages/chicken/lib/data/models/response/user_profile_model/user_profile_model.dart similarity index 100% rename from packages/core/lib/data/model/response/user_profile_model/user_profile_model.dart rename to packages/chicken/lib/data/models/response/user_profile_model/user_profile_model.dart diff --git a/packages/core/lib/data/model/response/user_profile_model/user_profile_model.freezed.dart b/packages/chicken/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart similarity index 100% rename from packages/core/lib/data/model/response/user_profile_model/user_profile_model.freezed.dart rename to packages/chicken/lib/data/models/response/user_profile_model/user_profile_model.freezed.dart diff --git a/packages/core/lib/data/model/response/user_profile_model/user_profile_model.g.dart b/packages/chicken/lib/data/models/response/user_profile_model/user_profile_model.g.dart similarity index 69% rename from packages/core/lib/data/model/response/user_profile_model/user_profile_model.g.dart rename to packages/chicken/lib/data/models/response/user_profile_model/user_profile_model.g.dart index 170f03f..df72e0e 100644 --- a/packages/core/lib/data/model/response/user_profile_model/user_profile_model.g.dart +++ b/packages/chicken/lib/data/models/response/user_profile_model/user_profile_model.g.dart @@ -8,40 +8,40 @@ part of 'user_profile_model.dart'; _UserProfileModel _$UserProfileModelFromJson(Map json) => _UserProfileModel( - accessToken: json['accessToken'] as String?, - expiresIn: json['expiresIn'] as String?, + accessToken: json['access_token'] as String?, + expiresIn: json['expires_in'] as String?, scope: json['scope'] as String?, - expireTime: json['expireTime'] as String?, + expireTime: json['expire_time'] as String?, mobile: json['mobile'] as String?, fullname: json['fullname'] as String?, firstname: json['firstname'] as String?, lastname: json['lastname'] as String?, city: json['city'] as String?, province: json['province'] as String?, - nationalCode: json['nationalCode'] as String?, - nationalId: json['nationalId'] as String?, + nationalCode: json['national_code'] as String?, + nationalId: json['national_id'] as String?, birthday: json['birthday'] as String?, image: json['image'] as String?, - baseOrder: (json['baseOrder'] as num?)?.toInt(), + baseOrder: (json['base_order'] as num?)?.toInt(), role: (json['role'] as List?)?.map((e) => e as String).toList(), ); Map _$UserProfileModelToJson(_UserProfileModel instance) => { - 'accessToken': instance.accessToken, - 'expiresIn': instance.expiresIn, + 'access_token': instance.accessToken, + 'expires_in': instance.expiresIn, 'scope': instance.scope, - 'expireTime': instance.expireTime, + 'expire_time': instance.expireTime, 'mobile': instance.mobile, 'fullname': instance.fullname, 'firstname': instance.firstname, 'lastname': instance.lastname, 'city': instance.city, 'province': instance.province, - 'nationalCode': instance.nationalCode, - 'nationalId': instance.nationalId, + 'national_code': instance.nationalCode, + 'national_id': instance.nationalId, 'birthday': instance.birthday, 'image': instance.image, - 'baseOrder': instance.baseOrder, + 'base_order': instance.baseOrder, 'role': instance.role, }; diff --git a/packages/core/build.yaml b/packages/core/build.yaml new file mode 100644 index 0000000..840029b --- /dev/null +++ b/packages/core/build.yaml @@ -0,0 +1,6 @@ +targets: + $default: + builders: + json_serializable: + options: + field_rename: snake \ No newline at end of file diff --git a/packages/core/lib/data/model/model.dart b/packages/core/lib/data/model/model.dart index 4a8a622..6d07ea5 100644 --- a/packages/core/lib/data/model/model.dart +++ b/packages/core/lib/data/model/model.dart @@ -1,3 +1,4 @@ + +export 'pagination_model/pagination_model.dart'; export 'local/module/module_model.dart'; export 'local/user_local/user_local_model.dart'; -export 'pagination_model/pagination_model.dart'; diff --git a/packages/core/lib/data/services/token_storage_service.dart b/packages/core/lib/data/services/token_storage_service.dart index c62c2ba..ab551c9 100644 --- a/packages/core/lib/data/services/token_storage_service.dart +++ b/packages/core/lib/data/services/token_storage_service.dart @@ -1,4 +1,5 @@ import 'dart:convert'; + import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/hive_registrar.g.dart'; @@ -38,7 +39,7 @@ class TokenStorageService extends GetxService { accessToken.value = _localStorage.read(boxName: _tokenBoxName, key: _accessTokenKey); refreshToken.value = _localStorage.read(boxName: _tokenBoxName, key: _refreshTokenKey); - appModule.value = _localStorage.read(boxName: _appBoxName, key: _moduleKey); + appModule.value = getModule(); baseurl.value = _localStorage.read(boxName: _appBoxName, key: _baseUrlKey); } @@ -60,6 +61,10 @@ class TokenStorageService extends GetxService { appModule.refresh(); } + Module? getModule() { + return _localStorage.read(boxName: _tokenBoxName, key: _moduleKey); + } + Future deleteTokens() async { await _localStorage.clear(_tokenBoxName); accessToken.value = null; diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index aa17d8b..dba8dfe 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -46,6 +46,9 @@ class $AssetsIconsGen { /// File path: assets/icons/arrow_right.svg SvgGenImage get arrowRight => const SvgGenImage('assets/icons/arrow_right.svg'); + /// File path: assets/icons/bg_auth.svg + SvgGenImage get bgAuth => const SvgGenImage('assets/icons/bg_auth.svg'); + /// File path: assets/icons/bg_header_user_profile.svg SvgGenImage get bgHeaderUserProfile => const SvgGenImage('assets/icons/bg_header_user_profile.svg'); @@ -278,6 +281,7 @@ class $AssetsIconsGen { appBarInspection, arrowLeft, arrowRight, + bgAuth, bgHeaderUserProfile, buy, calendar, @@ -403,6 +407,9 @@ class $AssetsVecGen { /// File path: assets/vec/arrow_right.svg.vec SvgGenImage get arrowRightSvg => const SvgGenImage.vec('assets/vec/arrow_right.svg.vec'); + /// File path: assets/vec/bg_auth.svg.vec + SvgGenImage get bgAuthSvg => const SvgGenImage.vec('assets/vec/bg_auth.svg.vec'); + /// File path: assets/vec/bg_header_user_profile.svg.vec SvgGenImage get bgHeaderUserProfileSvg => const SvgGenImage.vec('assets/vec/bg_header_user_profile.svg.vec'); @@ -635,6 +642,7 @@ class $AssetsVecGen { appBarInspectionSvg, arrowLeftSvg, arrowRightSvg, + bgAuthSvg, bgHeaderUserProfileSvg, buySvg, calendarSvg, diff --git a/packages/inspection/build.yaml b/packages/inspection/build.yaml new file mode 100644 index 0000000..840029b --- /dev/null +++ b/packages/inspection/build.yaml @@ -0,0 +1,6 @@ +targets: + $default: + builders: + json_serializable: + options: + field_rename: snake \ No newline at end of file diff --git a/packages/inspection/lib/data/data_source/remote/auth/auth_remote.dart b/packages/inspection/lib/data/data_source/remote/auth/auth_remote.dart new file mode 100644 index 0000000..eacaeeb --- /dev/null +++ b/packages/inspection/lib/data/data_source/remote/auth/auth_remote.dart @@ -0,0 +1,14 @@ +import 'package:rasadyar_inspection/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_inspection/data/model/response/captcha/captcha_response_model.dart'; + +abstract class AuthRemote { + Future login({required Map authRequest}); + + Future captcha(); + + Future logout(); + + Future hasAuthenticated(); + + Future loginWithRefreshToken({required Map authRequest}); +} diff --git a/packages/inspection/lib/data/repositories/auth_repository_imp.dart b/packages/inspection/lib/data/data_source/remote/auth/auth_remote_imp.dart similarity index 65% rename from packages/inspection/lib/data/repositories/auth_repository_imp.dart rename to packages/inspection/lib/data/data_source/remote/auth/auth_remote_imp.dart index 25a3ff6..ff1b37e 100644 --- a/packages/inspection/lib/data/repositories/auth_repository_imp.dart +++ b/packages/inspection/lib/data/data_source/remote/auth/auth_remote_imp.dart @@ -1,22 +1,22 @@ import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/model/response/auth/auth_response_model.dart'; -import 'package:rasadyar_core/data/model/response/captcha/captcha_response_model.dart'; -import 'package:rasadyar_core/data/model/response/user_info/user_info_model.dart'; -import 'package:rasadyar_core/data/model/response/user_profile_model/user_profile_model.dart'; -import 'auth_repository.dart'; +import 'package:rasadyar_inspection/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_inspection/data/model/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; -class AuthRepositoryImpl implements AuthRepository { +import 'auth_remote.dart'; + +class AuthRemoteImp extends AuthRemote { final DioRemote _httpClient; final String _BASE_URL = 'auth/api/v1/'; - AuthRepositoryImpl(this._httpClient); + AuthRemoteImp(this._httpClient); @override - Future login({required Map authRequest}) async { - var res = await _httpClient.post( - '/api/login/', + Future login({required Map authRequest}) async { + var res = await _httpClient.post( + '${_BASE_URL}login/', data: authRequest, - fromJson: UserProfileModel.fromJson, + fromJson: AuthResponseModel.fromJson, headers: {'Content-Type': 'application/json'}, ); return res.data; @@ -59,14 +59,14 @@ class AuthRepositoryImpl implements AuthRepository { return response.data ?? false; } - @override - Future getUserInfo(String phoneNumber) async { - var res = await _httpClient.post( +/* @override + Future getUserInfo(String phoneNumber) async { + var res = await _httpClient.post( 'https://userbackend.rasadyaar.ir/api/send_otp/', data: {"mobile": phoneNumber, "state": ""}, - fromJson: UserInfoModel.fromJson, + fromJson: UserProfileModel.fromJson, headers: {'Content-Type': 'application/json'}, ); return res.data; - } + }*/ } diff --git a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart new file mode 100644 index 0000000..4641e70 --- /dev/null +++ b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart @@ -0,0 +1,22 @@ +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; + +abstract class InspectionRemoteDataSource { + /// Fetches the inspection data for a given [inspectionId]. + /// + /// Returns a `Future` that resolves to a `Map` containing + /// the inspection data. + Future> fetchInspectionData(String inspectionId); + + /// Fetches the list of inspections for a given [userId]. + /// + /// Returns a `Future` that resolves to a `List>` + /// containing the list of inspections. + Future>> fetchInspections(String userId); + + + Future?> getNearbyLocation({ + double? centerLat, + double? centerLng, + double? radius, + }); +} diff --git a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart new file mode 100644 index 0000000..6309fa6 --- /dev/null +++ b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart @@ -0,0 +1,42 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/data_source/remote/inspection/inspection_remote.dart'; +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; + +class InspectionRemoteDataSourceImp implements InspectionRemoteDataSource { + final DioRemote _httpClient; + final String _BASE_URL = 'auth/api/v1/'; + + InspectionRemoteDataSourceImp(this._httpClient); + + @override + Future> fetchInspectionData(String inspectionId) { + // TODO: implement fetchInspectionData + throw UnimplementedError(); + } + + @override + Future>> fetchInspections(String userId) { + // TODO: implement fetchInspections + throw UnimplementedError(); + } + + @override + Future?> getNearbyLocation({ + double? centerLat, + double? centerLng, + double? radius, + }) async { + DioRemote dioRemote = DioRemote(baseUrl: 'https://habackend.rasadyaar.ir/'); + await dioRemote.init(); + + var res = await dioRemote.get>( + 'poultry-loc/', + queryParameters: {'center_lat': centerLat, 'center_lng': centerLng, 'radius': radius}, + headers: {'Content-Type': 'application/json'}, + fromJsonList: (json) => + json.map((item) => PoultryLocationModel.fromJson(item as Map)).toList(), + ); + + return res.data; + } +} diff --git a/packages/inspection/lib/data/data_source/remote/user/user_data_source.dart b/packages/inspection/lib/data/data_source/remote/user/user_data_source.dart new file mode 100644 index 0000000..7d013a7 --- /dev/null +++ b/packages/inspection/lib/data/data_source/remote/user/user_data_source.dart @@ -0,0 +1,8 @@ + +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; + +abstract class UserRemoteDataSource { + + Future getProfile({required String token}); + +} \ No newline at end of file diff --git a/packages/inspection/lib/data/data_source/remote/user/user_data_source_imp.dart b/packages/inspection/lib/data/data_source/remote/user/user_data_source_imp.dart new file mode 100644 index 0000000..da0a32f --- /dev/null +++ b/packages/inspection/lib/data/data_source/remote/user/user_data_source_imp.dart @@ -0,0 +1,25 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/data_source/remote/user/user_data_source.dart'; +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; + +class UserRemoteDataSourceImp extends UserRemoteDataSource { + final DioRemote _httpClient; + final String _BASE_URL = 'auth/api/v1/'; + + UserRemoteDataSourceImp(this._httpClient); + + @override + Future getProfile({required String token}) async { + var res = await _httpClient.get( + '${_BASE_URL}user/profile/', + fromJson: UserProfileModel.fromJson, + headers: {'Content-Type': 'application/json', 'Authorization': 'Bearer $token'}, + ); + + if (res.data == null) { + throw Exception('Failed to load user profile'); + } + + return res.data!; + } +} diff --git a/packages/inspection/lib/data/model/request/login_request/login_request_model.dart b/packages/inspection/lib/data/model/request/login_request/login_request_model.dart new file mode 100644 index 0000000..0e76bc2 --- /dev/null +++ b/packages/inspection/lib/data/model/request/login_request/login_request_model.dart @@ -0,0 +1,34 @@ +import 'package:rasadyar_core/core.dart'; + +part 'login_request_model.freezed.dart'; +part 'login_request_model.g.dart'; + +@freezed +abstract class LoginRequestModel with _$LoginRequestModel { + const factory LoginRequestModel({ + String? username, + String? password, + String? captchaCode, + String? captchaKey, + }) = _LoginRequestModel; + + factory LoginRequestModel.createWithCaptcha({ + required String username, + required String password, + required String captchaCode, + required String captchaKey, + }) { + return LoginRequestModel( + username: username, + password: password, + captchaCode: captchaCode, + captchaKey: 'rest_captcha_$captchaKey.0', + ); + } + + factory LoginRequestModel.fromJson(Map json) => + _$LoginRequestModelFromJson(json); + + const LoginRequestModel._(); + +} diff --git a/packages/inspection/lib/data/model/request/login_request/login_request_model.freezed.dart b/packages/inspection/lib/data/model/request/login_request/login_request_model.freezed.dart new file mode 100644 index 0000000..9b91ad6 --- /dev/null +++ b/packages/inspection/lib/data/model/request/login_request/login_request_model.freezed.dart @@ -0,0 +1,286 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'login_request_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$LoginRequestModel { + + String? get username; String? get password; String? get captchaCode; String? get captchaKey; +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LoginRequestModelCopyWith get copyWith => _$LoginRequestModelCopyWithImpl(this as LoginRequestModel, _$identity); + + /// Serializes this LoginRequestModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)&&(identical(other.captchaCode, captchaCode) || other.captchaCode == captchaCode)&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,username,password,captchaCode,captchaKey); + +@override +String toString() { + return 'LoginRequestModel(username: $username, password: $password, captchaCode: $captchaCode, captchaKey: $captchaKey)'; +} + + +} + +/// @nodoc +abstract mixin class $LoginRequestModelCopyWith<$Res> { + factory $LoginRequestModelCopyWith(LoginRequestModel value, $Res Function(LoginRequestModel) _then) = _$LoginRequestModelCopyWithImpl; +@useResult +$Res call({ + String? username, String? password, String? captchaCode, String? captchaKey +}); + + + + +} +/// @nodoc +class _$LoginRequestModelCopyWithImpl<$Res> + implements $LoginRequestModelCopyWith<$Res> { + _$LoginRequestModelCopyWithImpl(this._self, this._then); + + final LoginRequestModel _self; + final $Res Function(LoginRequestModel) _then; + +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? username = freezed,Object? password = freezed,Object? captchaCode = freezed,Object? captchaKey = freezed,}) { + return _then(_self.copyWith( +username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?,captchaCode: freezed == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable +as String?,captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [LoginRequestModel]. +extension LoginRequestModelPatterns on LoginRequestModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _LoginRequestModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _LoginRequestModel value) $default,){ +final _that = this; +switch (_that) { +case _LoginRequestModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _LoginRequestModel value)? $default,){ +final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? username, String? password, String? captchaCode, String? captchaKey)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that.username,_that.password,_that.captchaCode,_that.captchaKey);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? username, String? password, String? captchaCode, String? captchaKey) $default,) {final _that = this; +switch (_that) { +case _LoginRequestModel(): +return $default(_that.username,_that.password,_that.captchaCode,_that.captchaKey);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? username, String? password, String? captchaCode, String? captchaKey)? $default,) {final _that = this; +switch (_that) { +case _LoginRequestModel() when $default != null: +return $default(_that.username,_that.password,_that.captchaCode,_that.captchaKey);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _LoginRequestModel extends LoginRequestModel { + const _LoginRequestModel({this.username, this.password, this.captchaCode, this.captchaKey}): super._(); + factory _LoginRequestModel.fromJson(Map json) => _$LoginRequestModelFromJson(json); + +@override final String? username; +@override final String? password; +@override final String? captchaCode; +@override final String? captchaKey; + +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$LoginRequestModelCopyWith<_LoginRequestModel> get copyWith => __$LoginRequestModelCopyWithImpl<_LoginRequestModel>(this, _$identity); + +@override +Map toJson() { + return _$LoginRequestModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _LoginRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)&&(identical(other.captchaCode, captchaCode) || other.captchaCode == captchaCode)&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,username,password,captchaCode,captchaKey); + +@override +String toString() { + return 'LoginRequestModel(username: $username, password: $password, captchaCode: $captchaCode, captchaKey: $captchaKey)'; +} + + +} + +/// @nodoc +abstract mixin class _$LoginRequestModelCopyWith<$Res> implements $LoginRequestModelCopyWith<$Res> { + factory _$LoginRequestModelCopyWith(_LoginRequestModel value, $Res Function(_LoginRequestModel) _then) = __$LoginRequestModelCopyWithImpl; +@override @useResult +$Res call({ + String? username, String? password, String? captchaCode, String? captchaKey +}); + + + + +} +/// @nodoc +class __$LoginRequestModelCopyWithImpl<$Res> + implements _$LoginRequestModelCopyWith<$Res> { + __$LoginRequestModelCopyWithImpl(this._self, this._then); + + final _LoginRequestModel _self; + final $Res Function(_LoginRequestModel) _then; + +/// Create a copy of LoginRequestModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? username = freezed,Object? password = freezed,Object? captchaCode = freezed,Object? captchaKey = freezed,}) { + return _then(_LoginRequestModel( +username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?,captchaCode: freezed == captchaCode ? _self.captchaCode : captchaCode // ignore: cast_nullable_to_non_nullable +as String?,captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/inspection/lib/data/model/request/login_request/login_request_model.g.dart b/packages/inspection/lib/data/model/request/login_request/login_request_model.g.dart new file mode 100644 index 0000000..4504142 --- /dev/null +++ b/packages/inspection/lib/data/model/request/login_request/login_request_model.g.dart @@ -0,0 +1,23 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'login_request_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_LoginRequestModel _$LoginRequestModelFromJson(Map json) => + _LoginRequestModel( + username: json['username'] as String?, + password: json['password'] as String?, + captchaCode: json['captcha_code'] as String?, + captchaKey: json['captcha_key'] as String?, + ); + +Map _$LoginRequestModelToJson(_LoginRequestModel instance) => + { + 'username': instance.username, + 'password': instance.password, + 'captcha_code': instance.captchaCode, + 'captcha_key': instance.captchaKey, + }; diff --git a/packages/inspection/lib/data/model/response/auth/auth_response_model.dart b/packages/inspection/lib/data/model/response/auth/auth_response_model.dart new file mode 100644 index 0000000..1f5faba --- /dev/null +++ b/packages/inspection/lib/data/model/response/auth/auth_response_model.dart @@ -0,0 +1,20 @@ + + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'auth_response_model.freezed.dart'; +part 'auth_response_model.g.dart'; + +@freezed +abstract class AuthResponseModel with _$AuthResponseModel { + const factory AuthResponseModel({ + String? refresh, + String? access, + bool? otpStatus, + }) = _AuthResponseModel; + + factory AuthResponseModel.fromJson(Map json) => + _$AuthResponseModelFromJson(json); + +} + diff --git a/packages/inspection/lib/data/model/response/auth/auth_response_model.freezed.dart b/packages/inspection/lib/data/model/response/auth/auth_response_model.freezed.dart new file mode 100644 index 0000000..fdca0fc --- /dev/null +++ b/packages/inspection/lib/data/model/response/auth/auth_response_model.freezed.dart @@ -0,0 +1,283 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'auth_response_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$AuthResponseModel { + + String? get refresh; String? get access; bool? get otpStatus; +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AuthResponseModelCopyWith get copyWith => _$AuthResponseModelCopyWithImpl(this as AuthResponseModel, _$identity); + + /// Serializes this AuthResponseModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AuthResponseModel&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); + +@override +String toString() { + return 'AuthResponseModel(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; +} + + +} + +/// @nodoc +abstract mixin class $AuthResponseModelCopyWith<$Res> { + factory $AuthResponseModelCopyWith(AuthResponseModel value, $Res Function(AuthResponseModel) _then) = _$AuthResponseModelCopyWithImpl; +@useResult +$Res call({ + String? refresh, String? access, bool? otpStatus +}); + + + + +} +/// @nodoc +class _$AuthResponseModelCopyWithImpl<$Res> + implements $AuthResponseModelCopyWith<$Res> { + _$AuthResponseModelCopyWithImpl(this._self, this._then); + + final AuthResponseModel _self; + final $Res Function(AuthResponseModel) _then; + +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { + return _then(_self.copyWith( +refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable +as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable +as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [AuthResponseModel]. +extension AuthResponseModelPatterns on AuthResponseModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _AuthResponseModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _AuthResponseModel value) $default,){ +final _that = this; +switch (_that) { +case _AuthResponseModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _AuthResponseModel value)? $default,){ +final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? refresh, String? access, bool? otpStatus)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that.refresh,_that.access,_that.otpStatus);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? refresh, String? access, bool? otpStatus) $default,) {final _that = this; +switch (_that) { +case _AuthResponseModel(): +return $default(_that.refresh,_that.access,_that.otpStatus);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? refresh, String? access, bool? otpStatus)? $default,) {final _that = this; +switch (_that) { +case _AuthResponseModel() when $default != null: +return $default(_that.refresh,_that.access,_that.otpStatus);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _AuthResponseModel implements AuthResponseModel { + const _AuthResponseModel({this.refresh, this.access, this.otpStatus}); + factory _AuthResponseModel.fromJson(Map json) => _$AuthResponseModelFromJson(json); + +@override final String? refresh; +@override final String? access; +@override final bool? otpStatus; + +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AuthResponseModelCopyWith<_AuthResponseModel> get copyWith => __$AuthResponseModelCopyWithImpl<_AuthResponseModel>(this, _$identity); + +@override +Map toJson() { + return _$AuthResponseModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AuthResponseModel&&(identical(other.refresh, refresh) || other.refresh == refresh)&&(identical(other.access, access) || other.access == access)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,refresh,access,otpStatus); + +@override +String toString() { + return 'AuthResponseModel(refresh: $refresh, access: $access, otpStatus: $otpStatus)'; +} + + +} + +/// @nodoc +abstract mixin class _$AuthResponseModelCopyWith<$Res> implements $AuthResponseModelCopyWith<$Res> { + factory _$AuthResponseModelCopyWith(_AuthResponseModel value, $Res Function(_AuthResponseModel) _then) = __$AuthResponseModelCopyWithImpl; +@override @useResult +$Res call({ + String? refresh, String? access, bool? otpStatus +}); + + + + +} +/// @nodoc +class __$AuthResponseModelCopyWithImpl<$Res> + implements _$AuthResponseModelCopyWith<$Res> { + __$AuthResponseModelCopyWithImpl(this._self, this._then); + + final _AuthResponseModel _self; + final $Res Function(_AuthResponseModel) _then; + +/// Create a copy of AuthResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? refresh = freezed,Object? access = freezed,Object? otpStatus = freezed,}) { + return _then(_AuthResponseModel( +refresh: freezed == refresh ? _self.refresh : refresh // ignore: cast_nullable_to_non_nullable +as String?,access: freezed == access ? _self.access : access // ignore: cast_nullable_to_non_nullable +as String?,otpStatus: freezed == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + +// dart format on diff --git a/packages/inspection/lib/data/model/response/auth/auth_response_model.g.dart b/packages/inspection/lib/data/model/response/auth/auth_response_model.g.dart new file mode 100644 index 0000000..dc5d66d --- /dev/null +++ b/packages/inspection/lib/data/model/response/auth/auth_response_model.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'auth_response_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_AuthResponseModel _$AuthResponseModelFromJson(Map json) => + _AuthResponseModel( + refresh: json['refresh'] as String?, + access: json['access'] as String?, + otpStatus: json['otp_status'] as bool?, + ); + +Map _$AuthResponseModelToJson(_AuthResponseModel instance) => + { + 'refresh': instance.refresh, + 'access': instance.access, + 'otp_status': instance.otpStatus, + }; diff --git a/packages/inspection/lib/data/model/response/captcha/captcha_response_model.dart b/packages/inspection/lib/data/model/response/captcha/captcha_response_model.dart new file mode 100644 index 0000000..2b2f986 --- /dev/null +++ b/packages/inspection/lib/data/model/response/captcha/captcha_response_model.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'captcha_response_model.freezed.dart'; +part 'captcha_response_model.g.dart'; + +@freezed +abstract class CaptchaResponseModel with _$CaptchaResponseModel { + const factory CaptchaResponseModel({ + String? captchaKey, + String? captchaImage, + String? imageType, + String? imageDecode, + }) = _CaptchaResponseModel; + + factory CaptchaResponseModel.fromJson(Map json) => + _$CaptchaResponseModelFromJson(json); +} diff --git a/packages/inspection/lib/data/model/response/captcha/captcha_response_model.freezed.dart b/packages/inspection/lib/data/model/response/captcha/captcha_response_model.freezed.dart new file mode 100644 index 0000000..33d0167 --- /dev/null +++ b/packages/inspection/lib/data/model/response/captcha/captcha_response_model.freezed.dart @@ -0,0 +1,286 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'captcha_response_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$CaptchaResponseModel { + + String? get captchaKey; String? get captchaImage; String? get imageType; String? get imageDecode; +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CaptchaResponseModelCopyWith get copyWith => _$CaptchaResponseModelCopyWithImpl(this as CaptchaResponseModel, _$identity); + + /// Serializes this CaptchaResponseModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is CaptchaResponseModel&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)&&(identical(other.captchaImage, captchaImage) || other.captchaImage == captchaImage)&&(identical(other.imageType, imageType) || other.imageType == imageType)&&(identical(other.imageDecode, imageDecode) || other.imageDecode == imageDecode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,captchaKey,captchaImage,imageType,imageDecode); + +@override +String toString() { + return 'CaptchaResponseModel(captchaKey: $captchaKey, captchaImage: $captchaImage, imageType: $imageType, imageDecode: $imageDecode)'; +} + + +} + +/// @nodoc +abstract mixin class $CaptchaResponseModelCopyWith<$Res> { + factory $CaptchaResponseModelCopyWith(CaptchaResponseModel value, $Res Function(CaptchaResponseModel) _then) = _$CaptchaResponseModelCopyWithImpl; +@useResult +$Res call({ + String? captchaKey, String? captchaImage, String? imageType, String? imageDecode +}); + + + + +} +/// @nodoc +class _$CaptchaResponseModelCopyWithImpl<$Res> + implements $CaptchaResponseModelCopyWith<$Res> { + _$CaptchaResponseModelCopyWithImpl(this._self, this._then); + + final CaptchaResponseModel _self; + final $Res Function(CaptchaResponseModel) _then; + +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? captchaKey = freezed,Object? captchaImage = freezed,Object? imageType = freezed,Object? imageDecode = freezed,}) { + return _then(_self.copyWith( +captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?,captchaImage: freezed == captchaImage ? _self.captchaImage : captchaImage // ignore: cast_nullable_to_non_nullable +as String?,imageType: freezed == imageType ? _self.imageType : imageType // ignore: cast_nullable_to_non_nullable +as String?,imageDecode: freezed == imageDecode ? _self.imageDecode : imageDecode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [CaptchaResponseModel]. +extension CaptchaResponseModelPatterns on CaptchaResponseModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _CaptchaResponseModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _CaptchaResponseModel value) $default,){ +final _that = this; +switch (_that) { +case _CaptchaResponseModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _CaptchaResponseModel value)? $default,){ +final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? captchaKey, String? captchaImage, String? imageType, String? imageDecode)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that.captchaKey,_that.captchaImage,_that.imageType,_that.imageDecode);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? captchaKey, String? captchaImage, String? imageType, String? imageDecode) $default,) {final _that = this; +switch (_that) { +case _CaptchaResponseModel(): +return $default(_that.captchaKey,_that.captchaImage,_that.imageType,_that.imageDecode);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? captchaKey, String? captchaImage, String? imageType, String? imageDecode)? $default,) {final _that = this; +switch (_that) { +case _CaptchaResponseModel() when $default != null: +return $default(_that.captchaKey,_that.captchaImage,_that.imageType,_that.imageDecode);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _CaptchaResponseModel implements CaptchaResponseModel { + const _CaptchaResponseModel({this.captchaKey, this.captchaImage, this.imageType, this.imageDecode}); + factory _CaptchaResponseModel.fromJson(Map json) => _$CaptchaResponseModelFromJson(json); + +@override final String? captchaKey; +@override final String? captchaImage; +@override final String? imageType; +@override final String? imageDecode; + +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CaptchaResponseModelCopyWith<_CaptchaResponseModel> get copyWith => __$CaptchaResponseModelCopyWithImpl<_CaptchaResponseModel>(this, _$identity); + +@override +Map toJson() { + return _$CaptchaResponseModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CaptchaResponseModel&&(identical(other.captchaKey, captchaKey) || other.captchaKey == captchaKey)&&(identical(other.captchaImage, captchaImage) || other.captchaImage == captchaImage)&&(identical(other.imageType, imageType) || other.imageType == imageType)&&(identical(other.imageDecode, imageDecode) || other.imageDecode == imageDecode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,captchaKey,captchaImage,imageType,imageDecode); + +@override +String toString() { + return 'CaptchaResponseModel(captchaKey: $captchaKey, captchaImage: $captchaImage, imageType: $imageType, imageDecode: $imageDecode)'; +} + + +} + +/// @nodoc +abstract mixin class _$CaptchaResponseModelCopyWith<$Res> implements $CaptchaResponseModelCopyWith<$Res> { + factory _$CaptchaResponseModelCopyWith(_CaptchaResponseModel value, $Res Function(_CaptchaResponseModel) _then) = __$CaptchaResponseModelCopyWithImpl; +@override @useResult +$Res call({ + String? captchaKey, String? captchaImage, String? imageType, String? imageDecode +}); + + + + +} +/// @nodoc +class __$CaptchaResponseModelCopyWithImpl<$Res> + implements _$CaptchaResponseModelCopyWith<$Res> { + __$CaptchaResponseModelCopyWithImpl(this._self, this._then); + + final _CaptchaResponseModel _self; + final $Res Function(_CaptchaResponseModel) _then; + +/// Create a copy of CaptchaResponseModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? captchaKey = freezed,Object? captchaImage = freezed,Object? imageType = freezed,Object? imageDecode = freezed,}) { + return _then(_CaptchaResponseModel( +captchaKey: freezed == captchaKey ? _self.captchaKey : captchaKey // ignore: cast_nullable_to_non_nullable +as String?,captchaImage: freezed == captchaImage ? _self.captchaImage : captchaImage // ignore: cast_nullable_to_non_nullable +as String?,imageType: freezed == imageType ? _self.imageType : imageType // ignore: cast_nullable_to_non_nullable +as String?,imageDecode: freezed == imageDecode ? _self.imageDecode : imageDecode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/inspection/lib/data/model/response/captcha/captcha_response_model.g.dart b/packages/inspection/lib/data/model/response/captcha/captcha_response_model.g.dart new file mode 100644 index 0000000..8d69248 --- /dev/null +++ b/packages/inspection/lib/data/model/response/captcha/captcha_response_model.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'captcha_response_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_CaptchaResponseModel _$CaptchaResponseModelFromJson( + Map json, +) => _CaptchaResponseModel( + captchaKey: json['captcha_key'] as String?, + captchaImage: json['captcha_image'] as String?, + imageType: json['image_type'] as String?, + imageDecode: json['image_decode'] as String?, +); + +Map _$CaptchaResponseModelToJson( + _CaptchaResponseModel instance, +) => { + 'captcha_key': instance.captchaKey, + 'captcha_image': instance.captchaImage, + 'image_type': instance.imageType, + 'image_decode': instance.imageDecode, +}; diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart new file mode 100644 index 0000000..c470b20 --- /dev/null +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart @@ -0,0 +1,68 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'poultry_location_model.freezed.dart'; +part 'poultry_location_model.g.dart'; + +@freezed +abstract class PoultryLocationModel with _$PoultryLocationModel { + const factory PoultryLocationModel({ + int? id, + String? unitName, + @JsonKey(name: 'Lat') + double? lat, + @JsonKey(name: 'Long') + double? long, + User? user, + List? hatching, + Address? address, + }) = _PoultryLocationModel; + + factory PoultryLocationModel.fromJson(Map json) => + _$PoultryLocationModelFromJson(json); +} + +@freezed +abstract class User with _$User { + const factory User({ + String? fullname, + String? mobile, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} + +@freezed +abstract class Hatching with _$Hatching { + const factory Hatching({ + int? quantity, + int? leftOver, + int? period, + int? chickenAge, + DateTime? date, + bool?violation, + bool?archive, + }) = _Hatching; + + factory Hatching.fromJson(Map json) => + _$HatchingFromJson(json); +} + +@freezed +abstract class Address with _$Address { + const factory Address({ + City? city, + String? address, + }) = _Address; + + factory Address.fromJson(Map json) => + _$AddressFromJson(json); +} + +@freezed +abstract class City with _$City { + const factory City({ + String? name, + }) = _City; + + factory City.fromJson(Map json) => _$CityFromJson(json); +} diff --git a/packages/inspection/lib/data/model/response/user_profile/user_profile_model.dart b/packages/inspection/lib/data/model/response/user_profile/user_profile_model.dart new file mode 100644 index 0000000..a9dea06 --- /dev/null +++ b/packages/inspection/lib/data/model/response/user_profile/user_profile_model.dart @@ -0,0 +1,73 @@ +import 'package:rasadyar_core/core.dart'; + +part 'user_profile_model.freezed.dart'; + +part 'user_profile_model.g.dart'; + +@freezed +abstract class UserProfileModel with _$UserProfileModel { + const factory UserProfileModel({ + required User user, + required Role role, + required List permissions, + }) = _UserProfileModel; + + factory UserProfileModel.fromJson(Map json) => _$UserProfileModelFromJson(json); +} + +@freezed +abstract class User with _$User { + const factory User({ + required int id, + required String username, + required String password, + required String firstName, + required String lastName, + required bool isActive, + required String mobile, + required String phone, + required String nationalCode, + required DateTime birthdate, + required String nationality, + required String ownership, + required String address, + required String photo, + required int province, + required int city, + required bool otpStatus, + required String cityName, + required String provinceName, + }) = _User; + + + + factory User.fromJson(Map json) => _$UserFromJson(json); +} + +@freezed +abstract class Role with _$Role { + const factory Role({ + required int id, + required String roleName, + required String description, + required RoleType type, + required List permissions, + }) = _Role; + + factory Role.fromJson(Map json) => _$RoleFromJson(json); +} + +@freezed +abstract class RoleType with _$RoleType { + const factory RoleType({String? key, required String name}) = _RoleType; + + factory RoleType.fromJson(Map json) => _$RoleTypeFromJson(json); +} + +@freezed +abstract class Permission with _$Permission { + const factory Permission({required String pageName, required List pageAccess}) = + _Permission; + + factory Permission.fromJson(Map json) => _$PermissionFromJson(json); +} diff --git a/packages/inspection/lib/data/repositories/auth/auth_repository.dart b/packages/inspection/lib/data/repositories/auth/auth_repository.dart new file mode 100644 index 0000000..d582adb --- /dev/null +++ b/packages/inspection/lib/data/repositories/auth/auth_repository.dart @@ -0,0 +1,17 @@ + +import 'package:rasadyar_inspection/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_inspection/data/model/response/captcha/captcha_response_model.dart'; + +abstract class AuthRepository { + Future login({required Map authRequest}); + + Future captcha(); + + Future logout(); + + Future hasAuthenticated(); + + Future loginWithRefreshToken({required Map authRequest}); + + +} diff --git a/packages/inspection/lib/data/repositories/auth/auth_repository_imp.dart b/packages/inspection/lib/data/repositories/auth/auth_repository_imp.dart new file mode 100644 index 0000000..2e6e452 --- /dev/null +++ b/packages/inspection/lib/data/repositories/auth/auth_repository_imp.dart @@ -0,0 +1,37 @@ +import 'package:rasadyar_inspection/data/data_source/remote/auth/auth_remote.dart'; +import 'package:rasadyar_inspection/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_inspection/data/model/response/captcha/captcha_response_model.dart'; + +import 'auth_repository.dart'; + +class AuthRepositoryImpl implements AuthRepository { + final AuthRemote authRemote; + + AuthRepositoryImpl(this.authRemote); + + @override + Future login({required Map authRequest}) async => + await authRemote.login(authRequest: authRequest); + + @override + Future captcha() async { + return await authRemote.captcha(); + } + + @override + Future loginWithRefreshToken({ + required Map authRequest, + }) async { + return await authRemote.loginWithRefreshToken(authRequest: authRequest); + } + + @override + Future logout() async { + await authRemote.logout(); + } + + @override + Future hasAuthenticated() async { + return await authRemote.hasAuthenticated(); + } +} diff --git a/packages/inspection/lib/data/repositories/auth_repository.dart b/packages/inspection/lib/data/repositories/auth_repository.dart deleted file mode 100644 index 179483a..0000000 --- a/packages/inspection/lib/data/repositories/auth_repository.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:rasadyar_core/data/model/response/auth/auth_response_model.dart'; -import 'package:rasadyar_core/data/model/response/captcha/captcha_response_model.dart'; -import 'package:rasadyar_core/data/model/response/user_info/user_info_model.dart'; -import 'package:rasadyar_core/data/model/response/user_profile_model/user_profile_model.dart'; - -abstract class AuthRepository { - Future login({required Map authRequest}); - - Future captcha(); - - Future logout(); - - Future hasAuthenticated(); - - Future loginWithRefreshToken({required Map authRequest}); - - Future getUserInfo(String phoneNumber); -} diff --git a/packages/inspection/lib/data/repositories/inspection/inspection_repository.dart b/packages/inspection/lib/data/repositories/inspection/inspection_repository.dart new file mode 100644 index 0000000..148ce5b --- /dev/null +++ b/packages/inspection/lib/data/repositories/inspection/inspection_repository.dart @@ -0,0 +1,24 @@ +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; + +abstract class InspectionRepository { + /// Fetches the inspection data for a given [inspectionId]. + /// + /// Returns a `Future` that resolves to a `Map` containing + /// the inspection data. + Future> fetchInspectionData(String inspectionId); + + /// Fetches the list of inspections for a given [userId]. + /// + /// Returns a `Future` that resolves to a `List>` + /// containing the list of inspections. + Future>> fetchInspections(String userId); + + /// Fetches nearby poultry locations based on the provided coordinates and radius. + /// + /// Returns a `Future` that resolves to a `List?`. + Future?> getNearbyLocation({ + double? centerLat, + double? centerLng, + double? radius, + }); +} \ No newline at end of file diff --git a/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart b/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart new file mode 100644 index 0000000..90feb85 --- /dev/null +++ b/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart @@ -0,0 +1,34 @@ +import 'package:rasadyar_inspection/data/data_source/remote/inspection/inspection_remote.dart'; +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; +import 'package:rasadyar_inspection/data/repositories/inspection/inspection_repository.dart'; + +class InspectionRepositoryImp implements InspectionRepository { + final InspectionRemoteDataSource remoteDataSource; + + InspectionRepositoryImp({required this.remoteDataSource}); + + @override + Future> fetchInspectionData(String inspectionId) { + // TODO: implement fetchInspectionData + throw UnimplementedError(); + } + + @override + Future>> fetchInspections(String userId) { + // TODO: implement fetchInspections + throw UnimplementedError(); + } + + @override + Future?> getNearbyLocation({ + double? centerLat, + double? centerLng, + double? radius, + }) async { + return remoteDataSource.getNearbyLocation( + centerLat: centerLat, + centerLng: centerLng, + radius: radius, + ); + } +} diff --git a/packages/inspection/lib/data/repositories/user/user_repository.dart b/packages/inspection/lib/data/repositories/user/user_repository.dart new file mode 100644 index 0000000..b5974e9 --- /dev/null +++ b/packages/inspection/lib/data/repositories/user/user_repository.dart @@ -0,0 +1,19 @@ + +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; + +abstract class UserRepository { + /// Fetches the user profile from the remote data source. + /// + /// Returns a [Future] that resolves to a [UserProfileModel]. + Future fetchUserProfile({required String token}); + + /// Updates the user profile in the remote data source. + /// + /// Takes a [UserProfileModel] as an argument and returns a [Future] that resolves to a boolean indicating success or failure. + Future updateUserProfile(UserProfileModel userProfile); + + /// Changes the password of the user in the remote data source. + /// + /// Takes the old password, new password, and confirm password as arguments and returns a [Future] that resolves to a boolean indicating success or failure. + Future changePassword(String oldPassword, String newPassword, String confirmPassword); +} diff --git a/packages/inspection/lib/data/repositories/user/user_repository_imp.dart b/packages/inspection/lib/data/repositories/user/user_repository_imp.dart new file mode 100644 index 0000000..abd87fe --- /dev/null +++ b/packages/inspection/lib/data/repositories/user/user_repository_imp.dart @@ -0,0 +1,28 @@ + +import 'package:rasadyar_inspection/data/data_source/remote/user/user_data_source_imp.dart'; +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; + +import 'user_repository.dart'; + +class UserRepositoryImp implements UserRepository { + final UserRemoteDataSourceImp _remoteDataSource; + + UserRepositoryImp(this._remoteDataSource); + + @override + Future changePassword(String oldPassword, String newPassword, String confirmPassword) { + // TODO: implement changePassword + throw UnimplementedError(); + } + + @override + Future fetchUserProfile({required String token}) async { + return await _remoteDataSource.getProfile(token: token); + } + + @override + Future updateUserProfile(UserProfileModel userProfile) { + // TODO: implement updateUserProfile + throw UnimplementedError(); + } +} diff --git a/packages/inspection/lib/data/utils/dio_exception_handeler.dart b/packages/inspection/lib/data/utils/dio_exception_handeler.dart new file mode 100644 index 0000000..6f5e233 --- /dev/null +++ b/packages/inspection/lib/data/utils/dio_exception_handeler.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class DioErrorHandler { + void handle(DioException error) { + switch (error.response?.statusCode) { + case 401: + _handleGeneric(error); + break; + case 403: + _handleGeneric(error); + break; + + case 410: + _handle410(); + break; + default: + _handleGeneric(error); + } + } + + //wrong password/user name => "detail": "No active account found with the given credentials" - 401 + void _handle410() { + Get.showSnackbar(_errorSnackBar('نام کاربری یا رمز عبور اشتباه است')); + } + + //wrong captcha => "detail": "Captcha code is incorrect" - 403 + void _handle403() {} + + void _handleGeneric(DioException error) { + Get.showSnackbar( + _errorSnackBar( + error.response?.data.keys.first == 'is_user' + ? 'کاربر با این شماره تلفن وجود ندارد' + : error.response?.data[error.response?.data.keys.first] ?? + 'خطا در برقراری ارتباط با سرور', + ), + ); + } + + GetSnackBar _errorSnackBar(String message) { + return GetSnackBar( + titleText: Text( + 'خطا', + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + messageText: Text( + message, + style: AppFonts.yekan12.copyWith(color: Colors.white), + ), + backgroundColor: AppColor.error, + margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + borderRadius: 12, + duration: Duration(milliseconds: 3500), + snackPosition: SnackPosition.TOP, + ); + } +} diff --git a/packages/inspection/lib/injection/inspection_di.dart b/packages/inspection/lib/injection/inspection_di.dart new file mode 100644 index 0000000..456896e --- /dev/null +++ b/packages/inspection/lib/injection/inspection_di.dart @@ -0,0 +1,71 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/data_source/remote/auth/auth_remote.dart'; +import 'package:rasadyar_inspection/data/data_source/remote/auth/auth_remote_imp.dart'; +import 'package:rasadyar_inspection/data/data_source/remote/inspection/inspection_remote_imp.dart'; +import 'package:rasadyar_inspection/data/data_source/remote/user/user_data_source_imp.dart'; +import 'package:rasadyar_inspection/data/repositories/auth/auth_repository_imp.dart'; +import 'package:rasadyar_inspection/data/repositories/inspection/inspection_repository_imp.dart'; +import 'package:rasadyar_inspection/data/repositories/user/user_repository_imp.dart'; +import 'package:rasadyar_inspection/data/utils/dio_exception_handeler.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; + +GetIt diInspection = GetIt.instance; + +Future setupInspectionDI() async { + diInspection.registerSingleton(DioErrorHandler()); + var tokenService = Get.find(); + if (tokenService.baseurl.value == null) { + await tokenService.saveBaseUrl('https://bazrasbackend.rasadyaar.ir/'); + } + diInspection.registerLazySingleton( + () => AppInterceptor( + //TODO : Update the base URL to the correct one for inspection module + refreshTokenCallback: () async => null, + saveTokenCallback: (String newToken) async { + await tokenService.saveAccessToken(newToken); + }, + clearTokenCallback: () async { + await tokenService.deleteTokens(); + Get.offAllNamed(InspectionRoutes.auth, arguments: Module.inspection); + }, + authArguments: Module.inspection, + ), + instanceName: 'inspectionInterceptor', + ); + + diInspection.registerLazySingleton(() { + return DioRemote( + baseUrl: tokenService.baseurl.value, + interceptors: diInspection.get(instanceName: 'inspectionInterceptor'), + ); + }, instanceName: 'inspectionDioRemote'); + + var dioRemote = diInspection.get(instanceName: 'inspectionDioRemote'); + await dioRemote.init(); + + diInspection.registerLazySingleton( + () => AuthRemoteImp(diInspection.get(instanceName: 'inspectionDioRemote')), + ); + + diInspection.registerSingleton( + AuthRepositoryImpl(diInspection.get()), + ); + + diInspection.registerSingleton( + UserRemoteDataSourceImp(diInspection.get(instanceName: 'inspectionDioRemote')), + ); + + diInspection.registerSingleton( + UserRepositoryImp(diInspection.get()), + ); + + diInspection.registerSingleton( + InspectionRemoteDataSourceImp(diInspection.get(instanceName: 'inspectionDioRemote')), + ); + + diInspection.registerSingleton( + InspectionRepositoryImp(remoteDataSource: diInspection.get()), + ); + + diInspection.registerSingleton(ImagePicker()); +} diff --git a/packages/inspection/lib/presentation/pages/auth/logic.dart b/packages/inspection/lib/presentation/pages/auth/logic.dart index 126589b..0e157a2 100644 --- a/packages/inspection/lib/presentation/pages/auth/logic.dart +++ b/packages/inspection/lib/presentation/pages/auth/logic.dart @@ -2,10 +2,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/model/request/login_request/login_request_model.dart'; -import 'package:rasadyar_core/data/model/response/user_info/user_info_model.dart'; -import 'package:rasadyar_core/data/model/response/user_profile_model/user_profile_model.dart'; -import 'package:rasadyar_inspection/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_inspection/data/model/request/login_request/login_request_model.dart'; +import 'package:rasadyar_inspection/data/model/response/auth/auth_response_model.dart'; +import 'package:rasadyar_inspection/data/repositories/auth/auth_repository_imp.dart'; +import 'package:rasadyar_inspection/data/utils/dio_exception_handeler.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/captcha/logic.dart'; enum AuthType { useAndPass, otp } @@ -38,7 +40,7 @@ class AuthLogic extends GetxController { RxInt secondsRemaining = 120.obs; Timer? _timer; - //AuthRepositoryImpl authRepository = diAuth.get(); + AuthRepositoryImpl authRepository = diInspection.get(); final Module _module = Get.arguments; @@ -97,33 +99,34 @@ class AuthLogic extends GetxController { ); } - /*Future submitLoginForm() async { + Future submitLoginForm() async { if (!_isFormValid()) return; - iLog('module222 : ${_module.toString()}'); + final loginRequestModel = _buildLoginRequest(); isLoading.value = true; await safeCall( - call: () => authRepository.login(authRequest: loginRequestModel.toJson()), + call: () async => authRepository.login(authRequest: loginRequestModel.toJson()), onSuccess: (result) async { await tokenStorageService.saveModule(_module); await tokenStorageService.saveRefreshToken(result?.refresh ?? ''); await tokenStorageService.saveAccessToken(result?.access ?? ''); + Get.offAllNamed(InspectionRoutes.init); }, onError: (error, stackTrace) { if (error is DioException) { - diAuth.get().handle(error); + diInspection.get().handle(error); } captchaController.getCaptcha(); }, ); isLoading.value = false; - }*/ + } Future submitLoginForm2() async { if (!_isFormValid()) return; //AuthRepositoryImpl authTmp = diAuth.get(instanceName: 'newUrl'); isLoading.value = true; - /* await safeCall( + /* await safeCall( call: () => authTmp.login( authRequest: { "username": usernameController.value.text, diff --git a/packages/inspection/lib/presentation/pages/auth/view.dart b/packages/inspection/lib/presentation/pages/auth/view.dart index 213c747..0c10507 100644 --- a/packages/inspection/lib/presentation/pages/auth/view.dart +++ b/packages/inspection/lib/presentation/pages/auth/view.dart @@ -184,7 +184,7 @@ class AuthPage extends GetView { onPressed: controller.isDisabled.value ? null : () async { - await controller.submitLoginForm2(); + await controller.submitLoginForm(); }, width: Get.width, height: 48, diff --git a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart index 944784c..f1dfd8c 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart @@ -1,20 +1,23 @@ - import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/data/utils/marker_generator.dart'; +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; +import 'package:rasadyar_inspection/data/repositories/inspection/inspection_repository_imp.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; import '../filter/view.dart'; class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin { - final BaseLogic baseLogic = Get.find(); - Rx currentLocation = LatLng(35.824891, 50.948025).obs; - RxList allMarkers = [].obs; - RxList markers = [].obs; + Rx currentLocation = LatLng(34.798315281272544, 48.51479142983491).obs; + Rx>> allPoultryLocation = + Resource>.loading().obs; + + RxList markers = [].obs; + Timer? _debounceTimer; RxBool isLoading = false.obs; RxBool isSelectedDetailsLocation = false.obs; @@ -33,55 +36,7 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin late DraggableBottomSheetController detailsLocationBottomSheetController; late final BottomSheetManager bottomSheetManager; - Future determineCurrentPosition() async { - isLoading.value = true; - final position = await Geolocator.getCurrentPosition( - locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), - ); - final latLng = LatLng(position.latitude, position.longitude); - - currentLocation.value = latLng; - markers.add(latLng); - animatedMapController.animateTo( - dest: latLng, - zoom: 18, - curve: Curves.easeInOut, - duration: const Duration(seconds: 1), - ); - isLoading.value = false; - } - - void debouncedUpdateVisibleMarkers({required LatLng center}) { - _debounceTimer?.cancel(); - _debounceTimer = Timer(const Duration(milliseconds: 300), () { - final filtered = filterNearbyMarkers({ - 'markers': allMarkers, - 'centerLat': center.latitude, - 'centerLng': center.longitude, - 'radius': 2000.0, - }); - - markers.addAll(filtered); - }); - } - - List filterNearbyMarkers(Map args) { - final List rawMarkers = args['markers']; - final double centerLat = args['centerLat']; - final double centerLng = args['centerLng']; - final double radiusInMeters = args['radius']; - final center = LatLng(centerLat, centerLng); - final distance = Distance(); - - return rawMarkers - .where((marker) => distance(center, marker) <= radiusInMeters) - .toList(); - } - - Future generatedMarkers() async { - final generatedMarkers = await generateLocationsUsingCompute(100000); - allMarkers.value = generatedMarkers; - } + InspectionRepositoryImp inspectionRepository = diInspection.get(); @override void onInit() { @@ -92,6 +47,7 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin curve: Curves.easeInOut, cancelPreviousAnimations: true, ); + fetchAllPoultryLocations(); filterBottomSheetController = DraggableBottomSheetController( initialHeight: 350, @@ -105,7 +61,6 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin maxHeight: 200, ); - detailsLocationBottomSheetController = DraggableBottomSheetController( initialHeight: Get.height * 0.5, minHeight: Get.height * 0.37, @@ -114,13 +69,10 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin slidController = SlidableController(this).obs; bottomSheetManager = BottomSheetManager({ - filterBottomSheetController: - () => filterWidget(filterIndex: filterIndex, showIndex: showIndex), - selectedLocationBottomSheetController: - () => selectedLocationWidget( - showHint: - selectedLocationBottomSheetController.isVisible.value && - showSlideHint, + filterBottomSheetController: () => + filterWidget(filterIndex: filterIndex, showIndex: showIndex), + selectedLocationBottomSheetController: () => selectedLocationWidget( + showHint: selectedLocationBottomSheetController.isVisible.value && showSlideHint, sliderController: slidController.value, trigger: triggerSlidableAnimation, toggle: selectedLocationBottomSheetController.toggle, @@ -132,8 +84,63 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin @override void onReady() { super.onReady(); - determineCurrentPosition(); - generatedMarkers(); + //determineCurrentPosition(); + } + + @override + void onClose() { + slidController.close(); + super.onClose(); + } + + Future determineCurrentPosition() async { + isLoading.value = true; + final position = await Geolocator.getCurrentPosition( + locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), + ); + final latLng = LatLng(position.latitude, position.longitude); + + /*currentLocation.value = latLng; + markers.add(PoultryLocationModel( + lat: latLng.latitude, + long: latLng.longitude + ));*/ + animatedMapController.animateTo( + dest: latLng, + zoom: 18, + curve: Curves.easeInOut, + duration: const Duration(seconds: 1), + ); + isLoading.value = false; + } + + void debouncedUpdateVisibleMarkers({required LatLng center}) { + _debounceTimer?.cancel(); + _debounceTimer = Timer(const Duration(milliseconds: 300), () { + final filtered = filterNearbyMarkers( + allPoultryLocation.value.data ?? [], + center.latitude, + center.longitude, + 10000, // Radius in meters + ); + + markers.addAll(filtered); + }); + } + + List filterNearbyMarkers( + List allMarkers, + double centerLat, + double centerLng, + double radiusInMeters, + ) { + final center = LatLng(centerLat, centerLng); + final distance = Distance(); + + return allMarkers.where((marker) { + var tmp =LatLng(marker.lat ?? 0, marker.long ?? 0); + return distance(center,tmp ) <= radiusInMeters; + }).toList(); } Future triggerSlidableAnimation() async { @@ -144,9 +151,23 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin showSlideHint = false; } - @override - void onClose() { - slidController.close(); - super.onClose(); + Future fetchAllPoultryLocations() async { + isLoading.value = true; + allPoultryLocation.value = Resource>.loading(); + await safeCall( + call: () => inspectionRepository.getNearbyLocation(), + onSuccess: (result) { + if (result != null) { + allPoultryLocation.value = Resource>.success(result); + } else { + allPoultryLocation.value = Resource>.error( + 'No locations found', + ); + } + }, + onError: (error, stackTrace) { + allPoultryLocation.value = Resource>.error(error.toString()); + }, + ); } } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index 9932fe0..9645419 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -54,7 +54,7 @@ class InspectionMapPage extends GetView { markers: markers .map( (e) => markerWidget( - marker: e, + marker: LatLng(e.lat??0, e.long??0), onTap: () { Get.bottomSheet( selectedLocationWidget2( @@ -295,6 +295,7 @@ class InspectionMapPage extends GetView { } Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + iLog('lat: ${marker.latitude}, lng: ${marker.longitude}'); return Marker( point: marker, child: GestureDetector( diff --git a/packages/inspection/lib/presentation/pages/profile/logic.dart b/packages/inspection/lib/presentation/pages/profile/logic.dart index ced5ff0..e71a84b 100644 --- a/packages/inspection/lib/presentation/pages/profile/logic.dart +++ b/packages/inspection/lib/presentation/pages/profile/logic.dart @@ -1,28 +1,27 @@ import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; +import 'package:rasadyar_inspection/data/repositories/user/user_repository_imp.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; +import 'package:rasadyar_inspection/inspection.dart'; class ProfileLogic extends GetxController { - - - List roles = [ - 'کاربر عادی', - 'کاربر ویژه', - 'کاربر VIP', - 'کاربر نقره ای', - 'کاربر طلایی', - - ]; - - - + RootLogic rootLogic = Get.find(); + UserRepositoryImp userRepository = diInspection.get(); + Rx> userProfile = Resource.loading().obs; RxInt selectedRole = 0.obs; RxInt selectedInformationType = 0.obs; - @override void onReady() { - // TODO: implement onReady super.onReady(); + rootLogic.userProfile.listen((data) { + if (data != null) { + userProfile.value = Resource.success(data); + } else { + userProfile.value = Resource.error('Failed to load user profile'); + } + }); } @override @@ -30,4 +29,26 @@ class ProfileLogic extends GetxController { // TODO: implement onClose super.onClose(); } + + Future fetchUserProfile() async { + userProfile.value = Resource.loading(); + + await safeCall( + call: () => userRepository.fetchUserProfile( + token: rootLogic.tokenStorageService.accessToken.value ?? '', + ), + onSuccess: (profile) { + if (profile != null) { + userProfile.value = Resource.success(profile); + } else { + userProfile.value = Resource.error('Failed to load user profile'); + } + }, + onError: (error, stackTrace) { + userProfile.value = Resource.error( + 'Failed to load user profile: ${error.toString()}', + ); + }, + ); + } } diff --git a/packages/inspection/lib/presentation/pages/profile/view.dart b/packages/inspection/lib/presentation/pages/profile/view.dart index b125f1a..510f243 100644 --- a/packages/inspection/lib/presentation/pages/profile/view.dart +++ b/packages/inspection/lib/presentation/pages/profile/view.dart @@ -1,5 +1,7 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; import 'logic.dart'; @@ -9,124 +11,96 @@ class ProfilePage extends GetView { @override Widget build(BuildContext context) { return Column( - spacing: 30, children: [ - SizedBox( - height: Get.height * 0.3, - child: Stack( - fit: StackFit.expand, - alignment: Alignment.center, - clipBehavior: Clip.none, - children: [ - Assets.vec.bgHeaderUserProfileSvg.svg(), - Positioned( - bottom: -20, - left: 0, - right: 0, - child: SizedBox( - width: 110, - height: 110, - child: CircleAvatar( - backgroundColor: AppColor.blueLightHover, - child: FaIcon( - FontAwesomeIcons.user, - size: 45, - color: Colors.white, + Expanded( + flex: 1, + child: Container( + color: AppColor.blueNormal, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(), + ObxValue((data) { + final status = data.value.status; + + if (status == ResourceStatus.loading) { + return Container( + width: 128.w, + height: 128.h, + child: Center(child: CupertinoActivityIndicator(color: AppColor.greenNormal)), + ); + } + + if (status == ResourceStatus.error) { + return Container( + width: 128.w, + height: 128.h, + child: Center(child: Text('خطا در دریافت اطلاعات')), + ); + } + + // Default UI + return Container( + width: 128.w, + height: 128.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.blueLightActive, ), - ), - ), - ), - ], + child: Center( + child: CircleAvatar( + radius: 64.w, + backgroundImage: NetworkImage(data.value.data?.user.photo ?? ''), + ), + ), + ); + }, controller.userProfile), + ], + ), ), ), Expanded( + flex: 3, child: Column( crossAxisAlignment: CrossAxisAlignment.start, spacing: 16, children: [ - SizedBox( - height: 75, - child: ListView.separated( - shrinkWrap: true, - padding: EdgeInsets.all(16), - scrollDirection: Axis.horizontal, - itemBuilder: - (context, index) => ObxValue((data) { - return ChoiceChip( - onSelected: (value) { - data.value = index; - }, - selectedColor: AppColor.blueNormal, - labelStyle: - data.value == index - ? AppFonts.yekan13.copyWith( - color: AppColor.whiteLight, - ) - : AppFonts.yekan12.copyWith( - color: AppColor.darkGreyNormalActive, - ), - checkmarkColor: Colors.white, - label: Text(controller.roles[index]), - selected: index == data.value, - ); - }, controller.selectedRole), - - separatorBuilder: (context, index) => SizedBox(width: 8), - itemCount: controller.roles.length, - ), - ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 30, - vertical: 10, - ), - child: ObxValue((data) { - return switch (data.value) { - 0 => userProfileInformation(), - 1 => bankInformationWidget(), - 2 => invoiceIssuanceInformation(), - int() => Placeholder(), - }; - }, controller.selectedInformationType), + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 10), + child: userProfileInformation(), ), ), - ObxValue((data) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Wrap( - spacing: 20, - runSpacing: 10, - children: [ - cardActionWidget( - title: 'اطلاعات کاربری', - onPressed: () { - data.value = 0; - }, - icon: Assets.vec.profileUserSvg.path, - selected: data.value == 0, - ), - cardActionWidget( - title: 'اطلاعات بانکی', - onPressed: () { - data.value = 1; - }, - icon: Assets.vec.informationSvg.path, - selected: data.value == 1, - ), - cardActionWidget( - title: 'اطلاعات \nصدور فاکتور', - onPressed: () { - data.value = 2; - }, - icon: Assets.vec.receiptDiscountSvg.path, - selected: data.value == 2, - ), - ], - ), - ); - }, controller.selectedInformationType), + Center( + child: Wrap( + alignment: WrapAlignment.center, + spacing: 20, + runSpacing: 10, + children: [ + cardActionWidget( + title: 'تغییر رمز عبور', + selected: true, + onPressed: () { + Get.bottomSheet(changePasswordBottomSheet(), isScrollControlled: true); + }, + icon: Assets.vec.lockSvg.path, + ), + cardActionWidget( + title: 'خروج', + selected: true, + color: ColorFilter.mode(Colors.redAccent, BlendMode.srcIn), + cardColor: Color(0xFFEFEFEF), + textColor: AppColor.redDarkerText, + onPressed: () { + Get.bottomSheet(exitBottomSheet(), isScrollControlled: true); + }, + icon: Assets.vec.logoutSvg.path, + ), + ], + ), + ), SizedBox(height: 100), ], @@ -149,72 +123,113 @@ class ProfilePage extends GetView { ], ); - Column userProfileInformation() { - return Column( - spacing: 10, - children: [ - itemList( - title: 'نام و نام خانوادگی', - content: 'آیدا گل محمدی', - icon: Assets.vec.userSvg.path, - ), - itemList( - title: 'موبایل', - content: '09302654896', - icon: Assets.vec.callSvg.path, - ), - itemList( - title: 'کدملی', - content: 'نا مشخص', - icon: Assets.vec.tagUserSvg.path, - ), - itemList( - title: 'شماره شناسنامه', - content: 'نا مشخص', - icon: Assets.vec.userSquareSvg.path, - ), - itemList( - title: 'تاریخ تولد', - content: '1404/10/12', - icon: Assets.vec.calendarSvg.path, - ), - itemList( - title: 'استان', - content: 'لرستان', - icon: Assets.vec.pictureFrameSvg.path, - ), - itemList( - title: 'شهر', - content: 'خرم آباد', - icon: Assets.vec.mapSvg.path, - ), - ], - ); + Widget userProfileInformation() { + return ObxValue((data) { + if (data.value.status == ResourceStatus.loading) { + return LoadingWidget(); + } else if (data.value.status == ResourceStatus.error) { + return ErrorWidget('خطا در دریافت اطلاعات کاربر'); + } else if (data.value.status == ResourceStatus.success) { + User item = data.value.data!.user; + return Column( + spacing: 6, + children: [ + buildRowOnTapped( + onTap: () { + Get.bottomSheet( + userInformationBottomSheet(), + isScrollControlled: true, + ignoreSafeArea: false, + ); + }, + titleWidget: Column( + spacing: 3, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'اطلاعات هویتی', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Container(width: 37.w, height: 1.h, color: AppColor.greenNormal), + ], + ), + valueWidget: Assets.vec.editSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + itemList( + title: 'نام و نام خانوادگی', + content: '${item.firstName} ${item.lastName}', + icon: Assets.vec.userSvg.path, + hasColoredBox: true, + ), + itemList( + title: 'موبایل', + content: item.mobile ?? 'نامشخص', + icon: Assets.vec.callSvg.path, + ), + itemList( + title: 'کدملی', + content: item.nationalCode ?? 'نامشخص', + icon: Assets.vec.tagUserSvg.path, + ), + itemList( + title: 'شماره شناسنامه', + content: item.nationalCode ?? 'نامشخص', + icon: Assets.vec.userSquareSvg.path, + ), + + itemList( + title: 'استان', + content: item.provinceName ?? 'نامشخص', + icon: Assets.vec.pictureFrameSvg.path, + ), + itemList( + title: 'شهر', + content: item.cityName ?? 'نامشخص', + icon: Assets.vec.mapSvg.path, + ), + ], + ); + } else { + return SizedBox.shrink(); + } + }, controller.userProfile); } Widget itemList({ required String title, required String content, String? icon, - }) => Row( - spacing: 4, - children: [ - if (icon != null) - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgGenImage.vec(icon).svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + bool hasColoredBox = false, + }) => Container( + padding: EdgeInsets.symmetric(horizontal: 12.h, vertical: 6.h), + decoration: BoxDecoration( + color: hasColoredBox ? AppColor.greenLight : Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: hasColoredBox + ? Border.all(width: 0.25, color: AppColor.bgDark) + : Border.all(width: 0, color: Colors.transparent), + ), + child: Row( + spacing: 4, + children: [ + if (icon != null) + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: SvgGenImage.vec(icon).svg( + width: 20.w, + height: 20.h, + colorFilter: ColorFilter.mode(AppColor.mediumGreyNormalActive, BlendMode.srcIn), + ), ), - ), - Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), - Spacer(), - Text( - content, - style: AppFonts.yekan13.copyWith(color: AppColor.darkGreyNormalHover), - ), - ], + Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyNormalActive)), + Spacer(), + Text(content, style: AppFonts.yekan13.copyWith(color: AppColor.mediumGreyNormalHover)), + ], + ), ); Widget cardActionWidget({ @@ -222,6 +237,9 @@ class ProfilePage extends GetView { required VoidCallback onPressed, required String icon, bool selected = false, + ColorFilter? color, + Color? cardColor, + Color? textColor, }) { return GestureDetector( onTap: onPressed, @@ -233,25 +251,25 @@ class ProfilePage extends GetView { height: 52, padding: EdgeInsets.all(8), decoration: ShapeDecoration( - color: selected ? AppColor.blueLightActive : AppColor.blueLight, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), + color: cardColor ?? AppColor.blueLight, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: SvgGenImage.vec(icon).svg( width: 40, height: 40, - colorFilter: ColorFilter.mode( - selected ? AppColor.whiteLight : AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: + color ?? + ColorFilter.mode( + selected ? AppColor.blueNormal : AppColor.whiteLight, + BlendMode.srcIn, + ), ), ), SizedBox(height: 2), Text( title, style: AppFonts.yekan10.copyWith( - color: selected ? AppColor.blueNormal : AppColor.blueLightActive, + color: textColor ?? (selected ? AppColor.blueNormal : AppColor.blueLightActive), ), textAlign: TextAlign.center, ), @@ -259,4 +277,359 @@ class ProfilePage extends GetView { ), ); } + + Widget userInformationBottomSheet() { + return Container(color: Colors.red); + /* return BaseBottomSheet( + height: 750.h, + child: SingleChildScrollView( + child: Column( + spacing: 8, + children: [ + Text( + 'ویرایش اطلاعات هویتی', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 12, + children: [ + RTextField( + controller: controller.nameController, + label: 'نام', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.lastNameController, + label: 'نام خانوادگی', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.nationalCodeController, + label: 'شماره شناسنامه', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.nationalIdController, + label: 'کد ملی', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + + ObxValue((data) { + return RTextField( + controller: controller.birthdayController, + label: 'تاریخ تولد', + initText: data.value?.formatCompactDate() ?? '', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + onTap: () {}, + ); + }, controller.birthDate), + + SizedBox(), + ], + ), + ), + SizedBox(), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 8, + children: [ + Text( + 'عکس پروفایل', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ObxValue((data) { + return Container( + width: Get.width, + height: 270, + decoration: BoxDecoration( + color: AppColor.lightGreyNormal, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLight), + ), + child: Center( + child: data.value == null + ? Padding( + padding: const EdgeInsets.fromLTRB(30, 10, 10, 30), + child: Image.network( + controller.userProfile.value.data?.image ?? '', + ), + ) + : Image.file(File(data.value!.path), fit: BoxFit.cover), + ), + ); + }, controller.selectedImage), + + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + text: 'گالری', + width: 150.w, + height: 40.h, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + onPressed: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.gallery, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + ), + SizedBox(width: 16), + ROutlinedElevated( + text: 'دوربین', + width: 150.w, + height: 40.h, + textStyle: AppFonts.yekan20.copyWith(color: AppColor.blueNormal), + onPressed: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.camera, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); + }, + ), + ], + ), + ], + ), + ), + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ObxValue((data) { + return RElevated( + height: 40.h, + text: 'ویرایش', + isLoading: data.value, + onPressed: () async { + await controller.updateUserProfile(); + controller.getUserProfile(); + Get.back(); + }, + ); + }, controller.isOnLoading), + ROutlinedElevated( + height: 40.h, + text: 'انصراف', + borderColor: AppColor.blueNormal, + onPressed: () { + Get.back(); + }, + ), + ], + ), + ], + ), + ), + );*/ + } + + /* Widget _provinceWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rootLogic.provinces, + onChanged: (value) { + controller.selectedProvince.value = value; + }, + selectedItem: controller.selectedProvince.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), + ); + }); + } + + Widget _cityWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: data, + onChanged: (value) { + controller.selectedCity.value = value; + }, + selectedItem: controller.selectedCity.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), + ); + }, controller.cites); + }*/ + + Widget changePasswordBottomSheet() { + return Container(color: Colors.red); + /* return BaseBottomSheet( + height: 400.h, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 8, + children: [ + Text( + 'تغییر رمز عبور', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + SizedBox(), + RTextField( + controller: controller.oldPasswordController, + hintText: 'رمز عبور قبلی', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null || value.isEmpty) { + return 'رمز عبور را وارد کنید'; + } else if (controller.userProfile.value.data?.password != value) { + return 'رمز عبور صحیح نیست'; + } + return null; + }, + ), + RTextField( + controller: controller.newPasswordController, + hintText: 'رمز عبور جدید', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null || value.isEmpty) { + return 'رمز عبور را وارد کنید'; + } else if (value.length < 6) { + return 'رمز عبور باید بیش از 6 کارکتر باشد.'; + } + return null; + }, + ), + RTextField( + controller: controller.retryNewPasswordController, + hintText: 'تکرار رمز عبور جدید', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null || value.isEmpty) { + return 'رمز عبور را وارد کنید'; + } else if (value.length < 6) { + return 'رمز عبور باید بیش از 6 کارکتر باشد.'; + } else if (controller.newPasswordController.text != value) { + return 'رمز عبور جدید یکسان نیست'; + } + return null; + }, + ), + + SizedBox(), + + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + height: 40.h, + text: 'ویرایش', + onPressed: () async { + if (controller.formKey.currentState?.validate() != true) { + return; + } + await controller.updatePassword(); + controller.getUserProfile(); + controller.clearPasswordForm(); + Get.back(); + }, + ), + ROutlinedElevated( + height: 40.h, + text: 'انصراف', + borderColor: AppColor.blueNormal, + onPressed: () { + Get.back(); + }, + ), + ], + ), + ], + ), + ), + ), + );*/ + } + + Widget exitBottomSheet() { + return Container(color: Colors.red); + /* return BaseBottomSheet( + height: 220.h, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 8, + children: [ + Text('خروج', style: AppFonts.yekan16Bold.copyWith(color: AppColor.error)), + SizedBox(), + Text( + 'آیا مطمئن هستید که می‌خواهید از حساب کاربری خود خارج شوید؟', + textAlign: TextAlign.center, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.textColor), + ), + + SizedBox(), + + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + height: 40.h, + text: 'خروج', + backgroundColor: AppColor.error, + onPressed: () async { + await controller.rootLogic.tokenService.deleteTokens().then((value) { + Get.back(); + Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken); + }); + }, + ), + ROutlinedElevated( + height: 40.h, + text: 'انصراف', + borderColor: AppColor.blueNormal, + onPressed: () { + Get.back(); + }, + ), + ], + ), + ], + ), + ), + ), + );*/ + } } diff --git a/packages/inspection/lib/presentation/pages/root/logic.dart b/packages/inspection/lib/presentation/pages/root/logic.dart index 3e2df1e..f444120 100644 --- a/packages/inspection/lib/presentation/pages/root/logic.dart +++ b/packages/inspection/lib/presentation/pages/root/logic.dart @@ -1,16 +1,60 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/user_profile/user_profile_model.dart'; +import 'package:rasadyar_inspection/data/repositories/user/user_repository_imp.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; import 'package:rasadyar_inspection/presentation/pages/action/view.dart'; import 'package:rasadyar_inspection/presentation/pages/inspection_map/view.dart'; import 'package:rasadyar_inspection/presentation/pages/profile/view.dart'; - enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { RxInt currentIndex = 0.obs; List pages = [InspectionMapPage(), ActionPage(), ProfilePage()]; RxList errorLocationType = RxList(); + TokenStorageService tokenStorageService = Get.find(); + UserRepositoryImp userRepository = diInspection.get(); + Rxn userProfile = Rxn(); + + @override + void onInit() { + super.onInit(); + userRepository + .fetchUserProfile(token: tokenStorageService.accessToken.value ?? '') + .then((value) => userProfile.value = value); + } + + @override + void onReady() { + super.onReady(); + + locationServiceEnabled().then((value) { + if (!value) { + errorLocationType.add(ErrorLocationType.serviceDisabled); + } + }); + + checkPermission().then((value) { + if (!value) { + errorLocationType.add(ErrorLocationType.permissionDenied); + } + }); + + listenToLocationServiceStatus().listen((event) { + if (!event) { + errorLocationType.add(ErrorLocationType.serviceDisabled); + } else { + errorLocationType.remove(ErrorLocationType.serviceDisabled); + } + }); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } Stream listenToLocationServiceStatus() { return Geolocator.getServiceStatusStream().map((status) { @@ -52,38 +96,7 @@ class RootLogic extends GetxController { } } - @override - void onReady() { - super.onReady(); - - locationServiceEnabled().then((value) { - if (!value) { - errorLocationType.add(ErrorLocationType.serviceDisabled); - } - }); - - checkPermission().then((value) { - if (!value) { - errorLocationType.add(ErrorLocationType.permissionDenied); - } - }); - - listenToLocationServiceStatus().listen((event) { - if (!event) { - errorLocationType.add(ErrorLocationType.serviceDisabled); - } else { - errorLocationType.remove(ErrorLocationType.serviceDisabled); - } - }); - } - void changePage(int index) { currentIndex.value = index; } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - } } diff --git a/packages/inspection/lib/presentation/pages/root/view.dart b/packages/inspection/lib/presentation/pages/root/view.dart index 578c5f8..8b4542a 100644 --- a/packages/inspection/lib/presentation/pages/root/view.dart +++ b/packages/inspection/lib/presentation/pages/root/view.dart @@ -9,46 +9,46 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { return ObxValue((currentIndex) { - return Scaffold( - body: ObxValue( - (currentIndex) => IndexedStack(index: currentIndex.value, children: controller.pages), - controller.currentIndex, - ), - bottomNavigationBar: RBottomNavigation( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - items: [ - RBottomNavigationItem( - label: 'نقشه', - icon: Assets.vec.mapSvg.path, - isSelected: currentIndex.value == 0, - onTap: () { - Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + return PopScope( + canPop: false, + child: Scaffold( + backgroundColor: AppColor.bgLight, + body: IndexedStack(index: currentIndex.value, children: controller.pages), + bottomNavigationBar: RBottomNavigation( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + items: [ + RBottomNavigationItem( + label: 'نقشه', + icon: Assets.vec.mapSvg.path, + isSelected: currentIndex.value == 0, + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + controller.changePage(0); + }, + ), + RBottomNavigationItem( + label: 'اقدام', + icon: Assets.vec.settingSvg.path, + isSelected: currentIndex.value == 1, + onTap: () { + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); + controller.changePage(1); + }, + ), - controller.changePage(0); - }, - ), - RBottomNavigationItem( - label: 'اقدام', - icon: Assets.vec.settingSvg.path, - isSelected: currentIndex.value == 1, - onTap: () { - Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); - controller.changePage(1); - }, - ), + RBottomNavigationItem( + label: 'پروفایل', + icon: Assets.vec.profileCircleSvg.path, + isSelected: currentIndex.value == 2, + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); - RBottomNavigationItem( - label: 'پروفایل', - icon: Assets.vec.profileCircleSvg.path, - isSelected: currentIndex.value == 4, - onTap: () { - Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); - Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); - - controller.changePage(4); - }, - ), - ], + controller.changePage(2); + }, + ), + ], + ), ), ); }, controller.currentIndex); diff --git a/packages/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart index dcf3ac9..a6cc79a 100644 --- a/packages/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -6,6 +6,7 @@ import 'package:rasadyar_inspection/presentation/pages/pages.dart'; import 'package:rasadyar_inspection/presentation/pages/users/logic.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; +import 'package:rasadyar_inspection/presentation/widget/captcha/logic.dart'; sealed class InspectionPages { InspectionPages._(); @@ -64,7 +65,10 @@ sealed class InspectionPages { GetPage( name: InspectionRoutes.auth, page: () => AuthPage(), - binding: BindingsBuilder.put(() => AuthLogic()), + binding: BindingsBuilder(() { + Get.lazyPut(() => AuthLogic()); + Get.lazyPut(() =>CaptchaWidgetLogic()); + }), ), ]; } diff --git a/packages/inspection/lib/presentation/widget/captcha/logic.dart b/packages/inspection/lib/presentation/widget/captcha/logic.dart index 1ed9b15..04823a8 100644 --- a/packages/inspection/lib/presentation/widget/captcha/logic.dart +++ b/packages/inspection/lib/presentation/widget/captcha/logic.dart @@ -1,16 +1,14 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/model/response/captcha/captcha_response_model.dart'; -import 'package:rasadyar_inspection/data/repositories/auth_repository_imp.dart'; +import 'package:rasadyar_inspection/data/model/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_inspection/data/repositories/auth/auth_repository_imp.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; class CaptchaWidgetLogic extends GetxController with StateMixin { TextEditingController textController = TextEditingController(); RxnString captchaKey = RxnString(); GlobalKey formKey = GlobalKey(); - //AuthRepositoryImpl authRepository = .get(); - final Random random = Random(); + AuthRepositoryImpl authRepository = diInspection.get(); @override void onInit() { @@ -29,8 +27,21 @@ class CaptchaWidgetLogic extends GetxController with StateMixin getCaptcha() async { change(null, status: RxStatus.loading()); textController.clear(); - await Future.delayed(Duration(milliseconds: 800)); - captchaKey.value = (random.nextInt(900000) + 100000).toString(); + formKey.currentState?.reset(); + await Future.delayed(Duration(milliseconds: 200)); + await safeCall( + call: () async => authRepository.captcha(), + onSuccess: (result) { + if (result == null) { + change(null, status: RxStatus.error('Failed to load captcha')); + return; + } + captchaKey.value = result.captchaKey; + change(result, status: RxStatus.success()); + }, + onError: (error, stackTrace) {}, + ); + change(value, status: RxStatus.success()); } } diff --git a/packages/inspection/lib/presentation/widget/captcha/view.dart b/packages/inspection/lib/presentation/widget/captcha/view.dart index 0bd3523..80278f9 100644 --- a/packages/inspection/lib/presentation/widget/captcha/view.dart +++ b/packages/inspection/lib/presentation/widget/captcha/view.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:math'; import 'package:flutter/cupertino.dart'; @@ -28,12 +29,7 @@ class CaptchaWidget extends GetView { borderRadius: BorderRadius.circular(8), ), child: controller.obx( - (state) => Center( - child: Text( - controller.captchaKey.value ?? 'دوباره سعی کنید', - style: AppFonts.yekan24Bold, - ), - ), + (state) => Image.memory(base64Decode(state?.captchaImage ?? ''), fit: BoxFit.cover), onLoading: const Center( child: CupertinoActivityIndicator(color: AppColor.blueNormal), ), @@ -64,9 +60,6 @@ class CaptchaWidget extends GetView { validator: (value) { if (value == null || value.isEmpty) { return 'کد امنیتی را وارد کنید'; - } else if (controller.captchaKey.value != null && - controller.captchaKey.value != value) { - return 'کد امنیتی اشتباه است'; } return null; }, diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock index 1794b66..b52d807 100644 --- a/packages/inspection/pubspec.lock +++ b/packages/inspection/pubspec.lock @@ -98,7 +98,7 @@ packages: source: hosted version: "3.0.0" build_runner: - dependency: transitive + dependency: "direct dev" description: name: build_runner sha256: b971d4a1c789eba7be3e6fe6ce5e5b50fd3719e3cb485b3fad6d04358304351d @@ -145,6 +145,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.4" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" clock: dependency: transitive description: @@ -185,6 +193,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" cross_file: dependency: transitive description: @@ -289,6 +305,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.3" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" ffi: dependency: transitive description: @@ -366,6 +390,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.11.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" flutter_localizations: dependency: transitive description: flutter @@ -475,6 +507,11 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" flutter_web_plugins: dependency: transitive description: flutter @@ -488,8 +525,16 @@ packages: url: "https://pub.dev" source: hosted version: "10.8.0" + freezed: + dependency: "direct dev" + description: + name: freezed + sha256: da32f8ba8cfcd4ec71d9decc8cbf28bd2c31b5283d9887eb51eb4a0659d8110c + url: "https://pub.dev" + source: hosted + version: "3.2.0" freezed_annotation: - dependency: transitive + dependency: "direct main" description: name: freezed_annotation sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" @@ -584,6 +629,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.0.3" + get_test: + dependency: "direct dev" + description: + name: get_test + sha256: "558c39cb35fb37bd501f337dc143de60a4314d5ef3b75f4b0551d6741634995b" + url: "https://pub.dev" + source: hosted + version: "4.0.1" glob: dependency: transitive description: @@ -632,6 +685,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.1" + hive_ce_generator: + dependency: "direct dev" + description: + name: hive_ce_generator + sha256: a169feeff2da9cc2c417ce5ae9bcebf7c8a95d7a700492b276909016ad70a786 + url: "https://pub.dev" + source: hosted + version: "1.9.3" http: dependency: transitive description: @@ -769,13 +830,21 @@ packages: source: hosted version: "0.6.7" json_annotation: - dependency: transitive + dependency: "direct main" description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: ce2cf974ccdee13be2a510832d7fba0b94b364e0b0395dee42abaa51b855be27 + url: "https://pub.dev" + source: hosted + version: "6.10.0" latlong2: dependency: transitive description: @@ -784,6 +853,38 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.dev" + source: hosted + version: "10.0.9" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: "direct dev" + description: + name: lints + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 + url: "https://pub.dev" + source: hosted + version: "6.0.0" lists: dependency: transitive description: @@ -856,6 +957,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: "2314cbe9165bcd16106513df9cf3c3224713087f09723b128928dc11a4379f99" + url: "https://pub.dev" + source: hosted + version: "5.5.0" + mocktail: + dependency: "direct dev" + description: + name: mocktail + sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" package_config: dependency: transitive description: @@ -1111,6 +1236,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" shelf_web_socket: dependency: transitive description: @@ -1132,6 +1273,38 @@ packages: description: flutter source: sdk version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: fc787b1f89ceac9580c3616f899c9a447413cbdac1df071302127764c023a134 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "4f81479fe5194a622cdd1713fe1ecb683a6e6c85cd8cec8e2e35ee5ab3fdf2a1" + url: "https://pub.dev" + source: hosted + version: "1.3.6" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" source_span: dependency: transitive description: @@ -1188,14 +1361,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.2" + test: + dependency: "direct dev" + description: + name: test + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + url: "https://pub.dev" + source: hosted + version: "1.25.15" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.4" + test_core: + dependency: transitive + description: + name: test_core + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + url: "https://pub.dev" + source: hosted + version: "0.6.8" time: dependency: transitive description: @@ -1268,6 +1457,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" + source: hosted + version: "15.0.0" watcher: dependency: transitive description: @@ -1300,6 +1497,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" win32: dependency: transitive description: @@ -1348,6 +1553,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.3" + yaml_writer: + dependency: transitive + description: + name: yaml_writer + sha256: "69651cd7238411179ac32079937d4aa9a2970150d6b2ae2c6fe6de09402a5dc5" + url: "https://pub.dev" + source: hosted + version: "2.1.0" sdks: dart: ">=3.8.1 <4.0.0" flutter: ">=3.29.0" diff --git a/packages/inspection/pubspec.yaml b/packages/inspection/pubspec.yaml index aee96aa..0a3d2b2 100644 --- a/packages/inspection/pubspec.yaml +++ b/packages/inspection/pubspec.yaml @@ -11,3 +11,21 @@ dependencies: sdk: flutter rasadyar_core: path: ../core + ##code generation + freezed_annotation: ^3.1.0 + json_annotation: ^4.9.0 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 + lints: ^6.0.0 + test: ^1.25.15 + ##code generation + build_runner: ^2.6.0 + hive_ce_generator: ^1.9.3 + freezed: ^3.2.0 + json_serializable: ^6.10.0 + + ##test + mocktail: ^1.0.4 + get_test: ^4.0.1 From 8acd951c05140b07152f7c4436da42e4b71d4f48 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 28 Jul 2025 16:00:33 +0330 Subject: [PATCH 245/256] feat : profile and map --- assets/vec/bg_auth.svg.vec | Bin 0 -> 2056 bytes .../poultry_location_model.freezed.dart | 1451 ++++++++++++++++ .../poultry_location_model.g.dart | 86 + .../user_profile_model.freezed.dart | 1479 +++++++++++++++++ .../user_profile/user_profile_model.g.dart | 104 ++ 5 files changed, 3120 insertions(+) create mode 100644 assets/vec/bg_auth.svg.vec create mode 100644 packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart create mode 100644 packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart create mode 100644 packages/inspection/lib/data/model/response/user_profile/user_profile_model.freezed.dart create mode 100644 packages/inspection/lib/data/model/response/user_profile/user_profile_model.g.dart diff --git a/assets/vec/bg_auth.svg.vec b/assets/vec/bg_auth.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..a5c1c29d9eedd57b44d2b6333ee26ac67d80f8ff GIT binary patch literal 2056 zcmd^A|5H>|6hChtEGys_aKJB1DjP~fFc3jf8N2t~F$5$SNeE>@2PFaX3$2!!tTwI^ zL#B>~4Gc^W*ubPQV~}h`0=6ij+4Q40XkT!2f?;q>0$%67w^nX{LTC2v=iYNZ_uO;u zx%ZxpQHMc_02n~%dX0wzNxd1M@mqi^3}Axk0KUpgR1%j2E7Ww0Jqf}kfUZ9DZBNB* z$8xZ8s!>p3=&cN8VtU$xtAlQv3)}LZ#e;WBuIFJ?%Nu01RW9qn%dPVPZ+FW8dN7i!x#SHb5}l+IKN9N56qYKKHBX@|u8#af&E`b( z$AszJR#uBmWh=S=*m3-51Lxy;dudIK$6I4*d>AiYZ^G)$3wRd#V}UJ*M>w4f3TE^4 z%zUQb;Kf@jIZHnJ2Szv>8NgL6cDe{#vBNsRQk>Oz5`SaHGgTOGjU>P6s2_^M+ZU6t zVnYJnn4N&}g9)TJ;iM}DU(fT!pHm~Tu49B98eWEy=^EP&i}9&zHB4?@5op6C@Dcl=?vgxTG<_SIC{}3B zwYZqWFVzAt$llAANjFHJRmGh4PL|VNN9_svmZ>OJUm@-U)8{5y^1DY!XKr4uq6RQ zV@55FG0&mzyqDR~raatNyAIRlpTeLgb`W;}<1(vM6yuDN7Z^lCyBM-bw25Oa2~;_T z)0;7E=nSsgu?tNpwOH`wMtXnVq<1J1llPb67iB@1eqalJoj-&0Td}Znn5Eq>$NtZX z+0gk~G)!f)Zd)6!==_wyl1@B&rJLOj{s#To4c2|Gm;CtQ&A#u@@lF6bhWn6Z&Q<3X z^BW~^ZQbI^$_v%Vz}`Uj;2HWFuy8O42j+Z8d^&Sohg2*a+^+Q@N3{c?$|tM|T|+uy zFQq#z_@(ag)F*$!E>Q4|k{)J?8R^-0_-e?@wGgy_8;vKS^LX!r3+h`@b-5j9+$-e% z+ntzHm(R^7E}->D4!UJRbWB|Nibp+-+UMU-G$xQL{3*e_lV9uUbtH z66MsAqT(E%2;Mn%3H=Nv9*e#Bpe%&XsqVzM?jSxs^DM?aK8ycEIi2p;^HygCo_6SX zZ`T{xXrIK%h@Ck3U#Ud4>9Blv?Z8gs)gV@iJ{rZu0z@EtOa7M;N77oTNGK?iUw zu$awTut!@D*l6uO|J`@!q4z9=V(Ve&*UsZHDGmSB0jdY}B}?6XmqpkCTo#S*vaH+^ zs@bVtJggh)c(vcdgkAU*e4`|uZIXZI92^Ms%ZcN_TPvdYPD2sJ8pgq%sN(zg{j@#| zFkz>CWEy{fJ*MMawVP>w1)oqIFZ$$9*aZrH%px(dqAZfA))45Z&=AN}WeB{e#1ME> TeId|OlmtHXSP~fM4k^lCu?$$q literal 0 HcmV?d00001 diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart new file mode 100644 index 0000000..b1e11e1 --- /dev/null +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart @@ -0,0 +1,1451 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'poultry_location_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$PoultryLocationModel { + + int? get id; String? get unitName;@JsonKey(name: 'Lat') double? get lat;@JsonKey(name: 'Long') double? get long; User? get user; List? get hatching; Address? get address; +/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PoultryLocationModelCopyWith get copyWith => _$PoultryLocationModelCopyWithImpl(this as PoultryLocationModel, _$identity); + + /// Serializes this PoultryLocationModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other.hatching, hatching)&&(identical(other.address, address) || other.address == address)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(hatching),address); + +@override +String toString() { + return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address)'; +} + + +} + +/// @nodoc +abstract mixin class $PoultryLocationModelCopyWith<$Res> { + factory $PoultryLocationModelCopyWith(PoultryLocationModel value, $Res Function(PoultryLocationModel) _then) = _$PoultryLocationModelCopyWithImpl; +@useResult +$Res call({ + int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address +}); + + +$UserCopyWith<$Res>? get user;$AddressCopyWith<$Res>? get address; + +} +/// @nodoc +class _$PoultryLocationModelCopyWithImpl<$Res> + implements $PoultryLocationModelCopyWith<$Res> { + _$PoultryLocationModelCopyWithImpl(this._self, this._then); + + final PoultryLocationModel _self; + final $Res Function(PoultryLocationModel) _then; + +/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,}) { + return _then(_self.copyWith( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,lat: freezed == lat ? _self.lat : lat // ignore: cast_nullable_to_non_nullable +as double?,long: freezed == long ? _self.long : long // ignore: cast_nullable_to_non_nullable +as double?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,hatching: freezed == hatching ? _self.hatching : hatching // ignore: cast_nullable_to_non_nullable +as List?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?, + )); +} +/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [PoultryLocationModel]. +extension PoultryLocationModelPatterns on PoultryLocationModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _PoultryLocationModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _PoultryLocationModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _PoultryLocationModel value) $default,){ +final _that = this; +switch (_that) { +case _PoultryLocationModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _PoultryLocationModel value)? $default,){ +final _that = this; +switch (_that) { +case _PoultryLocationModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _PoultryLocationModel() when $default != null: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address) $default,) {final _that = this; +switch (_that) { +case _PoultryLocationModel(): +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address)? $default,) {final _that = this; +switch (_that) { +case _PoultryLocationModel() when $default != null: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _PoultryLocationModel implements PoultryLocationModel { + const _PoultryLocationModel({this.id, this.unitName, @JsonKey(name: 'Lat') this.lat, @JsonKey(name: 'Long') this.long, this.user, final List? hatching, this.address}): _hatching = hatching; + factory _PoultryLocationModel.fromJson(Map json) => _$PoultryLocationModelFromJson(json); + +@override final int? id; +@override final String? unitName; +@override@JsonKey(name: 'Lat') final double? lat; +@override@JsonKey(name: 'Long') final double? long; +@override final User? user; + final List? _hatching; +@override List? get hatching { + final value = _hatching; + if (value == null) return null; + if (_hatching is EqualUnmodifiableListView) return _hatching; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + +@override final Address? address; + +/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$PoultryLocationModelCopyWith<_PoultryLocationModel> get copyWith => __$PoultryLocationModelCopyWithImpl<_PoultryLocationModel>(this, _$identity); + +@override +Map toJson() { + return _$PoultryLocationModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other._hatching, _hatching)&&(identical(other.address, address) || other.address == address)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(_hatching),address); + +@override +String toString() { + return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address)'; +} + + +} + +/// @nodoc +abstract mixin class _$PoultryLocationModelCopyWith<$Res> implements $PoultryLocationModelCopyWith<$Res> { + factory _$PoultryLocationModelCopyWith(_PoultryLocationModel value, $Res Function(_PoultryLocationModel) _then) = __$PoultryLocationModelCopyWithImpl; +@override @useResult +$Res call({ + int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address +}); + + +@override $UserCopyWith<$Res>? get user;@override $AddressCopyWith<$Res>? get address; + +} +/// @nodoc +class __$PoultryLocationModelCopyWithImpl<$Res> + implements _$PoultryLocationModelCopyWith<$Res> { + __$PoultryLocationModelCopyWithImpl(this._self, this._then); + + final _PoultryLocationModel _self; + final $Res Function(_PoultryLocationModel) _then; + +/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,}) { + return _then(_PoultryLocationModel( +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,lat: freezed == lat ? _self.lat : lat // ignore: cast_nullable_to_non_nullable +as double?,long: freezed == long ? _self.long : long // ignore: cast_nullable_to_non_nullable +as double?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?,hatching: freezed == hatching ? _self._hatching : hatching // ignore: cast_nullable_to_non_nullable +as List?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as Address?, + )); +} + +/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of PoultryLocationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$AddressCopyWith<$Res>? get address { + if (_self.address == null) { + return null; + } + + return $AddressCopyWith<$Res>(_self.address!, (value) { + return _then(_self.copyWith(address: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + String? get fullname; String? get mobile; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,mobile); + +@override +String toString() { + return 'User(fullname: $fullname, mobile: $mobile)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? mobile +}); + + + + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? mobile = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? mobile)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.mobile);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? mobile) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.fullname,_that.mobile);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? mobile)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.mobile);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _User implements User { + const _User({this.fullname, this.mobile}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final String? fullname; +@override final String? mobile; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,mobile); + +@override +String toString() { + return 'User(fullname: $fullname, mobile: $mobile)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? mobile +}); + + + + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? mobile = freezed,}) { + return _then(_User( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$Hatching { + + int? get quantity; int? get leftOver; int? get period; int? get chickenAge; DateTime? get date; bool? get violation; bool? get archive; +/// Create a copy of Hatching +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$HatchingCopyWith get copyWith => _$HatchingCopyWithImpl(this as Hatching, _$identity); + + /// Serializes this Hatching to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Hatching&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.period, period) || other.period == period)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.date, date) || other.date == date)&&(identical(other.violation, violation) || other.violation == violation)&&(identical(other.archive, archive) || other.archive == archive)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,quantity,leftOver,period,chickenAge,date,violation,archive); + +@override +String toString() { + return 'Hatching(quantity: $quantity, leftOver: $leftOver, period: $period, chickenAge: $chickenAge, date: $date, violation: $violation, archive: $archive)'; +} + + +} + +/// @nodoc +abstract mixin class $HatchingCopyWith<$Res> { + factory $HatchingCopyWith(Hatching value, $Res Function(Hatching) _then) = _$HatchingCopyWithImpl; +@useResult +$Res call({ + int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive +}); + + + + +} +/// @nodoc +class _$HatchingCopyWithImpl<$Res> + implements $HatchingCopyWith<$Res> { + _$HatchingCopyWithImpl(this._self, this._then); + + final Hatching _self; + final $Res Function(Hatching) _then; + +/// Create a copy of Hatching +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? quantity = freezed,Object? leftOver = freezed,Object? period = freezed,Object? chickenAge = freezed,Object? date = freezed,Object? violation = freezed,Object? archive = freezed,}) { + return _then(_self.copyWith( +quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable +as int?,leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable +as int?,period: freezed == period ? _self.period : period // ignore: cast_nullable_to_non_nullable +as int?,chickenAge: freezed == chickenAge ? _self.chickenAge : chickenAge // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,violation: freezed == violation ? _self.violation : violation // ignore: cast_nullable_to_non_nullable +as bool?,archive: freezed == archive ? _self.archive : archive // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [Hatching]. +extension HatchingPatterns on Hatching { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Hatching value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Hatching() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Hatching value) $default,){ +final _that = this; +switch (_that) { +case _Hatching(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Hatching value)? $default,){ +final _that = this; +switch (_that) { +case _Hatching() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Hatching() when $default != null: +return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_that.date,_that.violation,_that.archive);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive) $default,) {final _that = this; +switch (_that) { +case _Hatching(): +return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_that.date,_that.violation,_that.archive);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive)? $default,) {final _that = this; +switch (_that) { +case _Hatching() when $default != null: +return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_that.date,_that.violation,_that.archive);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _Hatching implements Hatching { + const _Hatching({this.quantity, this.leftOver, this.period, this.chickenAge, this.date, this.violation, this.archive}); + factory _Hatching.fromJson(Map json) => _$HatchingFromJson(json); + +@override final int? quantity; +@override final int? leftOver; +@override final int? period; +@override final int? chickenAge; +@override final DateTime? date; +@override final bool? violation; +@override final bool? archive; + +/// Create a copy of Hatching +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$HatchingCopyWith<_Hatching> get copyWith => __$HatchingCopyWithImpl<_Hatching>(this, _$identity); + +@override +Map toJson() { + return _$HatchingToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Hatching&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.period, period) || other.period == period)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.date, date) || other.date == date)&&(identical(other.violation, violation) || other.violation == violation)&&(identical(other.archive, archive) || other.archive == archive)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,quantity,leftOver,period,chickenAge,date,violation,archive); + +@override +String toString() { + return 'Hatching(quantity: $quantity, leftOver: $leftOver, period: $period, chickenAge: $chickenAge, date: $date, violation: $violation, archive: $archive)'; +} + + +} + +/// @nodoc +abstract mixin class _$HatchingCopyWith<$Res> implements $HatchingCopyWith<$Res> { + factory _$HatchingCopyWith(_Hatching value, $Res Function(_Hatching) _then) = __$HatchingCopyWithImpl; +@override @useResult +$Res call({ + int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive +}); + + + + +} +/// @nodoc +class __$HatchingCopyWithImpl<$Res> + implements _$HatchingCopyWith<$Res> { + __$HatchingCopyWithImpl(this._self, this._then); + + final _Hatching _self; + final $Res Function(_Hatching) _then; + +/// Create a copy of Hatching +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? quantity = freezed,Object? leftOver = freezed,Object? period = freezed,Object? chickenAge = freezed,Object? date = freezed,Object? violation = freezed,Object? archive = freezed,}) { + return _then(_Hatching( +quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable +as int?,leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable +as int?,period: freezed == period ? _self.period : period // ignore: cast_nullable_to_non_nullable +as int?,chickenAge: freezed == chickenAge ? _self.chickenAge : chickenAge // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,violation: freezed == violation ? _self.violation : violation // ignore: cast_nullable_to_non_nullable +as bool?,archive: freezed == archive ? _self.archive : archive // ignore: cast_nullable_to_non_nullable +as bool?, + )); +} + + +} + + +/// @nodoc +mixin _$Address { + + City? get city; String? get address; +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AddressCopyWith
    get copyWith => _$AddressCopyWithImpl
    (this as Address, _$identity); + + /// Serializes this Address to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Address&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,city,address); + +@override +String toString() { + return 'Address(city: $city, address: $address)'; +} + + +} + +/// @nodoc +abstract mixin class $AddressCopyWith<$Res> { + factory $AddressCopyWith(Address value, $Res Function(Address) _then) = _$AddressCopyWithImpl; +@useResult +$Res call({ + City? city, String? address +}); + + +$CityCopyWith<$Res>? get city; + +} +/// @nodoc +class _$AddressCopyWithImpl<$Res> + implements $AddressCopyWith<$Res> { + _$AddressCopyWithImpl(this._self, this._then); + + final Address _self; + final $Res Function(Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? city = freezed,Object? address = freezed,}) { + return _then(_self.copyWith( +city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [Address]. +extension AddressPatterns on Address { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Address value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Address value) $default,){ +final _that = this; +switch (_that) { +case _Address(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Address value)? $default,){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( City? city, String? address)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.city,_that.address);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( City? city, String? address) $default,) {final _that = this; +switch (_that) { +case _Address(): +return $default(_that.city,_that.address);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( City? city, String? address)? $default,) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.city,_that.address);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _Address implements Address { + const _Address({this.city, this.address}); + factory _Address.fromJson(Map json) => _$AddressFromJson(json); + +@override final City? city; +@override final String? address; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AddressCopyWith<_Address> get copyWith => __$AddressCopyWithImpl<_Address>(this, _$identity); + +@override +Map toJson() { + return _$AddressToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Address&&(identical(other.city, city) || other.city == city)&&(identical(other.address, address) || other.address == address)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,city,address); + +@override +String toString() { + return 'Address(city: $city, address: $address)'; +} + + +} + +/// @nodoc +abstract mixin class _$AddressCopyWith<$Res> implements $AddressCopyWith<$Res> { + factory _$AddressCopyWith(_Address value, $Res Function(_Address) _then) = __$AddressCopyWithImpl; +@override @useResult +$Res call({ + City? city, String? address +}); + + +@override $CityCopyWith<$Res>? get city; + +} +/// @nodoc +class __$AddressCopyWithImpl<$Res> + implements _$AddressCopyWith<$Res> { + __$AddressCopyWithImpl(this._self, this._then); + + final _Address _self; + final $Res Function(_Address) _then; + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? city = freezed,Object? address = freezed,}) { + return _then(_Address( +city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as City?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of Address +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CityCopyWith<$Res>? get city { + if (_self.city == null) { + return null; + } + + return $CityCopyWith<$Res>(_self.city!, (value) { + return _then(_self.copyWith(city: value)); + }); +} +} + + +/// @nodoc +mixin _$City { + + String? get name; +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CityCopyWith get copyWith => _$CityCopyWithImpl(this as City, _$identity); + + /// Serializes this City to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is City&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,name); + +@override +String toString() { + return 'City(name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $CityCopyWith<$Res> { + factory $CityCopyWith(City value, $Res Function(City) _then) = _$CityCopyWithImpl; +@useResult +$Res call({ + String? name +}); + + + + +} +/// @nodoc +class _$CityCopyWithImpl<$Res> + implements $CityCopyWith<$Res> { + _$CityCopyWithImpl(this._self, this._then); + + final City _self; + final $Res Function(City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? name = freezed,}) { + return _then(_self.copyWith( +name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [City]. +extension CityPatterns on City { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _City value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _City value) $default,){ +final _that = this; +switch (_that) { +case _City(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _City value)? $default,){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? name) $default,) {final _that = this; +switch (_that) { +case _City(): +return $default(_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? name)? $default,) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.name);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _City implements City { + const _City({this.name}); + factory _City.fromJson(Map json) => _$CityFromJson(json); + +@override final String? name; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CityCopyWith<_City> get copyWith => __$CityCopyWithImpl<_City>(this, _$identity); + +@override +Map toJson() { + return _$CityToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _City&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,name); + +@override +String toString() { + return 'City(name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$CityCopyWith<$Res> implements $CityCopyWith<$Res> { + factory _$CityCopyWith(_City value, $Res Function(_City) _then) = __$CityCopyWithImpl; +@override @useResult +$Res call({ + String? name +}); + + + + +} +/// @nodoc +class __$CityCopyWithImpl<$Res> + implements _$CityCopyWith<$Res> { + __$CityCopyWithImpl(this._self, this._then); + + final _City _self; + final $Res Function(_City) _then; + +/// Create a copy of City +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? name = freezed,}) { + return _then(_City( +name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart new file mode 100644 index 0000000..653680a --- /dev/null +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart @@ -0,0 +1,86 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'poultry_location_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_PoultryLocationModel _$PoultryLocationModelFromJson( + Map json, +) => _PoultryLocationModel( + id: (json['id'] as num?)?.toInt(), + unitName: json['unit_name'] as String?, + lat: (json['Lat'] as num?)?.toDouble(), + long: (json['Long'] as num?)?.toDouble(), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + hatching: (json['hatching'] as List?) + ?.map((e) => Hatching.fromJson(e as Map)) + .toList(), + address: json['address'] == null + ? null + : Address.fromJson(json['address'] as Map), +); + +Map _$PoultryLocationModelToJson( + _PoultryLocationModel instance, +) => { + 'id': instance.id, + 'unit_name': instance.unitName, + 'Lat': instance.lat, + 'Long': instance.long, + 'user': instance.user, + 'hatching': instance.hatching, + 'address': instance.address, +}; + +_User _$UserFromJson(Map json) => _User( + fullname: json['fullname'] as String?, + mobile: json['mobile'] as String?, +); + +Map _$UserToJson(_User instance) => { + 'fullname': instance.fullname, + 'mobile': instance.mobile, +}; + +_Hatching _$HatchingFromJson(Map json) => _Hatching( + quantity: (json['quantity'] as num?)?.toInt(), + leftOver: (json['left_over'] as num?)?.toInt(), + period: (json['period'] as num?)?.toInt(), + chickenAge: (json['chicken_age'] as num?)?.toInt(), + date: json['date'] == null ? null : DateTime.parse(json['date'] as String), + violation: json['violation'] as bool?, + archive: json['archive'] as bool?, +); + +Map _$HatchingToJson(_Hatching instance) => { + 'quantity': instance.quantity, + 'left_over': instance.leftOver, + 'period': instance.period, + 'chicken_age': instance.chickenAge, + 'date': instance.date?.toIso8601String(), + 'violation': instance.violation, + 'archive': instance.archive, +}; + +_Address _$AddressFromJson(Map json) => _Address( + city: json['city'] == null + ? null + : City.fromJson(json['city'] as Map), + address: json['address'] as String?, +); + +Map _$AddressToJson(_Address instance) => { + 'city': instance.city, + 'address': instance.address, +}; + +_City _$CityFromJson(Map json) => + _City(name: json['name'] as String?); + +Map _$CityToJson(_City instance) => { + 'name': instance.name, +}; diff --git a/packages/inspection/lib/data/model/response/user_profile/user_profile_model.freezed.dart b/packages/inspection/lib/data/model/response/user_profile/user_profile_model.freezed.dart new file mode 100644 index 0000000..2e3865e --- /dev/null +++ b/packages/inspection/lib/data/model/response/user_profile/user_profile_model.freezed.dart @@ -0,0 +1,1479 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user_profile_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$UserProfileModel { + + User get user; Role get role; List get permissions; +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserProfileModelCopyWith get copyWith => _$UserProfileModelCopyWithImpl(this as UserProfileModel, _$identity); + + /// Serializes this UserProfileModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UserProfileModel&&(identical(other.user, user) || other.user == user)&&(identical(other.role, role) || other.role == role)&&const DeepCollectionEquality().equals(other.permissions, permissions)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user,role,const DeepCollectionEquality().hash(permissions)); + +@override +String toString() { + return 'UserProfileModel(user: $user, role: $role, permissions: $permissions)'; +} + + +} + +/// @nodoc +abstract mixin class $UserProfileModelCopyWith<$Res> { + factory $UserProfileModelCopyWith(UserProfileModel value, $Res Function(UserProfileModel) _then) = _$UserProfileModelCopyWithImpl; +@useResult +$Res call({ + User user, Role role, List permissions +}); + + +$UserCopyWith<$Res> get user;$RoleCopyWith<$Res> get role; + +} +/// @nodoc +class _$UserProfileModelCopyWithImpl<$Res> + implements $UserProfileModelCopyWith<$Res> { + _$UserProfileModelCopyWithImpl(this._self, this._then); + + final UserProfileModel _self; + final $Res Function(UserProfileModel) _then; + +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? user = null,Object? role = null,Object? permissions = null,}) { + return _then(_self.copyWith( +user: null == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User,role: null == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as Role,permissions: null == permissions ? _self.permissions : permissions // ignore: cast_nullable_to_non_nullable +as List, + )); +} +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res> get user { + + return $UserCopyWith<$Res>(_self.user, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$RoleCopyWith<$Res> get role { + + return $RoleCopyWith<$Res>(_self.role, (value) { + return _then(_self.copyWith(role: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [UserProfileModel]. +extension UserProfileModelPatterns on UserProfileModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _UserProfileModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _UserProfileModel value) $default,){ +final _that = this; +switch (_that) { +case _UserProfileModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _UserProfileModel value)? $default,){ +final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( User user, Role role, List permissions)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that.user,_that.role,_that.permissions);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( User user, Role role, List permissions) $default,) {final _that = this; +switch (_that) { +case _UserProfileModel(): +return $default(_that.user,_that.role,_that.permissions);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( User user, Role role, List permissions)? $default,) {final _that = this; +switch (_that) { +case _UserProfileModel() when $default != null: +return $default(_that.user,_that.role,_that.permissions);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _UserProfileModel implements UserProfileModel { + const _UserProfileModel({required this.user, required this.role, required final List permissions}): _permissions = permissions; + factory _UserProfileModel.fromJson(Map json) => _$UserProfileModelFromJson(json); + +@override final User user; +@override final Role role; + final List _permissions; +@override List get permissions { + if (_permissions is EqualUnmodifiableListView) return _permissions; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_permissions); +} + + +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserProfileModelCopyWith<_UserProfileModel> get copyWith => __$UserProfileModelCopyWithImpl<_UserProfileModel>(this, _$identity); + +@override +Map toJson() { + return _$UserProfileModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _UserProfileModel&&(identical(other.user, user) || other.user == user)&&(identical(other.role, role) || other.role == role)&&const DeepCollectionEquality().equals(other._permissions, _permissions)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,user,role,const DeepCollectionEquality().hash(_permissions)); + +@override +String toString() { + return 'UserProfileModel(user: $user, role: $role, permissions: $permissions)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserProfileModelCopyWith<$Res> implements $UserProfileModelCopyWith<$Res> { + factory _$UserProfileModelCopyWith(_UserProfileModel value, $Res Function(_UserProfileModel) _then) = __$UserProfileModelCopyWithImpl; +@override @useResult +$Res call({ + User user, Role role, List permissions +}); + + +@override $UserCopyWith<$Res> get user;@override $RoleCopyWith<$Res> get role; + +} +/// @nodoc +class __$UserProfileModelCopyWithImpl<$Res> + implements _$UserProfileModelCopyWith<$Res> { + __$UserProfileModelCopyWithImpl(this._self, this._then); + + final _UserProfileModel _self; + final $Res Function(_UserProfileModel) _then; + +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? user = null,Object? role = null,Object? permissions = null,}) { + return _then(_UserProfileModel( +user: null == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User,role: null == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as Role,permissions: null == permissions ? _self._permissions : permissions // ignore: cast_nullable_to_non_nullable +as List, + )); +} + +/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res> get user { + + return $UserCopyWith<$Res>(_self.user, (value) { + return _then(_self.copyWith(user: value)); + }); +}/// Create a copy of UserProfileModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$RoleCopyWith<$Res> get role { + + return $RoleCopyWith<$Res>(_self.role, (value) { + return _then(_self.copyWith(role: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + int get id; String get username; String get password; String get firstName; String get lastName; bool get isActive; String get mobile; String get phone; String get nationalCode; DateTime get birthdate; String get nationality; String get ownership; String get address; String get photo; int get province; int get city; bool get otpStatus; String get cityName; String get provinceName; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.id, id) || other.id == id)&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.isActive, isActive) || other.isActive == isActive)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.birthdate, birthdate) || other.birthdate == birthdate)&&(identical(other.nationality, nationality) || other.nationality == nationality)&&(identical(other.ownership, ownership) || other.ownership == ownership)&&(identical(other.address, address) || other.address == address)&&(identical(other.photo, photo) || other.photo == photo)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,username,password,firstName,lastName,isActive,mobile,phone,nationalCode,birthdate,nationality,ownership,address,photo,province,city,otpStatus,cityName,provinceName]); + +@override +String toString() { + return 'User(id: $id, username: $username, password: $password, firstName: $firstName, lastName: $lastName, isActive: $isActive, mobile: $mobile, phone: $phone, nationalCode: $nationalCode, birthdate: $birthdate, nationality: $nationality, ownership: $ownership, address: $address, photo: $photo, province: $province, city: $city, otpStatus: $otpStatus, cityName: $cityName, provinceName: $provinceName)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + int id, String username, String password, String firstName, String lastName, bool isActive, String mobile, String phone, String nationalCode, DateTime birthdate, String nationality, String ownership, String address, String photo, int province, int city, bool otpStatus, String cityName, String provinceName +}); + + + + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? username = null,Object? password = null,Object? firstName = null,Object? lastName = null,Object? isActive = null,Object? mobile = null,Object? phone = null,Object? nationalCode = null,Object? birthdate = null,Object? nationality = null,Object? ownership = null,Object? address = null,Object? photo = null,Object? province = null,Object? city = null,Object? otpStatus = null,Object? cityName = null,Object? provinceName = null,}) { + return _then(_self.copyWith( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int,username: null == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String,isActive: null == isActive ? _self.isActive : isActive // ignore: cast_nullable_to_non_nullable +as bool,mobile: null == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as String,nationalCode: null == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String,birthdate: null == birthdate ? _self.birthdate : birthdate // ignore: cast_nullable_to_non_nullable +as DateTime,nationality: null == nationality ? _self.nationality : nationality // ignore: cast_nullable_to_non_nullable +as String,ownership: null == ownership ? _self.ownership : ownership // ignore: cast_nullable_to_non_nullable +as String,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String,photo: null == photo ? _self.photo : photo // ignore: cast_nullable_to_non_nullable +as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as int,otpStatus: null == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool,cityName: null == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String,provinceName: null == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +} + + +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int id, String username, String password, String firstName, String lastName, bool isActive, String mobile, String phone, String nationalCode, DateTime birthdate, String nationality, String ownership, String address, String photo, int province, int city, bool otpStatus, String cityName, String provinceName)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.id,_that.username,_that.password,_that.firstName,_that.lastName,_that.isActive,_that.mobile,_that.phone,_that.nationalCode,_that.birthdate,_that.nationality,_that.ownership,_that.address,_that.photo,_that.province,_that.city,_that.otpStatus,_that.cityName,_that.provinceName);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int id, String username, String password, String firstName, String lastName, bool isActive, String mobile, String phone, String nationalCode, DateTime birthdate, String nationality, String ownership, String address, String photo, int province, int city, bool otpStatus, String cityName, String provinceName) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.id,_that.username,_that.password,_that.firstName,_that.lastName,_that.isActive,_that.mobile,_that.phone,_that.nationalCode,_that.birthdate,_that.nationality,_that.ownership,_that.address,_that.photo,_that.province,_that.city,_that.otpStatus,_that.cityName,_that.provinceName);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int id, String username, String password, String firstName, String lastName, bool isActive, String mobile, String phone, String nationalCode, DateTime birthdate, String nationality, String ownership, String address, String photo, int province, int city, bool otpStatus, String cityName, String provinceName)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.id,_that.username,_that.password,_that.firstName,_that.lastName,_that.isActive,_that.mobile,_that.phone,_that.nationalCode,_that.birthdate,_that.nationality,_that.ownership,_that.address,_that.photo,_that.province,_that.city,_that.otpStatus,_that.cityName,_that.provinceName);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _User implements User { + const _User({required this.id, required this.username, required this.password, required this.firstName, required this.lastName, required this.isActive, required this.mobile, required this.phone, required this.nationalCode, required this.birthdate, required this.nationality, required this.ownership, required this.address, required this.photo, required this.province, required this.city, required this.otpStatus, required this.cityName, required this.provinceName}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final int id; +@override final String username; +@override final String password; +@override final String firstName; +@override final String lastName; +@override final bool isActive; +@override final String mobile; +@override final String phone; +@override final String nationalCode; +@override final DateTime birthdate; +@override final String nationality; +@override final String ownership; +@override final String address; +@override final String photo; +@override final int province; +@override final int city; +@override final bool otpStatus; +@override final String cityName; +@override final String provinceName; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.id, id) || other.id == id)&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.isActive, isActive) || other.isActive == isActive)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.birthdate, birthdate) || other.birthdate == birthdate)&&(identical(other.nationality, nationality) || other.nationality == nationality)&&(identical(other.ownership, ownership) || other.ownership == ownership)&&(identical(other.address, address) || other.address == address)&&(identical(other.photo, photo) || other.photo == photo)&&(identical(other.province, province) || other.province == province)&&(identical(other.city, city) || other.city == city)&&(identical(other.otpStatus, otpStatus) || other.otpStatus == otpStatus)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,username,password,firstName,lastName,isActive,mobile,phone,nationalCode,birthdate,nationality,ownership,address,photo,province,city,otpStatus,cityName,provinceName]); + +@override +String toString() { + return 'User(id: $id, username: $username, password: $password, firstName: $firstName, lastName: $lastName, isActive: $isActive, mobile: $mobile, phone: $phone, nationalCode: $nationalCode, birthdate: $birthdate, nationality: $nationality, ownership: $ownership, address: $address, photo: $photo, province: $province, city: $city, otpStatus: $otpStatus, cityName: $cityName, provinceName: $provinceName)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + int id, String username, String password, String firstName, String lastName, bool isActive, String mobile, String phone, String nationalCode, DateTime birthdate, String nationality, String ownership, String address, String photo, int province, int city, bool otpStatus, String cityName, String provinceName +}); + + + + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? username = null,Object? password = null,Object? firstName = null,Object? lastName = null,Object? isActive = null,Object? mobile = null,Object? phone = null,Object? nationalCode = null,Object? birthdate = null,Object? nationality = null,Object? ownership = null,Object? address = null,Object? photo = null,Object? province = null,Object? city = null,Object? otpStatus = null,Object? cityName = null,Object? provinceName = null,}) { + return _then(_User( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int,username: null == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String,isActive: null == isActive ? _self.isActive : isActive // ignore: cast_nullable_to_non_nullable +as bool,mobile: null == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable +as String,nationalCode: null == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String,birthdate: null == birthdate ? _self.birthdate : birthdate // ignore: cast_nullable_to_non_nullable +as DateTime,nationality: null == nationality ? _self.nationality : nationality // ignore: cast_nullable_to_non_nullable +as String,ownership: null == ownership ? _self.ownership : ownership // ignore: cast_nullable_to_non_nullable +as String,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String,photo: null == photo ? _self.photo : photo // ignore: cast_nullable_to_non_nullable +as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as int,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as int,otpStatus: null == otpStatus ? _self.otpStatus : otpStatus // ignore: cast_nullable_to_non_nullable +as bool,cityName: null == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String,provinceName: null == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + + +/// @nodoc +mixin _$Role { + + int get id; String get roleName; String get description; RoleType get type; List get permissions; +/// Create a copy of Role +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RoleCopyWith get copyWith => _$RoleCopyWithImpl(this as Role, _$identity); + + /// Serializes this Role to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Role&&(identical(other.id, id) || other.id == id)&&(identical(other.roleName, roleName) || other.roleName == roleName)&&(identical(other.description, description) || other.description == description)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other.permissions, permissions)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,roleName,description,type,const DeepCollectionEquality().hash(permissions)); + +@override +String toString() { + return 'Role(id: $id, roleName: $roleName, description: $description, type: $type, permissions: $permissions)'; +} + + +} + +/// @nodoc +abstract mixin class $RoleCopyWith<$Res> { + factory $RoleCopyWith(Role value, $Res Function(Role) _then) = _$RoleCopyWithImpl; +@useResult +$Res call({ + int id, String roleName, String description, RoleType type, List permissions +}); + + +$RoleTypeCopyWith<$Res> get type; + +} +/// @nodoc +class _$RoleCopyWithImpl<$Res> + implements $RoleCopyWith<$Res> { + _$RoleCopyWithImpl(this._self, this._then); + + final Role _self; + final $Res Function(Role) _then; + +/// Create a copy of Role +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? roleName = null,Object? description = null,Object? type = null,Object? permissions = null,}) { + return _then(_self.copyWith( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int,roleName: null == roleName ? _self.roleName : roleName // ignore: cast_nullable_to_non_nullable +as String,description: null == description ? _self.description : description // ignore: cast_nullable_to_non_nullable +as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as RoleType,permissions: null == permissions ? _self.permissions : permissions // ignore: cast_nullable_to_non_nullable +as List, + )); +} +/// Create a copy of Role +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$RoleTypeCopyWith<$Res> get type { + + return $RoleTypeCopyWith<$Res>(_self.type, (value) { + return _then(_self.copyWith(type: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [Role]. +extension RolePatterns on Role { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Role value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Role() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Role value) $default,){ +final _that = this; +switch (_that) { +case _Role(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Role value)? $default,){ +final _that = this; +switch (_that) { +case _Role() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int id, String roleName, String description, RoleType type, List permissions)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Role() when $default != null: +return $default(_that.id,_that.roleName,_that.description,_that.type,_that.permissions);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int id, String roleName, String description, RoleType type, List permissions) $default,) {final _that = this; +switch (_that) { +case _Role(): +return $default(_that.id,_that.roleName,_that.description,_that.type,_that.permissions);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int id, String roleName, String description, RoleType type, List permissions)? $default,) {final _that = this; +switch (_that) { +case _Role() when $default != null: +return $default(_that.id,_that.roleName,_that.description,_that.type,_that.permissions);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _Role implements Role { + const _Role({required this.id, required this.roleName, required this.description, required this.type, required final List permissions}): _permissions = permissions; + factory _Role.fromJson(Map json) => _$RoleFromJson(json); + +@override final int id; +@override final String roleName; +@override final String description; +@override final RoleType type; + final List _permissions; +@override List get permissions { + if (_permissions is EqualUnmodifiableListView) return _permissions; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_permissions); +} + + +/// Create a copy of Role +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$RoleCopyWith<_Role> get copyWith => __$RoleCopyWithImpl<_Role>(this, _$identity); + +@override +Map toJson() { + return _$RoleToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Role&&(identical(other.id, id) || other.id == id)&&(identical(other.roleName, roleName) || other.roleName == roleName)&&(identical(other.description, description) || other.description == description)&&(identical(other.type, type) || other.type == type)&&const DeepCollectionEquality().equals(other._permissions, _permissions)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,id,roleName,description,type,const DeepCollectionEquality().hash(_permissions)); + +@override +String toString() { + return 'Role(id: $id, roleName: $roleName, description: $description, type: $type, permissions: $permissions)'; +} + + +} + +/// @nodoc +abstract mixin class _$RoleCopyWith<$Res> implements $RoleCopyWith<$Res> { + factory _$RoleCopyWith(_Role value, $Res Function(_Role) _then) = __$RoleCopyWithImpl; +@override @useResult +$Res call({ + int id, String roleName, String description, RoleType type, List permissions +}); + + +@override $RoleTypeCopyWith<$Res> get type; + +} +/// @nodoc +class __$RoleCopyWithImpl<$Res> + implements _$RoleCopyWith<$Res> { + __$RoleCopyWithImpl(this._self, this._then); + + final _Role _self; + final $Res Function(_Role) _then; + +/// Create a copy of Role +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? roleName = null,Object? description = null,Object? type = null,Object? permissions = null,}) { + return _then(_Role( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int,roleName: null == roleName ? _self.roleName : roleName // ignore: cast_nullable_to_non_nullable +as String,description: null == description ? _self.description : description // ignore: cast_nullable_to_non_nullable +as String,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as RoleType,permissions: null == permissions ? _self._permissions : permissions // ignore: cast_nullable_to_non_nullable +as List, + )); +} + +/// Create a copy of Role +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$RoleTypeCopyWith<$Res> get type { + + return $RoleTypeCopyWith<$Res>(_self.type, (value) { + return _then(_self.copyWith(type: value)); + }); +} +} + + +/// @nodoc +mixin _$RoleType { + + String? get key; String get name; +/// Create a copy of RoleType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RoleTypeCopyWith get copyWith => _$RoleTypeCopyWithImpl(this as RoleType, _$identity); + + /// Serializes this RoleType to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RoleType&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'RoleType(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class $RoleTypeCopyWith<$Res> { + factory $RoleTypeCopyWith(RoleType value, $Res Function(RoleType) _then) = _$RoleTypeCopyWithImpl; +@useResult +$Res call({ + String? key, String name +}); + + + + +} +/// @nodoc +class _$RoleTypeCopyWithImpl<$Res> + implements $RoleTypeCopyWith<$Res> { + _$RoleTypeCopyWithImpl(this._self, this._then); + + final RoleType _self; + final $Res Function(RoleType) _then; + +/// Create a copy of RoleType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = null,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +} + + +/// Adds pattern-matching-related methods to [RoleType]. +extension RoleTypePatterns on RoleType { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _RoleType value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _RoleType() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _RoleType value) $default,){ +final _that = this; +switch (_that) { +case _RoleType(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _RoleType value)? $default,){ +final _that = this; +switch (_that) { +case _RoleType() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _RoleType() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String name) $default,) {final _that = this; +switch (_that) { +case _RoleType(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String name)? $default,) {final _that = this; +switch (_that) { +case _RoleType() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _RoleType implements RoleType { + const _RoleType({this.key, required this.name}); + factory _RoleType.fromJson(Map json) => _$RoleTypeFromJson(json); + +@override final String? key; +@override final String name; + +/// Create a copy of RoleType +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$RoleTypeCopyWith<_RoleType> get copyWith => __$RoleTypeCopyWithImpl<_RoleType>(this, _$identity); + +@override +Map toJson() { + return _$RoleTypeToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _RoleType&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,name); + +@override +String toString() { + return 'RoleType(key: $key, name: $name)'; +} + + +} + +/// @nodoc +abstract mixin class _$RoleTypeCopyWith<$Res> implements $RoleTypeCopyWith<$Res> { + factory _$RoleTypeCopyWith(_RoleType value, $Res Function(_RoleType) _then) = __$RoleTypeCopyWithImpl; +@override @useResult +$Res call({ + String? key, String name +}); + + + + +} +/// @nodoc +class __$RoleTypeCopyWithImpl<$Res> + implements _$RoleTypeCopyWith<$Res> { + __$RoleTypeCopyWithImpl(this._self, this._then); + + final _RoleType _self; + final $Res Function(_RoleType) _then; + +/// Create a copy of RoleType +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = null,}) { + return _then(_RoleType( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + + +/// @nodoc +mixin _$Permission { + + String get pageName; List get pageAccess; +/// Create a copy of Permission +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PermissionCopyWith get copyWith => _$PermissionCopyWithImpl(this as Permission, _$identity); + + /// Serializes this Permission to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Permission&&(identical(other.pageName, pageName) || other.pageName == pageName)&&const DeepCollectionEquality().equals(other.pageAccess, pageAccess)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,pageName,const DeepCollectionEquality().hash(pageAccess)); + +@override +String toString() { + return 'Permission(pageName: $pageName, pageAccess: $pageAccess)'; +} + + +} + +/// @nodoc +abstract mixin class $PermissionCopyWith<$Res> { + factory $PermissionCopyWith(Permission value, $Res Function(Permission) _then) = _$PermissionCopyWithImpl; +@useResult +$Res call({ + String pageName, List pageAccess +}); + + + + +} +/// @nodoc +class _$PermissionCopyWithImpl<$Res> + implements $PermissionCopyWith<$Res> { + _$PermissionCopyWithImpl(this._self, this._then); + + final Permission _self; + final $Res Function(Permission) _then; + +/// Create a copy of Permission +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? pageName = null,Object? pageAccess = null,}) { + return _then(_self.copyWith( +pageName: null == pageName ? _self.pageName : pageName // ignore: cast_nullable_to_non_nullable +as String,pageAccess: null == pageAccess ? _self.pageAccess : pageAccess // ignore: cast_nullable_to_non_nullable +as List, + )); +} + +} + + +/// Adds pattern-matching-related methods to [Permission]. +extension PermissionPatterns on Permission { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Permission value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Permission() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Permission value) $default,){ +final _that = this; +switch (_that) { +case _Permission(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Permission value)? $default,){ +final _that = this; +switch (_that) { +case _Permission() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String pageName, List pageAccess)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Permission() when $default != null: +return $default(_that.pageName,_that.pageAccess);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String pageName, List pageAccess) $default,) {final _that = this; +switch (_that) { +case _Permission(): +return $default(_that.pageName,_that.pageAccess);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String pageName, List pageAccess)? $default,) {final _that = this; +switch (_that) { +case _Permission() when $default != null: +return $default(_that.pageName,_that.pageAccess);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _Permission implements Permission { + const _Permission({required this.pageName, required final List pageAccess}): _pageAccess = pageAccess; + factory _Permission.fromJson(Map json) => _$PermissionFromJson(json); + +@override final String pageName; + final List _pageAccess; +@override List get pageAccess { + if (_pageAccess is EqualUnmodifiableListView) return _pageAccess; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_pageAccess); +} + + +/// Create a copy of Permission +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$PermissionCopyWith<_Permission> get copyWith => __$PermissionCopyWithImpl<_Permission>(this, _$identity); + +@override +Map toJson() { + return _$PermissionToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Permission&&(identical(other.pageName, pageName) || other.pageName == pageName)&&const DeepCollectionEquality().equals(other._pageAccess, _pageAccess)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,pageName,const DeepCollectionEquality().hash(_pageAccess)); + +@override +String toString() { + return 'Permission(pageName: $pageName, pageAccess: $pageAccess)'; +} + + +} + +/// @nodoc +abstract mixin class _$PermissionCopyWith<$Res> implements $PermissionCopyWith<$Res> { + factory _$PermissionCopyWith(_Permission value, $Res Function(_Permission) _then) = __$PermissionCopyWithImpl; +@override @useResult +$Res call({ + String pageName, List pageAccess +}); + + + + +} +/// @nodoc +class __$PermissionCopyWithImpl<$Res> + implements _$PermissionCopyWith<$Res> { + __$PermissionCopyWithImpl(this._self, this._then); + + final _Permission _self; + final $Res Function(_Permission) _then; + +/// Create a copy of Permission +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? pageName = null,Object? pageAccess = null,}) { + return _then(_Permission( +pageName: null == pageName ? _self.pageName : pageName // ignore: cast_nullable_to_non_nullable +as String,pageAccess: null == pageAccess ? _self._pageAccess : pageAccess // ignore: cast_nullable_to_non_nullable +as List, + )); +} + + +} + +// dart format on diff --git a/packages/inspection/lib/data/model/response/user_profile/user_profile_model.g.dart b/packages/inspection/lib/data/model/response/user_profile/user_profile_model.g.dart new file mode 100644 index 0000000..7bf5323 --- /dev/null +++ b/packages/inspection/lib/data/model/response/user_profile/user_profile_model.g.dart @@ -0,0 +1,104 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_profile_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_UserProfileModel _$UserProfileModelFromJson(Map json) => + _UserProfileModel( + user: User.fromJson(json['user'] as Map), + role: Role.fromJson(json['role'] as Map), + permissions: (json['permissions'] as List) + .map((e) => Permission.fromJson(e as Map)) + .toList(), + ); + +Map _$UserProfileModelToJson(_UserProfileModel instance) => + { + 'user': instance.user, + 'role': instance.role, + 'permissions': instance.permissions, + }; + +_User _$UserFromJson(Map json) => _User( + id: (json['id'] as num).toInt(), + username: json['username'] as String, + password: json['password'] as String, + firstName: json['first_name'] as String, + lastName: json['last_name'] as String, + isActive: json['is_active'] as bool, + mobile: json['mobile'] as String, + phone: json['phone'] as String, + nationalCode: json['national_code'] as String, + birthdate: DateTime.parse(json['birthdate'] as String), + nationality: json['nationality'] as String, + ownership: json['ownership'] as String, + address: json['address'] as String, + photo: json['photo'] as String, + province: (json['province'] as num).toInt(), + city: (json['city'] as num).toInt(), + otpStatus: json['otp_status'] as bool, + cityName: json['city_name'] as String, + provinceName: json['province_name'] as String, +); + +Map _$UserToJson(_User instance) => { + 'id': instance.id, + 'username': instance.username, + 'password': instance.password, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'is_active': instance.isActive, + 'mobile': instance.mobile, + 'phone': instance.phone, + 'national_code': instance.nationalCode, + 'birthdate': instance.birthdate.toIso8601String(), + 'nationality': instance.nationality, + 'ownership': instance.ownership, + 'address': instance.address, + 'photo': instance.photo, + 'province': instance.province, + 'city': instance.city, + 'otp_status': instance.otpStatus, + 'city_name': instance.cityName, + 'province_name': instance.provinceName, +}; + +_Role _$RoleFromJson(Map json) => _Role( + id: (json['id'] as num).toInt(), + roleName: json['role_name'] as String, + description: json['description'] as String, + type: RoleType.fromJson(json['type'] as Map), + permissions: json['permissions'] as List, +); + +Map _$RoleToJson(_Role instance) => { + 'id': instance.id, + 'role_name': instance.roleName, + 'description': instance.description, + 'type': instance.type, + 'permissions': instance.permissions, +}; + +_RoleType _$RoleTypeFromJson(Map json) => + _RoleType(key: json['key'] as String?, name: json['name'] as String); + +Map _$RoleTypeToJson(_RoleType instance) => { + 'key': instance.key, + 'name': instance.name, +}; + +_Permission _$PermissionFromJson(Map json) => _Permission( + pageName: json['page_name'] as String, + pageAccess: (json['page_access'] as List) + .map((e) => e as String) + .toList(), +); + +Map _$PermissionToJson(_Permission instance) => + { + 'page_name': instance.pageName, + 'page_access': instance.pageAccess, + }; From 716dd6e70a38cf6b1ac8e855c96b0f79907e8ae7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 29 Jul 2025 10:50:18 +0330 Subject: [PATCH 246/256] feat : Cluster Map --- packages/core/lib/core.dart | 1 + packages/core/pubspec.lock | 64 +++++++++++++++---- packages/core/pubspec.yaml | 5 +- .../pages/inspection_map/logic.dart | 46 ++++++++++--- .../pages/inspection_map/view.dart | 56 ++++++++-------- packages/inspection/pubspec.lock | 64 +++++++++++++++---- pubspec.lock | 64 +++++++++++++++---- 7 files changed, 225 insertions(+), 75 deletions(-) diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index ce05d09..86caf03 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -36,6 +36,7 @@ export 'package:pretty_dio_logger/pretty_dio_logger.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; +export 'package:flutter_map_marker_cluster/flutter_map_marker_cluster.dart'; //models export 'data/model/model.dart'; diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index ec15459..9eea597 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -25,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.3.0" + animated_stack_widget: + dependency: transitive + description: + name: animated_stack_widget + sha256: ce4788dd158768c9d4388354b6fb72600b78e041a37afc4c279c63ecafcb9408 + url: "https://pub.dev" + source: hosted + version: "0.0.4" archive: dependency: transitive description: @@ -217,14 +225,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - dart_polylabel2: - dependency: transitive - description: - name: dart_polylabel2 - sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" - url: "https://pub.dev" - source: hosted - version: "1.0.0" dart_style: dependency: transitive description: @@ -391,18 +391,34 @@ packages: dependency: "direct main" description: name: flutter_map - sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5 + sha256: "2ecb34619a4be19df6f40c2f8dce1591675b4eff7a6857bd8f533706977385da" url: "https://pub.dev" source: hosted - version: "8.2.1" + version: "7.0.2" flutter_map_animations: dependency: "direct main" description: name: flutter_map_animations - sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e + sha256: "08233f89919049a3601e785d32e9d1d9e1faac6578190150f1d7495fc1050d36" url: "https://pub.dev" source: hosted - version: "0.9.0" + version: "0.8.0" + flutter_map_marker_cluster: + dependency: "direct main" + description: + name: flutter_map_marker_cluster + sha256: "2c1fb4d7a2105c4bbeb89be215320507f4b71b2036df4341fab9d2aa677d3ae9" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + flutter_map_marker_popup: + dependency: transitive + description: + name: flutter_map_marker_popup + sha256: a7540538114b5d1627ab67b498273d66bc36090385412ae49ef215af4a2861c5 + url: "https://pub.dev" + source: hosted + version: "7.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -957,6 +973,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" package_config: dependency: transitive description: @@ -1133,6 +1157,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.9.1" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" pool: dependency: transitive description: @@ -1165,6 +1197,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + provider: + dependency: transitive + description: + name: provider + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" + url: "https://pub.dev" + source: hosted + version: "6.1.5" pub_semver: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index e064032..f87b92b 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -68,8 +68,9 @@ dependencies: android_intent_plus: ^5.3.0 #Map - flutter_map: ^8.2.1 - flutter_map_animations: ^0.9.0 + flutter_map: ^7.0.0 + flutter_map_animations: ^0.8.0 + flutter_map_marker_cluster: ^1.4.0 #location latlong2: ^0.9.1 geolocator: ^14.0.2 diff --git a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart index f1dfd8c..ede317b 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:math'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; @@ -11,12 +12,12 @@ import '../filter/view.dart'; class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin { final BaseLogic baseLogic = Get.find(); - + final distance = Distance(); Rx currentLocation = LatLng(34.798315281272544, 48.51479142983491).obs; Rx>> allPoultryLocation = Resource>.loading().obs; - RxList markers = [].obs; + RxList markers = [].obs; Timer? _debounceTimer; RxBool isLoading = false.obs; @@ -25,6 +26,7 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin RxInt filterIndex = 0.obs; RxInt showIndex = 0.obs; bool showSlideHint = true; + RxInt currentZoom = 15.obs; late Rx slidController; @@ -114,17 +116,28 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin isLoading.value = false; } - void debouncedUpdateVisibleMarkers({required LatLng center}) { + void debouncedUpdateVisibleMarkers({required LatLng center, required double zoom}) { _debounceTimer?.cancel(); _debounceTimer = Timer(const Duration(milliseconds: 300), () { + var raduis = getVisibleRadiusKm( + zoom: zoom, + screenWidthPx: Get.width.toDouble(), + latitude: center.latitude, + ); final filtered = filterNearbyMarkers( allPoultryLocation.value.data ?? [], center.latitude, center.longitude, - 10000, // Radius in meters + raduis * 1000, // Radius in meters + ); + markers.assignAll( + filtered.map( + (e) => Marker( + point: LatLng(e.lat ?? 0, e.long ?? 0), + child: Icon(Icons.location_on, color: Colors.red), + ), + ), ); - - markers.addAll(filtered); }); } @@ -135,11 +148,10 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin double radiusInMeters, ) { final center = LatLng(centerLat, centerLng); - final distance = Distance(); return allMarkers.where((marker) { - var tmp =LatLng(marker.lat ?? 0, marker.long ?? 0); - return distance(center,tmp ) <= radiusInMeters; + var tmp = LatLng(marker.lat ?? 0, marker.long ?? 0); + return distance(center, tmp) <= radiusInMeters; }).toList(); } @@ -155,7 +167,11 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin isLoading.value = true; allPoultryLocation.value = Resource>.loading(); await safeCall( - call: () => inspectionRepository.getNearbyLocation(), + call: () => inspectionRepository.getNearbyLocation( + centerLat: currentLocation.value.latitude, + centerLng: currentLocation.value.longitude, + radius: 15, // Radius in K meters + ), onSuccess: (result) { if (result != null) { allPoultryLocation.value = Resource>.success(result); @@ -170,4 +186,14 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin }, ); } + + double getVisibleRadiusKm({ + required double zoom, + required double screenWidthPx, + required double latitude, + }) { + double metersPerPixel = 156543.03392 * cos(latitude * pi / 180) / pow(2, zoom); + double visibleWidthInMeters = metersPerPixel * screenWidthPx; + return (visibleWidthInMeters / 2) / 1000; // radius in KM + } } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index 9645419..1d3734f 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/presentation/pages/filter/view.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; @@ -39,40 +38,44 @@ class InspectionMapPage extends GetView { mapController: controller.animatedMapController.mapController, options: MapOptions( initialCenter: currentLocation.value, - initialZoom: 18, + interactionOptions: const InteractionOptions( + flags: InteractiveFlag.all & ~InteractiveFlag.rotate, + ), + initialZoom: 15, onPositionChanged: (camera, hasGesture) { - controller.debouncedUpdateVisibleMarkers(center: camera.center); + controller.debouncedUpdateVisibleMarkers(center: camera.center,zoom: camera.zoom); }, ), + children: [ TileLayer( urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'ir.mnpc.rasadyar', ), - ObxValue((markers) { - return MarkerLayer( - markers: markers - .map( - (e) => markerWidget( - marker: LatLng(e.lat??0, e.long??0), - onTap: () { - Get.bottomSheet( - selectedLocationWidget2( - showHint: false, - sliderController: controller.slidController.value, - trigger: () {}, - toggle: () {}, - ), - isScrollControlled: true, - enableDrag: true, - backgroundColor: Colors.transparent, - ); - }, + MarkerClusterLayerWidget( + options: MarkerClusterLayerOptions( + maxClusterRadius: 80, + size: const Size(40, 40), + alignment: Alignment.center, + padding: const EdgeInsets.all(50), + maxZoom: 15, + markers: controller.markers, + builder: (context, markers) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.blue, + ), + child: Center( + child: Text( + markers.length.toString(), + style: const TextStyle(color: Colors.white), ), - ) - .toList(), - ); - }, controller.markers), + ), + ); + }, + ), + ), ], ); }, controller.currentLocation), @@ -521,7 +524,6 @@ Widget cardWithLabel({ ); } - Widget selectedLocationWidget({ required bool showHint, required SlidableController sliderController, diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock index b52d807..dda8513 100644 --- a/packages/inspection/pubspec.lock +++ b/packages/inspection/pubspec.lock @@ -25,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.3.0" + animated_stack_widget: + dependency: transitive + description: + name: animated_stack_widget + sha256: ce4788dd158768c9d4388354b6fb72600b78e041a37afc4c279c63ecafcb9408 + url: "https://pub.dev" + source: hosted + version: "0.0.4" archive: dependency: transitive description: @@ -233,14 +241,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - dart_polylabel2: - dependency: transitive - description: - name: dart_polylabel2 - sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" - url: "https://pub.dev" - source: hosted - version: "1.0.0" dart_style: dependency: transitive description: @@ -407,18 +407,34 @@ packages: dependency: transitive description: name: flutter_map - sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5 + sha256: "2ecb34619a4be19df6f40c2f8dce1591675b4eff7a6857bd8f533706977385da" url: "https://pub.dev" source: hosted - version: "8.2.1" + version: "7.0.2" flutter_map_animations: dependency: transitive description: name: flutter_map_animations - sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e + sha256: "08233f89919049a3601e785d32e9d1d9e1faac6578190150f1d7495fc1050d36" url: "https://pub.dev" source: hosted - version: "0.9.0" + version: "0.8.0" + flutter_map_marker_cluster: + dependency: transitive + description: + name: flutter_map_marker_cluster + sha256: "2c1fb4d7a2105c4bbeb89be215320507f4b71b2036df4341fab9d2aa677d3ae9" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + flutter_map_marker_popup: + dependency: transitive + description: + name: flutter_map_marker_popup + sha256: a7540538114b5d1627ab67b498273d66bc36090385412ae49ef215af4a2861c5 + url: "https://pub.dev" + source: hosted + version: "7.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -973,6 +989,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" node_preamble: dependency: transitive description: @@ -1157,6 +1181,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.9.1" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" pool: dependency: transitive description: @@ -1189,6 +1221,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + provider: + dependency: transitive + description: + name: provider + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" + url: "https://pub.dev" + source: hosted + version: "6.1.5" pub_semver: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index e64ee24..b93bb67 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -25,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.3.0" + animated_stack_widget: + dependency: transitive + description: + name: animated_stack_widget + sha256: ce4788dd158768c9d4388354b6fb72600b78e041a37afc4c279c63ecafcb9408 + url: "https://pub.dev" + source: hosted + version: "0.0.4" archive: dependency: transitive description: @@ -233,14 +241,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - dart_polylabel2: - dependency: transitive - description: - name: dart_polylabel2 - sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" - url: "https://pub.dev" - source: hosted - version: "1.0.0" dart_style: dependency: transitive description: @@ -415,18 +415,34 @@ packages: dependency: transitive description: name: flutter_map - sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5 + sha256: "2ecb34619a4be19df6f40c2f8dce1591675b4eff7a6857bd8f533706977385da" url: "https://pub.dev" source: hosted - version: "8.2.1" + version: "7.0.2" flutter_map_animations: dependency: transitive description: name: flutter_map_animations - sha256: bf583863561861aaaf4854ae7ed8940d79bea7d32918bf7a85d309b25235a09e + sha256: "08233f89919049a3601e785d32e9d1d9e1faac6578190150f1d7495fc1050d36" url: "https://pub.dev" source: hosted - version: "0.9.0" + version: "0.8.0" + flutter_map_marker_cluster: + dependency: transitive + description: + name: flutter_map_marker_cluster + sha256: "2c1fb4d7a2105c4bbeb89be215320507f4b71b2036df4341fab9d2aa677d3ae9" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + flutter_map_marker_popup: + dependency: transitive + description: + name: flutter_map_marker_popup + sha256: a7540538114b5d1627ab67b498273d66bc36090385412ae49ef215af4a2861c5 + url: "https://pub.dev" + source: hosted + version: "7.0.0" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -981,6 +997,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" package_config: dependency: transitive description: @@ -1157,6 +1181,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.9.1" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" pool: dependency: transitive description: @@ -1189,6 +1221,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + provider: + dependency: transitive + description: + name: provider + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" + url: "https://pub.dev" + source: hosted + version: "6.1.5" pub_semver: dependency: transitive description: From 22cfbda124ab25f0b6239716c7280192019d1c4a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 29 Jul 2025 12:37:17 +0330 Subject: [PATCH 247/256] feat : marker with zoom changes --- assets/icons/chicken_map_marker.svg | 36 ++++++ assets/icons/chicken_marker_location.svg | 116 ------------------ assets/vec/chicken_map_marker.svg.vec | Bin 0 -> 26397 bytes .../lib/presentation/common/assets.gen.dart | 8 ++ .../pages/inspection_map/logic.dart | 55 +++++++-- .../pages/inspection_map/view.dart | 58 +++++---- 6 files changed, 123 insertions(+), 150 deletions(-) create mode 100644 assets/icons/chicken_map_marker.svg delete mode 100644 assets/icons/chicken_marker_location.svg create mode 100644 assets/vec/chicken_map_marker.svg.vec diff --git a/assets/icons/chicken_map_marker.svg b/assets/icons/chicken_map_marker.svg new file mode 100644 index 0000000..2099322 --- /dev/null +++ b/assets/icons/chicken_map_marker.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/chicken_marker_location.svg b/assets/icons/chicken_marker_location.svg deleted file mode 100644 index 6d79658..0000000 --- a/assets/icons/chicken_marker_location.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/vec/chicken_map_marker.svg.vec b/assets/vec/chicken_map_marker.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..4ea6f27454ccd64278502dd679efde078006841a GIT binary patch literal 26397 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 GRsAnJf_+y2 literal 0 HcmV?d00001 diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index dba8dfe..b349f7c 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -76,6 +76,9 @@ class $AssetsIconsGen { /// File path: assets/icons/chicken.svg SvgGenImage get chicken => const SvgGenImage('assets/icons/chicken.svg'); + /// File path: assets/icons/chicken_map_marker.svg + SvgGenImage get chickenMapMarker => const SvgGenImage('assets/icons/chicken_map_marker.svg'); + /// File path: assets/icons/clipboard_eye.svg SvgGenImage get clipboardEye => const SvgGenImage('assets/icons/clipboard_eye.svg'); @@ -291,6 +294,7 @@ class $AssetsIconsGen { check, checkSquare, chicken, + chickenMapMarker, clipboardEye, clipboardTask, clock, @@ -437,6 +441,9 @@ class $AssetsVecGen { /// File path: assets/vec/chicken.svg.vec SvgGenImage get chickenSvg => const SvgGenImage.vec('assets/vec/chicken.svg.vec'); + /// File path: assets/vec/chicken_map_marker.svg.vec + SvgGenImage get chickenMapMarkerSvg => const SvgGenImage.vec('assets/vec/chicken_map_marker.svg.vec'); + /// File path: assets/vec/clipboard_eye.svg.vec SvgGenImage get clipboardEyeSvg => const SvgGenImage.vec('assets/vec/clipboard_eye.svg.vec'); @@ -652,6 +659,7 @@ class $AssetsVecGen { checkSvg, checkSquareSvg, chickenSvg, + chickenMapMarkerSvg, clipboardEyeSvg, clipboardTaskSvg, clockSvg, diff --git a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart index ede317b..39ba16a 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart @@ -19,6 +19,7 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin RxList markers = [].obs; + Timer? _debounceTimer; RxBool isLoading = false.obs; RxBool isSelectedDetailsLocation = false.obs; @@ -119,25 +120,59 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin void debouncedUpdateVisibleMarkers({required LatLng center, required double zoom}) { _debounceTimer?.cancel(); _debounceTimer = Timer(const Duration(milliseconds: 300), () { - var raduis = getVisibleRadiusKm( + final radius = getVisibleRadiusKm( zoom: zoom, screenWidthPx: Get.width.toDouble(), latitude: center.latitude, ); + final filtered = filterNearbyMarkers( allPoultryLocation.value.data ?? [], center.latitude, center.longitude, - raduis * 1000, // Radius in meters - ); - markers.assignAll( - filtered.map( - (e) => Marker( - point: LatLng(e.lat ?? 0, e.long ?? 0), - child: Icon(Icons.location_on, color: Colors.red), - ), - ), + radius * 1000, ); + + final visibleBounds = animatedMapController.mapController.camera.visibleBounds; + final isZoomedIn = zoom > 17; + + final updatedMarkers = filtered.map((location) { + final point = LatLng(location.lat ?? 0, location.long ?? 0); + final isVisible = visibleBounds.contains(point); + + return Marker( + point: point, + width: isZoomedIn && isVisible ? 180.w : 40.h, + height: isZoomedIn && isVisible ? 50.h : 50.h, + child: isZoomedIn && isVisible + ? Container( + height: 30.h, + padding: EdgeInsets.all(5.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + Text(location.user?.fullname ?? '',style: AppFonts.yekan12,), + ], + ), + ) + : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + ); + }).toList(); + + markers.value = updatedMarkers; }); } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index 1d3734f..9c5a75e 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -43,7 +43,11 @@ class InspectionMapPage extends GetView { ), initialZoom: 15, onPositionChanged: (camera, hasGesture) { - controller.debouncedUpdateVisibleMarkers(center: camera.center,zoom: camera.zoom); + wLog(camera.zoom); + controller.debouncedUpdateVisibleMarkers( + center: camera.center, + zoom: camera.zoom, + ); }, ), @@ -52,29 +56,35 @@ class InspectionMapPage extends GetView { urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', userAgentPackageName: 'ir.mnpc.rasadyar', ), - MarkerClusterLayerWidget( - options: MarkerClusterLayerOptions( - maxClusterRadius: 80, - size: const Size(40, 40), - alignment: Alignment.center, - padding: const EdgeInsets.all(50), - maxZoom: 15, - markers: controller.markers, - builder: (context, markers) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.blue, - ), - child: Center( - child: Text( - markers.length.toString(), - style: const TextStyle(color: Colors.white), - ), - ), - ); - }, - ), + + ObxValue( + (markers) { + return MarkerClusterLayerWidget( + options: MarkerClusterLayerOptions( + maxClusterRadius: 80, + size: const Size(40, 40), + alignment: Alignment.center, + padding: const EdgeInsets.all(50), + maxZoom: 15, + markers: markers.value, + builder: (context, clusterMarkers) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.blue, + ), + child: Center( + child: Text( + clusterMarkers.length.toString(), + style: const TextStyle(color: Colors.white), + ), + ), + ); + }, + ), + ); + }, + controller.markers, ), ], ); From 28063013674d8eb2330183e44f81870d16e463ed Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 29 Jul 2025 14:33:15 +0330 Subject: [PATCH 248/256] chore : seperated ui's --- .../pages/inspection_map/logic.dart | 42 +-- .../pages/inspection_map/map_widget.dart | 108 ++++++ .../pages/inspection_map/view.dart | 322 ++++++++++++++++-- 3 files changed, 398 insertions(+), 74 deletions(-) create mode 100644 packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart diff --git a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart index 39ba16a..efbaeec 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart @@ -18,7 +18,7 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin Resource>.loading().obs; RxList markers = [].obs; - + RxList markers2 = [].obs; Timer? _debounceTimer; RxBool isLoading = false.obs; @@ -133,46 +133,8 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin radius * 1000, ); - final visibleBounds = animatedMapController.mapController.camera.visibleBounds; - final isZoomedIn = zoom > 17; + markers2.addAll(filtered); - final updatedMarkers = filtered.map((location) { - final point = LatLng(location.lat ?? 0, location.long ?? 0); - final isVisible = visibleBounds.contains(point); - - return Marker( - point: point, - width: isZoomedIn && isVisible ? 180.w : 40.h, - height: isZoomedIn && isVisible ? 50.h : 50.h, - child: isZoomedIn && isVisible - ? Container( - height: 30.h, - padding: EdgeInsets.all(5.r), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 5, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - Text(location.user?.fullname ?? '',style: AppFonts.yekan12,), - ], - ), - ) - : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - ); - }).toList(); - - markers.value = updatedMarkers; }); } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart b/packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart new file mode 100644 index 0000000..5b981f4 --- /dev/null +++ b/packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart @@ -0,0 +1,108 @@ +// widgets/map_widgets.dart +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/pages/inspection_map/logic.dart'; +import 'package:rasadyar_inspection/presentation/widget/search.dart'; + +class MapView extends GetView { + const MapView({super.key}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: Stack( + fit: StackFit.expand, + children: [ + _buildFlutterMap(), + _buildSearchOverlay(), + ], + ), + ); + } + + Widget _buildFlutterMap() { + return ObxValue( + (currentLocation) => FlutterMap( + mapController: controller.animatedMapController.mapController, + options: MapOptions( + initialCenter: currentLocation.value, + interactionOptions: const InteractionOptions( + flags: InteractiveFlag.all & ~InteractiveFlag.rotate, + ), + initialZoom: 15, + onPositionChanged: _handlePositionChanged, + ), + children: [ + _buildTileLayer(), + _buildMarkerClusterLayer(), + ], + ), + controller.currentLocation, + ); + } + + Widget _buildTileLayer() { + return TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'ir.mnpc.rasadyar', + ); + } + + Widget _buildMarkerClusterLayer() { + return ObxValue( + (markers) => MarkerClusterLayerWidget( + options: MarkerClusterLayerOptions( + maxClusterRadius: 80, + size: const Size(40, 40), + alignment: Alignment.center, + padding: const EdgeInsets.all(50), + maxZoom: 15, + markers: markers.value, + builder: _buildClusterMarker, + ), + ), + controller.markers, + ); + } + + Widget _buildClusterMarker(BuildContext context, List clusterMarkers) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.blue, + ), + child: Center( + child: Text( + clusterMarkers.length.toString(), + style: const TextStyle(color: Colors.white), + ), + ), + ); + } + + Widget _buildSearchOverlay() { + return Positioned( + top: 10, + left: 20, + right: 20, + child: ObxValue( + (isSearchSelected) => isSearchSelected.value + ? SearchWidget( + onSearchChanged: (data) { + controller.baseLogic.searchValue.value = data; + }, + ) + : const SizedBox.shrink(), + controller.baseLogic.isSearchSelected, + ), + ); + } + + void _handlePositionChanged(MapCamera camera, bool hasGesture) { + wLog(camera.zoom); + controller.debouncedUpdateVisibleMarkers( + center: camera.center, + zoom: camera.zoom, + ); + } +} diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index 9c5a75e..f662605 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; @@ -16,18 +17,18 @@ class InspectionMapPage extends GetView { hasSearch: true, hasFilter: true, hasBack: false, - defaultSearch: false, filteringWidget: filterWidget(showIndex: 3.obs, filterIndex: 5.obs), - onSearchTap: () { - controller.baseLogic.isSearchSelected.value = !controller.baseLogic.isSearchSelected.value; - }, - + onSearchTap: _handleSearchTap, widgets: [_buildMap()], floatingActionButton: _buildGpsButton(), ); } + void _handleSearchTap() { + controller.baseLogic.isSearchSelected.value = !controller.baseLogic.isSearchSelected.value; + } + Widget _buildMap() { return Expanded( child: Stack( @@ -43,7 +44,6 @@ class InspectionMapPage extends GetView { ), initialZoom: 15, onPositionChanged: (camera, hasGesture) { - wLog(camera.zoom); controller.debouncedUpdateVisibleMarkers( center: camera.center, zoom: camera.zoom, @@ -57,35 +57,32 @@ class InspectionMapPage extends GetView { userAgentPackageName: 'ir.mnpc.rasadyar', ), - ObxValue( - (markers) { - return MarkerClusterLayerWidget( - options: MarkerClusterLayerOptions( - maxClusterRadius: 80, - size: const Size(40, 40), - alignment: Alignment.center, - padding: const EdgeInsets.all(50), - maxZoom: 15, - markers: markers.value, - builder: (context, clusterMarkers) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.blue, + ObxValue((markers) { + return MarkerClusterLayerWidget( + options: MarkerClusterLayerOptions( + maxClusterRadius: 80, + size: const Size(40, 40), + alignment: Alignment.center, + padding: const EdgeInsets.all(50), + maxZoom: 15, + markers: buildMarkers(markers), + builder: (context, clusterMarkers) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.blue, + ), + child: Center( + child: Text( + clusterMarkers.length.toString(), + style: const TextStyle(color: Colors.white), ), - child: Center( - child: Text( - clusterMarkers.length.toString(), - style: const TextStyle(color: Colors.white), - ), - ), - ); - }, - ), - ); - }, - controller.markers, - ), + ), + ); + }, + ), + ); + }, controller.markers2), ], ); }, controller.currentLocation), @@ -305,6 +302,263 @@ class InspectionMapPage extends GetView { ); }, controller.isSelectedDetailsLocation); } + + List buildMarkers(RxList markers) { + final visibleBounds = controller.animatedMapController.mapController.camera.visibleBounds; + final isZoomedIn = controller.currentZoom > 17; + + final updatedMarkers = markers.map((location) { + final point = LatLng(location.lat ?? 0, location.long ?? 0); + final isVisible = visibleBounds.contains(point); + + return Marker( + point: point, + width: isZoomedIn && isVisible ? 180.w : 40.h, + height: isZoomedIn && isVisible ? 50.h : 50.h, + child: isZoomedIn && isVisible + ? GestureDetector( + onTap: () { + Get.bottomSheet( + ObxValue((data) { + return BaseBottomSheet( + height: data.value ? 450.h : 150.h, + child: ListItemWithOutCounter( + secondChild: Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داوود خرم پور', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, + ), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1.w, + color: AppColor.blueLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ بازرسی', + style: AppFonts.yekan14.copyWith( + color: AppColor.textColor, + ), + ), + + Text( + '1403/12/12', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + + buildRow( + title: 'تلفن خریدار', + value: '0326598653', + valueStyle: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + buildRow(title: 'آخرین فعالیت', value: '1409/12/12'), + buildRow(title: 'موجودی', value: '5KG'), + buildRow(title: 'فروش رفته', value: '5KG'), + ], + ), + ), + Row( + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 7, + children: [ + RElevated( + width: 40.h, + height: 38.h, + backgroundColor: AppColor.greenNormal, + child: Assets.vec.messageAddSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + onPressed: () {}, + ), + RElevated( + width: 150.w, + height: 40.h, + backgroundColor: AppColor.blueNormal, + onPressed: () { + /* controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ).whenComplete(() {});*/ + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + Text( + 'مسیریابی', + style: AppFonts.yekan14Bold.copyWith( + color: Colors.white, + ), + ), + ], + ), + ), + ROutlinedElevated( + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async {}, + onRefresh: () async {}, + ); + }, + borderColor: AppColor.bgIcon, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.securityTimeSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + AppColor.bgIcon, + BlendMode.srcIn, + ), + ), + Text( + 'سوابق بازرسی', + style: AppFonts.yekan14Bold.copyWith( + color: AppColor.bgIcon, + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + labelIconColor: AppColor.bgIcon, + onTap: () => data.value = !data.value, + selected: data.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + ), + ); + }, controller.isSelectedDetailsLocation), + ); + }, + child: Container( + height: 30.h, + padding: EdgeInsets.all(5.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + Text(location.user?.fullname ?? '', style: AppFonts.yekan12), + ], + ), + ), + ) + : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + ); + }).toList(); + + return updatedMarkers; + } } Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { From f563c6188e2762037f794fe728d7fbb1d742d0b6 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 30 Jul 2025 12:31:47 +0330 Subject: [PATCH 249/256] feat : 1 - search in map with api 2 - show details in selected location --- .../pages/buy_in_province_all/view.dart | 2 +- .../pages/buy_in_province_waiting/view.dart | 2 +- .../pages/buy_out_of_province/view.dart | 2 +- .../pages/sales_in_province/view.dart | 2 +- .../pages/sales_out_of_province/view.dart | 2 +- .../sales_out_of_province_buyers/view.dart | 2 +- .../view.dart | 2 +- .../presentation/pages/segmentation/view.dart | 2 +- .../bottom_sheet/base_bottom_sheet.dart | 15 +- .../widget/list_item/list_item2.dart | 99 +- packages/core/lib/utils/map_utils.dart | 71 +- .../remote/inspection/inspection_remote.dart | 8 +- .../inspection/inspection_remote_imp.dart | 8 +- .../hatching_details/hatching_details.dart | 210 ++ .../hatching_details.freezed.dart | 2648 +++++++++++++++++ .../hatching_details/hatching_details.g.dart | 385 +++ .../poultry_location_model.dart | 8 +- .../poultry_location_model.freezed.dart | 102 +- .../poultry_location_model.g.dart | 12 +- .../inspection/inspection_repository_imp.dart | 2 + .../pages/inspection_map/logic.dart | 90 +- .../pages/inspection_map/view.dart | 617 ++-- .../lib/presentation/pages/records/view.dart | 2 +- .../lib/presentation/pages/users/view.dart | 2 +- .../presentation/widget/base_page/logic.dart | 2 + 25 files changed, 3960 insertions(+), 337 deletions(-) create mode 100644 packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart create mode 100644 packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart create mode 100644 packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart index 1b8a429..8a01cbc 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -23,7 +23,7 @@ class BuyInProvinceAllPage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.contains(index), onTap: () => controller.isExpandedList.toggle(index), index: index, diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 7ecf44e..d556141 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -24,7 +24,7 @@ class BuyInProvinceWaitingPage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.contains(index), onTap: () => controller.isExpandedList.toggle(index), index: index, diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index bc73e58..e05f5a6 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -36,7 +36,7 @@ class BuyOutOfProvincePage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.contains(index), onTap: () => controller.isExpandedList.toggle(index), index: index, diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 65ee593..6930717 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -45,7 +45,7 @@ class SalesInProvincePage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.contains(index), onTap: () => controller.isExpandedList.toggle(index), index: index, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 827b542..6d89403 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -42,7 +42,7 @@ class SalesOutOfProvincePage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.contains(index), onTap: () => controller.isExpandedList.toggle(index), index: index, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index fb906d6..311aee8 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -36,7 +36,7 @@ class SalesOutOfProvinceBuyersPage extends GetView controller.isExpandedList.toggle(index), index: index, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index ab1ce40..6430e77 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -31,7 +31,7 @@ class SalesOutOfProvinceSalesListPage extends GetView controller.isExpandedList.toggle(index), index: index, diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index 87a2d4a..a028920 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -35,7 +35,7 @@ class SegmentationPage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.contains(index), onTap: () => controller.isExpandedList.toggle(index), index: index, diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart index 55fb489..ac7db9c 100644 --- a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -3,9 +3,16 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; class BaseBottomSheet extends StatelessWidget { - const BaseBottomSheet({super.key, required this.child, this.height, this.bgColor}); + const BaseBottomSheet({ + super.key, + this.child, + this.height, + this.bgColor, + this.rootChild, + }):assert(child==null || rootChild==null, 'You can only provide one of child or rootChild'); - final Widget child; + final Widget? child; + final Widget? rootChild; final double? height; final Color? bgColor; @@ -51,8 +58,8 @@ class BaseBottomSheet extends StatelessWidget { ], ), ), - SizedBox(height:8), - Expanded(child: SingleChildScrollView(child: child)), + SizedBox(height: 8), + Expanded(child: rootChild ?? SingleChildScrollView(child: child)), ], ), ), diff --git a/packages/core/lib/presentation/widget/list_item/list_item2.dart b/packages/core/lib/presentation/widget/list_item/list_item2.dart index fb8eb81..cd62606 100644 --- a/packages/core/lib/presentation/widget/list_item/list_item2.dart +++ b/packages/core/lib/presentation/widget/list_item/list_item2.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -class ListItem2 extends StatelessWidget { - const ListItem2({ +class ExpandableListItem2 extends StatelessWidget { + const ExpandableListItem2({ super.key, required this.index, required this.child, @@ -115,3 +115,98 @@ class ListItem2 extends StatelessWidget { ); } } + +class ListItem2 extends StatelessWidget { + const ListItem2({ + super.key, + required this.index, + required this.child, + required this.labelColor, + required this.labelIcon, + this.onTap, + + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final int index; + final Widget child; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + Row( + children: [ + Expanded( + child: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + ), + Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + //TODO + colorFilter: ColorFilter.mode( + labelIconColor ?? AppColor.mediumGreyDarkActive, + BlendMode.srcIn, + ), + ), + ), + ), + ], + ), + + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/packages/core/lib/utils/map_utils.dart b/packages/core/lib/utils/map_utils.dart index a313a1e..3278207 100644 --- a/packages/core/lib/utils/map_utils.dart +++ b/packages/core/lib/utils/map_utils.dart @@ -10,12 +10,8 @@ Map buildQueryParams({ DateTime? toDate, String? role, String? state, - }) { final params = {}; - - - if (fromDate != null) { params['date1'] = fromDate.formattedDashedGregorian; } @@ -30,7 +26,6 @@ Map buildQueryParams({ params['value'] = value ?? ''; - if (page != null) { params['page'] = page; } @@ -53,3 +48,69 @@ Map buildQueryParams({ return params; } + +Map? buildRawQueryParams({ + Map? queryParams, + String? search, + String? value, + int? page, + int? pageSize, + DateTime? fromDate, + DateTime? toDate, + String? role, + String? state, + double? centerLat, + double? centerLng, + double? radius, +}) { + final params = {}; + if (fromDate != null) { + params['date1'] = fromDate.formattedDashedGregorian; + } + + if (toDate != null) { + params['date2'] = toDate.formattedDashedGregorian; + } + + if (search != null && search.isNotEmpty) { + params['search'] = search; + } + + if (value != null) { + params['value'] = value ?? ''; + } + + if (page != null) { + params['page'] = page; + } + + if (pageSize != null) { + params['page_size'] = pageSize; + } + + if (role != null && role.isNotEmpty) { + params['role'] = role; + } + + if (state != null && state.isNotEmpty) { + params['state'] = state; + } + + if (queryParams != null) { + params.addAll(queryParams); + } + + if (centerLat != null) { + params['center_lat'] = centerLat ?? ''; + } + + if (centerLng != null) { + params['center_lon'] = centerLng ?? ''; + } + + if (radius != null) { + params['radius'] = radius ?? ''; + } + + return params.keys.isEmpty ? null : params; +} diff --git a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart index 4641e70..d267c96 100644 --- a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart +++ b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart @@ -13,10 +13,10 @@ abstract class InspectionRemoteDataSource { /// containing the list of inspections. Future>> fetchInspections(String userId); - Future?> getNearbyLocation({ - double? centerLat, - double? centerLng, - double? radius, + double? centerLat, + double? centerLng, + double? radius, + String? value, }); } diff --git a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart index 6309fa6..30a8110 100644 --- a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart +++ b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart @@ -25,13 +25,19 @@ class InspectionRemoteDataSourceImp implements InspectionRemoteDataSource { double? centerLat, double? centerLng, double? radius, + String? value, }) async { DioRemote dioRemote = DioRemote(baseUrl: 'https://habackend.rasadyaar.ir/'); await dioRemote.init(); var res = await dioRemote.get>( 'poultry-loc/', - queryParameters: {'center_lat': centerLat, 'center_lng': centerLng, 'radius': radius}, + queryParameters: buildRawQueryParams( + centerLat: centerLat, + centerLng: centerLng, + radius: radius, + value: value, + ), headers: {'Content-Type': 'application/json'}, fromJsonList: (json) => json.map((item) => PoultryLocationModel.fromJson(item as Map)).toList(), diff --git a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart new file mode 100644 index 0000000..f8b606d --- /dev/null +++ b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart @@ -0,0 +1,210 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'hatching_details.freezed.dart'; +part 'hatching_details.g.dart'; + +@freezed +abstract class HatchingDetails with _$HatchingDetails { + const factory HatchingDetails({ + required int id, + String? chainCompany, + int? age, + dynamic inspectionLosses, + VetFarm? vetFarm, + ActiveKill? activeKill, + KillingInfo? killingInfo, + FreeGovernmentalInfo? freeGovernmentalInfo, + String? key, + DateTime? createDate, + DateTime? modifyDate, + bool? trash, + bool? hasChainCompany, + dynamic poultryIdForeignKey, + dynamic poultryHatchingIdKey, + int? quantity, + int? losses, + int? leftOver, + int? killedQuantity, + int? extraKilledQuantity, + double? governmentalKilledQuantity, + double? governmentalQuantity, + double? freeKilledQuantity, + double? freeQuantity, + double? chainKilledQuantity, + double? chainKilledWeight, + double? outProvinceKilledWeight, + double? outProvinceKilledQuantity, + double? exportKilledWeight, + double? exportKilledQuantity, + double? totalCommitment, + String? commitmentType, + double? totalCommitmentQuantity, + double? totalFreeCommitmentQuantity, + double? totalFreeCommitmentWeight, + double? totalKilledWeight, + double? totalAverageKilledWeight, + int? requestLeftOver, + int? hall, + DateTime? date, + DateTime? predicateDate, + String? chickenBreed, + int? period, + String? allowHatching, + String? state, + bool? archive, + bool? violation, + dynamic message, + dynamic registrar, + List? breed, + int? cityNumber, + String? cityName, + int? provinceNumber, + String? provinceName, + LastChange? lastChange, + int? chickenAge, + int? nowAge, + LatestHatchingChange? latestHatchingChange, + dynamic violationReport, + String? violationMessage, + dynamic violationImage, + dynamic violationReporter, + dynamic violationReportDate, + dynamic violationReportEditor, + dynamic violationReportEditDate, + int? totalLosses, + int? directLosses, + dynamic directLossesInputer, + dynamic directLossesDate, + dynamic directLossesEditor, + dynamic directLossesLastEditDate, + dynamic endPeriodLossesInputer, + dynamic endPeriodLossesDate, + dynamic endPeriodLossesEditor, + dynamic endPeriodLossesLastEditDate, + String? breedingUniqueId, + String? licenceNumber, + bool? temporaryTrash, + bool? temporaryDeleted, + dynamic firstDateInputArchive, + dynamic secondDateInputArchive, + dynamic inputArchiver, + dynamic outputArchiveDate, + dynamic outputArchiver, + double? barDifferenceRequestWeight, + double? barDifferenceRequestQuantity, + dynamic healthCertificate, + int? samasatDischargePercentage, + String? personTypeName, + String? interactTypeName, + String? unionTypeName, + String? certId, + int? increaseQuantity, + dynamic tenantFullname, + dynamic tenantNationalCode, + dynamic tenantMobile, + dynamic tenantCity, + bool? hasTenant, + dynamic createdBy, + dynamic modifiedBy, + int? poultry, + }) = _HatchingDetails; + + factory HatchingDetails.fromJson(Map json) => + _$HatchingDetailsFromJson(json); +} + +@freezed +abstract class VetFarm with _$VetFarm { + const factory VetFarm({ + String? vetFarmFullName, + String? vetFarmMobile, + }) = _VetFarm; + + factory VetFarm.fromJson(Map json) => + _$VetFarmFromJson(json); +} + +@freezed +abstract class ActiveKill with _$ActiveKill { + const factory ActiveKill({ + bool? activeKill, + int? countOfRequest, + }) = _ActiveKill; + + factory ActiveKill.fromJson(Map json) => + _$ActiveKillFromJson(json); +} + +@freezed +abstract class KillingInfo with _$KillingInfo { + const factory KillingInfo({ + String? violationMessage, + int? provinceKillRequests, + int? provinceKillRequestsQuantity, + double? provinceKillRequestsWeight, + int? killHouseRequests, + int? killHouseRequestsFirstQuantity, + double? killHouseRequestsFirstWeight, + int? barCompleteWithKillHouse, + int? acceptedRealQuantityFinal, + double? acceptedRealWightFinal, + int? wareHouseBars, + int? wareHouseBarsQuantity, + double? wareHouseBarsWeight, + double? wareHouseBarsWeightLose, + }) = _KillingInfo; + + factory KillingInfo.fromJson(Map json) => + _$KillingInfoFromJson(json); +} + +@freezed +abstract class FreeGovernmentalInfo with _$FreeGovernmentalInfo { + const factory FreeGovernmentalInfo({ + int? governmentalAllocatedQuantity, + double? totalCommitmentQuantity, + int? freeAllocatedQuantity, + double? totalFreeCommitmentQuantity, + int? leftTotalFreeCommitmentQuantity, + }) = _FreeGovernmentalInfo; + + factory FreeGovernmentalInfo.fromJson(Map json) => + _$FreeGovernmentalInfoFromJson(json); +} + +@freezed +abstract class Breed with _$Breed { + const factory Breed({ + String? breed, + int? mainQuantity, + int? remainQuantity, + }) = _Breed; + + factory Breed.fromJson(Map json) => + _$BreedFromJson(json); +} + +@freezed +abstract class LastChange with _$LastChange { + const factory LastChange({ + DateTime? date, + String? role, + String? type, + String? fullName, + }) = _LastChange; + + factory LastChange.fromJson(Map json) => + _$LastChangeFromJson(json); +} + +@freezed +abstract class LatestHatchingChange with _$LatestHatchingChange { + const factory LatestHatchingChange({ + DateTime? date, + String? role, + String? fullName, + }) = _LatestHatchingChange; + + factory LatestHatchingChange.fromJson(Map json) => + _$LatestHatchingChangeFromJson(json); +} diff --git a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart new file mode 100644 index 0000000..e7d53d6 --- /dev/null +++ b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart @@ -0,0 +1,2648 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'hatching_details.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$HatchingDetails { + + int get id; String? get chainCompany; int? get age; dynamic get inspectionLosses; VetFarm? get vetFarm; ActiveKill? get activeKill; KillingInfo? get killingInfo; FreeGovernmentalInfo? get freeGovernmentalInfo; String? get key; DateTime? get createDate; DateTime? get modifyDate; bool? get trash; bool? get hasChainCompany; dynamic get poultryIdForeignKey; dynamic get poultryHatchingIdKey; int? get quantity; int? get losses; int? get leftOver; int? get killedQuantity; int? get extraKilledQuantity; double? get governmentalKilledQuantity; double? get governmentalQuantity; double? get freeKilledQuantity; double? get freeQuantity; double? get chainKilledQuantity; double? get chainKilledWeight; double? get outProvinceKilledWeight; double? get outProvinceKilledQuantity; double? get exportKilledWeight; double? get exportKilledQuantity; double? get totalCommitment; String? get commitmentType; double? get totalCommitmentQuantity; double? get totalFreeCommitmentQuantity; double? get totalFreeCommitmentWeight; double? get totalKilledWeight; double? get totalAverageKilledWeight; int? get requestLeftOver; int? get hall; DateTime? get date; DateTime? get predicateDate; String? get chickenBreed; int? get period; String? get allowHatching; String? get state; bool? get archive; bool? get violation; dynamic get message; dynamic get registrar; List? get breed; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; LastChange? get lastChange; int? get chickenAge; int? get nowAge; LatestHatchingChange? get latestHatchingChange; dynamic get violationReport; String? get violationMessage; dynamic get violationImage; dynamic get violationReporter; dynamic get violationReportDate; dynamic get violationReportEditor; dynamic get violationReportEditDate; int? get totalLosses; int? get directLosses; dynamic get directLossesInputer; dynamic get directLossesDate; dynamic get directLossesEditor; dynamic get directLossesLastEditDate; dynamic get endPeriodLossesInputer; dynamic get endPeriodLossesDate; dynamic get endPeriodLossesEditor; dynamic get endPeriodLossesLastEditDate; String? get breedingUniqueId; String? get licenceNumber; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get firstDateInputArchive; dynamic get secondDateInputArchive; dynamic get inputArchiver; dynamic get outputArchiveDate; dynamic get outputArchiver; double? get barDifferenceRequestWeight; double? get barDifferenceRequestQuantity; dynamic get healthCertificate; int? get samasatDischargePercentage; String? get personTypeName; String? get interactTypeName; String? get unionTypeName; String? get certId; int? get increaseQuantity; dynamic get tenantFullname; dynamic get tenantNationalCode; dynamic get tenantMobile; dynamic get tenantCity; bool? get hasTenant; dynamic get createdBy; dynamic get modifiedBy; int? get poultry; +/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$HatchingDetailsCopyWith get copyWith => _$HatchingDetailsCopyWithImpl(this as HatchingDetails, _$identity); + + /// Serializes this HatchingDetails to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is HatchingDetails&&(identical(other.id, id) || other.id == id)&&(identical(other.chainCompany, chainCompany) || other.chainCompany == chainCompany)&&(identical(other.age, age) || other.age == age)&&const DeepCollectionEquality().equals(other.inspectionLosses, inspectionLosses)&&(identical(other.vetFarm, vetFarm) || other.vetFarm == vetFarm)&&(identical(other.activeKill, activeKill) || other.activeKill == activeKill)&&(identical(other.killingInfo, killingInfo) || other.killingInfo == killingInfo)&&(identical(other.freeGovernmentalInfo, freeGovernmentalInfo) || other.freeGovernmentalInfo == freeGovernmentalInfo)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.hasChainCompany, hasChainCompany) || other.hasChainCompany == hasChainCompany)&&const DeepCollectionEquality().equals(other.poultryIdForeignKey, poultryIdForeignKey)&&const DeepCollectionEquality().equals(other.poultryHatchingIdKey, poultryHatchingIdKey)&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.losses, losses) || other.losses == losses)&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.killedQuantity, killedQuantity) || other.killedQuantity == killedQuantity)&&(identical(other.extraKilledQuantity, extraKilledQuantity) || other.extraKilledQuantity == extraKilledQuantity)&&(identical(other.governmentalKilledQuantity, governmentalKilledQuantity) || other.governmentalKilledQuantity == governmentalKilledQuantity)&&(identical(other.governmentalQuantity, governmentalQuantity) || other.governmentalQuantity == governmentalQuantity)&&(identical(other.freeKilledQuantity, freeKilledQuantity) || other.freeKilledQuantity == freeKilledQuantity)&&(identical(other.freeQuantity, freeQuantity) || other.freeQuantity == freeQuantity)&&(identical(other.chainKilledQuantity, chainKilledQuantity) || other.chainKilledQuantity == chainKilledQuantity)&&(identical(other.chainKilledWeight, chainKilledWeight) || other.chainKilledWeight == chainKilledWeight)&&(identical(other.outProvinceKilledWeight, outProvinceKilledWeight) || other.outProvinceKilledWeight == outProvinceKilledWeight)&&(identical(other.outProvinceKilledQuantity, outProvinceKilledQuantity) || other.outProvinceKilledQuantity == outProvinceKilledQuantity)&&(identical(other.exportKilledWeight, exportKilledWeight) || other.exportKilledWeight == exportKilledWeight)&&(identical(other.exportKilledQuantity, exportKilledQuantity) || other.exportKilledQuantity == exportKilledQuantity)&&(identical(other.totalCommitment, totalCommitment) || other.totalCommitment == totalCommitment)&&(identical(other.commitmentType, commitmentType) || other.commitmentType == commitmentType)&&(identical(other.totalCommitmentQuantity, totalCommitmentQuantity) || other.totalCommitmentQuantity == totalCommitmentQuantity)&&(identical(other.totalFreeCommitmentQuantity, totalFreeCommitmentQuantity) || other.totalFreeCommitmentQuantity == totalFreeCommitmentQuantity)&&(identical(other.totalFreeCommitmentWeight, totalFreeCommitmentWeight) || other.totalFreeCommitmentWeight == totalFreeCommitmentWeight)&&(identical(other.totalKilledWeight, totalKilledWeight) || other.totalKilledWeight == totalKilledWeight)&&(identical(other.totalAverageKilledWeight, totalAverageKilledWeight) || other.totalAverageKilledWeight == totalAverageKilledWeight)&&(identical(other.requestLeftOver, requestLeftOver) || other.requestLeftOver == requestLeftOver)&&(identical(other.hall, hall) || other.hall == hall)&&(identical(other.date, date) || other.date == date)&&(identical(other.predicateDate, predicateDate) || other.predicateDate == predicateDate)&&(identical(other.chickenBreed, chickenBreed) || other.chickenBreed == chickenBreed)&&(identical(other.period, period) || other.period == period)&&(identical(other.allowHatching, allowHatching) || other.allowHatching == allowHatching)&&(identical(other.state, state) || other.state == state)&&(identical(other.archive, archive) || other.archive == archive)&&(identical(other.violation, violation) || other.violation == violation)&&const DeepCollectionEquality().equals(other.message, message)&&const DeepCollectionEquality().equals(other.registrar, registrar)&&const DeepCollectionEquality().equals(other.breed, breed)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.lastChange, lastChange) || other.lastChange == lastChange)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.nowAge, nowAge) || other.nowAge == nowAge)&&(identical(other.latestHatchingChange, latestHatchingChange) || other.latestHatchingChange == latestHatchingChange)&&const DeepCollectionEquality().equals(other.violationReport, violationReport)&&(identical(other.violationMessage, violationMessage) || other.violationMessage == violationMessage)&&const DeepCollectionEquality().equals(other.violationImage, violationImage)&&const DeepCollectionEquality().equals(other.violationReporter, violationReporter)&&const DeepCollectionEquality().equals(other.violationReportDate, violationReportDate)&&const DeepCollectionEquality().equals(other.violationReportEditor, violationReportEditor)&&const DeepCollectionEquality().equals(other.violationReportEditDate, violationReportEditDate)&&(identical(other.totalLosses, totalLosses) || other.totalLosses == totalLosses)&&(identical(other.directLosses, directLosses) || other.directLosses == directLosses)&&const DeepCollectionEquality().equals(other.directLossesInputer, directLossesInputer)&&const DeepCollectionEquality().equals(other.directLossesDate, directLossesDate)&&const DeepCollectionEquality().equals(other.directLossesEditor, directLossesEditor)&&const DeepCollectionEquality().equals(other.directLossesLastEditDate, directLossesLastEditDate)&&const DeepCollectionEquality().equals(other.endPeriodLossesInputer, endPeriodLossesInputer)&&const DeepCollectionEquality().equals(other.endPeriodLossesDate, endPeriodLossesDate)&&const DeepCollectionEquality().equals(other.endPeriodLossesEditor, endPeriodLossesEditor)&&const DeepCollectionEquality().equals(other.endPeriodLossesLastEditDate, endPeriodLossesLastEditDate)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)&&(identical(other.licenceNumber, licenceNumber) || other.licenceNumber == licenceNumber)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.firstDateInputArchive, firstDateInputArchive)&&const DeepCollectionEquality().equals(other.secondDateInputArchive, secondDateInputArchive)&&const DeepCollectionEquality().equals(other.inputArchiver, inputArchiver)&&const DeepCollectionEquality().equals(other.outputArchiveDate, outputArchiveDate)&&const DeepCollectionEquality().equals(other.outputArchiver, outputArchiver)&&(identical(other.barDifferenceRequestWeight, barDifferenceRequestWeight) || other.barDifferenceRequestWeight == barDifferenceRequestWeight)&&(identical(other.barDifferenceRequestQuantity, barDifferenceRequestQuantity) || other.barDifferenceRequestQuantity == barDifferenceRequestQuantity)&&const DeepCollectionEquality().equals(other.healthCertificate, healthCertificate)&&(identical(other.samasatDischargePercentage, samasatDischargePercentage) || other.samasatDischargePercentage == samasatDischargePercentage)&&(identical(other.personTypeName, personTypeName) || other.personTypeName == personTypeName)&&(identical(other.interactTypeName, interactTypeName) || other.interactTypeName == interactTypeName)&&(identical(other.unionTypeName, unionTypeName) || other.unionTypeName == unionTypeName)&&(identical(other.certId, certId) || other.certId == certId)&&(identical(other.increaseQuantity, increaseQuantity) || other.increaseQuantity == increaseQuantity)&&const DeepCollectionEquality().equals(other.tenantFullname, tenantFullname)&&const DeepCollectionEquality().equals(other.tenantNationalCode, tenantNationalCode)&&const DeepCollectionEquality().equals(other.tenantMobile, tenantMobile)&&const DeepCollectionEquality().equals(other.tenantCity, tenantCity)&&(identical(other.hasTenant, hasTenant) || other.hasTenant == hasTenant)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.poultry, poultry) || other.poultry == poultry)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,chainCompany,age,const DeepCollectionEquality().hash(inspectionLosses),vetFarm,activeKill,killingInfo,freeGovernmentalInfo,key,createDate,modifyDate,trash,hasChainCompany,const DeepCollectionEquality().hash(poultryIdForeignKey),const DeepCollectionEquality().hash(poultryHatchingIdKey),quantity,losses,leftOver,killedQuantity,extraKilledQuantity,governmentalKilledQuantity,governmentalQuantity,freeKilledQuantity,freeQuantity,chainKilledQuantity,chainKilledWeight,outProvinceKilledWeight,outProvinceKilledQuantity,exportKilledWeight,exportKilledQuantity,totalCommitment,commitmentType,totalCommitmentQuantity,totalFreeCommitmentQuantity,totalFreeCommitmentWeight,totalKilledWeight,totalAverageKilledWeight,requestLeftOver,hall,date,predicateDate,chickenBreed,period,allowHatching,state,archive,violation,const DeepCollectionEquality().hash(message),const DeepCollectionEquality().hash(registrar),const DeepCollectionEquality().hash(breed),cityNumber,cityName,provinceNumber,provinceName,lastChange,chickenAge,nowAge,latestHatchingChange,const DeepCollectionEquality().hash(violationReport),violationMessage,const DeepCollectionEquality().hash(violationImage),const DeepCollectionEquality().hash(violationReporter),const DeepCollectionEquality().hash(violationReportDate),const DeepCollectionEquality().hash(violationReportEditor),const DeepCollectionEquality().hash(violationReportEditDate),totalLosses,directLosses,const DeepCollectionEquality().hash(directLossesInputer),const DeepCollectionEquality().hash(directLossesDate),const DeepCollectionEquality().hash(directLossesEditor),const DeepCollectionEquality().hash(directLossesLastEditDate),const DeepCollectionEquality().hash(endPeriodLossesInputer),const DeepCollectionEquality().hash(endPeriodLossesDate),const DeepCollectionEquality().hash(endPeriodLossesEditor),const DeepCollectionEquality().hash(endPeriodLossesLastEditDate),breedingUniqueId,licenceNumber,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(firstDateInputArchive),const DeepCollectionEquality().hash(secondDateInputArchive),const DeepCollectionEquality().hash(inputArchiver),const DeepCollectionEquality().hash(outputArchiveDate),const DeepCollectionEquality().hash(outputArchiver),barDifferenceRequestWeight,barDifferenceRequestQuantity,const DeepCollectionEquality().hash(healthCertificate),samasatDischargePercentage,personTypeName,interactTypeName,unionTypeName,certId,increaseQuantity,const DeepCollectionEquality().hash(tenantFullname),const DeepCollectionEquality().hash(tenantNationalCode),const DeepCollectionEquality().hash(tenantMobile),const DeepCollectionEquality().hash(tenantCity),hasTenant,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),poultry]); + +@override +String toString() { + return 'HatchingDetails(id: $id, chainCompany: $chainCompany, age: $age, inspectionLosses: $inspectionLosses, vetFarm: $vetFarm, activeKill: $activeKill, killingInfo: $killingInfo, freeGovernmentalInfo: $freeGovernmentalInfo, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, hasChainCompany: $hasChainCompany, poultryIdForeignKey: $poultryIdForeignKey, poultryHatchingIdKey: $poultryHatchingIdKey, quantity: $quantity, losses: $losses, leftOver: $leftOver, killedQuantity: $killedQuantity, extraKilledQuantity: $extraKilledQuantity, governmentalKilledQuantity: $governmentalKilledQuantity, governmentalQuantity: $governmentalQuantity, freeKilledQuantity: $freeKilledQuantity, freeQuantity: $freeQuantity, chainKilledQuantity: $chainKilledQuantity, chainKilledWeight: $chainKilledWeight, outProvinceKilledWeight: $outProvinceKilledWeight, outProvinceKilledQuantity: $outProvinceKilledQuantity, exportKilledWeight: $exportKilledWeight, exportKilledQuantity: $exportKilledQuantity, totalCommitment: $totalCommitment, commitmentType: $commitmentType, totalCommitmentQuantity: $totalCommitmentQuantity, totalFreeCommitmentQuantity: $totalFreeCommitmentQuantity, totalFreeCommitmentWeight: $totalFreeCommitmentWeight, totalKilledWeight: $totalKilledWeight, totalAverageKilledWeight: $totalAverageKilledWeight, requestLeftOver: $requestLeftOver, hall: $hall, date: $date, predicateDate: $predicateDate, chickenBreed: $chickenBreed, period: $period, allowHatching: $allowHatching, state: $state, archive: $archive, violation: $violation, message: $message, registrar: $registrar, breed: $breed, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, lastChange: $lastChange, chickenAge: $chickenAge, nowAge: $nowAge, latestHatchingChange: $latestHatchingChange, violationReport: $violationReport, violationMessage: $violationMessage, violationImage: $violationImage, violationReporter: $violationReporter, violationReportDate: $violationReportDate, violationReportEditor: $violationReportEditor, violationReportEditDate: $violationReportEditDate, totalLosses: $totalLosses, directLosses: $directLosses, directLossesInputer: $directLossesInputer, directLossesDate: $directLossesDate, directLossesEditor: $directLossesEditor, directLossesLastEditDate: $directLossesLastEditDate, endPeriodLossesInputer: $endPeriodLossesInputer, endPeriodLossesDate: $endPeriodLossesDate, endPeriodLossesEditor: $endPeriodLossesEditor, endPeriodLossesLastEditDate: $endPeriodLossesLastEditDate, breedingUniqueId: $breedingUniqueId, licenceNumber: $licenceNumber, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, firstDateInputArchive: $firstDateInputArchive, secondDateInputArchive: $secondDateInputArchive, inputArchiver: $inputArchiver, outputArchiveDate: $outputArchiveDate, outputArchiver: $outputArchiver, barDifferenceRequestWeight: $barDifferenceRequestWeight, barDifferenceRequestQuantity: $barDifferenceRequestQuantity, healthCertificate: $healthCertificate, samasatDischargePercentage: $samasatDischargePercentage, personTypeName: $personTypeName, interactTypeName: $interactTypeName, unionTypeName: $unionTypeName, certId: $certId, increaseQuantity: $increaseQuantity, tenantFullname: $tenantFullname, tenantNationalCode: $tenantNationalCode, tenantMobile: $tenantMobile, tenantCity: $tenantCity, hasTenant: $hasTenant, createdBy: $createdBy, modifiedBy: $modifiedBy, poultry: $poultry)'; +} + + +} + +/// @nodoc +abstract mixin class $HatchingDetailsCopyWith<$Res> { + factory $HatchingDetailsCopyWith(HatchingDetails value, $Res Function(HatchingDetails) _then) = _$HatchingDetailsCopyWithImpl; +@useResult +$Res call({ + int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry +}); + + +$VetFarmCopyWith<$Res>? get vetFarm;$ActiveKillCopyWith<$Res>? get activeKill;$KillingInfoCopyWith<$Res>? get killingInfo;$FreeGovernmentalInfoCopyWith<$Res>? get freeGovernmentalInfo;$LastChangeCopyWith<$Res>? get lastChange;$LatestHatchingChangeCopyWith<$Res>? get latestHatchingChange; + +} +/// @nodoc +class _$HatchingDetailsCopyWithImpl<$Res> + implements $HatchingDetailsCopyWith<$Res> { + _$HatchingDetailsCopyWithImpl(this._self, this._then); + + final HatchingDetails _self; + final $Res Function(HatchingDetails) _then; + +/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? chainCompany = freezed,Object? age = freezed,Object? inspectionLosses = freezed,Object? vetFarm = freezed,Object? activeKill = freezed,Object? killingInfo = freezed,Object? freeGovernmentalInfo = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? hasChainCompany = freezed,Object? poultryIdForeignKey = freezed,Object? poultryHatchingIdKey = freezed,Object? quantity = freezed,Object? losses = freezed,Object? leftOver = freezed,Object? killedQuantity = freezed,Object? extraKilledQuantity = freezed,Object? governmentalKilledQuantity = freezed,Object? governmentalQuantity = freezed,Object? freeKilledQuantity = freezed,Object? freeQuantity = freezed,Object? chainKilledQuantity = freezed,Object? chainKilledWeight = freezed,Object? outProvinceKilledWeight = freezed,Object? outProvinceKilledQuantity = freezed,Object? exportKilledWeight = freezed,Object? exportKilledQuantity = freezed,Object? totalCommitment = freezed,Object? commitmentType = freezed,Object? totalCommitmentQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? totalFreeCommitmentWeight = freezed,Object? totalKilledWeight = freezed,Object? totalAverageKilledWeight = freezed,Object? requestLeftOver = freezed,Object? hall = freezed,Object? date = freezed,Object? predicateDate = freezed,Object? chickenBreed = freezed,Object? period = freezed,Object? allowHatching = freezed,Object? state = freezed,Object? archive = freezed,Object? violation = freezed,Object? message = freezed,Object? registrar = freezed,Object? breed = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? lastChange = freezed,Object? chickenAge = freezed,Object? nowAge = freezed,Object? latestHatchingChange = freezed,Object? violationReport = freezed,Object? violationMessage = freezed,Object? violationImage = freezed,Object? violationReporter = freezed,Object? violationReportDate = freezed,Object? violationReportEditor = freezed,Object? violationReportEditDate = freezed,Object? totalLosses = freezed,Object? directLosses = freezed,Object? directLossesInputer = freezed,Object? directLossesDate = freezed,Object? directLossesEditor = freezed,Object? directLossesLastEditDate = freezed,Object? endPeriodLossesInputer = freezed,Object? endPeriodLossesDate = freezed,Object? endPeriodLossesEditor = freezed,Object? endPeriodLossesLastEditDate = freezed,Object? breedingUniqueId = freezed,Object? licenceNumber = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? firstDateInputArchive = freezed,Object? secondDateInputArchive = freezed,Object? inputArchiver = freezed,Object? outputArchiveDate = freezed,Object? outputArchiver = freezed,Object? barDifferenceRequestWeight = freezed,Object? barDifferenceRequestQuantity = freezed,Object? healthCertificate = freezed,Object? samasatDischargePercentage = freezed,Object? personTypeName = freezed,Object? interactTypeName = freezed,Object? unionTypeName = freezed,Object? certId = freezed,Object? increaseQuantity = freezed,Object? tenantFullname = freezed,Object? tenantNationalCode = freezed,Object? tenantMobile = freezed,Object? tenantCity = freezed,Object? hasTenant = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? poultry = freezed,}) { + return _then(_self.copyWith( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int,chainCompany: freezed == chainCompany ? _self.chainCompany : chainCompany // ignore: cast_nullable_to_non_nullable +as String?,age: freezed == age ? _self.age : age // ignore: cast_nullable_to_non_nullable +as int?,inspectionLosses: freezed == inspectionLosses ? _self.inspectionLosses : inspectionLosses // ignore: cast_nullable_to_non_nullable +as dynamic,vetFarm: freezed == vetFarm ? _self.vetFarm : vetFarm // ignore: cast_nullable_to_non_nullable +as VetFarm?,activeKill: freezed == activeKill ? _self.activeKill : activeKill // ignore: cast_nullable_to_non_nullable +as ActiveKill?,killingInfo: freezed == killingInfo ? _self.killingInfo : killingInfo // ignore: cast_nullable_to_non_nullable +as KillingInfo?,freeGovernmentalInfo: freezed == freeGovernmentalInfo ? _self.freeGovernmentalInfo : freeGovernmentalInfo // ignore: cast_nullable_to_non_nullable +as FreeGovernmentalInfo?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as DateTime?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as DateTime?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,hasChainCompany: freezed == hasChainCompany ? _self.hasChainCompany : hasChainCompany // ignore: cast_nullable_to_non_nullable +as bool?,poultryIdForeignKey: freezed == poultryIdForeignKey ? _self.poultryIdForeignKey : poultryIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,poultryHatchingIdKey: freezed == poultryHatchingIdKey ? _self.poultryHatchingIdKey : poultryHatchingIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable +as int?,losses: freezed == losses ? _self.losses : losses // ignore: cast_nullable_to_non_nullable +as int?,leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable +as int?,killedQuantity: freezed == killedQuantity ? _self.killedQuantity : killedQuantity // ignore: cast_nullable_to_non_nullable +as int?,extraKilledQuantity: freezed == extraKilledQuantity ? _self.extraKilledQuantity : extraKilledQuantity // ignore: cast_nullable_to_non_nullable +as int?,governmentalKilledQuantity: freezed == governmentalKilledQuantity ? _self.governmentalKilledQuantity : governmentalKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,governmentalQuantity: freezed == governmentalQuantity ? _self.governmentalQuantity : governmentalQuantity // ignore: cast_nullable_to_non_nullable +as double?,freeKilledQuantity: freezed == freeKilledQuantity ? _self.freeKilledQuantity : freeKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,freeQuantity: freezed == freeQuantity ? _self.freeQuantity : freeQuantity // ignore: cast_nullable_to_non_nullable +as double?,chainKilledQuantity: freezed == chainKilledQuantity ? _self.chainKilledQuantity : chainKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,chainKilledWeight: freezed == chainKilledWeight ? _self.chainKilledWeight : chainKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,outProvinceKilledWeight: freezed == outProvinceKilledWeight ? _self.outProvinceKilledWeight : outProvinceKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,outProvinceKilledQuantity: freezed == outProvinceKilledQuantity ? _self.outProvinceKilledQuantity : outProvinceKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,exportKilledWeight: freezed == exportKilledWeight ? _self.exportKilledWeight : exportKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,exportKilledQuantity: freezed == exportKilledQuantity ? _self.exportKilledQuantity : exportKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalCommitment: freezed == totalCommitment ? _self.totalCommitment : totalCommitment // ignore: cast_nullable_to_non_nullable +as double?,commitmentType: freezed == commitmentType ? _self.commitmentType : commitmentType // ignore: cast_nullable_to_non_nullable +as String?,totalCommitmentQuantity: freezed == totalCommitmentQuantity ? _self.totalCommitmentQuantity : totalCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalFreeCommitmentQuantity: freezed == totalFreeCommitmentQuantity ? _self.totalFreeCommitmentQuantity : totalFreeCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalFreeCommitmentWeight: freezed == totalFreeCommitmentWeight ? _self.totalFreeCommitmentWeight : totalFreeCommitmentWeight // ignore: cast_nullable_to_non_nullable +as double?,totalKilledWeight: freezed == totalKilledWeight ? _self.totalKilledWeight : totalKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,totalAverageKilledWeight: freezed == totalAverageKilledWeight ? _self.totalAverageKilledWeight : totalAverageKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,requestLeftOver: freezed == requestLeftOver ? _self.requestLeftOver : requestLeftOver // ignore: cast_nullable_to_non_nullable +as int?,hall: freezed == hall ? _self.hall : hall // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,predicateDate: freezed == predicateDate ? _self.predicateDate : predicateDate // ignore: cast_nullable_to_non_nullable +as DateTime?,chickenBreed: freezed == chickenBreed ? _self.chickenBreed : chickenBreed // ignore: cast_nullable_to_non_nullable +as String?,period: freezed == period ? _self.period : period // ignore: cast_nullable_to_non_nullable +as int?,allowHatching: freezed == allowHatching ? _self.allowHatching : allowHatching // ignore: cast_nullable_to_non_nullable +as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,archive: freezed == archive ? _self.archive : archive // ignore: cast_nullable_to_non_nullable +as bool?,violation: freezed == violation ? _self.violation : violation // ignore: cast_nullable_to_non_nullable +as bool?,message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable +as dynamic,registrar: freezed == registrar ? _self.registrar : registrar // ignore: cast_nullable_to_non_nullable +as dynamic,breed: freezed == breed ? _self.breed : breed // ignore: cast_nullable_to_non_nullable +as List?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,lastChange: freezed == lastChange ? _self.lastChange : lastChange // ignore: cast_nullable_to_non_nullable +as LastChange?,chickenAge: freezed == chickenAge ? _self.chickenAge : chickenAge // ignore: cast_nullable_to_non_nullable +as int?,nowAge: freezed == nowAge ? _self.nowAge : nowAge // ignore: cast_nullable_to_non_nullable +as int?,latestHatchingChange: freezed == latestHatchingChange ? _self.latestHatchingChange : latestHatchingChange // ignore: cast_nullable_to_non_nullable +as LatestHatchingChange?,violationReport: freezed == violationReport ? _self.violationReport : violationReport // ignore: cast_nullable_to_non_nullable +as dynamic,violationMessage: freezed == violationMessage ? _self.violationMessage : violationMessage // ignore: cast_nullable_to_non_nullable +as String?,violationImage: freezed == violationImage ? _self.violationImage : violationImage // ignore: cast_nullable_to_non_nullable +as dynamic,violationReporter: freezed == violationReporter ? _self.violationReporter : violationReporter // ignore: cast_nullable_to_non_nullable +as dynamic,violationReportDate: freezed == violationReportDate ? _self.violationReportDate : violationReportDate // ignore: cast_nullable_to_non_nullable +as dynamic,violationReportEditor: freezed == violationReportEditor ? _self.violationReportEditor : violationReportEditor // ignore: cast_nullable_to_non_nullable +as dynamic,violationReportEditDate: freezed == violationReportEditDate ? _self.violationReportEditDate : violationReportEditDate // ignore: cast_nullable_to_non_nullable +as dynamic,totalLosses: freezed == totalLosses ? _self.totalLosses : totalLosses // ignore: cast_nullable_to_non_nullable +as int?,directLosses: freezed == directLosses ? _self.directLosses : directLosses // ignore: cast_nullable_to_non_nullable +as int?,directLossesInputer: freezed == directLossesInputer ? _self.directLossesInputer : directLossesInputer // ignore: cast_nullable_to_non_nullable +as dynamic,directLossesDate: freezed == directLossesDate ? _self.directLossesDate : directLossesDate // ignore: cast_nullable_to_non_nullable +as dynamic,directLossesEditor: freezed == directLossesEditor ? _self.directLossesEditor : directLossesEditor // ignore: cast_nullable_to_non_nullable +as dynamic,directLossesLastEditDate: freezed == directLossesLastEditDate ? _self.directLossesLastEditDate : directLossesLastEditDate // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesInputer: freezed == endPeriodLossesInputer ? _self.endPeriodLossesInputer : endPeriodLossesInputer // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesDate: freezed == endPeriodLossesDate ? _self.endPeriodLossesDate : endPeriodLossesDate // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesEditor: freezed == endPeriodLossesEditor ? _self.endPeriodLossesEditor : endPeriodLossesEditor // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesLastEditDate: freezed == endPeriodLossesLastEditDate ? _self.endPeriodLossesLastEditDate : endPeriodLossesLastEditDate // ignore: cast_nullable_to_non_nullable +as dynamic,breedingUniqueId: freezed == breedingUniqueId ? _self.breedingUniqueId : breedingUniqueId // ignore: cast_nullable_to_non_nullable +as String?,licenceNumber: freezed == licenceNumber ? _self.licenceNumber : licenceNumber // ignore: cast_nullable_to_non_nullable +as String?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,firstDateInputArchive: freezed == firstDateInputArchive ? _self.firstDateInputArchive : firstDateInputArchive // ignore: cast_nullable_to_non_nullable +as dynamic,secondDateInputArchive: freezed == secondDateInputArchive ? _self.secondDateInputArchive : secondDateInputArchive // ignore: cast_nullable_to_non_nullable +as dynamic,inputArchiver: freezed == inputArchiver ? _self.inputArchiver : inputArchiver // ignore: cast_nullable_to_non_nullable +as dynamic,outputArchiveDate: freezed == outputArchiveDate ? _self.outputArchiveDate : outputArchiveDate // ignore: cast_nullable_to_non_nullable +as dynamic,outputArchiver: freezed == outputArchiver ? _self.outputArchiver : outputArchiver // ignore: cast_nullable_to_non_nullable +as dynamic,barDifferenceRequestWeight: freezed == barDifferenceRequestWeight ? _self.barDifferenceRequestWeight : barDifferenceRequestWeight // ignore: cast_nullable_to_non_nullable +as double?,barDifferenceRequestQuantity: freezed == barDifferenceRequestQuantity ? _self.barDifferenceRequestQuantity : barDifferenceRequestQuantity // ignore: cast_nullable_to_non_nullable +as double?,healthCertificate: freezed == healthCertificate ? _self.healthCertificate : healthCertificate // ignore: cast_nullable_to_non_nullable +as dynamic,samasatDischargePercentage: freezed == samasatDischargePercentage ? _self.samasatDischargePercentage : samasatDischargePercentage // ignore: cast_nullable_to_non_nullable +as int?,personTypeName: freezed == personTypeName ? _self.personTypeName : personTypeName // ignore: cast_nullable_to_non_nullable +as String?,interactTypeName: freezed == interactTypeName ? _self.interactTypeName : interactTypeName // ignore: cast_nullable_to_non_nullable +as String?,unionTypeName: freezed == unionTypeName ? _self.unionTypeName : unionTypeName // ignore: cast_nullable_to_non_nullable +as String?,certId: freezed == certId ? _self.certId : certId // ignore: cast_nullable_to_non_nullable +as String?,increaseQuantity: freezed == increaseQuantity ? _self.increaseQuantity : increaseQuantity // ignore: cast_nullable_to_non_nullable +as int?,tenantFullname: freezed == tenantFullname ? _self.tenantFullname : tenantFullname // ignore: cast_nullable_to_non_nullable +as dynamic,tenantNationalCode: freezed == tenantNationalCode ? _self.tenantNationalCode : tenantNationalCode // ignore: cast_nullable_to_non_nullable +as dynamic,tenantMobile: freezed == tenantMobile ? _self.tenantMobile : tenantMobile // ignore: cast_nullable_to_non_nullable +as dynamic,tenantCity: freezed == tenantCity ? _self.tenantCity : tenantCity // ignore: cast_nullable_to_non_nullable +as dynamic,hasTenant: freezed == hasTenant ? _self.hasTenant : hasTenant // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,poultry: freezed == poultry ? _self.poultry : poultry // ignore: cast_nullable_to_non_nullable +as int?, + )); +} +/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$VetFarmCopyWith<$Res>? get vetFarm { + if (_self.vetFarm == null) { + return null; + } + + return $VetFarmCopyWith<$Res>(_self.vetFarm!, (value) { + return _then(_self.copyWith(vetFarm: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActiveKillCopyWith<$Res>? get activeKill { + if (_self.activeKill == null) { + return null; + } + + return $ActiveKillCopyWith<$Res>(_self.activeKill!, (value) { + return _then(_self.copyWith(activeKill: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillingInfoCopyWith<$Res>? get killingInfo { + if (_self.killingInfo == null) { + return null; + } + + return $KillingInfoCopyWith<$Res>(_self.killingInfo!, (value) { + return _then(_self.copyWith(killingInfo: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$FreeGovernmentalInfoCopyWith<$Res>? get freeGovernmentalInfo { + if (_self.freeGovernmentalInfo == null) { + return null; + } + + return $FreeGovernmentalInfoCopyWith<$Res>(_self.freeGovernmentalInfo!, (value) { + return _then(_self.copyWith(freeGovernmentalInfo: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$LastChangeCopyWith<$Res>? get lastChange { + if (_self.lastChange == null) { + return null; + } + + return $LastChangeCopyWith<$Res>(_self.lastChange!, (value) { + return _then(_self.copyWith(lastChange: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$LatestHatchingChangeCopyWith<$Res>? get latestHatchingChange { + if (_self.latestHatchingChange == null) { + return null; + } + + return $LatestHatchingChangeCopyWith<$Res>(_self.latestHatchingChange!, (value) { + return _then(_self.copyWith(latestHatchingChange: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [HatchingDetails]. +extension HatchingDetailsPatterns on HatchingDetails { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _HatchingDetails value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _HatchingDetails() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _HatchingDetails value) $default,){ +final _that = this; +switch (_that) { +case _HatchingDetails(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _HatchingDetails value)? $default,){ +final _that = this; +switch (_that) { +case _HatchingDetails() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _HatchingDetails() when $default != null: +return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_that.vetFarm,_that.activeKill,_that.killingInfo,_that.freeGovernmentalInfo,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.hasChainCompany,_that.poultryIdForeignKey,_that.poultryHatchingIdKey,_that.quantity,_that.losses,_that.leftOver,_that.killedQuantity,_that.extraKilledQuantity,_that.governmentalKilledQuantity,_that.governmentalQuantity,_that.freeKilledQuantity,_that.freeQuantity,_that.chainKilledQuantity,_that.chainKilledWeight,_that.outProvinceKilledWeight,_that.outProvinceKilledQuantity,_that.exportKilledWeight,_that.exportKilledQuantity,_that.totalCommitment,_that.commitmentType,_that.totalCommitmentQuantity,_that.totalFreeCommitmentQuantity,_that.totalFreeCommitmentWeight,_that.totalKilledWeight,_that.totalAverageKilledWeight,_that.requestLeftOver,_that.hall,_that.date,_that.predicateDate,_that.chickenBreed,_that.period,_that.allowHatching,_that.state,_that.archive,_that.violation,_that.message,_that.registrar,_that.breed,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.lastChange,_that.chickenAge,_that.nowAge,_that.latestHatchingChange,_that.violationReport,_that.violationMessage,_that.violationImage,_that.violationReporter,_that.violationReportDate,_that.violationReportEditor,_that.violationReportEditDate,_that.totalLosses,_that.directLosses,_that.directLossesInputer,_that.directLossesDate,_that.directLossesEditor,_that.directLossesLastEditDate,_that.endPeriodLossesInputer,_that.endPeriodLossesDate,_that.endPeriodLossesEditor,_that.endPeriodLossesLastEditDate,_that.breedingUniqueId,_that.licenceNumber,_that.temporaryTrash,_that.temporaryDeleted,_that.firstDateInputArchive,_that.secondDateInputArchive,_that.inputArchiver,_that.outputArchiveDate,_that.outputArchiver,_that.barDifferenceRequestWeight,_that.barDifferenceRequestQuantity,_that.healthCertificate,_that.samasatDischargePercentage,_that.personTypeName,_that.interactTypeName,_that.unionTypeName,_that.certId,_that.increaseQuantity,_that.tenantFullname,_that.tenantNationalCode,_that.tenantMobile,_that.tenantCity,_that.hasTenant,_that.createdBy,_that.modifiedBy,_that.poultry);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry) $default,) {final _that = this; +switch (_that) { +case _HatchingDetails(): +return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_that.vetFarm,_that.activeKill,_that.killingInfo,_that.freeGovernmentalInfo,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.hasChainCompany,_that.poultryIdForeignKey,_that.poultryHatchingIdKey,_that.quantity,_that.losses,_that.leftOver,_that.killedQuantity,_that.extraKilledQuantity,_that.governmentalKilledQuantity,_that.governmentalQuantity,_that.freeKilledQuantity,_that.freeQuantity,_that.chainKilledQuantity,_that.chainKilledWeight,_that.outProvinceKilledWeight,_that.outProvinceKilledQuantity,_that.exportKilledWeight,_that.exportKilledQuantity,_that.totalCommitment,_that.commitmentType,_that.totalCommitmentQuantity,_that.totalFreeCommitmentQuantity,_that.totalFreeCommitmentWeight,_that.totalKilledWeight,_that.totalAverageKilledWeight,_that.requestLeftOver,_that.hall,_that.date,_that.predicateDate,_that.chickenBreed,_that.period,_that.allowHatching,_that.state,_that.archive,_that.violation,_that.message,_that.registrar,_that.breed,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.lastChange,_that.chickenAge,_that.nowAge,_that.latestHatchingChange,_that.violationReport,_that.violationMessage,_that.violationImage,_that.violationReporter,_that.violationReportDate,_that.violationReportEditor,_that.violationReportEditDate,_that.totalLosses,_that.directLosses,_that.directLossesInputer,_that.directLossesDate,_that.directLossesEditor,_that.directLossesLastEditDate,_that.endPeriodLossesInputer,_that.endPeriodLossesDate,_that.endPeriodLossesEditor,_that.endPeriodLossesLastEditDate,_that.breedingUniqueId,_that.licenceNumber,_that.temporaryTrash,_that.temporaryDeleted,_that.firstDateInputArchive,_that.secondDateInputArchive,_that.inputArchiver,_that.outputArchiveDate,_that.outputArchiver,_that.barDifferenceRequestWeight,_that.barDifferenceRequestQuantity,_that.healthCertificate,_that.samasatDischargePercentage,_that.personTypeName,_that.interactTypeName,_that.unionTypeName,_that.certId,_that.increaseQuantity,_that.tenantFullname,_that.tenantNationalCode,_that.tenantMobile,_that.tenantCity,_that.hasTenant,_that.createdBy,_that.modifiedBy,_that.poultry);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry)? $default,) {final _that = this; +switch (_that) { +case _HatchingDetails() when $default != null: +return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_that.vetFarm,_that.activeKill,_that.killingInfo,_that.freeGovernmentalInfo,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.hasChainCompany,_that.poultryIdForeignKey,_that.poultryHatchingIdKey,_that.quantity,_that.losses,_that.leftOver,_that.killedQuantity,_that.extraKilledQuantity,_that.governmentalKilledQuantity,_that.governmentalQuantity,_that.freeKilledQuantity,_that.freeQuantity,_that.chainKilledQuantity,_that.chainKilledWeight,_that.outProvinceKilledWeight,_that.outProvinceKilledQuantity,_that.exportKilledWeight,_that.exportKilledQuantity,_that.totalCommitment,_that.commitmentType,_that.totalCommitmentQuantity,_that.totalFreeCommitmentQuantity,_that.totalFreeCommitmentWeight,_that.totalKilledWeight,_that.totalAverageKilledWeight,_that.requestLeftOver,_that.hall,_that.date,_that.predicateDate,_that.chickenBreed,_that.period,_that.allowHatching,_that.state,_that.archive,_that.violation,_that.message,_that.registrar,_that.breed,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.lastChange,_that.chickenAge,_that.nowAge,_that.latestHatchingChange,_that.violationReport,_that.violationMessage,_that.violationImage,_that.violationReporter,_that.violationReportDate,_that.violationReportEditor,_that.violationReportEditDate,_that.totalLosses,_that.directLosses,_that.directLossesInputer,_that.directLossesDate,_that.directLossesEditor,_that.directLossesLastEditDate,_that.endPeriodLossesInputer,_that.endPeriodLossesDate,_that.endPeriodLossesEditor,_that.endPeriodLossesLastEditDate,_that.breedingUniqueId,_that.licenceNumber,_that.temporaryTrash,_that.temporaryDeleted,_that.firstDateInputArchive,_that.secondDateInputArchive,_that.inputArchiver,_that.outputArchiveDate,_that.outputArchiver,_that.barDifferenceRequestWeight,_that.barDifferenceRequestQuantity,_that.healthCertificate,_that.samasatDischargePercentage,_that.personTypeName,_that.interactTypeName,_that.unionTypeName,_that.certId,_that.increaseQuantity,_that.tenantFullname,_that.tenantNationalCode,_that.tenantMobile,_that.tenantCity,_that.hasTenant,_that.createdBy,_that.modifiedBy,_that.poultry);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _HatchingDetails implements HatchingDetails { + const _HatchingDetails({required this.id, this.chainCompany, this.age, this.inspectionLosses, this.vetFarm, this.activeKill, this.killingInfo, this.freeGovernmentalInfo, this.key, this.createDate, this.modifyDate, this.trash, this.hasChainCompany, this.poultryIdForeignKey, this.poultryHatchingIdKey, this.quantity, this.losses, this.leftOver, this.killedQuantity, this.extraKilledQuantity, this.governmentalKilledQuantity, this.governmentalQuantity, this.freeKilledQuantity, this.freeQuantity, this.chainKilledQuantity, this.chainKilledWeight, this.outProvinceKilledWeight, this.outProvinceKilledQuantity, this.exportKilledWeight, this.exportKilledQuantity, this.totalCommitment, this.commitmentType, this.totalCommitmentQuantity, this.totalFreeCommitmentQuantity, this.totalFreeCommitmentWeight, this.totalKilledWeight, this.totalAverageKilledWeight, this.requestLeftOver, this.hall, this.date, this.predicateDate, this.chickenBreed, this.period, this.allowHatching, this.state, this.archive, this.violation, this.message, this.registrar, final List? breed, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.lastChange, this.chickenAge, this.nowAge, this.latestHatchingChange, this.violationReport, this.violationMessage, this.violationImage, this.violationReporter, this.violationReportDate, this.violationReportEditor, this.violationReportEditDate, this.totalLosses, this.directLosses, this.directLossesInputer, this.directLossesDate, this.directLossesEditor, this.directLossesLastEditDate, this.endPeriodLossesInputer, this.endPeriodLossesDate, this.endPeriodLossesEditor, this.endPeriodLossesLastEditDate, this.breedingUniqueId, this.licenceNumber, this.temporaryTrash, this.temporaryDeleted, this.firstDateInputArchive, this.secondDateInputArchive, this.inputArchiver, this.outputArchiveDate, this.outputArchiver, this.barDifferenceRequestWeight, this.barDifferenceRequestQuantity, this.healthCertificate, this.samasatDischargePercentage, this.personTypeName, this.interactTypeName, this.unionTypeName, this.certId, this.increaseQuantity, this.tenantFullname, this.tenantNationalCode, this.tenantMobile, this.tenantCity, this.hasTenant, this.createdBy, this.modifiedBy, this.poultry}): _breed = breed; + factory _HatchingDetails.fromJson(Map json) => _$HatchingDetailsFromJson(json); + +@override final int id; +@override final String? chainCompany; +@override final int? age; +@override final dynamic inspectionLosses; +@override final VetFarm? vetFarm; +@override final ActiveKill? activeKill; +@override final KillingInfo? killingInfo; +@override final FreeGovernmentalInfo? freeGovernmentalInfo; +@override final String? key; +@override final DateTime? createDate; +@override final DateTime? modifyDate; +@override final bool? trash; +@override final bool? hasChainCompany; +@override final dynamic poultryIdForeignKey; +@override final dynamic poultryHatchingIdKey; +@override final int? quantity; +@override final int? losses; +@override final int? leftOver; +@override final int? killedQuantity; +@override final int? extraKilledQuantity; +@override final double? governmentalKilledQuantity; +@override final double? governmentalQuantity; +@override final double? freeKilledQuantity; +@override final double? freeQuantity; +@override final double? chainKilledQuantity; +@override final double? chainKilledWeight; +@override final double? outProvinceKilledWeight; +@override final double? outProvinceKilledQuantity; +@override final double? exportKilledWeight; +@override final double? exportKilledQuantity; +@override final double? totalCommitment; +@override final String? commitmentType; +@override final double? totalCommitmentQuantity; +@override final double? totalFreeCommitmentQuantity; +@override final double? totalFreeCommitmentWeight; +@override final double? totalKilledWeight; +@override final double? totalAverageKilledWeight; +@override final int? requestLeftOver; +@override final int? hall; +@override final DateTime? date; +@override final DateTime? predicateDate; +@override final String? chickenBreed; +@override final int? period; +@override final String? allowHatching; +@override final String? state; +@override final bool? archive; +@override final bool? violation; +@override final dynamic message; +@override final dynamic registrar; + final List? _breed; +@override List? get breed { + final value = _breed; + if (value == null) return null; + if (_breed is EqualUnmodifiableListView) return _breed; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + +@override final int? cityNumber; +@override final String? cityName; +@override final int? provinceNumber; +@override final String? provinceName; +@override final LastChange? lastChange; +@override final int? chickenAge; +@override final int? nowAge; +@override final LatestHatchingChange? latestHatchingChange; +@override final dynamic violationReport; +@override final String? violationMessage; +@override final dynamic violationImage; +@override final dynamic violationReporter; +@override final dynamic violationReportDate; +@override final dynamic violationReportEditor; +@override final dynamic violationReportEditDate; +@override final int? totalLosses; +@override final int? directLosses; +@override final dynamic directLossesInputer; +@override final dynamic directLossesDate; +@override final dynamic directLossesEditor; +@override final dynamic directLossesLastEditDate; +@override final dynamic endPeriodLossesInputer; +@override final dynamic endPeriodLossesDate; +@override final dynamic endPeriodLossesEditor; +@override final dynamic endPeriodLossesLastEditDate; +@override final String? breedingUniqueId; +@override final String? licenceNumber; +@override final bool? temporaryTrash; +@override final bool? temporaryDeleted; +@override final dynamic firstDateInputArchive; +@override final dynamic secondDateInputArchive; +@override final dynamic inputArchiver; +@override final dynamic outputArchiveDate; +@override final dynamic outputArchiver; +@override final double? barDifferenceRequestWeight; +@override final double? barDifferenceRequestQuantity; +@override final dynamic healthCertificate; +@override final int? samasatDischargePercentage; +@override final String? personTypeName; +@override final String? interactTypeName; +@override final String? unionTypeName; +@override final String? certId; +@override final int? increaseQuantity; +@override final dynamic tenantFullname; +@override final dynamic tenantNationalCode; +@override final dynamic tenantMobile; +@override final dynamic tenantCity; +@override final bool? hasTenant; +@override final dynamic createdBy; +@override final dynamic modifiedBy; +@override final int? poultry; + +/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$HatchingDetailsCopyWith<_HatchingDetails> get copyWith => __$HatchingDetailsCopyWithImpl<_HatchingDetails>(this, _$identity); + +@override +Map toJson() { + return _$HatchingDetailsToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _HatchingDetails&&(identical(other.id, id) || other.id == id)&&(identical(other.chainCompany, chainCompany) || other.chainCompany == chainCompany)&&(identical(other.age, age) || other.age == age)&&const DeepCollectionEquality().equals(other.inspectionLosses, inspectionLosses)&&(identical(other.vetFarm, vetFarm) || other.vetFarm == vetFarm)&&(identical(other.activeKill, activeKill) || other.activeKill == activeKill)&&(identical(other.killingInfo, killingInfo) || other.killingInfo == killingInfo)&&(identical(other.freeGovernmentalInfo, freeGovernmentalInfo) || other.freeGovernmentalInfo == freeGovernmentalInfo)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.hasChainCompany, hasChainCompany) || other.hasChainCompany == hasChainCompany)&&const DeepCollectionEquality().equals(other.poultryIdForeignKey, poultryIdForeignKey)&&const DeepCollectionEquality().equals(other.poultryHatchingIdKey, poultryHatchingIdKey)&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.losses, losses) || other.losses == losses)&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.killedQuantity, killedQuantity) || other.killedQuantity == killedQuantity)&&(identical(other.extraKilledQuantity, extraKilledQuantity) || other.extraKilledQuantity == extraKilledQuantity)&&(identical(other.governmentalKilledQuantity, governmentalKilledQuantity) || other.governmentalKilledQuantity == governmentalKilledQuantity)&&(identical(other.governmentalQuantity, governmentalQuantity) || other.governmentalQuantity == governmentalQuantity)&&(identical(other.freeKilledQuantity, freeKilledQuantity) || other.freeKilledQuantity == freeKilledQuantity)&&(identical(other.freeQuantity, freeQuantity) || other.freeQuantity == freeQuantity)&&(identical(other.chainKilledQuantity, chainKilledQuantity) || other.chainKilledQuantity == chainKilledQuantity)&&(identical(other.chainKilledWeight, chainKilledWeight) || other.chainKilledWeight == chainKilledWeight)&&(identical(other.outProvinceKilledWeight, outProvinceKilledWeight) || other.outProvinceKilledWeight == outProvinceKilledWeight)&&(identical(other.outProvinceKilledQuantity, outProvinceKilledQuantity) || other.outProvinceKilledQuantity == outProvinceKilledQuantity)&&(identical(other.exportKilledWeight, exportKilledWeight) || other.exportKilledWeight == exportKilledWeight)&&(identical(other.exportKilledQuantity, exportKilledQuantity) || other.exportKilledQuantity == exportKilledQuantity)&&(identical(other.totalCommitment, totalCommitment) || other.totalCommitment == totalCommitment)&&(identical(other.commitmentType, commitmentType) || other.commitmentType == commitmentType)&&(identical(other.totalCommitmentQuantity, totalCommitmentQuantity) || other.totalCommitmentQuantity == totalCommitmentQuantity)&&(identical(other.totalFreeCommitmentQuantity, totalFreeCommitmentQuantity) || other.totalFreeCommitmentQuantity == totalFreeCommitmentQuantity)&&(identical(other.totalFreeCommitmentWeight, totalFreeCommitmentWeight) || other.totalFreeCommitmentWeight == totalFreeCommitmentWeight)&&(identical(other.totalKilledWeight, totalKilledWeight) || other.totalKilledWeight == totalKilledWeight)&&(identical(other.totalAverageKilledWeight, totalAverageKilledWeight) || other.totalAverageKilledWeight == totalAverageKilledWeight)&&(identical(other.requestLeftOver, requestLeftOver) || other.requestLeftOver == requestLeftOver)&&(identical(other.hall, hall) || other.hall == hall)&&(identical(other.date, date) || other.date == date)&&(identical(other.predicateDate, predicateDate) || other.predicateDate == predicateDate)&&(identical(other.chickenBreed, chickenBreed) || other.chickenBreed == chickenBreed)&&(identical(other.period, period) || other.period == period)&&(identical(other.allowHatching, allowHatching) || other.allowHatching == allowHatching)&&(identical(other.state, state) || other.state == state)&&(identical(other.archive, archive) || other.archive == archive)&&(identical(other.violation, violation) || other.violation == violation)&&const DeepCollectionEquality().equals(other.message, message)&&const DeepCollectionEquality().equals(other.registrar, registrar)&&const DeepCollectionEquality().equals(other._breed, _breed)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.lastChange, lastChange) || other.lastChange == lastChange)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.nowAge, nowAge) || other.nowAge == nowAge)&&(identical(other.latestHatchingChange, latestHatchingChange) || other.latestHatchingChange == latestHatchingChange)&&const DeepCollectionEquality().equals(other.violationReport, violationReport)&&(identical(other.violationMessage, violationMessage) || other.violationMessage == violationMessage)&&const DeepCollectionEquality().equals(other.violationImage, violationImage)&&const DeepCollectionEquality().equals(other.violationReporter, violationReporter)&&const DeepCollectionEquality().equals(other.violationReportDate, violationReportDate)&&const DeepCollectionEquality().equals(other.violationReportEditor, violationReportEditor)&&const DeepCollectionEquality().equals(other.violationReportEditDate, violationReportEditDate)&&(identical(other.totalLosses, totalLosses) || other.totalLosses == totalLosses)&&(identical(other.directLosses, directLosses) || other.directLosses == directLosses)&&const DeepCollectionEquality().equals(other.directLossesInputer, directLossesInputer)&&const DeepCollectionEquality().equals(other.directLossesDate, directLossesDate)&&const DeepCollectionEquality().equals(other.directLossesEditor, directLossesEditor)&&const DeepCollectionEquality().equals(other.directLossesLastEditDate, directLossesLastEditDate)&&const DeepCollectionEquality().equals(other.endPeriodLossesInputer, endPeriodLossesInputer)&&const DeepCollectionEquality().equals(other.endPeriodLossesDate, endPeriodLossesDate)&&const DeepCollectionEquality().equals(other.endPeriodLossesEditor, endPeriodLossesEditor)&&const DeepCollectionEquality().equals(other.endPeriodLossesLastEditDate, endPeriodLossesLastEditDate)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)&&(identical(other.licenceNumber, licenceNumber) || other.licenceNumber == licenceNumber)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.firstDateInputArchive, firstDateInputArchive)&&const DeepCollectionEquality().equals(other.secondDateInputArchive, secondDateInputArchive)&&const DeepCollectionEquality().equals(other.inputArchiver, inputArchiver)&&const DeepCollectionEquality().equals(other.outputArchiveDate, outputArchiveDate)&&const DeepCollectionEquality().equals(other.outputArchiver, outputArchiver)&&(identical(other.barDifferenceRequestWeight, barDifferenceRequestWeight) || other.barDifferenceRequestWeight == barDifferenceRequestWeight)&&(identical(other.barDifferenceRequestQuantity, barDifferenceRequestQuantity) || other.barDifferenceRequestQuantity == barDifferenceRequestQuantity)&&const DeepCollectionEquality().equals(other.healthCertificate, healthCertificate)&&(identical(other.samasatDischargePercentage, samasatDischargePercentage) || other.samasatDischargePercentage == samasatDischargePercentage)&&(identical(other.personTypeName, personTypeName) || other.personTypeName == personTypeName)&&(identical(other.interactTypeName, interactTypeName) || other.interactTypeName == interactTypeName)&&(identical(other.unionTypeName, unionTypeName) || other.unionTypeName == unionTypeName)&&(identical(other.certId, certId) || other.certId == certId)&&(identical(other.increaseQuantity, increaseQuantity) || other.increaseQuantity == increaseQuantity)&&const DeepCollectionEquality().equals(other.tenantFullname, tenantFullname)&&const DeepCollectionEquality().equals(other.tenantNationalCode, tenantNationalCode)&&const DeepCollectionEquality().equals(other.tenantMobile, tenantMobile)&&const DeepCollectionEquality().equals(other.tenantCity, tenantCity)&&(identical(other.hasTenant, hasTenant) || other.hasTenant == hasTenant)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.poultry, poultry) || other.poultry == poultry)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,chainCompany,age,const DeepCollectionEquality().hash(inspectionLosses),vetFarm,activeKill,killingInfo,freeGovernmentalInfo,key,createDate,modifyDate,trash,hasChainCompany,const DeepCollectionEquality().hash(poultryIdForeignKey),const DeepCollectionEquality().hash(poultryHatchingIdKey),quantity,losses,leftOver,killedQuantity,extraKilledQuantity,governmentalKilledQuantity,governmentalQuantity,freeKilledQuantity,freeQuantity,chainKilledQuantity,chainKilledWeight,outProvinceKilledWeight,outProvinceKilledQuantity,exportKilledWeight,exportKilledQuantity,totalCommitment,commitmentType,totalCommitmentQuantity,totalFreeCommitmentQuantity,totalFreeCommitmentWeight,totalKilledWeight,totalAverageKilledWeight,requestLeftOver,hall,date,predicateDate,chickenBreed,period,allowHatching,state,archive,violation,const DeepCollectionEquality().hash(message),const DeepCollectionEquality().hash(registrar),const DeepCollectionEquality().hash(_breed),cityNumber,cityName,provinceNumber,provinceName,lastChange,chickenAge,nowAge,latestHatchingChange,const DeepCollectionEquality().hash(violationReport),violationMessage,const DeepCollectionEquality().hash(violationImage),const DeepCollectionEquality().hash(violationReporter),const DeepCollectionEquality().hash(violationReportDate),const DeepCollectionEquality().hash(violationReportEditor),const DeepCollectionEquality().hash(violationReportEditDate),totalLosses,directLosses,const DeepCollectionEquality().hash(directLossesInputer),const DeepCollectionEquality().hash(directLossesDate),const DeepCollectionEquality().hash(directLossesEditor),const DeepCollectionEquality().hash(directLossesLastEditDate),const DeepCollectionEquality().hash(endPeriodLossesInputer),const DeepCollectionEquality().hash(endPeriodLossesDate),const DeepCollectionEquality().hash(endPeriodLossesEditor),const DeepCollectionEquality().hash(endPeriodLossesLastEditDate),breedingUniqueId,licenceNumber,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(firstDateInputArchive),const DeepCollectionEquality().hash(secondDateInputArchive),const DeepCollectionEquality().hash(inputArchiver),const DeepCollectionEquality().hash(outputArchiveDate),const DeepCollectionEquality().hash(outputArchiver),barDifferenceRequestWeight,barDifferenceRequestQuantity,const DeepCollectionEquality().hash(healthCertificate),samasatDischargePercentage,personTypeName,interactTypeName,unionTypeName,certId,increaseQuantity,const DeepCollectionEquality().hash(tenantFullname),const DeepCollectionEquality().hash(tenantNationalCode),const DeepCollectionEquality().hash(tenantMobile),const DeepCollectionEquality().hash(tenantCity),hasTenant,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),poultry]); + +@override +String toString() { + return 'HatchingDetails(id: $id, chainCompany: $chainCompany, age: $age, inspectionLosses: $inspectionLosses, vetFarm: $vetFarm, activeKill: $activeKill, killingInfo: $killingInfo, freeGovernmentalInfo: $freeGovernmentalInfo, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, hasChainCompany: $hasChainCompany, poultryIdForeignKey: $poultryIdForeignKey, poultryHatchingIdKey: $poultryHatchingIdKey, quantity: $quantity, losses: $losses, leftOver: $leftOver, killedQuantity: $killedQuantity, extraKilledQuantity: $extraKilledQuantity, governmentalKilledQuantity: $governmentalKilledQuantity, governmentalQuantity: $governmentalQuantity, freeKilledQuantity: $freeKilledQuantity, freeQuantity: $freeQuantity, chainKilledQuantity: $chainKilledQuantity, chainKilledWeight: $chainKilledWeight, outProvinceKilledWeight: $outProvinceKilledWeight, outProvinceKilledQuantity: $outProvinceKilledQuantity, exportKilledWeight: $exportKilledWeight, exportKilledQuantity: $exportKilledQuantity, totalCommitment: $totalCommitment, commitmentType: $commitmentType, totalCommitmentQuantity: $totalCommitmentQuantity, totalFreeCommitmentQuantity: $totalFreeCommitmentQuantity, totalFreeCommitmentWeight: $totalFreeCommitmentWeight, totalKilledWeight: $totalKilledWeight, totalAverageKilledWeight: $totalAverageKilledWeight, requestLeftOver: $requestLeftOver, hall: $hall, date: $date, predicateDate: $predicateDate, chickenBreed: $chickenBreed, period: $period, allowHatching: $allowHatching, state: $state, archive: $archive, violation: $violation, message: $message, registrar: $registrar, breed: $breed, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, lastChange: $lastChange, chickenAge: $chickenAge, nowAge: $nowAge, latestHatchingChange: $latestHatchingChange, violationReport: $violationReport, violationMessage: $violationMessage, violationImage: $violationImage, violationReporter: $violationReporter, violationReportDate: $violationReportDate, violationReportEditor: $violationReportEditor, violationReportEditDate: $violationReportEditDate, totalLosses: $totalLosses, directLosses: $directLosses, directLossesInputer: $directLossesInputer, directLossesDate: $directLossesDate, directLossesEditor: $directLossesEditor, directLossesLastEditDate: $directLossesLastEditDate, endPeriodLossesInputer: $endPeriodLossesInputer, endPeriodLossesDate: $endPeriodLossesDate, endPeriodLossesEditor: $endPeriodLossesEditor, endPeriodLossesLastEditDate: $endPeriodLossesLastEditDate, breedingUniqueId: $breedingUniqueId, licenceNumber: $licenceNumber, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, firstDateInputArchive: $firstDateInputArchive, secondDateInputArchive: $secondDateInputArchive, inputArchiver: $inputArchiver, outputArchiveDate: $outputArchiveDate, outputArchiver: $outputArchiver, barDifferenceRequestWeight: $barDifferenceRequestWeight, barDifferenceRequestQuantity: $barDifferenceRequestQuantity, healthCertificate: $healthCertificate, samasatDischargePercentage: $samasatDischargePercentage, personTypeName: $personTypeName, interactTypeName: $interactTypeName, unionTypeName: $unionTypeName, certId: $certId, increaseQuantity: $increaseQuantity, tenantFullname: $tenantFullname, tenantNationalCode: $tenantNationalCode, tenantMobile: $tenantMobile, tenantCity: $tenantCity, hasTenant: $hasTenant, createdBy: $createdBy, modifiedBy: $modifiedBy, poultry: $poultry)'; +} + + +} + +/// @nodoc +abstract mixin class _$HatchingDetailsCopyWith<$Res> implements $HatchingDetailsCopyWith<$Res> { + factory _$HatchingDetailsCopyWith(_HatchingDetails value, $Res Function(_HatchingDetails) _then) = __$HatchingDetailsCopyWithImpl; +@override @useResult +$Res call({ + int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry +}); + + +@override $VetFarmCopyWith<$Res>? get vetFarm;@override $ActiveKillCopyWith<$Res>? get activeKill;@override $KillingInfoCopyWith<$Res>? get killingInfo;@override $FreeGovernmentalInfoCopyWith<$Res>? get freeGovernmentalInfo;@override $LastChangeCopyWith<$Res>? get lastChange;@override $LatestHatchingChangeCopyWith<$Res>? get latestHatchingChange; + +} +/// @nodoc +class __$HatchingDetailsCopyWithImpl<$Res> + implements _$HatchingDetailsCopyWith<$Res> { + __$HatchingDetailsCopyWithImpl(this._self, this._then); + + final _HatchingDetails _self; + final $Res Function(_HatchingDetails) _then; + +/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? chainCompany = freezed,Object? age = freezed,Object? inspectionLosses = freezed,Object? vetFarm = freezed,Object? activeKill = freezed,Object? killingInfo = freezed,Object? freeGovernmentalInfo = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? hasChainCompany = freezed,Object? poultryIdForeignKey = freezed,Object? poultryHatchingIdKey = freezed,Object? quantity = freezed,Object? losses = freezed,Object? leftOver = freezed,Object? killedQuantity = freezed,Object? extraKilledQuantity = freezed,Object? governmentalKilledQuantity = freezed,Object? governmentalQuantity = freezed,Object? freeKilledQuantity = freezed,Object? freeQuantity = freezed,Object? chainKilledQuantity = freezed,Object? chainKilledWeight = freezed,Object? outProvinceKilledWeight = freezed,Object? outProvinceKilledQuantity = freezed,Object? exportKilledWeight = freezed,Object? exportKilledQuantity = freezed,Object? totalCommitment = freezed,Object? commitmentType = freezed,Object? totalCommitmentQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? totalFreeCommitmentWeight = freezed,Object? totalKilledWeight = freezed,Object? totalAverageKilledWeight = freezed,Object? requestLeftOver = freezed,Object? hall = freezed,Object? date = freezed,Object? predicateDate = freezed,Object? chickenBreed = freezed,Object? period = freezed,Object? allowHatching = freezed,Object? state = freezed,Object? archive = freezed,Object? violation = freezed,Object? message = freezed,Object? registrar = freezed,Object? breed = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? lastChange = freezed,Object? chickenAge = freezed,Object? nowAge = freezed,Object? latestHatchingChange = freezed,Object? violationReport = freezed,Object? violationMessage = freezed,Object? violationImage = freezed,Object? violationReporter = freezed,Object? violationReportDate = freezed,Object? violationReportEditor = freezed,Object? violationReportEditDate = freezed,Object? totalLosses = freezed,Object? directLosses = freezed,Object? directLossesInputer = freezed,Object? directLossesDate = freezed,Object? directLossesEditor = freezed,Object? directLossesLastEditDate = freezed,Object? endPeriodLossesInputer = freezed,Object? endPeriodLossesDate = freezed,Object? endPeriodLossesEditor = freezed,Object? endPeriodLossesLastEditDate = freezed,Object? breedingUniqueId = freezed,Object? licenceNumber = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? firstDateInputArchive = freezed,Object? secondDateInputArchive = freezed,Object? inputArchiver = freezed,Object? outputArchiveDate = freezed,Object? outputArchiver = freezed,Object? barDifferenceRequestWeight = freezed,Object? barDifferenceRequestQuantity = freezed,Object? healthCertificate = freezed,Object? samasatDischargePercentage = freezed,Object? personTypeName = freezed,Object? interactTypeName = freezed,Object? unionTypeName = freezed,Object? certId = freezed,Object? increaseQuantity = freezed,Object? tenantFullname = freezed,Object? tenantNationalCode = freezed,Object? tenantMobile = freezed,Object? tenantCity = freezed,Object? hasTenant = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? poultry = freezed,}) { + return _then(_HatchingDetails( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int,chainCompany: freezed == chainCompany ? _self.chainCompany : chainCompany // ignore: cast_nullable_to_non_nullable +as String?,age: freezed == age ? _self.age : age // ignore: cast_nullable_to_non_nullable +as int?,inspectionLosses: freezed == inspectionLosses ? _self.inspectionLosses : inspectionLosses // ignore: cast_nullable_to_non_nullable +as dynamic,vetFarm: freezed == vetFarm ? _self.vetFarm : vetFarm // ignore: cast_nullable_to_non_nullable +as VetFarm?,activeKill: freezed == activeKill ? _self.activeKill : activeKill // ignore: cast_nullable_to_non_nullable +as ActiveKill?,killingInfo: freezed == killingInfo ? _self.killingInfo : killingInfo // ignore: cast_nullable_to_non_nullable +as KillingInfo?,freeGovernmentalInfo: freezed == freeGovernmentalInfo ? _self.freeGovernmentalInfo : freeGovernmentalInfo // ignore: cast_nullable_to_non_nullable +as FreeGovernmentalInfo?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable +as DateTime?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable +as DateTime?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable +as bool?,hasChainCompany: freezed == hasChainCompany ? _self.hasChainCompany : hasChainCompany // ignore: cast_nullable_to_non_nullable +as bool?,poultryIdForeignKey: freezed == poultryIdForeignKey ? _self.poultryIdForeignKey : poultryIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,poultryHatchingIdKey: freezed == poultryHatchingIdKey ? _self.poultryHatchingIdKey : poultryHatchingIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable +as int?,losses: freezed == losses ? _self.losses : losses // ignore: cast_nullable_to_non_nullable +as int?,leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable +as int?,killedQuantity: freezed == killedQuantity ? _self.killedQuantity : killedQuantity // ignore: cast_nullable_to_non_nullable +as int?,extraKilledQuantity: freezed == extraKilledQuantity ? _self.extraKilledQuantity : extraKilledQuantity // ignore: cast_nullable_to_non_nullable +as int?,governmentalKilledQuantity: freezed == governmentalKilledQuantity ? _self.governmentalKilledQuantity : governmentalKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,governmentalQuantity: freezed == governmentalQuantity ? _self.governmentalQuantity : governmentalQuantity // ignore: cast_nullable_to_non_nullable +as double?,freeKilledQuantity: freezed == freeKilledQuantity ? _self.freeKilledQuantity : freeKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,freeQuantity: freezed == freeQuantity ? _self.freeQuantity : freeQuantity // ignore: cast_nullable_to_non_nullable +as double?,chainKilledQuantity: freezed == chainKilledQuantity ? _self.chainKilledQuantity : chainKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,chainKilledWeight: freezed == chainKilledWeight ? _self.chainKilledWeight : chainKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,outProvinceKilledWeight: freezed == outProvinceKilledWeight ? _self.outProvinceKilledWeight : outProvinceKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,outProvinceKilledQuantity: freezed == outProvinceKilledQuantity ? _self.outProvinceKilledQuantity : outProvinceKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,exportKilledWeight: freezed == exportKilledWeight ? _self.exportKilledWeight : exportKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,exportKilledQuantity: freezed == exportKilledQuantity ? _self.exportKilledQuantity : exportKilledQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalCommitment: freezed == totalCommitment ? _self.totalCommitment : totalCommitment // ignore: cast_nullable_to_non_nullable +as double?,commitmentType: freezed == commitmentType ? _self.commitmentType : commitmentType // ignore: cast_nullable_to_non_nullable +as String?,totalCommitmentQuantity: freezed == totalCommitmentQuantity ? _self.totalCommitmentQuantity : totalCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalFreeCommitmentQuantity: freezed == totalFreeCommitmentQuantity ? _self.totalFreeCommitmentQuantity : totalFreeCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,totalFreeCommitmentWeight: freezed == totalFreeCommitmentWeight ? _self.totalFreeCommitmentWeight : totalFreeCommitmentWeight // ignore: cast_nullable_to_non_nullable +as double?,totalKilledWeight: freezed == totalKilledWeight ? _self.totalKilledWeight : totalKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,totalAverageKilledWeight: freezed == totalAverageKilledWeight ? _self.totalAverageKilledWeight : totalAverageKilledWeight // ignore: cast_nullable_to_non_nullable +as double?,requestLeftOver: freezed == requestLeftOver ? _self.requestLeftOver : requestLeftOver // ignore: cast_nullable_to_non_nullable +as int?,hall: freezed == hall ? _self.hall : hall // ignore: cast_nullable_to_non_nullable +as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,predicateDate: freezed == predicateDate ? _self.predicateDate : predicateDate // ignore: cast_nullable_to_non_nullable +as DateTime?,chickenBreed: freezed == chickenBreed ? _self.chickenBreed : chickenBreed // ignore: cast_nullable_to_non_nullable +as String?,period: freezed == period ? _self.period : period // ignore: cast_nullable_to_non_nullable +as int?,allowHatching: freezed == allowHatching ? _self.allowHatching : allowHatching // ignore: cast_nullable_to_non_nullable +as String?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as String?,archive: freezed == archive ? _self.archive : archive // ignore: cast_nullable_to_non_nullable +as bool?,violation: freezed == violation ? _self.violation : violation // ignore: cast_nullable_to_non_nullable +as bool?,message: freezed == message ? _self.message : message // ignore: cast_nullable_to_non_nullable +as dynamic,registrar: freezed == registrar ? _self.registrar : registrar // ignore: cast_nullable_to_non_nullable +as dynamic,breed: freezed == breed ? _self._breed : breed // ignore: cast_nullable_to_non_nullable +as List?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,lastChange: freezed == lastChange ? _self.lastChange : lastChange // ignore: cast_nullable_to_non_nullable +as LastChange?,chickenAge: freezed == chickenAge ? _self.chickenAge : chickenAge // ignore: cast_nullable_to_non_nullable +as int?,nowAge: freezed == nowAge ? _self.nowAge : nowAge // ignore: cast_nullable_to_non_nullable +as int?,latestHatchingChange: freezed == latestHatchingChange ? _self.latestHatchingChange : latestHatchingChange // ignore: cast_nullable_to_non_nullable +as LatestHatchingChange?,violationReport: freezed == violationReport ? _self.violationReport : violationReport // ignore: cast_nullable_to_non_nullable +as dynamic,violationMessage: freezed == violationMessage ? _self.violationMessage : violationMessage // ignore: cast_nullable_to_non_nullable +as String?,violationImage: freezed == violationImage ? _self.violationImage : violationImage // ignore: cast_nullable_to_non_nullable +as dynamic,violationReporter: freezed == violationReporter ? _self.violationReporter : violationReporter // ignore: cast_nullable_to_non_nullable +as dynamic,violationReportDate: freezed == violationReportDate ? _self.violationReportDate : violationReportDate // ignore: cast_nullable_to_non_nullable +as dynamic,violationReportEditor: freezed == violationReportEditor ? _self.violationReportEditor : violationReportEditor // ignore: cast_nullable_to_non_nullable +as dynamic,violationReportEditDate: freezed == violationReportEditDate ? _self.violationReportEditDate : violationReportEditDate // ignore: cast_nullable_to_non_nullable +as dynamic,totalLosses: freezed == totalLosses ? _self.totalLosses : totalLosses // ignore: cast_nullable_to_non_nullable +as int?,directLosses: freezed == directLosses ? _self.directLosses : directLosses // ignore: cast_nullable_to_non_nullable +as int?,directLossesInputer: freezed == directLossesInputer ? _self.directLossesInputer : directLossesInputer // ignore: cast_nullable_to_non_nullable +as dynamic,directLossesDate: freezed == directLossesDate ? _self.directLossesDate : directLossesDate // ignore: cast_nullable_to_non_nullable +as dynamic,directLossesEditor: freezed == directLossesEditor ? _self.directLossesEditor : directLossesEditor // ignore: cast_nullable_to_non_nullable +as dynamic,directLossesLastEditDate: freezed == directLossesLastEditDate ? _self.directLossesLastEditDate : directLossesLastEditDate // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesInputer: freezed == endPeriodLossesInputer ? _self.endPeriodLossesInputer : endPeriodLossesInputer // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesDate: freezed == endPeriodLossesDate ? _self.endPeriodLossesDate : endPeriodLossesDate // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesEditor: freezed == endPeriodLossesEditor ? _self.endPeriodLossesEditor : endPeriodLossesEditor // ignore: cast_nullable_to_non_nullable +as dynamic,endPeriodLossesLastEditDate: freezed == endPeriodLossesLastEditDate ? _self.endPeriodLossesLastEditDate : endPeriodLossesLastEditDate // ignore: cast_nullable_to_non_nullable +as dynamic,breedingUniqueId: freezed == breedingUniqueId ? _self.breedingUniqueId : breedingUniqueId // ignore: cast_nullable_to_non_nullable +as String?,licenceNumber: freezed == licenceNumber ? _self.licenceNumber : licenceNumber // ignore: cast_nullable_to_non_nullable +as String?,temporaryTrash: freezed == temporaryTrash ? _self.temporaryTrash : temporaryTrash // ignore: cast_nullable_to_non_nullable +as bool?,temporaryDeleted: freezed == temporaryDeleted ? _self.temporaryDeleted : temporaryDeleted // ignore: cast_nullable_to_non_nullable +as bool?,firstDateInputArchive: freezed == firstDateInputArchive ? _self.firstDateInputArchive : firstDateInputArchive // ignore: cast_nullable_to_non_nullable +as dynamic,secondDateInputArchive: freezed == secondDateInputArchive ? _self.secondDateInputArchive : secondDateInputArchive // ignore: cast_nullable_to_non_nullable +as dynamic,inputArchiver: freezed == inputArchiver ? _self.inputArchiver : inputArchiver // ignore: cast_nullable_to_non_nullable +as dynamic,outputArchiveDate: freezed == outputArchiveDate ? _self.outputArchiveDate : outputArchiveDate // ignore: cast_nullable_to_non_nullable +as dynamic,outputArchiver: freezed == outputArchiver ? _self.outputArchiver : outputArchiver // ignore: cast_nullable_to_non_nullable +as dynamic,barDifferenceRequestWeight: freezed == barDifferenceRequestWeight ? _self.barDifferenceRequestWeight : barDifferenceRequestWeight // ignore: cast_nullable_to_non_nullable +as double?,barDifferenceRequestQuantity: freezed == barDifferenceRequestQuantity ? _self.barDifferenceRequestQuantity : barDifferenceRequestQuantity // ignore: cast_nullable_to_non_nullable +as double?,healthCertificate: freezed == healthCertificate ? _self.healthCertificate : healthCertificate // ignore: cast_nullable_to_non_nullable +as dynamic,samasatDischargePercentage: freezed == samasatDischargePercentage ? _self.samasatDischargePercentage : samasatDischargePercentage // ignore: cast_nullable_to_non_nullable +as int?,personTypeName: freezed == personTypeName ? _self.personTypeName : personTypeName // ignore: cast_nullable_to_non_nullable +as String?,interactTypeName: freezed == interactTypeName ? _self.interactTypeName : interactTypeName // ignore: cast_nullable_to_non_nullable +as String?,unionTypeName: freezed == unionTypeName ? _self.unionTypeName : unionTypeName // ignore: cast_nullable_to_non_nullable +as String?,certId: freezed == certId ? _self.certId : certId // ignore: cast_nullable_to_non_nullable +as String?,increaseQuantity: freezed == increaseQuantity ? _self.increaseQuantity : increaseQuantity // ignore: cast_nullable_to_non_nullable +as int?,tenantFullname: freezed == tenantFullname ? _self.tenantFullname : tenantFullname // ignore: cast_nullable_to_non_nullable +as dynamic,tenantNationalCode: freezed == tenantNationalCode ? _self.tenantNationalCode : tenantNationalCode // ignore: cast_nullable_to_non_nullable +as dynamic,tenantMobile: freezed == tenantMobile ? _self.tenantMobile : tenantMobile // ignore: cast_nullable_to_non_nullable +as dynamic,tenantCity: freezed == tenantCity ? _self.tenantCity : tenantCity // ignore: cast_nullable_to_non_nullable +as dynamic,hasTenant: freezed == hasTenant ? _self.hasTenant : hasTenant // ignore: cast_nullable_to_non_nullable +as bool?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable +as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable +as dynamic,poultry: freezed == poultry ? _self.poultry : poultry // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$VetFarmCopyWith<$Res>? get vetFarm { + if (_self.vetFarm == null) { + return null; + } + + return $VetFarmCopyWith<$Res>(_self.vetFarm!, (value) { + return _then(_self.copyWith(vetFarm: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ActiveKillCopyWith<$Res>? get activeKill { + if (_self.activeKill == null) { + return null; + } + + return $ActiveKillCopyWith<$Res>(_self.activeKill!, (value) { + return _then(_self.copyWith(activeKill: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$KillingInfoCopyWith<$Res>? get killingInfo { + if (_self.killingInfo == null) { + return null; + } + + return $KillingInfoCopyWith<$Res>(_self.killingInfo!, (value) { + return _then(_self.copyWith(killingInfo: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$FreeGovernmentalInfoCopyWith<$Res>? get freeGovernmentalInfo { + if (_self.freeGovernmentalInfo == null) { + return null; + } + + return $FreeGovernmentalInfoCopyWith<$Res>(_self.freeGovernmentalInfo!, (value) { + return _then(_self.copyWith(freeGovernmentalInfo: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$LastChangeCopyWith<$Res>? get lastChange { + if (_self.lastChange == null) { + return null; + } + + return $LastChangeCopyWith<$Res>(_self.lastChange!, (value) { + return _then(_self.copyWith(lastChange: value)); + }); +}/// Create a copy of HatchingDetails +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$LatestHatchingChangeCopyWith<$Res>? get latestHatchingChange { + if (_self.latestHatchingChange == null) { + return null; + } + + return $LatestHatchingChangeCopyWith<$Res>(_self.latestHatchingChange!, (value) { + return _then(_self.copyWith(latestHatchingChange: value)); + }); +} +} + + +/// @nodoc +mixin _$VetFarm { + + String? get vetFarmFullName; String? get vetFarmMobile; +/// Create a copy of VetFarm +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$VetFarmCopyWith get copyWith => _$VetFarmCopyWithImpl(this as VetFarm, _$identity); + + /// Serializes this VetFarm to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is VetFarm&&(identical(other.vetFarmFullName, vetFarmFullName) || other.vetFarmFullName == vetFarmFullName)&&(identical(other.vetFarmMobile, vetFarmMobile) || other.vetFarmMobile == vetFarmMobile)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,vetFarmFullName,vetFarmMobile); + +@override +String toString() { + return 'VetFarm(vetFarmFullName: $vetFarmFullName, vetFarmMobile: $vetFarmMobile)'; +} + + +} + +/// @nodoc +abstract mixin class $VetFarmCopyWith<$Res> { + factory $VetFarmCopyWith(VetFarm value, $Res Function(VetFarm) _then) = _$VetFarmCopyWithImpl; +@useResult +$Res call({ + String? vetFarmFullName, String? vetFarmMobile +}); + + + + +} +/// @nodoc +class _$VetFarmCopyWithImpl<$Res> + implements $VetFarmCopyWith<$Res> { + _$VetFarmCopyWithImpl(this._self, this._then); + + final VetFarm _self; + final $Res Function(VetFarm) _then; + +/// Create a copy of VetFarm +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? vetFarmFullName = freezed,Object? vetFarmMobile = freezed,}) { + return _then(_self.copyWith( +vetFarmFullName: freezed == vetFarmFullName ? _self.vetFarmFullName : vetFarmFullName // ignore: cast_nullable_to_non_nullable +as String?,vetFarmMobile: freezed == vetFarmMobile ? _self.vetFarmMobile : vetFarmMobile // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [VetFarm]. +extension VetFarmPatterns on VetFarm { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _VetFarm value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _VetFarm() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _VetFarm value) $default,){ +final _that = this; +switch (_that) { +case _VetFarm(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _VetFarm value)? $default,){ +final _that = this; +switch (_that) { +case _VetFarm() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? vetFarmFullName, String? vetFarmMobile)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _VetFarm() when $default != null: +return $default(_that.vetFarmFullName,_that.vetFarmMobile);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? vetFarmFullName, String? vetFarmMobile) $default,) {final _that = this; +switch (_that) { +case _VetFarm(): +return $default(_that.vetFarmFullName,_that.vetFarmMobile);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? vetFarmFullName, String? vetFarmMobile)? $default,) {final _that = this; +switch (_that) { +case _VetFarm() when $default != null: +return $default(_that.vetFarmFullName,_that.vetFarmMobile);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _VetFarm implements VetFarm { + const _VetFarm({this.vetFarmFullName, this.vetFarmMobile}); + factory _VetFarm.fromJson(Map json) => _$VetFarmFromJson(json); + +@override final String? vetFarmFullName; +@override final String? vetFarmMobile; + +/// Create a copy of VetFarm +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$VetFarmCopyWith<_VetFarm> get copyWith => __$VetFarmCopyWithImpl<_VetFarm>(this, _$identity); + +@override +Map toJson() { + return _$VetFarmToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _VetFarm&&(identical(other.vetFarmFullName, vetFarmFullName) || other.vetFarmFullName == vetFarmFullName)&&(identical(other.vetFarmMobile, vetFarmMobile) || other.vetFarmMobile == vetFarmMobile)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,vetFarmFullName,vetFarmMobile); + +@override +String toString() { + return 'VetFarm(vetFarmFullName: $vetFarmFullName, vetFarmMobile: $vetFarmMobile)'; +} + + +} + +/// @nodoc +abstract mixin class _$VetFarmCopyWith<$Res> implements $VetFarmCopyWith<$Res> { + factory _$VetFarmCopyWith(_VetFarm value, $Res Function(_VetFarm) _then) = __$VetFarmCopyWithImpl; +@override @useResult +$Res call({ + String? vetFarmFullName, String? vetFarmMobile +}); + + + + +} +/// @nodoc +class __$VetFarmCopyWithImpl<$Res> + implements _$VetFarmCopyWith<$Res> { + __$VetFarmCopyWithImpl(this._self, this._then); + + final _VetFarm _self; + final $Res Function(_VetFarm) _then; + +/// Create a copy of VetFarm +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? vetFarmFullName = freezed,Object? vetFarmMobile = freezed,}) { + return _then(_VetFarm( +vetFarmFullName: freezed == vetFarmFullName ? _self.vetFarmFullName : vetFarmFullName // ignore: cast_nullable_to_non_nullable +as String?,vetFarmMobile: freezed == vetFarmMobile ? _self.vetFarmMobile : vetFarmMobile // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$ActiveKill { + + bool? get activeKill; int? get countOfRequest; +/// Create a copy of ActiveKill +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ActiveKillCopyWith get copyWith => _$ActiveKillCopyWithImpl(this as ActiveKill, _$identity); + + /// Serializes this ActiveKill to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ActiveKill&&(identical(other.activeKill, activeKill) || other.activeKill == activeKill)&&(identical(other.countOfRequest, countOfRequest) || other.countOfRequest == countOfRequest)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,activeKill,countOfRequest); + +@override +String toString() { + return 'ActiveKill(activeKill: $activeKill, countOfRequest: $countOfRequest)'; +} + + +} + +/// @nodoc +abstract mixin class $ActiveKillCopyWith<$Res> { + factory $ActiveKillCopyWith(ActiveKill value, $Res Function(ActiveKill) _then) = _$ActiveKillCopyWithImpl; +@useResult +$Res call({ + bool? activeKill, int? countOfRequest +}); + + + + +} +/// @nodoc +class _$ActiveKillCopyWithImpl<$Res> + implements $ActiveKillCopyWith<$Res> { + _$ActiveKillCopyWithImpl(this._self, this._then); + + final ActiveKill _self; + final $Res Function(ActiveKill) _then; + +/// Create a copy of ActiveKill +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? activeKill = freezed,Object? countOfRequest = freezed,}) { + return _then(_self.copyWith( +activeKill: freezed == activeKill ? _self.activeKill : activeKill // ignore: cast_nullable_to_non_nullable +as bool?,countOfRequest: freezed == countOfRequest ? _self.countOfRequest : countOfRequest // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [ActiveKill]. +extension ActiveKillPatterns on ActiveKill { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ActiveKill value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ActiveKill() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ActiveKill value) $default,){ +final _that = this; +switch (_that) { +case _ActiveKill(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ActiveKill value)? $default,){ +final _that = this; +switch (_that) { +case _ActiveKill() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( bool? activeKill, int? countOfRequest)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ActiveKill() when $default != null: +return $default(_that.activeKill,_that.countOfRequest);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( bool? activeKill, int? countOfRequest) $default,) {final _that = this; +switch (_that) { +case _ActiveKill(): +return $default(_that.activeKill,_that.countOfRequest);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( bool? activeKill, int? countOfRequest)? $default,) {final _that = this; +switch (_that) { +case _ActiveKill() when $default != null: +return $default(_that.activeKill,_that.countOfRequest);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _ActiveKill implements ActiveKill { + const _ActiveKill({this.activeKill, this.countOfRequest}); + factory _ActiveKill.fromJson(Map json) => _$ActiveKillFromJson(json); + +@override final bool? activeKill; +@override final int? countOfRequest; + +/// Create a copy of ActiveKill +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ActiveKillCopyWith<_ActiveKill> get copyWith => __$ActiveKillCopyWithImpl<_ActiveKill>(this, _$identity); + +@override +Map toJson() { + return _$ActiveKillToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ActiveKill&&(identical(other.activeKill, activeKill) || other.activeKill == activeKill)&&(identical(other.countOfRequest, countOfRequest) || other.countOfRequest == countOfRequest)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,activeKill,countOfRequest); + +@override +String toString() { + return 'ActiveKill(activeKill: $activeKill, countOfRequest: $countOfRequest)'; +} + + +} + +/// @nodoc +abstract mixin class _$ActiveKillCopyWith<$Res> implements $ActiveKillCopyWith<$Res> { + factory _$ActiveKillCopyWith(_ActiveKill value, $Res Function(_ActiveKill) _then) = __$ActiveKillCopyWithImpl; +@override @useResult +$Res call({ + bool? activeKill, int? countOfRequest +}); + + + + +} +/// @nodoc +class __$ActiveKillCopyWithImpl<$Res> + implements _$ActiveKillCopyWith<$Res> { + __$ActiveKillCopyWithImpl(this._self, this._then); + + final _ActiveKill _self; + final $Res Function(_ActiveKill) _then; + +/// Create a copy of ActiveKill +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? activeKill = freezed,Object? countOfRequest = freezed,}) { + return _then(_ActiveKill( +activeKill: freezed == activeKill ? _self.activeKill : activeKill // ignore: cast_nullable_to_non_nullable +as bool?,countOfRequest: freezed == countOfRequest ? _self.countOfRequest : countOfRequest // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + + +/// @nodoc +mixin _$KillingInfo { + + String? get violationMessage; int? get provinceKillRequests; int? get provinceKillRequestsQuantity; double? get provinceKillRequestsWeight; int? get killHouseRequests; int? get killHouseRequestsFirstQuantity; double? get killHouseRequestsFirstWeight; int? get barCompleteWithKillHouse; int? get acceptedRealQuantityFinal; double? get acceptedRealWightFinal; int? get wareHouseBars; int? get wareHouseBarsQuantity; double? get wareHouseBarsWeight; double? get wareHouseBarsWeightLose; +/// Create a copy of KillingInfo +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$KillingInfoCopyWith get copyWith => _$KillingInfoCopyWithImpl(this as KillingInfo, _$identity); + + /// Serializes this KillingInfo to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is KillingInfo&&(identical(other.violationMessage, violationMessage) || other.violationMessage == violationMessage)&&(identical(other.provinceKillRequests, provinceKillRequests) || other.provinceKillRequests == provinceKillRequests)&&(identical(other.provinceKillRequestsQuantity, provinceKillRequestsQuantity) || other.provinceKillRequestsQuantity == provinceKillRequestsQuantity)&&(identical(other.provinceKillRequestsWeight, provinceKillRequestsWeight) || other.provinceKillRequestsWeight == provinceKillRequestsWeight)&&(identical(other.killHouseRequests, killHouseRequests) || other.killHouseRequests == killHouseRequests)&&(identical(other.killHouseRequestsFirstQuantity, killHouseRequestsFirstQuantity) || other.killHouseRequestsFirstQuantity == killHouseRequestsFirstQuantity)&&(identical(other.killHouseRequestsFirstWeight, killHouseRequestsFirstWeight) || other.killHouseRequestsFirstWeight == killHouseRequestsFirstWeight)&&(identical(other.barCompleteWithKillHouse, barCompleteWithKillHouse) || other.barCompleteWithKillHouse == barCompleteWithKillHouse)&&(identical(other.acceptedRealQuantityFinal, acceptedRealQuantityFinal) || other.acceptedRealQuantityFinal == acceptedRealQuantityFinal)&&(identical(other.acceptedRealWightFinal, acceptedRealWightFinal) || other.acceptedRealWightFinal == acceptedRealWightFinal)&&(identical(other.wareHouseBars, wareHouseBars) || other.wareHouseBars == wareHouseBars)&&(identical(other.wareHouseBarsQuantity, wareHouseBarsQuantity) || other.wareHouseBarsQuantity == wareHouseBarsQuantity)&&(identical(other.wareHouseBarsWeight, wareHouseBarsWeight) || other.wareHouseBarsWeight == wareHouseBarsWeight)&&(identical(other.wareHouseBarsWeightLose, wareHouseBarsWeightLose) || other.wareHouseBarsWeightLose == wareHouseBarsWeightLose)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,violationMessage,provinceKillRequests,provinceKillRequestsQuantity,provinceKillRequestsWeight,killHouseRequests,killHouseRequestsFirstQuantity,killHouseRequestsFirstWeight,barCompleteWithKillHouse,acceptedRealQuantityFinal,acceptedRealWightFinal,wareHouseBars,wareHouseBarsQuantity,wareHouseBarsWeight,wareHouseBarsWeightLose); + +@override +String toString() { + return 'KillingInfo(violationMessage: $violationMessage, provinceKillRequests: $provinceKillRequests, provinceKillRequestsQuantity: $provinceKillRequestsQuantity, provinceKillRequestsWeight: $provinceKillRequestsWeight, killHouseRequests: $killHouseRequests, killHouseRequestsFirstQuantity: $killHouseRequestsFirstQuantity, killHouseRequestsFirstWeight: $killHouseRequestsFirstWeight, barCompleteWithKillHouse: $barCompleteWithKillHouse, acceptedRealQuantityFinal: $acceptedRealQuantityFinal, acceptedRealWightFinal: $acceptedRealWightFinal, wareHouseBars: $wareHouseBars, wareHouseBarsQuantity: $wareHouseBarsQuantity, wareHouseBarsWeight: $wareHouseBarsWeight, wareHouseBarsWeightLose: $wareHouseBarsWeightLose)'; +} + + +} + +/// @nodoc +abstract mixin class $KillingInfoCopyWith<$Res> { + factory $KillingInfoCopyWith(KillingInfo value, $Res Function(KillingInfo) _then) = _$KillingInfoCopyWithImpl; +@useResult +$Res call({ + String? violationMessage, int? provinceKillRequests, int? provinceKillRequestsQuantity, double? provinceKillRequestsWeight, int? killHouseRequests, int? killHouseRequestsFirstQuantity, double? killHouseRequestsFirstWeight, int? barCompleteWithKillHouse, int? acceptedRealQuantityFinal, double? acceptedRealWightFinal, int? wareHouseBars, int? wareHouseBarsQuantity, double? wareHouseBarsWeight, double? wareHouseBarsWeightLose +}); + + + + +} +/// @nodoc +class _$KillingInfoCopyWithImpl<$Res> + implements $KillingInfoCopyWith<$Res> { + _$KillingInfoCopyWithImpl(this._self, this._then); + + final KillingInfo _self; + final $Res Function(KillingInfo) _then; + +/// Create a copy of KillingInfo +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? violationMessage = freezed,Object? provinceKillRequests = freezed,Object? provinceKillRequestsQuantity = freezed,Object? provinceKillRequestsWeight = freezed,Object? killHouseRequests = freezed,Object? killHouseRequestsFirstQuantity = freezed,Object? killHouseRequestsFirstWeight = freezed,Object? barCompleteWithKillHouse = freezed,Object? acceptedRealQuantityFinal = freezed,Object? acceptedRealWightFinal = freezed,Object? wareHouseBars = freezed,Object? wareHouseBarsQuantity = freezed,Object? wareHouseBarsWeight = freezed,Object? wareHouseBarsWeightLose = freezed,}) { + return _then(_self.copyWith( +violationMessage: freezed == violationMessage ? _self.violationMessage : violationMessage // ignore: cast_nullable_to_non_nullable +as String?,provinceKillRequests: freezed == provinceKillRequests ? _self.provinceKillRequests : provinceKillRequests // ignore: cast_nullable_to_non_nullable +as int?,provinceKillRequestsQuantity: freezed == provinceKillRequestsQuantity ? _self.provinceKillRequestsQuantity : provinceKillRequestsQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceKillRequestsWeight: freezed == provinceKillRequestsWeight ? _self.provinceKillRequestsWeight : provinceKillRequestsWeight // ignore: cast_nullable_to_non_nullable +as double?,killHouseRequests: freezed == killHouseRequests ? _self.killHouseRequests : killHouseRequests // ignore: cast_nullable_to_non_nullable +as int?,killHouseRequestsFirstQuantity: freezed == killHouseRequestsFirstQuantity ? _self.killHouseRequestsFirstQuantity : killHouseRequestsFirstQuantity // ignore: cast_nullable_to_non_nullable +as int?,killHouseRequestsFirstWeight: freezed == killHouseRequestsFirstWeight ? _self.killHouseRequestsFirstWeight : killHouseRequestsFirstWeight // ignore: cast_nullable_to_non_nullable +as double?,barCompleteWithKillHouse: freezed == barCompleteWithKillHouse ? _self.barCompleteWithKillHouse : barCompleteWithKillHouse // ignore: cast_nullable_to_non_nullable +as int?,acceptedRealQuantityFinal: freezed == acceptedRealQuantityFinal ? _self.acceptedRealQuantityFinal : acceptedRealQuantityFinal // ignore: cast_nullable_to_non_nullable +as int?,acceptedRealWightFinal: freezed == acceptedRealWightFinal ? _self.acceptedRealWightFinal : acceptedRealWightFinal // ignore: cast_nullable_to_non_nullable +as double?,wareHouseBars: freezed == wareHouseBars ? _self.wareHouseBars : wareHouseBars // ignore: cast_nullable_to_non_nullable +as int?,wareHouseBarsQuantity: freezed == wareHouseBarsQuantity ? _self.wareHouseBarsQuantity : wareHouseBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,wareHouseBarsWeight: freezed == wareHouseBarsWeight ? _self.wareHouseBarsWeight : wareHouseBarsWeight // ignore: cast_nullable_to_non_nullable +as double?,wareHouseBarsWeightLose: freezed == wareHouseBarsWeightLose ? _self.wareHouseBarsWeightLose : wareHouseBarsWeightLose // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [KillingInfo]. +extension KillingInfoPatterns on KillingInfo { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _KillingInfo value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _KillingInfo() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _KillingInfo value) $default,){ +final _that = this; +switch (_that) { +case _KillingInfo(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _KillingInfo value)? $default,){ +final _that = this; +switch (_that) { +case _KillingInfo() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? violationMessage, int? provinceKillRequests, int? provinceKillRequestsQuantity, double? provinceKillRequestsWeight, int? killHouseRequests, int? killHouseRequestsFirstQuantity, double? killHouseRequestsFirstWeight, int? barCompleteWithKillHouse, int? acceptedRealQuantityFinal, double? acceptedRealWightFinal, int? wareHouseBars, int? wareHouseBarsQuantity, double? wareHouseBarsWeight, double? wareHouseBarsWeightLose)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _KillingInfo() when $default != null: +return $default(_that.violationMessage,_that.provinceKillRequests,_that.provinceKillRequestsQuantity,_that.provinceKillRequestsWeight,_that.killHouseRequests,_that.killHouseRequestsFirstQuantity,_that.killHouseRequestsFirstWeight,_that.barCompleteWithKillHouse,_that.acceptedRealQuantityFinal,_that.acceptedRealWightFinal,_that.wareHouseBars,_that.wareHouseBarsQuantity,_that.wareHouseBarsWeight,_that.wareHouseBarsWeightLose);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? violationMessage, int? provinceKillRequests, int? provinceKillRequestsQuantity, double? provinceKillRequestsWeight, int? killHouseRequests, int? killHouseRequestsFirstQuantity, double? killHouseRequestsFirstWeight, int? barCompleteWithKillHouse, int? acceptedRealQuantityFinal, double? acceptedRealWightFinal, int? wareHouseBars, int? wareHouseBarsQuantity, double? wareHouseBarsWeight, double? wareHouseBarsWeightLose) $default,) {final _that = this; +switch (_that) { +case _KillingInfo(): +return $default(_that.violationMessage,_that.provinceKillRequests,_that.provinceKillRequestsQuantity,_that.provinceKillRequestsWeight,_that.killHouseRequests,_that.killHouseRequestsFirstQuantity,_that.killHouseRequestsFirstWeight,_that.barCompleteWithKillHouse,_that.acceptedRealQuantityFinal,_that.acceptedRealWightFinal,_that.wareHouseBars,_that.wareHouseBarsQuantity,_that.wareHouseBarsWeight,_that.wareHouseBarsWeightLose);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? violationMessage, int? provinceKillRequests, int? provinceKillRequestsQuantity, double? provinceKillRequestsWeight, int? killHouseRequests, int? killHouseRequestsFirstQuantity, double? killHouseRequestsFirstWeight, int? barCompleteWithKillHouse, int? acceptedRealQuantityFinal, double? acceptedRealWightFinal, int? wareHouseBars, int? wareHouseBarsQuantity, double? wareHouseBarsWeight, double? wareHouseBarsWeightLose)? $default,) {final _that = this; +switch (_that) { +case _KillingInfo() when $default != null: +return $default(_that.violationMessage,_that.provinceKillRequests,_that.provinceKillRequestsQuantity,_that.provinceKillRequestsWeight,_that.killHouseRequests,_that.killHouseRequestsFirstQuantity,_that.killHouseRequestsFirstWeight,_that.barCompleteWithKillHouse,_that.acceptedRealQuantityFinal,_that.acceptedRealWightFinal,_that.wareHouseBars,_that.wareHouseBarsQuantity,_that.wareHouseBarsWeight,_that.wareHouseBarsWeightLose);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _KillingInfo implements KillingInfo { + const _KillingInfo({this.violationMessage, this.provinceKillRequests, this.provinceKillRequestsQuantity, this.provinceKillRequestsWeight, this.killHouseRequests, this.killHouseRequestsFirstQuantity, this.killHouseRequestsFirstWeight, this.barCompleteWithKillHouse, this.acceptedRealQuantityFinal, this.acceptedRealWightFinal, this.wareHouseBars, this.wareHouseBarsQuantity, this.wareHouseBarsWeight, this.wareHouseBarsWeightLose}); + factory _KillingInfo.fromJson(Map json) => _$KillingInfoFromJson(json); + +@override final String? violationMessage; +@override final int? provinceKillRequests; +@override final int? provinceKillRequestsQuantity; +@override final double? provinceKillRequestsWeight; +@override final int? killHouseRequests; +@override final int? killHouseRequestsFirstQuantity; +@override final double? killHouseRequestsFirstWeight; +@override final int? barCompleteWithKillHouse; +@override final int? acceptedRealQuantityFinal; +@override final double? acceptedRealWightFinal; +@override final int? wareHouseBars; +@override final int? wareHouseBarsQuantity; +@override final double? wareHouseBarsWeight; +@override final double? wareHouseBarsWeightLose; + +/// Create a copy of KillingInfo +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$KillingInfoCopyWith<_KillingInfo> get copyWith => __$KillingInfoCopyWithImpl<_KillingInfo>(this, _$identity); + +@override +Map toJson() { + return _$KillingInfoToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillingInfo&&(identical(other.violationMessage, violationMessage) || other.violationMessage == violationMessage)&&(identical(other.provinceKillRequests, provinceKillRequests) || other.provinceKillRequests == provinceKillRequests)&&(identical(other.provinceKillRequestsQuantity, provinceKillRequestsQuantity) || other.provinceKillRequestsQuantity == provinceKillRequestsQuantity)&&(identical(other.provinceKillRequestsWeight, provinceKillRequestsWeight) || other.provinceKillRequestsWeight == provinceKillRequestsWeight)&&(identical(other.killHouseRequests, killHouseRequests) || other.killHouseRequests == killHouseRequests)&&(identical(other.killHouseRequestsFirstQuantity, killHouseRequestsFirstQuantity) || other.killHouseRequestsFirstQuantity == killHouseRequestsFirstQuantity)&&(identical(other.killHouseRequestsFirstWeight, killHouseRequestsFirstWeight) || other.killHouseRequestsFirstWeight == killHouseRequestsFirstWeight)&&(identical(other.barCompleteWithKillHouse, barCompleteWithKillHouse) || other.barCompleteWithKillHouse == barCompleteWithKillHouse)&&(identical(other.acceptedRealQuantityFinal, acceptedRealQuantityFinal) || other.acceptedRealQuantityFinal == acceptedRealQuantityFinal)&&(identical(other.acceptedRealWightFinal, acceptedRealWightFinal) || other.acceptedRealWightFinal == acceptedRealWightFinal)&&(identical(other.wareHouseBars, wareHouseBars) || other.wareHouseBars == wareHouseBars)&&(identical(other.wareHouseBarsQuantity, wareHouseBarsQuantity) || other.wareHouseBarsQuantity == wareHouseBarsQuantity)&&(identical(other.wareHouseBarsWeight, wareHouseBarsWeight) || other.wareHouseBarsWeight == wareHouseBarsWeight)&&(identical(other.wareHouseBarsWeightLose, wareHouseBarsWeightLose) || other.wareHouseBarsWeightLose == wareHouseBarsWeightLose)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,violationMessage,provinceKillRequests,provinceKillRequestsQuantity,provinceKillRequestsWeight,killHouseRequests,killHouseRequestsFirstQuantity,killHouseRequestsFirstWeight,barCompleteWithKillHouse,acceptedRealQuantityFinal,acceptedRealWightFinal,wareHouseBars,wareHouseBarsQuantity,wareHouseBarsWeight,wareHouseBarsWeightLose); + +@override +String toString() { + return 'KillingInfo(violationMessage: $violationMessage, provinceKillRequests: $provinceKillRequests, provinceKillRequestsQuantity: $provinceKillRequestsQuantity, provinceKillRequestsWeight: $provinceKillRequestsWeight, killHouseRequests: $killHouseRequests, killHouseRequestsFirstQuantity: $killHouseRequestsFirstQuantity, killHouseRequestsFirstWeight: $killHouseRequestsFirstWeight, barCompleteWithKillHouse: $barCompleteWithKillHouse, acceptedRealQuantityFinal: $acceptedRealQuantityFinal, acceptedRealWightFinal: $acceptedRealWightFinal, wareHouseBars: $wareHouseBars, wareHouseBarsQuantity: $wareHouseBarsQuantity, wareHouseBarsWeight: $wareHouseBarsWeight, wareHouseBarsWeightLose: $wareHouseBarsWeightLose)'; +} + + +} + +/// @nodoc +abstract mixin class _$KillingInfoCopyWith<$Res> implements $KillingInfoCopyWith<$Res> { + factory _$KillingInfoCopyWith(_KillingInfo value, $Res Function(_KillingInfo) _then) = __$KillingInfoCopyWithImpl; +@override @useResult +$Res call({ + String? violationMessage, int? provinceKillRequests, int? provinceKillRequestsQuantity, double? provinceKillRequestsWeight, int? killHouseRequests, int? killHouseRequestsFirstQuantity, double? killHouseRequestsFirstWeight, int? barCompleteWithKillHouse, int? acceptedRealQuantityFinal, double? acceptedRealWightFinal, int? wareHouseBars, int? wareHouseBarsQuantity, double? wareHouseBarsWeight, double? wareHouseBarsWeightLose +}); + + + + +} +/// @nodoc +class __$KillingInfoCopyWithImpl<$Res> + implements _$KillingInfoCopyWith<$Res> { + __$KillingInfoCopyWithImpl(this._self, this._then); + + final _KillingInfo _self; + final $Res Function(_KillingInfo) _then; + +/// Create a copy of KillingInfo +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? violationMessage = freezed,Object? provinceKillRequests = freezed,Object? provinceKillRequestsQuantity = freezed,Object? provinceKillRequestsWeight = freezed,Object? killHouseRequests = freezed,Object? killHouseRequestsFirstQuantity = freezed,Object? killHouseRequestsFirstWeight = freezed,Object? barCompleteWithKillHouse = freezed,Object? acceptedRealQuantityFinal = freezed,Object? acceptedRealWightFinal = freezed,Object? wareHouseBars = freezed,Object? wareHouseBarsQuantity = freezed,Object? wareHouseBarsWeight = freezed,Object? wareHouseBarsWeightLose = freezed,}) { + return _then(_KillingInfo( +violationMessage: freezed == violationMessage ? _self.violationMessage : violationMessage // ignore: cast_nullable_to_non_nullable +as String?,provinceKillRequests: freezed == provinceKillRequests ? _self.provinceKillRequests : provinceKillRequests // ignore: cast_nullable_to_non_nullable +as int?,provinceKillRequestsQuantity: freezed == provinceKillRequestsQuantity ? _self.provinceKillRequestsQuantity : provinceKillRequestsQuantity // ignore: cast_nullable_to_non_nullable +as int?,provinceKillRequestsWeight: freezed == provinceKillRequestsWeight ? _self.provinceKillRequestsWeight : provinceKillRequestsWeight // ignore: cast_nullable_to_non_nullable +as double?,killHouseRequests: freezed == killHouseRequests ? _self.killHouseRequests : killHouseRequests // ignore: cast_nullable_to_non_nullable +as int?,killHouseRequestsFirstQuantity: freezed == killHouseRequestsFirstQuantity ? _self.killHouseRequestsFirstQuantity : killHouseRequestsFirstQuantity // ignore: cast_nullable_to_non_nullable +as int?,killHouseRequestsFirstWeight: freezed == killHouseRequestsFirstWeight ? _self.killHouseRequestsFirstWeight : killHouseRequestsFirstWeight // ignore: cast_nullable_to_non_nullable +as double?,barCompleteWithKillHouse: freezed == barCompleteWithKillHouse ? _self.barCompleteWithKillHouse : barCompleteWithKillHouse // ignore: cast_nullable_to_non_nullable +as int?,acceptedRealQuantityFinal: freezed == acceptedRealQuantityFinal ? _self.acceptedRealQuantityFinal : acceptedRealQuantityFinal // ignore: cast_nullable_to_non_nullable +as int?,acceptedRealWightFinal: freezed == acceptedRealWightFinal ? _self.acceptedRealWightFinal : acceptedRealWightFinal // ignore: cast_nullable_to_non_nullable +as double?,wareHouseBars: freezed == wareHouseBars ? _self.wareHouseBars : wareHouseBars // ignore: cast_nullable_to_non_nullable +as int?,wareHouseBarsQuantity: freezed == wareHouseBarsQuantity ? _self.wareHouseBarsQuantity : wareHouseBarsQuantity // ignore: cast_nullable_to_non_nullable +as int?,wareHouseBarsWeight: freezed == wareHouseBarsWeight ? _self.wareHouseBarsWeight : wareHouseBarsWeight // ignore: cast_nullable_to_non_nullable +as double?,wareHouseBarsWeightLose: freezed == wareHouseBarsWeightLose ? _self.wareHouseBarsWeightLose : wareHouseBarsWeightLose // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + + +/// @nodoc +mixin _$FreeGovernmentalInfo { + + int? get governmentalAllocatedQuantity; double? get totalCommitmentQuantity; int? get freeAllocatedQuantity; double? get totalFreeCommitmentQuantity; int? get leftTotalFreeCommitmentQuantity; +/// Create a copy of FreeGovernmentalInfo +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FreeGovernmentalInfoCopyWith get copyWith => _$FreeGovernmentalInfoCopyWithImpl(this as FreeGovernmentalInfo, _$identity); + + /// Serializes this FreeGovernmentalInfo to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FreeGovernmentalInfo&&(identical(other.governmentalAllocatedQuantity, governmentalAllocatedQuantity) || other.governmentalAllocatedQuantity == governmentalAllocatedQuantity)&&(identical(other.totalCommitmentQuantity, totalCommitmentQuantity) || other.totalCommitmentQuantity == totalCommitmentQuantity)&&(identical(other.freeAllocatedQuantity, freeAllocatedQuantity) || other.freeAllocatedQuantity == freeAllocatedQuantity)&&(identical(other.totalFreeCommitmentQuantity, totalFreeCommitmentQuantity) || other.totalFreeCommitmentQuantity == totalFreeCommitmentQuantity)&&(identical(other.leftTotalFreeCommitmentQuantity, leftTotalFreeCommitmentQuantity) || other.leftTotalFreeCommitmentQuantity == leftTotalFreeCommitmentQuantity)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,governmentalAllocatedQuantity,totalCommitmentQuantity,freeAllocatedQuantity,totalFreeCommitmentQuantity,leftTotalFreeCommitmentQuantity); + +@override +String toString() { + return 'FreeGovernmentalInfo(governmentalAllocatedQuantity: $governmentalAllocatedQuantity, totalCommitmentQuantity: $totalCommitmentQuantity, freeAllocatedQuantity: $freeAllocatedQuantity, totalFreeCommitmentQuantity: $totalFreeCommitmentQuantity, leftTotalFreeCommitmentQuantity: $leftTotalFreeCommitmentQuantity)'; +} + + +} + +/// @nodoc +abstract mixin class $FreeGovernmentalInfoCopyWith<$Res> { + factory $FreeGovernmentalInfoCopyWith(FreeGovernmentalInfo value, $Res Function(FreeGovernmentalInfo) _then) = _$FreeGovernmentalInfoCopyWithImpl; +@useResult +$Res call({ + int? governmentalAllocatedQuantity, double? totalCommitmentQuantity, int? freeAllocatedQuantity, double? totalFreeCommitmentQuantity, int? leftTotalFreeCommitmentQuantity +}); + + + + +} +/// @nodoc +class _$FreeGovernmentalInfoCopyWithImpl<$Res> + implements $FreeGovernmentalInfoCopyWith<$Res> { + _$FreeGovernmentalInfoCopyWithImpl(this._self, this._then); + + final FreeGovernmentalInfo _self; + final $Res Function(FreeGovernmentalInfo) _then; + +/// Create a copy of FreeGovernmentalInfo +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? governmentalAllocatedQuantity = freezed,Object? totalCommitmentQuantity = freezed,Object? freeAllocatedQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? leftTotalFreeCommitmentQuantity = freezed,}) { + return _then(_self.copyWith( +governmentalAllocatedQuantity: freezed == governmentalAllocatedQuantity ? _self.governmentalAllocatedQuantity : governmentalAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalCommitmentQuantity: freezed == totalCommitmentQuantity ? _self.totalCommitmentQuantity : totalCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,freeAllocatedQuantity: freezed == freeAllocatedQuantity ? _self.freeAllocatedQuantity : freeAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalFreeCommitmentQuantity: freezed == totalFreeCommitmentQuantity ? _self.totalFreeCommitmentQuantity : totalFreeCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,leftTotalFreeCommitmentQuantity: freezed == leftTotalFreeCommitmentQuantity ? _self.leftTotalFreeCommitmentQuantity : leftTotalFreeCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [FreeGovernmentalInfo]. +extension FreeGovernmentalInfoPatterns on FreeGovernmentalInfo { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _FreeGovernmentalInfo value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _FreeGovernmentalInfo() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _FreeGovernmentalInfo value) $default,){ +final _that = this; +switch (_that) { +case _FreeGovernmentalInfo(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _FreeGovernmentalInfo value)? $default,){ +final _that = this; +switch (_that) { +case _FreeGovernmentalInfo() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? governmentalAllocatedQuantity, double? totalCommitmentQuantity, int? freeAllocatedQuantity, double? totalFreeCommitmentQuantity, int? leftTotalFreeCommitmentQuantity)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _FreeGovernmentalInfo() when $default != null: +return $default(_that.governmentalAllocatedQuantity,_that.totalCommitmentQuantity,_that.freeAllocatedQuantity,_that.totalFreeCommitmentQuantity,_that.leftTotalFreeCommitmentQuantity);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? governmentalAllocatedQuantity, double? totalCommitmentQuantity, int? freeAllocatedQuantity, double? totalFreeCommitmentQuantity, int? leftTotalFreeCommitmentQuantity) $default,) {final _that = this; +switch (_that) { +case _FreeGovernmentalInfo(): +return $default(_that.governmentalAllocatedQuantity,_that.totalCommitmentQuantity,_that.freeAllocatedQuantity,_that.totalFreeCommitmentQuantity,_that.leftTotalFreeCommitmentQuantity);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? governmentalAllocatedQuantity, double? totalCommitmentQuantity, int? freeAllocatedQuantity, double? totalFreeCommitmentQuantity, int? leftTotalFreeCommitmentQuantity)? $default,) {final _that = this; +switch (_that) { +case _FreeGovernmentalInfo() when $default != null: +return $default(_that.governmentalAllocatedQuantity,_that.totalCommitmentQuantity,_that.freeAllocatedQuantity,_that.totalFreeCommitmentQuantity,_that.leftTotalFreeCommitmentQuantity);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _FreeGovernmentalInfo implements FreeGovernmentalInfo { + const _FreeGovernmentalInfo({this.governmentalAllocatedQuantity, this.totalCommitmentQuantity, this.freeAllocatedQuantity, this.totalFreeCommitmentQuantity, this.leftTotalFreeCommitmentQuantity}); + factory _FreeGovernmentalInfo.fromJson(Map json) => _$FreeGovernmentalInfoFromJson(json); + +@override final int? governmentalAllocatedQuantity; +@override final double? totalCommitmentQuantity; +@override final int? freeAllocatedQuantity; +@override final double? totalFreeCommitmentQuantity; +@override final int? leftTotalFreeCommitmentQuantity; + +/// Create a copy of FreeGovernmentalInfo +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$FreeGovernmentalInfoCopyWith<_FreeGovernmentalInfo> get copyWith => __$FreeGovernmentalInfoCopyWithImpl<_FreeGovernmentalInfo>(this, _$identity); + +@override +Map toJson() { + return _$FreeGovernmentalInfoToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _FreeGovernmentalInfo&&(identical(other.governmentalAllocatedQuantity, governmentalAllocatedQuantity) || other.governmentalAllocatedQuantity == governmentalAllocatedQuantity)&&(identical(other.totalCommitmentQuantity, totalCommitmentQuantity) || other.totalCommitmentQuantity == totalCommitmentQuantity)&&(identical(other.freeAllocatedQuantity, freeAllocatedQuantity) || other.freeAllocatedQuantity == freeAllocatedQuantity)&&(identical(other.totalFreeCommitmentQuantity, totalFreeCommitmentQuantity) || other.totalFreeCommitmentQuantity == totalFreeCommitmentQuantity)&&(identical(other.leftTotalFreeCommitmentQuantity, leftTotalFreeCommitmentQuantity) || other.leftTotalFreeCommitmentQuantity == leftTotalFreeCommitmentQuantity)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,governmentalAllocatedQuantity,totalCommitmentQuantity,freeAllocatedQuantity,totalFreeCommitmentQuantity,leftTotalFreeCommitmentQuantity); + +@override +String toString() { + return 'FreeGovernmentalInfo(governmentalAllocatedQuantity: $governmentalAllocatedQuantity, totalCommitmentQuantity: $totalCommitmentQuantity, freeAllocatedQuantity: $freeAllocatedQuantity, totalFreeCommitmentQuantity: $totalFreeCommitmentQuantity, leftTotalFreeCommitmentQuantity: $leftTotalFreeCommitmentQuantity)'; +} + + +} + +/// @nodoc +abstract mixin class _$FreeGovernmentalInfoCopyWith<$Res> implements $FreeGovernmentalInfoCopyWith<$Res> { + factory _$FreeGovernmentalInfoCopyWith(_FreeGovernmentalInfo value, $Res Function(_FreeGovernmentalInfo) _then) = __$FreeGovernmentalInfoCopyWithImpl; +@override @useResult +$Res call({ + int? governmentalAllocatedQuantity, double? totalCommitmentQuantity, int? freeAllocatedQuantity, double? totalFreeCommitmentQuantity, int? leftTotalFreeCommitmentQuantity +}); + + + + +} +/// @nodoc +class __$FreeGovernmentalInfoCopyWithImpl<$Res> + implements _$FreeGovernmentalInfoCopyWith<$Res> { + __$FreeGovernmentalInfoCopyWithImpl(this._self, this._then); + + final _FreeGovernmentalInfo _self; + final $Res Function(_FreeGovernmentalInfo) _then; + +/// Create a copy of FreeGovernmentalInfo +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? governmentalAllocatedQuantity = freezed,Object? totalCommitmentQuantity = freezed,Object? freeAllocatedQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? leftTotalFreeCommitmentQuantity = freezed,}) { + return _then(_FreeGovernmentalInfo( +governmentalAllocatedQuantity: freezed == governmentalAllocatedQuantity ? _self.governmentalAllocatedQuantity : governmentalAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalCommitmentQuantity: freezed == totalCommitmentQuantity ? _self.totalCommitmentQuantity : totalCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,freeAllocatedQuantity: freezed == freeAllocatedQuantity ? _self.freeAllocatedQuantity : freeAllocatedQuantity // ignore: cast_nullable_to_non_nullable +as int?,totalFreeCommitmentQuantity: freezed == totalFreeCommitmentQuantity ? _self.totalFreeCommitmentQuantity : totalFreeCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as double?,leftTotalFreeCommitmentQuantity: freezed == leftTotalFreeCommitmentQuantity ? _self.leftTotalFreeCommitmentQuantity : leftTotalFreeCommitmentQuantity // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + + +/// @nodoc +mixin _$Breed { + + String? get breed; int? get mainQuantity; int? get remainQuantity; +/// Create a copy of Breed +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BreedCopyWith get copyWith => _$BreedCopyWithImpl(this as Breed, _$identity); + + /// Serializes this Breed to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Breed&&(identical(other.breed, breed) || other.breed == breed)&&(identical(other.mainQuantity, mainQuantity) || other.mainQuantity == mainQuantity)&&(identical(other.remainQuantity, remainQuantity) || other.remainQuantity == remainQuantity)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,breed,mainQuantity,remainQuantity); + +@override +String toString() { + return 'Breed(breed: $breed, mainQuantity: $mainQuantity, remainQuantity: $remainQuantity)'; +} + + +} + +/// @nodoc +abstract mixin class $BreedCopyWith<$Res> { + factory $BreedCopyWith(Breed value, $Res Function(Breed) _then) = _$BreedCopyWithImpl; +@useResult +$Res call({ + String? breed, int? mainQuantity, int? remainQuantity +}); + + + + +} +/// @nodoc +class _$BreedCopyWithImpl<$Res> + implements $BreedCopyWith<$Res> { + _$BreedCopyWithImpl(this._self, this._then); + + final Breed _self; + final $Res Function(Breed) _then; + +/// Create a copy of Breed +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? breed = freezed,Object? mainQuantity = freezed,Object? remainQuantity = freezed,}) { + return _then(_self.copyWith( +breed: freezed == breed ? _self.breed : breed // ignore: cast_nullable_to_non_nullable +as String?,mainQuantity: freezed == mainQuantity ? _self.mainQuantity : mainQuantity // ignore: cast_nullable_to_non_nullable +as int?,remainQuantity: freezed == remainQuantity ? _self.remainQuantity : remainQuantity // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [Breed]. +extension BreedPatterns on Breed { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Breed value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Breed() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Breed value) $default,){ +final _that = this; +switch (_that) { +case _Breed(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Breed value)? $default,){ +final _that = this; +switch (_that) { +case _Breed() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? breed, int? mainQuantity, int? remainQuantity)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Breed() when $default != null: +return $default(_that.breed,_that.mainQuantity,_that.remainQuantity);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? breed, int? mainQuantity, int? remainQuantity) $default,) {final _that = this; +switch (_that) { +case _Breed(): +return $default(_that.breed,_that.mainQuantity,_that.remainQuantity);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? breed, int? mainQuantity, int? remainQuantity)? $default,) {final _that = this; +switch (_that) { +case _Breed() when $default != null: +return $default(_that.breed,_that.mainQuantity,_that.remainQuantity);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _Breed implements Breed { + const _Breed({this.breed, this.mainQuantity, this.remainQuantity}); + factory _Breed.fromJson(Map json) => _$BreedFromJson(json); + +@override final String? breed; +@override final int? mainQuantity; +@override final int? remainQuantity; + +/// Create a copy of Breed +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$BreedCopyWith<_Breed> get copyWith => __$BreedCopyWithImpl<_Breed>(this, _$identity); + +@override +Map toJson() { + return _$BreedToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Breed&&(identical(other.breed, breed) || other.breed == breed)&&(identical(other.mainQuantity, mainQuantity) || other.mainQuantity == mainQuantity)&&(identical(other.remainQuantity, remainQuantity) || other.remainQuantity == remainQuantity)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,breed,mainQuantity,remainQuantity); + +@override +String toString() { + return 'Breed(breed: $breed, mainQuantity: $mainQuantity, remainQuantity: $remainQuantity)'; +} + + +} + +/// @nodoc +abstract mixin class _$BreedCopyWith<$Res> implements $BreedCopyWith<$Res> { + factory _$BreedCopyWith(_Breed value, $Res Function(_Breed) _then) = __$BreedCopyWithImpl; +@override @useResult +$Res call({ + String? breed, int? mainQuantity, int? remainQuantity +}); + + + + +} +/// @nodoc +class __$BreedCopyWithImpl<$Res> + implements _$BreedCopyWith<$Res> { + __$BreedCopyWithImpl(this._self, this._then); + + final _Breed _self; + final $Res Function(_Breed) _then; + +/// Create a copy of Breed +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? breed = freezed,Object? mainQuantity = freezed,Object? remainQuantity = freezed,}) { + return _then(_Breed( +breed: freezed == breed ? _self.breed : breed // ignore: cast_nullable_to_non_nullable +as String?,mainQuantity: freezed == mainQuantity ? _self.mainQuantity : mainQuantity // ignore: cast_nullable_to_non_nullable +as int?,remainQuantity: freezed == remainQuantity ? _self.remainQuantity : remainQuantity // ignore: cast_nullable_to_non_nullable +as int?, + )); +} + + +} + + +/// @nodoc +mixin _$LastChange { + + DateTime? get date; String? get role; String? get type; String? get fullName; +/// Create a copy of LastChange +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LastChangeCopyWith get copyWith => _$LastChangeCopyWithImpl(this as LastChange, _$identity); + + /// Serializes this LastChange to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LastChange&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.type, type) || other.type == type)&&(identical(other.fullName, fullName) || other.fullName == fullName)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,date,role,type,fullName); + +@override +String toString() { + return 'LastChange(date: $date, role: $role, type: $type, fullName: $fullName)'; +} + + +} + +/// @nodoc +abstract mixin class $LastChangeCopyWith<$Res> { + factory $LastChangeCopyWith(LastChange value, $Res Function(LastChange) _then) = _$LastChangeCopyWithImpl; +@useResult +$Res call({ + DateTime? date, String? role, String? type, String? fullName +}); + + + + +} +/// @nodoc +class _$LastChangeCopyWithImpl<$Res> + implements $LastChangeCopyWith<$Res> { + _$LastChangeCopyWithImpl(this._self, this._then); + + final LastChange _self; + final $Res Function(LastChange) _then; + +/// Create a copy of LastChange +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? date = freezed,Object? role = freezed,Object? type = freezed,Object? fullName = freezed,}) { + return _then(_self.copyWith( +date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,fullName: freezed == fullName ? _self.fullName : fullName // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [LastChange]. +extension LastChangePatterns on LastChange { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _LastChange value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _LastChange() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _LastChange value) $default,){ +final _that = this; +switch (_that) { +case _LastChange(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _LastChange value)? $default,){ +final _that = this; +switch (_that) { +case _LastChange() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( DateTime? date, String? role, String? type, String? fullName)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _LastChange() when $default != null: +return $default(_that.date,_that.role,_that.type,_that.fullName);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( DateTime? date, String? role, String? type, String? fullName) $default,) {final _that = this; +switch (_that) { +case _LastChange(): +return $default(_that.date,_that.role,_that.type,_that.fullName);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( DateTime? date, String? role, String? type, String? fullName)? $default,) {final _that = this; +switch (_that) { +case _LastChange() when $default != null: +return $default(_that.date,_that.role,_that.type,_that.fullName);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _LastChange implements LastChange { + const _LastChange({this.date, this.role, this.type, this.fullName}); + factory _LastChange.fromJson(Map json) => _$LastChangeFromJson(json); + +@override final DateTime? date; +@override final String? role; +@override final String? type; +@override final String? fullName; + +/// Create a copy of LastChange +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$LastChangeCopyWith<_LastChange> get copyWith => __$LastChangeCopyWithImpl<_LastChange>(this, _$identity); + +@override +Map toJson() { + return _$LastChangeToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _LastChange&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.type, type) || other.type == type)&&(identical(other.fullName, fullName) || other.fullName == fullName)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,date,role,type,fullName); + +@override +String toString() { + return 'LastChange(date: $date, role: $role, type: $type, fullName: $fullName)'; +} + + +} + +/// @nodoc +abstract mixin class _$LastChangeCopyWith<$Res> implements $LastChangeCopyWith<$Res> { + factory _$LastChangeCopyWith(_LastChange value, $Res Function(_LastChange) _then) = __$LastChangeCopyWithImpl; +@override @useResult +$Res call({ + DateTime? date, String? role, String? type, String? fullName +}); + + + + +} +/// @nodoc +class __$LastChangeCopyWithImpl<$Res> + implements _$LastChangeCopyWith<$Res> { + __$LastChangeCopyWithImpl(this._self, this._then); + + final _LastChange _self; + final $Res Function(_LastChange) _then; + +/// Create a copy of LastChange +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? date = freezed,Object? role = freezed,Object? type = freezed,Object? fullName = freezed,}) { + return _then(_LastChange( +date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,fullName: freezed == fullName ? _self.fullName : fullName // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$LatestHatchingChange { + + DateTime? get date; String? get role; String? get fullName; +/// Create a copy of LatestHatchingChange +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LatestHatchingChangeCopyWith get copyWith => _$LatestHatchingChangeCopyWithImpl(this as LatestHatchingChange, _$identity); + + /// Serializes this LatestHatchingChange to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LatestHatchingChange&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.fullName, fullName) || other.fullName == fullName)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,date,role,fullName); + +@override +String toString() { + return 'LatestHatchingChange(date: $date, role: $role, fullName: $fullName)'; +} + + +} + +/// @nodoc +abstract mixin class $LatestHatchingChangeCopyWith<$Res> { + factory $LatestHatchingChangeCopyWith(LatestHatchingChange value, $Res Function(LatestHatchingChange) _then) = _$LatestHatchingChangeCopyWithImpl; +@useResult +$Res call({ + DateTime? date, String? role, String? fullName +}); + + + + +} +/// @nodoc +class _$LatestHatchingChangeCopyWithImpl<$Res> + implements $LatestHatchingChangeCopyWith<$Res> { + _$LatestHatchingChangeCopyWithImpl(this._self, this._then); + + final LatestHatchingChange _self; + final $Res Function(LatestHatchingChange) _then; + +/// Create a copy of LatestHatchingChange +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? date = freezed,Object? role = freezed,Object? fullName = freezed,}) { + return _then(_self.copyWith( +date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,fullName: freezed == fullName ? _self.fullName : fullName // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [LatestHatchingChange]. +extension LatestHatchingChangePatterns on LatestHatchingChange { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _LatestHatchingChange value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _LatestHatchingChange() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _LatestHatchingChange value) $default,){ +final _that = this; +switch (_that) { +case _LatestHatchingChange(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _LatestHatchingChange value)? $default,){ +final _that = this; +switch (_that) { +case _LatestHatchingChange() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( DateTime? date, String? role, String? fullName)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _LatestHatchingChange() when $default != null: +return $default(_that.date,_that.role,_that.fullName);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( DateTime? date, String? role, String? fullName) $default,) {final _that = this; +switch (_that) { +case _LatestHatchingChange(): +return $default(_that.date,_that.role,_that.fullName);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( DateTime? date, String? role, String? fullName)? $default,) {final _that = this; +switch (_that) { +case _LatestHatchingChange() when $default != null: +return $default(_that.date,_that.role,_that.fullName);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _LatestHatchingChange implements LatestHatchingChange { + const _LatestHatchingChange({this.date, this.role, this.fullName}); + factory _LatestHatchingChange.fromJson(Map json) => _$LatestHatchingChangeFromJson(json); + +@override final DateTime? date; +@override final String? role; +@override final String? fullName; + +/// Create a copy of LatestHatchingChange +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$LatestHatchingChangeCopyWith<_LatestHatchingChange> get copyWith => __$LatestHatchingChangeCopyWithImpl<_LatestHatchingChange>(this, _$identity); + +@override +Map toJson() { + return _$LatestHatchingChangeToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _LatestHatchingChange&&(identical(other.date, date) || other.date == date)&&(identical(other.role, role) || other.role == role)&&(identical(other.fullName, fullName) || other.fullName == fullName)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,date,role,fullName); + +@override +String toString() { + return 'LatestHatchingChange(date: $date, role: $role, fullName: $fullName)'; +} + + +} + +/// @nodoc +abstract mixin class _$LatestHatchingChangeCopyWith<$Res> implements $LatestHatchingChangeCopyWith<$Res> { + factory _$LatestHatchingChangeCopyWith(_LatestHatchingChange value, $Res Function(_LatestHatchingChange) _then) = __$LatestHatchingChangeCopyWithImpl; +@override @useResult +$Res call({ + DateTime? date, String? role, String? fullName +}); + + + + +} +/// @nodoc +class __$LatestHatchingChangeCopyWithImpl<$Res> + implements _$LatestHatchingChangeCopyWith<$Res> { + __$LatestHatchingChangeCopyWithImpl(this._self, this._then); + + final _LatestHatchingChange _self; + final $Res Function(_LatestHatchingChange) _then; + +/// Create a copy of LatestHatchingChange +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? date = freezed,Object? role = freezed,Object? fullName = freezed,}) { + return _then(_LatestHatchingChange( +date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as String?,fullName: freezed == fullName ? _self.fullName : fullName // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart new file mode 100644 index 0000000..0c94208 --- /dev/null +++ b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart @@ -0,0 +1,385 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'hatching_details.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_HatchingDetails _$HatchingDetailsFromJson( + Map json, +) => _HatchingDetails( + id: (json['id'] as num).toInt(), + chainCompany: json['chain_company'] as String?, + age: (json['age'] as num?)?.toInt(), + inspectionLosses: json['inspection_losses'], + vetFarm: json['vet_farm'] == null + ? null + : VetFarm.fromJson(json['vet_farm'] as Map), + activeKill: json['active_kill'] == null + ? null + : ActiveKill.fromJson(json['active_kill'] as Map), + killingInfo: json['killing_info'] == null + ? null + : KillingInfo.fromJson(json['killing_info'] as Map), + freeGovernmentalInfo: json['free_governmental_info'] == null + ? null + : FreeGovernmentalInfo.fromJson( + json['free_governmental_info'] as Map, + ), + key: json['key'] as String?, + createDate: json['create_date'] == null + ? null + : DateTime.parse(json['create_date'] as String), + modifyDate: json['modify_date'] == null + ? null + : DateTime.parse(json['modify_date'] as String), + trash: json['trash'] as bool?, + hasChainCompany: json['has_chain_company'] as bool?, + poultryIdForeignKey: json['poultry_id_foreign_key'], + poultryHatchingIdKey: json['poultry_hatching_id_key'], + quantity: (json['quantity'] as num?)?.toInt(), + losses: (json['losses'] as num?)?.toInt(), + leftOver: (json['left_over'] as num?)?.toInt(), + killedQuantity: (json['killed_quantity'] as num?)?.toInt(), + extraKilledQuantity: (json['extra_killed_quantity'] as num?)?.toInt(), + governmentalKilledQuantity: (json['governmental_killed_quantity'] as num?) + ?.toDouble(), + governmentalQuantity: (json['governmental_quantity'] as num?)?.toDouble(), + freeKilledQuantity: (json['free_killed_quantity'] as num?)?.toDouble(), + freeQuantity: (json['free_quantity'] as num?)?.toDouble(), + chainKilledQuantity: (json['chain_killed_quantity'] as num?)?.toDouble(), + chainKilledWeight: (json['chain_killed_weight'] as num?)?.toDouble(), + outProvinceKilledWeight: (json['out_province_killed_weight'] as num?) + ?.toDouble(), + outProvinceKilledQuantity: (json['out_province_killed_quantity'] as num?) + ?.toDouble(), + exportKilledWeight: (json['export_killed_weight'] as num?)?.toDouble(), + exportKilledQuantity: (json['export_killed_quantity'] as num?)?.toDouble(), + totalCommitment: (json['total_commitment'] as num?)?.toDouble(), + commitmentType: json['commitment_type'] as String?, + totalCommitmentQuantity: (json['total_commitment_quantity'] as num?) + ?.toDouble(), + totalFreeCommitmentQuantity: (json['total_free_commitment_quantity'] as num?) + ?.toDouble(), + totalFreeCommitmentWeight: (json['total_free_commitment_weight'] as num?) + ?.toDouble(), + totalKilledWeight: (json['total_killed_weight'] as num?)?.toDouble(), + totalAverageKilledWeight: (json['total_average_killed_weight'] as num?) + ?.toDouble(), + requestLeftOver: (json['request_left_over'] as num?)?.toInt(), + hall: (json['hall'] as num?)?.toInt(), + date: json['date'] == null ? null : DateTime.parse(json['date'] as String), + predicateDate: json['predicate_date'] == null + ? null + : DateTime.parse(json['predicate_date'] as String), + chickenBreed: json['chicken_breed'] as String?, + period: (json['period'] as num?)?.toInt(), + allowHatching: json['allow_hatching'] as String?, + state: json['state'] as String?, + archive: json['archive'] as bool?, + violation: json['violation'] as bool?, + message: json['message'], + registrar: json['registrar'], + breed: (json['breed'] as List?) + ?.map((e) => Breed.fromJson(e as Map)) + .toList(), + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, + lastChange: json['last_change'] == null + ? null + : LastChange.fromJson(json['last_change'] as Map), + chickenAge: (json['chicken_age'] as num?)?.toInt(), + nowAge: (json['now_age'] as num?)?.toInt(), + latestHatchingChange: json['latest_hatching_change'] == null + ? null + : LatestHatchingChange.fromJson( + json['latest_hatching_change'] as Map, + ), + violationReport: json['violation_report'], + violationMessage: json['violation_message'] as String?, + violationImage: json['violation_image'], + violationReporter: json['violation_reporter'], + violationReportDate: json['violation_report_date'], + violationReportEditor: json['violation_report_editor'], + violationReportEditDate: json['violation_report_edit_date'], + totalLosses: (json['total_losses'] as num?)?.toInt(), + directLosses: (json['direct_losses'] as num?)?.toInt(), + directLossesInputer: json['direct_losses_inputer'], + directLossesDate: json['direct_losses_date'], + directLossesEditor: json['direct_losses_editor'], + directLossesLastEditDate: json['direct_losses_last_edit_date'], + endPeriodLossesInputer: json['end_period_losses_inputer'], + endPeriodLossesDate: json['end_period_losses_date'], + endPeriodLossesEditor: json['end_period_losses_editor'], + endPeriodLossesLastEditDate: json['end_period_losses_last_edit_date'], + breedingUniqueId: json['breeding_unique_id'] as String?, + licenceNumber: json['licence_number'] as String?, + temporaryTrash: json['temporary_trash'] as bool?, + temporaryDeleted: json['temporary_deleted'] as bool?, + firstDateInputArchive: json['first_date_input_archive'], + secondDateInputArchive: json['second_date_input_archive'], + inputArchiver: json['input_archiver'], + outputArchiveDate: json['output_archive_date'], + outputArchiver: json['output_archiver'], + barDifferenceRequestWeight: (json['bar_difference_request_weight'] as num?) + ?.toDouble(), + barDifferenceRequestQuantity: + (json['bar_difference_request_quantity'] as num?)?.toDouble(), + healthCertificate: json['health_certificate'], + samasatDischargePercentage: (json['samasat_discharge_percentage'] as num?) + ?.toInt(), + personTypeName: json['person_type_name'] as String?, + interactTypeName: json['interact_type_name'] as String?, + unionTypeName: json['union_type_name'] as String?, + certId: json['cert_id'] as String?, + increaseQuantity: (json['increase_quantity'] as num?)?.toInt(), + tenantFullname: json['tenant_fullname'], + tenantNationalCode: json['tenant_national_code'], + tenantMobile: json['tenant_mobile'], + tenantCity: json['tenant_city'], + hasTenant: json['has_tenant'] as bool?, + createdBy: json['created_by'], + modifiedBy: json['modified_by'], + poultry: (json['poultry'] as num?)?.toInt(), +); + +Map _$HatchingDetailsToJson(_HatchingDetails instance) => + { + 'id': instance.id, + 'chain_company': instance.chainCompany, + 'age': instance.age, + 'inspection_losses': instance.inspectionLosses, + 'vet_farm': instance.vetFarm, + 'active_kill': instance.activeKill, + 'killing_info': instance.killingInfo, + 'free_governmental_info': instance.freeGovernmentalInfo, + 'key': instance.key, + 'create_date': instance.createDate?.toIso8601String(), + 'modify_date': instance.modifyDate?.toIso8601String(), + 'trash': instance.trash, + 'has_chain_company': instance.hasChainCompany, + 'poultry_id_foreign_key': instance.poultryIdForeignKey, + 'poultry_hatching_id_key': instance.poultryHatchingIdKey, + 'quantity': instance.quantity, + 'losses': instance.losses, + 'left_over': instance.leftOver, + 'killed_quantity': instance.killedQuantity, + 'extra_killed_quantity': instance.extraKilledQuantity, + 'governmental_killed_quantity': instance.governmentalKilledQuantity, + 'governmental_quantity': instance.governmentalQuantity, + 'free_killed_quantity': instance.freeKilledQuantity, + 'free_quantity': instance.freeQuantity, + 'chain_killed_quantity': instance.chainKilledQuantity, + 'chain_killed_weight': instance.chainKilledWeight, + 'out_province_killed_weight': instance.outProvinceKilledWeight, + 'out_province_killed_quantity': instance.outProvinceKilledQuantity, + 'export_killed_weight': instance.exportKilledWeight, + 'export_killed_quantity': instance.exportKilledQuantity, + 'total_commitment': instance.totalCommitment, + 'commitment_type': instance.commitmentType, + 'total_commitment_quantity': instance.totalCommitmentQuantity, + 'total_free_commitment_quantity': instance.totalFreeCommitmentQuantity, + 'total_free_commitment_weight': instance.totalFreeCommitmentWeight, + 'total_killed_weight': instance.totalKilledWeight, + 'total_average_killed_weight': instance.totalAverageKilledWeight, + 'request_left_over': instance.requestLeftOver, + 'hall': instance.hall, + 'date': instance.date?.toIso8601String(), + 'predicate_date': instance.predicateDate?.toIso8601String(), + 'chicken_breed': instance.chickenBreed, + 'period': instance.period, + 'allow_hatching': instance.allowHatching, + 'state': instance.state, + 'archive': instance.archive, + 'violation': instance.violation, + 'message': instance.message, + 'registrar': instance.registrar, + 'breed': instance.breed, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, + 'last_change': instance.lastChange, + 'chicken_age': instance.chickenAge, + 'now_age': instance.nowAge, + 'latest_hatching_change': instance.latestHatchingChange, + 'violation_report': instance.violationReport, + 'violation_message': instance.violationMessage, + 'violation_image': instance.violationImage, + 'violation_reporter': instance.violationReporter, + 'violation_report_date': instance.violationReportDate, + 'violation_report_editor': instance.violationReportEditor, + 'violation_report_edit_date': instance.violationReportEditDate, + 'total_losses': instance.totalLosses, + 'direct_losses': instance.directLosses, + 'direct_losses_inputer': instance.directLossesInputer, + 'direct_losses_date': instance.directLossesDate, + 'direct_losses_editor': instance.directLossesEditor, + 'direct_losses_last_edit_date': instance.directLossesLastEditDate, + 'end_period_losses_inputer': instance.endPeriodLossesInputer, + 'end_period_losses_date': instance.endPeriodLossesDate, + 'end_period_losses_editor': instance.endPeriodLossesEditor, + 'end_period_losses_last_edit_date': instance.endPeriodLossesLastEditDate, + 'breeding_unique_id': instance.breedingUniqueId, + 'licence_number': instance.licenceNumber, + 'temporary_trash': instance.temporaryTrash, + 'temporary_deleted': instance.temporaryDeleted, + 'first_date_input_archive': instance.firstDateInputArchive, + 'second_date_input_archive': instance.secondDateInputArchive, + 'input_archiver': instance.inputArchiver, + 'output_archive_date': instance.outputArchiveDate, + 'output_archiver': instance.outputArchiver, + 'bar_difference_request_weight': instance.barDifferenceRequestWeight, + 'bar_difference_request_quantity': instance.barDifferenceRequestQuantity, + 'health_certificate': instance.healthCertificate, + 'samasat_discharge_percentage': instance.samasatDischargePercentage, + 'person_type_name': instance.personTypeName, + 'interact_type_name': instance.interactTypeName, + 'union_type_name': instance.unionTypeName, + 'cert_id': instance.certId, + 'increase_quantity': instance.increaseQuantity, + 'tenant_fullname': instance.tenantFullname, + 'tenant_national_code': instance.tenantNationalCode, + 'tenant_mobile': instance.tenantMobile, + 'tenant_city': instance.tenantCity, + 'has_tenant': instance.hasTenant, + 'created_by': instance.createdBy, + 'modified_by': instance.modifiedBy, + 'poultry': instance.poultry, + }; + +_VetFarm _$VetFarmFromJson(Map json) => _VetFarm( + vetFarmFullName: json['vet_farm_full_name'] as String?, + vetFarmMobile: json['vet_farm_mobile'] as String?, +); + +Map _$VetFarmToJson(_VetFarm instance) => { + 'vet_farm_full_name': instance.vetFarmFullName, + 'vet_farm_mobile': instance.vetFarmMobile, +}; + +_ActiveKill _$ActiveKillFromJson(Map json) => _ActiveKill( + activeKill: json['active_kill'] as bool?, + countOfRequest: (json['count_of_request'] as num?)?.toInt(), +); + +Map _$ActiveKillToJson(_ActiveKill instance) => + { + 'active_kill': instance.activeKill, + 'count_of_request': instance.countOfRequest, + }; + +_KillingInfo _$KillingInfoFromJson(Map json) => _KillingInfo( + violationMessage: json['violation_message'] as String?, + provinceKillRequests: (json['province_kill_requests'] as num?)?.toInt(), + provinceKillRequestsQuantity: + (json['province_kill_requests_quantity'] as num?)?.toInt(), + provinceKillRequestsWeight: (json['province_kill_requests_weight'] as num?) + ?.toDouble(), + killHouseRequests: (json['kill_house_requests'] as num?)?.toInt(), + killHouseRequestsFirstQuantity: + (json['kill_house_requests_first_quantity'] as num?)?.toInt(), + killHouseRequestsFirstWeight: + (json['kill_house_requests_first_weight'] as num?)?.toDouble(), + barCompleteWithKillHouse: (json['bar_complete_with_kill_house'] as num?) + ?.toInt(), + acceptedRealQuantityFinal: (json['accepted_real_quantity_final'] as num?) + ?.toInt(), + acceptedRealWightFinal: (json['accepted_real_wight_final'] as num?) + ?.toDouble(), + wareHouseBars: (json['ware_house_bars'] as num?)?.toInt(), + wareHouseBarsQuantity: (json['ware_house_bars_quantity'] as num?)?.toInt(), + wareHouseBarsWeight: (json['ware_house_bars_weight'] as num?)?.toDouble(), + wareHouseBarsWeightLose: (json['ware_house_bars_weight_lose'] as num?) + ?.toDouble(), +); + +Map _$KillingInfoToJson( + _KillingInfo instance, +) => { + 'violation_message': instance.violationMessage, + 'province_kill_requests': instance.provinceKillRequests, + 'province_kill_requests_quantity': instance.provinceKillRequestsQuantity, + 'province_kill_requests_weight': instance.provinceKillRequestsWeight, + 'kill_house_requests': instance.killHouseRequests, + 'kill_house_requests_first_quantity': instance.killHouseRequestsFirstQuantity, + 'kill_house_requests_first_weight': instance.killHouseRequestsFirstWeight, + 'bar_complete_with_kill_house': instance.barCompleteWithKillHouse, + 'accepted_real_quantity_final': instance.acceptedRealQuantityFinal, + 'accepted_real_wight_final': instance.acceptedRealWightFinal, + 'ware_house_bars': instance.wareHouseBars, + 'ware_house_bars_quantity': instance.wareHouseBarsQuantity, + 'ware_house_bars_weight': instance.wareHouseBarsWeight, + 'ware_house_bars_weight_lose': instance.wareHouseBarsWeightLose, +}; + +_FreeGovernmentalInfo _$FreeGovernmentalInfoFromJson( + Map json, +) => _FreeGovernmentalInfo( + governmentalAllocatedQuantity: + (json['governmental_allocated_quantity'] as num?)?.toInt(), + totalCommitmentQuantity: (json['total_commitment_quantity'] as num?) + ?.toDouble(), + freeAllocatedQuantity: (json['free_allocated_quantity'] as num?)?.toInt(), + totalFreeCommitmentQuantity: (json['total_free_commitment_quantity'] as num?) + ?.toDouble(), + leftTotalFreeCommitmentQuantity: + (json['left_total_free_commitment_quantity'] as num?)?.toInt(), +); + +Map _$FreeGovernmentalInfoToJson( + _FreeGovernmentalInfo instance, +) => { + 'governmental_allocated_quantity': instance.governmentalAllocatedQuantity, + 'total_commitment_quantity': instance.totalCommitmentQuantity, + 'free_allocated_quantity': instance.freeAllocatedQuantity, + 'total_free_commitment_quantity': instance.totalFreeCommitmentQuantity, + 'left_total_free_commitment_quantity': + instance.leftTotalFreeCommitmentQuantity, +}; + +_Breed _$BreedFromJson(Map json) => _Breed( + breed: json['breed'] as String?, + mainQuantity: (json['main_quantity'] as num?)?.toInt(), + remainQuantity: (json['remain_quantity'] as num?)?.toInt(), +); + +Map _$BreedToJson(_Breed instance) => { + 'breed': instance.breed, + 'main_quantity': instance.mainQuantity, + 'remain_quantity': instance.remainQuantity, +}; + +_LastChange _$LastChangeFromJson(Map json) => _LastChange( + date: json['date'] == null ? null : DateTime.parse(json['date'] as String), + role: json['role'] as String?, + type: json['type'] as String?, + fullName: json['full_name'] as String?, +); + +Map _$LastChangeToJson(_LastChange instance) => + { + 'date': instance.date?.toIso8601String(), + 'role': instance.role, + 'type': instance.type, + 'full_name': instance.fullName, + }; + +_LatestHatchingChange _$LatestHatchingChangeFromJson( + Map json, +) => _LatestHatchingChange( + date: json['date'] == null ? null : DateTime.parse(json['date'] as String), + role: json['role'] as String?, + fullName: json['full_name'] as String?, +); + +Map _$LatestHatchingChangeToJson( + _LatestHatchingChange instance, +) => { + 'date': instance.date?.toIso8601String(), + 'role': instance.role, + 'full_name': instance.fullName, +}; diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart index c470b20..330cc53 100644 --- a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart @@ -15,6 +15,7 @@ abstract class PoultryLocationModel with _$PoultryLocationModel { User? user, List? hatching, Address? address, + String? breedingUniqueId, }) = _PoultryLocationModel; factory PoultryLocationModel.fromJson(Map json) => @@ -34,13 +35,12 @@ abstract class User with _$User { @freezed abstract class Hatching with _$Hatching { const factory Hatching({ - int? quantity, + int? leftOver, - int? period, int? chickenAge, DateTime? date, - bool?violation, - bool?archive, + String? licenceNumber, + }) = _Hatching; factory Hatching.fromJson(Map json) => diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart index b1e11e1..98cf153 100644 --- a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart @@ -15,7 +15,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$PoultryLocationModel { - int? get id; String? get unitName;@JsonKey(name: 'Lat') double? get lat;@JsonKey(name: 'Long') double? get long; User? get user; List? get hatching; Address? get address; + int? get id; String? get unitName;@JsonKey(name: 'Lat') double? get lat;@JsonKey(name: 'Long') double? get long; User? get user; List? get hatching; Address? get address; String? get breedingUniqueId; /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -28,16 +28,16 @@ $PoultryLocationModelCopyWith get copyWith => _$PoultryLoc @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other.hatching, hatching)&&(identical(other.address, address) || other.address == address)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other.hatching, hatching)&&(identical(other.address, address) || other.address == address)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(hatching),address); +int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(hatching),address,breedingUniqueId); @override String toString() { - return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address)'; + return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address, breedingUniqueId: $breedingUniqueId)'; } @@ -48,7 +48,7 @@ abstract mixin class $PoultryLocationModelCopyWith<$Res> { factory $PoultryLocationModelCopyWith(PoultryLocationModel value, $Res Function(PoultryLocationModel) _then) = _$PoultryLocationModelCopyWithImpl; @useResult $Res call({ - int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address + int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId }); @@ -65,7 +65,7 @@ class _$PoultryLocationModelCopyWithImpl<$Res> /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,Object? breedingUniqueId = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable @@ -74,7 +74,8 @@ as double?,long: freezed == long ? _self.long : long // ignore: cast_nullable_to as double?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable as User?,hatching: freezed == hatching ? _self.hatching : hatching // ignore: cast_nullable_to_non_nullable as List?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as Address?, +as Address?,breedingUniqueId: freezed == breedingUniqueId ? _self.breedingUniqueId : breedingUniqueId // ignore: cast_nullable_to_non_nullable +as String?, )); } /// Create a copy of PoultryLocationModel @@ -183,10 +184,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _PoultryLocationModel() when $default != null: -return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address);case _: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId);case _: return orElse(); } @@ -204,10 +205,10 @@ return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.ha /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId) $default,) {final _that = this; switch (_that) { case _PoultryLocationModel(): -return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address);case _: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId);case _: throw StateError('Unexpected subclass'); } @@ -224,10 +225,10 @@ return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.ha /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId)? $default,) {final _that = this; switch (_that) { case _PoultryLocationModel() when $default != null: -return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address);case _: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId);case _: return null; } @@ -239,7 +240,7 @@ return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.ha @JsonSerializable() class _PoultryLocationModel implements PoultryLocationModel { - const _PoultryLocationModel({this.id, this.unitName, @JsonKey(name: 'Lat') this.lat, @JsonKey(name: 'Long') this.long, this.user, final List? hatching, this.address}): _hatching = hatching; + const _PoultryLocationModel({this.id, this.unitName, @JsonKey(name: 'Lat') this.lat, @JsonKey(name: 'Long') this.long, this.user, final List? hatching, this.address, this.breedingUniqueId}): _hatching = hatching; factory _PoultryLocationModel.fromJson(Map json) => _$PoultryLocationModelFromJson(json); @override final int? id; @@ -257,6 +258,7 @@ class _PoultryLocationModel implements PoultryLocationModel { } @override final Address? address; +@override final String? breedingUniqueId; /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. @@ -271,16 +273,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other._hatching, _hatching)&&(identical(other.address, address) || other.address == address)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other._hatching, _hatching)&&(identical(other.address, address) || other.address == address)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(_hatching),address); +int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(_hatching),address,breedingUniqueId); @override String toString() { - return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address)'; + return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address, breedingUniqueId: $breedingUniqueId)'; } @@ -291,7 +293,7 @@ abstract mixin class _$PoultryLocationModelCopyWith<$Res> implements $PoultryLoc factory _$PoultryLocationModelCopyWith(_PoultryLocationModel value, $Res Function(_PoultryLocationModel) _then) = __$PoultryLocationModelCopyWithImpl; @override @useResult $Res call({ - int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address + int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId }); @@ -308,7 +310,7 @@ class __$PoultryLocationModelCopyWithImpl<$Res> /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,Object? breedingUniqueId = freezed,}) { return _then(_PoultryLocationModel( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable @@ -317,7 +319,8 @@ as double?,long: freezed == long ? _self.long : long // ignore: cast_nullable_to as double?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable as User?,hatching: freezed == hatching ? _self._hatching : hatching // ignore: cast_nullable_to_non_nullable as List?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable -as Address?, +as Address?,breedingUniqueId: freezed == breedingUniqueId ? _self.breedingUniqueId : breedingUniqueId // ignore: cast_nullable_to_non_nullable +as String?, )); } @@ -618,7 +621,7 @@ as String?, /// @nodoc mixin _$Hatching { - int? get quantity; int? get leftOver; int? get period; int? get chickenAge; DateTime? get date; bool? get violation; bool? get archive; + int? get leftOver; int? get chickenAge; DateTime? get date; String? get licenceNumber; /// Create a copy of Hatching /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -631,16 +634,16 @@ $HatchingCopyWith get copyWith => _$HatchingCopyWithImpl(thi @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Hatching&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.period, period) || other.period == period)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.date, date) || other.date == date)&&(identical(other.violation, violation) || other.violation == violation)&&(identical(other.archive, archive) || other.archive == archive)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Hatching&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.date, date) || other.date == date)&&(identical(other.licenceNumber, licenceNumber) || other.licenceNumber == licenceNumber)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,quantity,leftOver,period,chickenAge,date,violation,archive); +int get hashCode => Object.hash(runtimeType,leftOver,chickenAge,date,licenceNumber); @override String toString() { - return 'Hatching(quantity: $quantity, leftOver: $leftOver, period: $period, chickenAge: $chickenAge, date: $date, violation: $violation, archive: $archive)'; + return 'Hatching(leftOver: $leftOver, chickenAge: $chickenAge, date: $date, licenceNumber: $licenceNumber)'; } @@ -651,7 +654,7 @@ abstract mixin class $HatchingCopyWith<$Res> { factory $HatchingCopyWith(Hatching value, $Res Function(Hatching) _then) = _$HatchingCopyWithImpl; @useResult $Res call({ - int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive + int? leftOver, int? chickenAge, DateTime? date, String? licenceNumber }); @@ -668,16 +671,13 @@ class _$HatchingCopyWithImpl<$Res> /// Create a copy of Hatching /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? quantity = freezed,Object? leftOver = freezed,Object? period = freezed,Object? chickenAge = freezed,Object? date = freezed,Object? violation = freezed,Object? archive = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? leftOver = freezed,Object? chickenAge = freezed,Object? date = freezed,Object? licenceNumber = freezed,}) { return _then(_self.copyWith( -quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable -as int?,leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable -as int?,period: freezed == period ? _self.period : period // ignore: cast_nullable_to_non_nullable +leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable as int?,chickenAge: freezed == chickenAge ? _self.chickenAge : chickenAge // ignore: cast_nullable_to_non_nullable as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable -as DateTime?,violation: freezed == violation ? _self.violation : violation // ignore: cast_nullable_to_non_nullable -as bool?,archive: freezed == archive ? _self.archive : archive // ignore: cast_nullable_to_non_nullable -as bool?, +as DateTime?,licenceNumber: freezed == licenceNumber ? _self.licenceNumber : licenceNumber // ignore: cast_nullable_to_non_nullable +as String?, )); } @@ -762,10 +762,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( int? leftOver, int? chickenAge, DateTime? date, String? licenceNumber)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _Hatching() when $default != null: -return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_that.date,_that.violation,_that.archive);case _: +return $default(_that.leftOver,_that.chickenAge,_that.date,_that.licenceNumber);case _: return orElse(); } @@ -783,10 +783,10 @@ return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_tha /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( int? leftOver, int? chickenAge, DateTime? date, String? licenceNumber) $default,) {final _that = this; switch (_that) { case _Hatching(): -return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_that.date,_that.violation,_that.archive);case _: +return $default(_that.leftOver,_that.chickenAge,_that.date,_that.licenceNumber);case _: throw StateError('Unexpected subclass'); } @@ -803,10 +803,10 @@ return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_tha /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? leftOver, int? chickenAge, DateTime? date, String? licenceNumber)? $default,) {final _that = this; switch (_that) { case _Hatching() when $default != null: -return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_that.date,_that.violation,_that.archive);case _: +return $default(_that.leftOver,_that.chickenAge,_that.date,_that.licenceNumber);case _: return null; } @@ -818,16 +818,13 @@ return $default(_that.quantity,_that.leftOver,_that.period,_that.chickenAge,_tha @JsonSerializable() class _Hatching implements Hatching { - const _Hatching({this.quantity, this.leftOver, this.period, this.chickenAge, this.date, this.violation, this.archive}); + const _Hatching({this.leftOver, this.chickenAge, this.date, this.licenceNumber}); factory _Hatching.fromJson(Map json) => _$HatchingFromJson(json); -@override final int? quantity; @override final int? leftOver; -@override final int? period; @override final int? chickenAge; @override final DateTime? date; -@override final bool? violation; -@override final bool? archive; +@override final String? licenceNumber; /// Create a copy of Hatching /// with the given fields replaced by the non-null parameter values. @@ -842,16 +839,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Hatching&&(identical(other.quantity, quantity) || other.quantity == quantity)&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.period, period) || other.period == period)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.date, date) || other.date == date)&&(identical(other.violation, violation) || other.violation == violation)&&(identical(other.archive, archive) || other.archive == archive)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Hatching&&(identical(other.leftOver, leftOver) || other.leftOver == leftOver)&&(identical(other.chickenAge, chickenAge) || other.chickenAge == chickenAge)&&(identical(other.date, date) || other.date == date)&&(identical(other.licenceNumber, licenceNumber) || other.licenceNumber == licenceNumber)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,quantity,leftOver,period,chickenAge,date,violation,archive); +int get hashCode => Object.hash(runtimeType,leftOver,chickenAge,date,licenceNumber); @override String toString() { - return 'Hatching(quantity: $quantity, leftOver: $leftOver, period: $period, chickenAge: $chickenAge, date: $date, violation: $violation, archive: $archive)'; + return 'Hatching(leftOver: $leftOver, chickenAge: $chickenAge, date: $date, licenceNumber: $licenceNumber)'; } @@ -862,7 +859,7 @@ abstract mixin class _$HatchingCopyWith<$Res> implements $HatchingCopyWith<$Res> factory _$HatchingCopyWith(_Hatching value, $Res Function(_Hatching) _then) = __$HatchingCopyWithImpl; @override @useResult $Res call({ - int? quantity, int? leftOver, int? period, int? chickenAge, DateTime? date, bool? violation, bool? archive + int? leftOver, int? chickenAge, DateTime? date, String? licenceNumber }); @@ -879,16 +876,13 @@ class __$HatchingCopyWithImpl<$Res> /// Create a copy of Hatching /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? quantity = freezed,Object? leftOver = freezed,Object? period = freezed,Object? chickenAge = freezed,Object? date = freezed,Object? violation = freezed,Object? archive = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? leftOver = freezed,Object? chickenAge = freezed,Object? date = freezed,Object? licenceNumber = freezed,}) { return _then(_Hatching( -quantity: freezed == quantity ? _self.quantity : quantity // ignore: cast_nullable_to_non_nullable -as int?,leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable -as int?,period: freezed == period ? _self.period : period // ignore: cast_nullable_to_non_nullable +leftOver: freezed == leftOver ? _self.leftOver : leftOver // ignore: cast_nullable_to_non_nullable as int?,chickenAge: freezed == chickenAge ? _self.chickenAge : chickenAge // ignore: cast_nullable_to_non_nullable as int?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable -as DateTime?,violation: freezed == violation ? _self.violation : violation // ignore: cast_nullable_to_non_nullable -as bool?,archive: freezed == archive ? _self.archive : archive // ignore: cast_nullable_to_non_nullable -as bool?, +as DateTime?,licenceNumber: freezed == licenceNumber ? _self.licenceNumber : licenceNumber // ignore: cast_nullable_to_non_nullable +as String?, )); } diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart index 653680a..0c14730 100644 --- a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.g.dart @@ -22,6 +22,7 @@ _PoultryLocationModel _$PoultryLocationModelFromJson( address: json['address'] == null ? null : Address.fromJson(json['address'] as Map), + breedingUniqueId: json['breeding_unique_id'] as String?, ); Map _$PoultryLocationModelToJson( @@ -34,6 +35,7 @@ Map _$PoultryLocationModelToJson( 'user': instance.user, 'hatching': instance.hatching, 'address': instance.address, + 'breeding_unique_id': instance.breedingUniqueId, }; _User _$UserFromJson(Map json) => _User( @@ -47,23 +49,17 @@ Map _$UserToJson(_User instance) => { }; _Hatching _$HatchingFromJson(Map json) => _Hatching( - quantity: (json['quantity'] as num?)?.toInt(), leftOver: (json['left_over'] as num?)?.toInt(), - period: (json['period'] as num?)?.toInt(), chickenAge: (json['chicken_age'] as num?)?.toInt(), date: json['date'] == null ? null : DateTime.parse(json['date'] as String), - violation: json['violation'] as bool?, - archive: json['archive'] as bool?, + licenceNumber: json['licence_number'] as String?, ); Map _$HatchingToJson(_Hatching instance) => { - 'quantity': instance.quantity, 'left_over': instance.leftOver, - 'period': instance.period, 'chicken_age': instance.chickenAge, 'date': instance.date?.toIso8601String(), - 'violation': instance.violation, - 'archive': instance.archive, + 'licence_number': instance.licenceNumber, }; _Address _$AddressFromJson(Map json) => _Address( diff --git a/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart b/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart index 90feb85..67a8d92 100644 --- a/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart +++ b/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart @@ -24,11 +24,13 @@ class InspectionRepositoryImp implements InspectionRepository { double? centerLat, double? centerLng, double? radius, + String? value, }) async { return remoteDataSource.getNearbyLocation( centerLat: centerLat, centerLng: centerLng, radius: radius, + value: value, ); } } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart index efbaeec..e522219 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart @@ -8,14 +8,20 @@ import 'package:rasadyar_inspection/data/repositories/inspection/inspection_repo import 'package:rasadyar_inspection/injection/inspection_di.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; -import '../filter/view.dart'; - class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin { final BaseLogic baseLogic = Get.find(); + + InspectionRepositoryImp inspectionRepository = diInspection.get(); + final distance = Distance(); + Rx currentLocation = LatLng(34.798315281272544, 48.51479142983491).obs; + Rx>> allPoultryLocation = - Resource>.loading().obs; + Resource>.initial().obs; + + Rx>> searchedPoultryLocation = + Resource>.initial().obs; RxList markers = [].obs; RxList markers2 = [].obs; @@ -28,19 +34,9 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin RxInt showIndex = 0.obs; bool showSlideHint = true; RxInt currentZoom = 15.obs; - - late Rx slidController; - Rx mapController = MapController().obs; late final AnimatedMapController animatedMapController; - late DraggableBottomSheetController filterBottomSheetController; - late DraggableBottomSheetController selectedLocationBottomSheetController; - late DraggableBottomSheetController detailsLocationBottomSheetController; - late final BottomSheetManager bottomSheetManager; - - InspectionRepositoryImp inspectionRepository = diInspection.get(); - @override void onInit() { super.onInit(); @@ -50,38 +46,16 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin curve: Curves.easeInOut, cancelPreviousAnimations: true, ); + fetchAllPoultryLocations(); - filterBottomSheetController = DraggableBottomSheetController( - initialHeight: 350, - minHeight: 200, - maxHeight: Get.height * 0.5, - ); - - selectedLocationBottomSheetController = DraggableBottomSheetController( - initialHeight: 200, - minHeight: 100, - maxHeight: 200, - ); - - detailsLocationBottomSheetController = DraggableBottomSheetController( - initialHeight: Get.height * 0.5, - minHeight: Get.height * 0.37, - maxHeight: Get.height * 0.5, - ); - - slidController = SlidableController(this).obs; - bottomSheetManager = BottomSheetManager({ - filterBottomSheetController: () => - filterWidget(filterIndex: filterIndex, showIndex: showIndex), - selectedLocationBottomSheetController: () => selectedLocationWidget( - showHint: selectedLocationBottomSheetController.isVisible.value && showSlideHint, - sliderController: slidController.value, - trigger: triggerSlidableAnimation, - toggle: selectedLocationBottomSheetController.toggle, - ), - detailsLocationBottomSheetController: () => markerDetailsWidget(), - }); + debounce(baseLogic.searchValue, (callback) { + if (callback != null && + callback.trim().isNotEmpty && + searchedPoultryLocation.value.status != ResourceStatus.loading) { + searchPoultryLocations(); + } + }, time: Duration(seconds: 2)); } @override @@ -92,7 +66,6 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin @override void onClose() { - slidController.close(); super.onClose(); } @@ -132,9 +105,9 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin center.longitude, radius * 1000, ); - - markers2.addAll(filtered); - + final existingIds = markers2.map((e) => e.id).toSet(); + final uniqueFiltered = filtered.where((e) => !existingIds.contains(e.id)).toList(); + markers2.addAll(uniqueFiltered); }); } @@ -154,9 +127,9 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin Future triggerSlidableAnimation() async { await Future.delayed(Duration(milliseconds: 200)); - await slidController.value.openEndActionPane(); + //await slidController.value.openEndActionPane(); await Future.delayed(Duration(milliseconds: 200)); - await slidController.value.close(); + //await slidController.value.close(); showSlideHint = false; } @@ -184,6 +157,25 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin ); } + Future searchPoultryLocations() async { + searchedPoultryLocation.value = Resource>.loading(); + await safeCall( + call: () => inspectionRepository.getNearbyLocation(value: baseLogic.searchValue.value), + onSuccess: (result) { + if (result != null || result!.isNotEmpty) { + searchedPoultryLocation.value = Resource>.success(result); + } else { + searchedPoultryLocation.value = Resource>.empty(); + } + }, + onError: (error, stackTrace) { + searchedPoultryLocation.value = Resource>.error( + error.toString(), + ); + }, + ); + } + double getVisibleRadiusKm({ required double zoom, required double screenWidthPx, diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index f662605..044567d 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -4,7 +4,6 @@ import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; -import 'package:rasadyar_inspection/presentation/widget/search.dart'; import 'logic.dart'; @@ -87,7 +86,24 @@ class InspectionMapPage extends GetView { ); }, controller.currentLocation), - Positioned( + Obx(() { + if (controller.baseLogic.isSearchSelected.value) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (Get.isBottomSheetOpen != true) { + Get.bottomSheet( + searchWidget(), + isDismissible: true, + ignoreSafeArea: false, + isScrollControlled: true, + ); + } + }); + } + return const SizedBox.shrink(); + }), + + // Uncomment the following lines to enable the search widget + /* Positioned( top: 10, left: 20, right: 20, @@ -102,6 +118,126 @@ class InspectionMapPage extends GetView { return SizedBox.shrink(); } }, controller.baseLogic.isSearchSelected), + ),*/ + ], + ), + ); + } + + BaseBottomSheet searchWidget() { + return BaseBottomSheet( + height: Get.height * 0.85, + rootChild: Column( + spacing: 8, + children: [ + RTextField( + height: 40, + borderColor: AppColor.blackLight, + suffixIcon: ObxValue( + (data) => Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: (data.value == null) + ? Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ) + : IconButton( + onPressed: () { + controller.baseLogic.searchTextController.clear(); + controller.baseLogic.searchValue.value = null; + controller.baseLogic.isSearchSelected.value = false; + controller.searchedPoultryLocation.value = Resource.initial(); + }, + enableFeedback: true, + padding: EdgeInsets.zero, + iconSize: 24, + splashRadius: 50, + icon: Assets.vec.closeCircleSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ), + controller.baseLogic.searchValue, + ), + hintText: 'جستجو کنید ...', + hintStyle: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + filledColor: Colors.white, + filled: true, + controller: controller.baseLogic.searchTextController, + onChanged: (val) => controller.baseLogic.searchValue.value = val, + ), + Expanded( + child: ObxValue((rxData) { + final resource = rxData.value; + final status = resource.status; + final items = resource.data; + final message = resource.message ?? 'خطا در بارگذاری'; + + if (status == ResourceStatus.initial) { + return Center(child: Text('ابتدا جستجو کنید')); + } + + if (status == ResourceStatus.loading) { + return const Center(child: CircularProgressIndicator()); + } + + if (status == ResourceStatus.error) { + return Center(child: Text(message)); + } + + if (items == null || items.isEmpty) { + return Center(child: EmptyWidget()); + } + + return ListView.separated( + itemCount: items.length, + separatorBuilder: (context, index) => SizedBox(height: 8), + itemBuilder: (context, index) { + final item = items[index]; // اگر item استفاده نمیشه، می‌تونه حذف بشه + return ListItem2( + index: index, + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + item.unitName ?? 'N/A', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + item.user?.fullname ?? '', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + (item.hatching != null && item.hatching!.isNotEmpty) + ? 'دارد' + : 'ندراد', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + ], + ), + ); + }, + ); + }, controller.searchedPoultryLocation), ), ], ), @@ -315,221 +451,310 @@ class InspectionMapPage extends GetView { point: point, width: isZoomedIn && isVisible ? 180.w : 40.h, height: isZoomedIn && isVisible ? 50.h : 50.h, - child: isZoomedIn && isVisible - ? GestureDetector( - onTap: () { - Get.bottomSheet( - ObxValue((data) { - return BaseBottomSheet( - height: data.value ? 450.h : 150.h, - child: ListItemWithOutCounter( - secondChild: Column( - spacing: 8, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, + child: GestureDetector( + onTap: () { + bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; + Get.bottomSheet( + ObxValue((data) { + return BaseBottomSheet( + height: data.value + ? hasHatching + ? 550.h + : 400.h + : 150.h, + child: Column( + spacing: 12, + children: [ + ListItemWithOutCounter( + secondChild: Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1.w, + color: AppColor.blueLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, children: [ Text( - 'داوود خرم پور', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, + 'جوجه ریزی فعال', + style: AppFonts.yekan14.copyWith( + color: AppColor.textColor, + ), + ), + + Text( + hasHatching ? 'دارد' : 'ندارد', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, ), ), ], ), - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1.w, - color: AppColor.blueLightHover, + ), + buildRow( + title: 'مشخصات خریدار', + value: location.user?.fullname ?? 'N/A', + ), + + buildRow( + title: 'تلفن خریدار', + value: location.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + + Visibility( + visible: location.address?.city?.name != null, + child: buildRow( + title: 'شهر', + value: location.address?.city?.name ?? 'N/A', + ), + ), + Visibility( + visible: location.address?.address != null, + child: buildRow( + title: 'آردس', + value: location.address?.address ?? 'N/A', + ), + ), + + buildRow( + title: 'شناسه یکتا', + value: location.breedingUniqueId ?? 'N/A', + ), + ], + ), + ), + Row( + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 7, + children: [ + RElevated( + width: 40.h, + height: 38.h, + backgroundColor: AppColor.greenNormal, + child: Assets.vec.messageAddSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, ), - borderRadius: BorderRadius.circular(8), + ), + onPressed: () {}, + ), + RElevated( + width: 150.w, + height: 40.h, + backgroundColor: AppColor.blueNormal, + onPressed: () { + /* controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ).whenComplete(() {});*/ + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + Text( + 'جزییات کامل', + style: AppFonts.yekan14Bold.copyWith( + color: Colors.white, + ), + ), + ], ), ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, - children: [ - Text( - 'تاریخ بازرسی', - style: AppFonts.yekan14.copyWith( - color: AppColor.textColor, + ROutlinedElevated( + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async {}, + onRefresh: () async {}, + ); + }, + borderColor: AppColor.bgIcon, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.securityTimeSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + AppColor.bgIcon, + BlendMode.srcIn, + ), ), - ), - - Text( - '1403/12/12', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, + Text( + 'سوابق بازرسی', + style: AppFonts.yekan14Bold.copyWith( + color: AppColor.bgIcon, + ), ), - ), - ], + ], + ), ), + ], + ), + ), + ], + ), + ], + ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + labelIconColor: AppColor.bgIcon, + onTap: () => data.value = !data.value, + selected: data.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + location.user?.fullname ?? '', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + (location.hatching != null && location.hatching!.isNotEmpty) + ? 'دارد' + : 'ندراد', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + ), + + Visibility( + visible: hasHatching, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + padding: EdgeInsets.all(8.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: Column( + spacing: 8.h, + children: [ + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), ), - buildRow( - title: 'تلفن خریدار', - value: '0326598653', - valueStyle: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + Text( + location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), - buildRow(title: 'آخرین فعالیت', value: '1409/12/12'), - buildRow(title: 'موجودی', value: '5KG'), - buildRow(title: 'فروش رفته', value: '5KG'), ], ), ), - Row( - children: [ - Expanded( - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - spacing: 7, - children: [ - RElevated( - width: 40.h, - height: 38.h, - backgroundColor: AppColor.greenNormal, - child: Assets.vec.messageAddSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - onPressed: () {}, - ), - RElevated( - width: 150.w, - height: 40.h, - backgroundColor: AppColor.blueNormal, - onPressed: () { - /* controller.setEditData(item); - Get.bottomSheet( - addOrEditBottomSheet(true), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ).whenComplete(() {});*/ - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 8, - children: [ - Assets.vec.mapSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - Text( - 'مسیریابی', - style: AppFonts.yekan14Bold.copyWith( - color: Colors.white, - ), - ), - ], - ), - ), - ROutlinedElevated( - width: 150.w, - height: 40.h, - onPressed: () { - buildDeleteDialog( - onConfirm: () async {}, - onRefresh: () async {}, - ); - }, - borderColor: AppColor.bgIcon, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.securityTimeSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - AppColor.bgIcon, - BlendMode.srcIn, - ), - ), - Text( - 'سوابق بازرسی', - style: AppFonts.yekan14Bold.copyWith( - color: AppColor.bgIcon, - ), - ), - ], - ), - ), - ], - ), - ), - ], + buildRow( + title: 'باقیمانده', + value: location.hatching?.first.leftOver.separatedByComma ?? 'N/A', ), - ], - ), - labelColor: AppColor.blueLight, - labelIcon: Assets.vec.cowSvg.path, - labelIconColor: AppColor.bgIcon, - onTap: () => data.value = !data.value, - selected: data.value, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'داود خرم مهری پور', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - 'گوشت و مرغ', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], + buildRow( + title: 'سن جوجه ریزی', + value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'باقی مانده', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - '0 کیلوگرم', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], + buildRow( + title: 'شماره مجوز جوجه ریزی', + value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', ), - Assets.vec.scanBarcodeSvg.svg(), ], ), ), - ); - }, controller.isSelectedDetailsLocation), - ); - }, - child: Container( + ), + ], + ), + ); + }, controller.isSelectedDetailsLocation), + isScrollControlled: true, + isDismissible: true, + ); + }, + child: isZoomedIn && isVisible + ? Container( height: 30.h, padding: EdgeInsets.all(5.r), decoration: BoxDecoration( @@ -551,9 +776,9 @@ class InspectionMapPage extends GetView { Text(location.user?.fullname ?? '', style: AppFonts.yekan12), ], ), - ), - ) - : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + ) + : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + ), ); }).toList(); diff --git a/packages/inspection/lib/presentation/pages/records/view.dart b/packages/inspection/lib/presentation/pages/records/view.dart index 24c34cf..e2b56be 100644 --- a/packages/inspection/lib/presentation/pages/records/view.dart +++ b/packages/inspection/lib/presentation/pages/records/view.dart @@ -29,7 +29,7 @@ class RecordsPage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.value == index, onTap: () => controller.toggleExpandedList(index), index: index, diff --git a/packages/inspection/lib/presentation/pages/users/view.dart b/packages/inspection/lib/presentation/pages/users/view.dart index 3ac9419..ddf1285 100644 --- a/packages/inspection/lib/presentation/pages/users/view.dart +++ b/packages/inspection/lib/presentation/pages/users/view.dart @@ -29,7 +29,7 @@ class UsersPage extends GetView { itemBuilder: (context, index) { var item = data.value.data!.results![index]; return ObxValue((val) { - return ListItem2( + return ExpandableListItem2( selected: val.value == index, onTap: () => controller.toggleExpandedList(index), index: index, diff --git a/packages/inspection/lib/presentation/widget/base_page/logic.dart b/packages/inspection/lib/presentation/widget/base_page/logic.dart index dbba195..79ac095 100644 --- a/packages/inspection/lib/presentation/widget/base_page/logic.dart +++ b/packages/inspection/lib/presentation/widget/base_page/logic.dart @@ -1,8 +1,10 @@ +import 'package:flutter/cupertino.dart'; import 'package:rasadyar_core/core.dart'; class BaseLogic extends GetxController { final RxBool isFilterSelected = false.obs; final RxBool isSearchSelected = false.obs; + final TextEditingController searchTextController = TextEditingController(); final RxnString searchValue = RxnString(); void setSearchCallback(void Function(String)? onSearchChanged) { From aaa69a94e93400bbed2858f3a003acb59ff8c413 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 2 Aug 2025 08:51:46 +0330 Subject: [PATCH 250/256] feat : 1 - search and filter location 2 - mapWidget --- .../poultry_location_model.dart | 45 +- .../poultry_location_model.freezed.dart | 43 +- .../pages/inspection_map/logic.dart | 109 +--- .../pages/inspection_map/map_widget.dart | 108 ---- .../pages/inspection_map/view.dart | 596 +++--------------- .../inspection_map/widget/map/logic.dart | 139 ++++ .../pages/inspection_map/widget/map/view.dart | 496 +++++++++++++++ .../lib/presentation/routes/app_pages.dart | 10 +- 8 files changed, 770 insertions(+), 776 deletions(-) delete mode 100644 packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart create mode 100644 packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart create mode 100644 packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart index 330cc53..a0da0d1 100644 --- a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.dart @@ -1,4 +1,4 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:rasadyar_core/core.dart'; part 'poultry_location_model.freezed.dart'; part 'poultry_location_model.g.dart'; @@ -8,61 +8,48 @@ abstract class PoultryLocationModel with _$PoultryLocationModel { const factory PoultryLocationModel({ int? id, String? unitName, - @JsonKey(name: 'Lat') - double? lat, - @JsonKey(name: 'Long') - double? long, + @JsonKey(name: 'Lat') double? lat, + @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId, + @JsonKey(includeFromJson: false, includeToJson: false) LatLng? latLng, }) = _PoultryLocationModel; factory PoultryLocationModel.fromJson(Map json) => - _$PoultryLocationModelFromJson(json); + _$PoultryLocationModelFromJson(json).copyWith( + latLng: (json['Lat'] != null && json['Long'] != null) + ? LatLng(json['Lat'] as double, json['Long'] as double) + : null, + ); } @freezed abstract class User with _$User { - const factory User({ - String? fullname, - String? mobile, - }) = _User; + const factory User({String? fullname, String? mobile}) = _User; factory User.fromJson(Map json) => _$UserFromJson(json); } @freezed abstract class Hatching with _$Hatching { - const factory Hatching({ + const factory Hatching({int? leftOver, int? chickenAge, DateTime? date, String? licenceNumber}) = + _Hatching; - int? leftOver, - int? chickenAge, - DateTime? date, - String? licenceNumber, - - }) = _Hatching; - - factory Hatching.fromJson(Map json) => - _$HatchingFromJson(json); + factory Hatching.fromJson(Map json) => _$HatchingFromJson(json); } @freezed abstract class Address with _$Address { - const factory Address({ - City? city, - String? address, - }) = _Address; + const factory Address({City? city, String? address}) = _Address; - factory Address.fromJson(Map json) => - _$AddressFromJson(json); + factory Address.fromJson(Map json) => _$AddressFromJson(json); } @freezed abstract class City with _$City { - const factory City({ - String? name, - }) = _City; + const factory City({String? name}) = _City; factory City.fromJson(Map json) => _$CityFromJson(json); } diff --git a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart index 98cf153..68f16d3 100644 --- a/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart +++ b/packages/inspection/lib/data/model/response/poultry_location/poultry_location_model.freezed.dart @@ -15,7 +15,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$PoultryLocationModel { - int? get id; String? get unitName;@JsonKey(name: 'Lat') double? get lat;@JsonKey(name: 'Long') double? get long; User? get user; List? get hatching; Address? get address; String? get breedingUniqueId; + int? get id; String? get unitName;@JsonKey(name: 'Lat') double? get lat;@JsonKey(name: 'Long') double? get long; User? get user; List? get hatching; Address? get address; String? get breedingUniqueId;@JsonKey(includeFromJson: false, includeToJson: false) LatLng? get latLng; /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -28,16 +28,16 @@ $PoultryLocationModelCopyWith get copyWith => _$PoultryLoc @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other.hatching, hatching)&&(identical(other.address, address) || other.address == address)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other.hatching, hatching)&&(identical(other.address, address) || other.address == address)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)&&(identical(other.latLng, latLng) || other.latLng == latLng)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(hatching),address,breedingUniqueId); +int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(hatching),address,breedingUniqueId,latLng); @override String toString() { - return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address, breedingUniqueId: $breedingUniqueId)'; + return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address, breedingUniqueId: $breedingUniqueId, latLng: $latLng)'; } @@ -48,7 +48,7 @@ abstract mixin class $PoultryLocationModelCopyWith<$Res> { factory $PoultryLocationModelCopyWith(PoultryLocationModel value, $Res Function(PoultryLocationModel) _then) = _$PoultryLocationModelCopyWithImpl; @useResult $Res call({ - int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId + int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId,@JsonKey(includeFromJson: false, includeToJson: false) LatLng? latLng }); @@ -65,7 +65,7 @@ class _$PoultryLocationModelCopyWithImpl<$Res> /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,Object? breedingUniqueId = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,Object? breedingUniqueId = freezed,Object? latLng = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable @@ -75,7 +75,8 @@ as double?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to as User?,hatching: freezed == hatching ? _self.hatching : hatching // ignore: cast_nullable_to_non_nullable as List?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as Address?,breedingUniqueId: freezed == breedingUniqueId ? _self.breedingUniqueId : breedingUniqueId // ignore: cast_nullable_to_non_nullable -as String?, +as String?,latLng: freezed == latLng ? _self.latLng : latLng // ignore: cast_nullable_to_non_nullable +as LatLng?, )); } /// Create a copy of PoultryLocationModel @@ -184,10 +185,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId, @JsonKey(includeFromJson: false, includeToJson: false) LatLng? latLng)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _PoultryLocationModel() when $default != null: -return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId);case _: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId,_that.latLng);case _: return orElse(); } @@ -205,10 +206,10 @@ return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.ha /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId, @JsonKey(includeFromJson: false, includeToJson: false) LatLng? latLng) $default,) {final _that = this; switch (_that) { case _PoultryLocationModel(): -return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId);case _: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId,_that.latLng);case _: throw StateError('Unexpected subclass'); } @@ -225,10 +226,10 @@ return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.ha /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? unitName, @JsonKey(name: 'Lat') double? lat, @JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId, @JsonKey(includeFromJson: false, includeToJson: false) LatLng? latLng)? $default,) {final _that = this; switch (_that) { case _PoultryLocationModel() when $default != null: -return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId);case _: +return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.hatching,_that.address,_that.breedingUniqueId,_that.latLng);case _: return null; } @@ -240,7 +241,7 @@ return $default(_that.id,_that.unitName,_that.lat,_that.long,_that.user,_that.ha @JsonSerializable() class _PoultryLocationModel implements PoultryLocationModel { - const _PoultryLocationModel({this.id, this.unitName, @JsonKey(name: 'Lat') this.lat, @JsonKey(name: 'Long') this.long, this.user, final List? hatching, this.address, this.breedingUniqueId}): _hatching = hatching; + const _PoultryLocationModel({this.id, this.unitName, @JsonKey(name: 'Lat') this.lat, @JsonKey(name: 'Long') this.long, this.user, final List? hatching, this.address, this.breedingUniqueId, @JsonKey(includeFromJson: false, includeToJson: false) this.latLng}): _hatching = hatching; factory _PoultryLocationModel.fromJson(Map json) => _$PoultryLocationModelFromJson(json); @override final int? id; @@ -259,6 +260,7 @@ class _PoultryLocationModel implements PoultryLocationModel { @override final Address? address; @override final String? breedingUniqueId; +@override@JsonKey(includeFromJson: false, includeToJson: false) final LatLng? latLng; /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. @@ -273,16 +275,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other._hatching, _hatching)&&(identical(other.address, address) || other.address == address)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _PoultryLocationModel&&(identical(other.id, id) || other.id == id)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.lat, lat) || other.lat == lat)&&(identical(other.long, long) || other.long == long)&&(identical(other.user, user) || other.user == user)&&const DeepCollectionEquality().equals(other._hatching, _hatching)&&(identical(other.address, address) || other.address == address)&&(identical(other.breedingUniqueId, breedingUniqueId) || other.breedingUniqueId == breedingUniqueId)&&(identical(other.latLng, latLng) || other.latLng == latLng)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(_hatching),address,breedingUniqueId); +int get hashCode => Object.hash(runtimeType,id,unitName,lat,long,user,const DeepCollectionEquality().hash(_hatching),address,breedingUniqueId,latLng); @override String toString() { - return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address, breedingUniqueId: $breedingUniqueId)'; + return 'PoultryLocationModel(id: $id, unitName: $unitName, lat: $lat, long: $long, user: $user, hatching: $hatching, address: $address, breedingUniqueId: $breedingUniqueId, latLng: $latLng)'; } @@ -293,7 +295,7 @@ abstract mixin class _$PoultryLocationModelCopyWith<$Res> implements $PoultryLoc factory _$PoultryLocationModelCopyWith(_PoultryLocationModel value, $Res Function(_PoultryLocationModel) _then) = __$PoultryLocationModelCopyWithImpl; @override @useResult $Res call({ - int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId + int? id, String? unitName,@JsonKey(name: 'Lat') double? lat,@JsonKey(name: 'Long') double? long, User? user, List? hatching, Address? address, String? breedingUniqueId,@JsonKey(includeFromJson: false, includeToJson: false) LatLng? latLng }); @@ -310,7 +312,7 @@ class __$PoultryLocationModelCopyWithImpl<$Res> /// Create a copy of PoultryLocationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,Object? breedingUniqueId = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? unitName = freezed,Object? lat = freezed,Object? long = freezed,Object? user = freezed,Object? hatching = freezed,Object? address = freezed,Object? breedingUniqueId = freezed,Object? latLng = freezed,}) { return _then(_PoultryLocationModel( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable @@ -320,7 +322,8 @@ as double?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to as User?,hatching: freezed == hatching ? _self._hatching : hatching // ignore: cast_nullable_to_non_nullable as List?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as Address?,breedingUniqueId: freezed == breedingUniqueId ? _self.breedingUniqueId : breedingUniqueId // ignore: cast_nullable_to_non_nullable -as String?, +as String?,latLng: freezed == latLng ? _self.latLng : latLng // ignore: cast_nullable_to_non_nullable +as LatLng?, )); } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart index e522219..04ef033 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart @@ -1,20 +1,18 @@ import 'dart:async'; -import 'dart:math'; -import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; import 'package:rasadyar_inspection/data/repositories/inspection/inspection_repository_imp.dart'; import 'package:rasadyar_inspection/injection/inspection_di.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; -class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin { +import 'widget/map/logic.dart'; + +class InspectionMapLogic extends GetxController { final BaseLogic baseLogic = Get.find(); - + final MapLogic mapLogic = Get.find(); InspectionRepositoryImp inspectionRepository = diInspection.get(); - final distance = Distance(); - Rx currentLocation = LatLng(34.798315281272544, 48.51479142983491).obs; Rx>> allPoultryLocation = @@ -26,26 +24,12 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin RxList markers = [].obs; RxList markers2 = [].obs; - Timer? _debounceTimer; - RxBool isLoading = false.obs; - RxBool isSelectedDetailsLocation = false.obs; - RxInt filterIndex = 0.obs; RxInt showIndex = 0.obs; - bool showSlideHint = true; - RxInt currentZoom = 15.obs; - Rx mapController = MapController().obs; - late final AnimatedMapController animatedMapController; @override void onInit() { super.onInit(); - animatedMapController = AnimatedMapController( - vsync: this, - duration: const Duration(milliseconds: 500), - curve: Curves.easeInOut, - cancelPreviousAnimations: true, - ); fetchAllPoultryLocations(); @@ -69,82 +53,14 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin super.onClose(); } - Future determineCurrentPosition() async { - isLoading.value = true; - final position = await Geolocator.getCurrentPosition( - locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), - ); - final latLng = LatLng(position.latitude, position.longitude); - - /*currentLocation.value = latLng; - markers.add(PoultryLocationModel( - lat: latLng.latitude, - long: latLng.longitude - ));*/ - animatedMapController.animateTo( - dest: latLng, - zoom: 18, - curve: Curves.easeInOut, - duration: const Duration(seconds: 1), - ); - isLoading.value = false; - } - - void debouncedUpdateVisibleMarkers({required LatLng center, required double zoom}) { - _debounceTimer?.cancel(); - _debounceTimer = Timer(const Duration(milliseconds: 300), () { - final radius = getVisibleRadiusKm( - zoom: zoom, - screenWidthPx: Get.width.toDouble(), - latitude: center.latitude, - ); - - final filtered = filterNearbyMarkers( - allPoultryLocation.value.data ?? [], - center.latitude, - center.longitude, - radius * 1000, - ); - final existingIds = markers2.map((e) => e.id).toSet(); - final uniqueFiltered = filtered.where((e) => !existingIds.contains(e.id)).toList(); - markers2.addAll(uniqueFiltered); - }); - } - - List filterNearbyMarkers( - List allMarkers, - double centerLat, - double centerLng, - double radiusInMeters, - ) { - final center = LatLng(centerLat, centerLng); - - return allMarkers.where((marker) { - var tmp = LatLng(marker.lat ?? 0, marker.long ?? 0); - return distance(center, tmp) <= radiusInMeters; - }).toList(); - } - - Future triggerSlidableAnimation() async { - await Future.delayed(Duration(milliseconds: 200)); - //await slidController.value.openEndActionPane(); - await Future.delayed(Duration(milliseconds: 200)); - //await slidController.value.close(); - showSlideHint = false; - } - Future fetchAllPoultryLocations() async { - isLoading.value = true; allPoultryLocation.value = Resource>.loading(); await safeCall( - call: () => inspectionRepository.getNearbyLocation( - centerLat: currentLocation.value.latitude, - centerLng: currentLocation.value.longitude, - radius: 15, // Radius in K meters - ), + call: () => inspectionRepository.getNearbyLocation(), onSuccess: (result) { if (result != null) { allPoultryLocation.value = Resource>.success(result); + mapLogic.allLocations.value = Resource>.success(result); } else { allPoultryLocation.value = Resource>.error( 'No locations found', @@ -164,8 +80,11 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin onSuccess: (result) { if (result != null || result!.isNotEmpty) { searchedPoultryLocation.value = Resource>.success(result); + mapLogic.hasFilterOrSearch.value = true; + mapLogic.filteredLocations.value = Resource>.success(result); } else { searchedPoultryLocation.value = Resource>.empty(); + mapLogic.filteredLocations.value = Resource>.empty(); } }, onError: (error, stackTrace) { @@ -175,14 +94,4 @@ class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin }, ); } - - double getVisibleRadiusKm({ - required double zoom, - required double screenWidthPx, - required double latitude, - }) { - double metersPerPixel = 156543.03392 * cos(latitude * pi / 180) / pow(2, zoom); - double visibleWidthInMeters = metersPerPixel * screenWidthPx; - return (visibleWidthInMeters / 2) / 1000; // radius in KM - } } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart b/packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart deleted file mode 100644 index 5b981f4..0000000 --- a/packages/inspection/lib/presentation/pages/inspection_map/map_widget.dart +++ /dev/null @@ -1,108 +0,0 @@ -// widgets/map_widgets.dart -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/presentation/pages/inspection_map/logic.dart'; -import 'package:rasadyar_inspection/presentation/widget/search.dart'; - -class MapView extends GetView { - const MapView({super.key}); - - @override - Widget build(BuildContext context) { - return Expanded( - child: Stack( - fit: StackFit.expand, - children: [ - _buildFlutterMap(), - _buildSearchOverlay(), - ], - ), - ); - } - - Widget _buildFlutterMap() { - return ObxValue( - (currentLocation) => FlutterMap( - mapController: controller.animatedMapController.mapController, - options: MapOptions( - initialCenter: currentLocation.value, - interactionOptions: const InteractionOptions( - flags: InteractiveFlag.all & ~InteractiveFlag.rotate, - ), - initialZoom: 15, - onPositionChanged: _handlePositionChanged, - ), - children: [ - _buildTileLayer(), - _buildMarkerClusterLayer(), - ], - ), - controller.currentLocation, - ); - } - - Widget _buildTileLayer() { - return TileLayer( - urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - userAgentPackageName: 'ir.mnpc.rasadyar', - ); - } - - Widget _buildMarkerClusterLayer() { - return ObxValue( - (markers) => MarkerClusterLayerWidget( - options: MarkerClusterLayerOptions( - maxClusterRadius: 80, - size: const Size(40, 40), - alignment: Alignment.center, - padding: const EdgeInsets.all(50), - maxZoom: 15, - markers: markers.value, - builder: _buildClusterMarker, - ), - ), - controller.markers, - ); - } - - Widget _buildClusterMarker(BuildContext context, List clusterMarkers) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.blue, - ), - child: Center( - child: Text( - clusterMarkers.length.toString(), - style: const TextStyle(color: Colors.white), - ), - ), - ); - } - - Widget _buildSearchOverlay() { - return Positioned( - top: 10, - left: 20, - right: 20, - child: ObxValue( - (isSearchSelected) => isSearchSelected.value - ? SearchWidget( - onSearchChanged: (data) { - controller.baseLogic.searchValue.value = data; - }, - ) - : const SizedBox.shrink(), - controller.baseLogic.isSearchSelected, - ), - ); - } - - void _handlePositionChanged(MapCamera camera, bool hasGesture) { - wLog(camera.zoom); - controller.debouncedUpdateVisibleMarkers( - center: camera.center, - zoom: camera.zoom, - ); - } -} diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index 044567d..b83c6f8 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; import 'logic.dart'; +import 'widget/map/view.dart'; class InspectionMapPage extends GetView { const InspectionMapPage({super.key}); @@ -18,109 +18,24 @@ class InspectionMapPage extends GetView { hasBack: false, defaultSearch: false, filteringWidget: filterWidget(showIndex: 3.obs, filterIndex: 5.obs), - onSearchTap: _handleSearchTap, - widgets: [_buildMap()], - floatingActionButton: _buildGpsButton(), - ); - } - - void _handleSearchTap() { - controller.baseLogic.isSearchSelected.value = !controller.baseLogic.isSearchSelected.value; - } - - Widget _buildMap() { - return Expanded( - child: Stack( - fit: StackFit.expand, - children: [ - ObxValue((currentLocation) { - return FlutterMap( - mapController: controller.animatedMapController.mapController, - options: MapOptions( - initialCenter: currentLocation.value, - interactionOptions: const InteractionOptions( - flags: InteractiveFlag.all & ~InteractiveFlag.rotate, - ), - initialZoom: 15, - onPositionChanged: (camera, hasGesture) { - controller.debouncedUpdateVisibleMarkers( - center: camera.center, - zoom: camera.zoom, - ); - }, - ), - - children: [ - TileLayer( - urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - userAgentPackageName: 'ir.mnpc.rasadyar', - ), - - ObxValue((markers) { - return MarkerClusterLayerWidget( - options: MarkerClusterLayerOptions( - maxClusterRadius: 80, - size: const Size(40, 40), - alignment: Alignment.center, - padding: const EdgeInsets.all(50), - maxZoom: 15, - markers: buildMarkers(markers), - builder: (context, clusterMarkers) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Colors.blue, - ), - child: Center( - child: Text( - clusterMarkers.length.toString(), - style: const TextStyle(color: Colors.white), - ), - ), - ); - }, - ), - ); - }, controller.markers2), - ], - ); - }, controller.currentLocation), - - Obx(() { - if (controller.baseLogic.isSearchSelected.value) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (Get.isBottomSheetOpen != true) { - Get.bottomSheet( - searchWidget(), - isDismissible: true, - ignoreSafeArea: false, - isScrollControlled: true, - ); - } - }); - } - return const SizedBox.shrink(); - }), - - // Uncomment the following lines to enable the search widget - /* Positioned( - top: 10, - left: 20, - right: 20, - child: ObxValue((data) { - if (data.value) { - return SearchWidget( - onSearchChanged: (data) { - controller.baseLogic.searchValue.value = data; - }, - ); - } else { - return SizedBox.shrink(); - } - }, controller.baseLogic.isSearchSelected), - ),*/ - ], - ), + widgets: [ + MapPage(), + ObxValue((p0) => Text(p0.toString()), controller.showIndex), + ObxValue((data) { + if (data.value) { + WidgetsBinding.instance.addPostFrameCallback((_) { + Get.bottomSheet( + searchWidget(), + isScrollControlled: true, + isDismissible: true, + ignoreSafeArea: false, + ); + controller.baseLogic.isSearchSelected.value = false; + }); + } + return const SizedBox.shrink(); + }, controller.baseLogic.isSearchSelected), + ], ); } @@ -130,44 +45,63 @@ class InspectionMapPage extends GetView { rootChild: Column( spacing: 8, children: [ - RTextField( - height: 40, - borderColor: AppColor.blackLight, - suffixIcon: ObxValue( - (data) => Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: (data.value == null) - ? Assets.vec.searchSvg.svg( - width: 10, - height: 10, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ) - : IconButton( - onPressed: () { - controller.baseLogic.searchTextController.clear(); - controller.baseLogic.searchValue.value = null; - controller.baseLogic.isSearchSelected.value = false; - controller.searchedPoultryLocation.value = Resource.initial(); - }, - enableFeedback: true, - padding: EdgeInsets.zero, - iconSize: 24, - splashRadius: 50, - icon: Assets.vec.closeCircleSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), + Row( + spacing: 12, + children: [ + Expanded( + child: RTextField( + height: 40, + borderColor: AppColor.blackLight, + suffixIcon: ObxValue( + (data) => Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: (data.value == null) + ? Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ) + : IconButton( + onPressed: () { + controller.baseLogic.searchTextController.clear(); + controller.baseLogic.searchValue.value = null; + controller.baseLogic.isSearchSelected.value = false; + controller. mapLogic.hasFilterOrSearch.value = false; + controller.searchedPoultryLocation.value = Resource.initial(); + }, + enableFeedback: true, + padding: EdgeInsets.zero, + iconSize: 24, + splashRadius: 50, + icon: Assets.vec.closeCircleSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ), + controller.baseLogic.searchValue, + ), + hintText: 'جستجو کنید ...', + hintStyle: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + filledColor: Colors.white, + filled: true, + controller: controller.baseLogic.searchTextController, + onChanged: (val) => controller.baseLogic.searchValue.value = val, + ), ), - controller.baseLogic.searchValue, - ), - hintText: 'جستجو کنید ...', - hintStyle: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), - filledColor: Colors.white, - filled: true, - controller: controller.baseLogic.searchTextController, - onChanged: (val) => controller.baseLogic.searchValue.value = val, + GestureDetector( + onTap: () { + + Get.back(); + }, + child: Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ], ), Expanded( child: ObxValue((rxData) { @@ -244,16 +178,7 @@ class InspectionMapPage extends GetView { ); } - Widget _buildGpsButton() { - return ObxValue((data) { - return RFab( - backgroundColor: AppColor.greenNormal, - isLoading: data.value, - icon: Assets.vec.gpsSvg.svg(width: 40.w, height: 40.h), - onPressed: () async => await controller.determineCurrentPosition(), - ); - }, controller.isLoading); - } + /* Widget selectedLocationWidget2({ required bool showHint, @@ -345,14 +270,16 @@ class InspectionMapPage extends GetView { height: 40.h, backgroundColor: AppColor.blueNormal, onPressed: () { - /*controller.setEditData(item); + */ + /*controller.setEditData(item); Get.bottomSheet( addOrEditBottomSheet(true), isScrollControlled: true, backgroundColor: Colors.transparent, ).whenComplete(() { - });*/ + });*/ /* + }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -438,368 +365,7 @@ class InspectionMapPage extends GetView { ); }, controller.isSelectedDetailsLocation); } - - List buildMarkers(RxList markers) { - final visibleBounds = controller.animatedMapController.mapController.camera.visibleBounds; - final isZoomedIn = controller.currentZoom > 17; - - final updatedMarkers = markers.map((location) { - final point = LatLng(location.lat ?? 0, location.long ?? 0); - final isVisible = visibleBounds.contains(point); - - return Marker( - point: point, - width: isZoomedIn && isVisible ? 180.w : 40.h, - height: isZoomedIn && isVisible ? 50.h : 50.h, - child: GestureDetector( - onTap: () { - bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; - Get.bottomSheet( - ObxValue((data) { - return BaseBottomSheet( - height: data.value - ? hasHatching - ? 550.h - : 400.h - : 150.h, - child: Column( - spacing: 12, - children: [ - ListItemWithOutCounter( - secondChild: Column( - spacing: 8, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - ], - ), - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1.w, - color: AppColor.blueLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, - children: [ - Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan14.copyWith( - color: AppColor.textColor, - ), - ), - - Text( - hasHatching ? 'دارد' : 'ندارد', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - buildRow( - title: 'مشخصات خریدار', - value: location.user?.fullname ?? 'N/A', - ), - - buildRow( - title: 'تلفن خریدار', - value: location.user?.mobile ?? 'N/A', - valueStyle: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - - Visibility( - visible: location.address?.city?.name != null, - child: buildRow( - title: 'شهر', - value: location.address?.city?.name ?? 'N/A', - ), - ), - Visibility( - visible: location.address?.address != null, - child: buildRow( - title: 'آردس', - value: location.address?.address ?? 'N/A', - ), - ), - - buildRow( - title: 'شناسه یکتا', - value: location.breedingUniqueId ?? 'N/A', - ), - ], - ), - ), - Row( - children: [ - Expanded( - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - spacing: 7, - children: [ - RElevated( - width: 40.h, - height: 38.h, - backgroundColor: AppColor.greenNormal, - child: Assets.vec.messageAddSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - onPressed: () {}, - ), - RElevated( - width: 150.w, - height: 40.h, - backgroundColor: AppColor.blueNormal, - onPressed: () { - /* controller.setEditData(item); - Get.bottomSheet( - addOrEditBottomSheet(true), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ).whenComplete(() {});*/ - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 8, - children: [ - Assets.vec.mapSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - Text( - 'جزییات کامل', - style: AppFonts.yekan14Bold.copyWith( - color: Colors.white, - ), - ), - ], - ), - ), - ROutlinedElevated( - width: 150.w, - height: 40.h, - onPressed: () { - buildDeleteDialog( - onConfirm: () async {}, - onRefresh: () async {}, - ); - }, - borderColor: AppColor.bgIcon, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.securityTimeSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - AppColor.bgIcon, - BlendMode.srcIn, - ), - ), - Text( - 'سوابق بازرسی', - style: AppFonts.yekan14Bold.copyWith( - color: AppColor.bgIcon, - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ], - ), - labelColor: AppColor.blueLight, - labelIcon: Assets.vec.cowSvg.path, - labelIconColor: AppColor.bgIcon, - onTap: () => data.value = !data.value, - selected: data.value, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - location.user?.fullname ?? '', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - (location.hatching != null && location.hatching!.isNotEmpty) - ? 'دارد' - : 'ندراد', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Assets.vec.scanBarcodeSvg.svg(), - ], - ), - ), - - Visibility( - visible: hasHatching, - child: Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - padding: EdgeInsets.all(8.r), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), - ), - child: Column( - spacing: 8.h, - children: [ - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1.w, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, - children: [ - Text( - 'تاریخ', - style: AppFonts.yekan14.copyWith(color: AppColor.textColor), - ), - - Text( - location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - ], - ), - ), - buildRow( - title: 'باقیمانده', - value: location.hatching?.first.leftOver.separatedByComma ?? 'N/A', - ), - buildRow( - title: 'سن جوجه ریزی', - value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', - ), - buildRow( - title: 'شماره مجوز جوجه ریزی', - value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', - ), - ], - ), - ), - ), - ], - ), - ); - }, controller.isSelectedDetailsLocation), - isScrollControlled: true, - isDismissible: true, - ); - }, - child: isZoomedIn && isVisible - ? Container( - height: 30.h, - padding: EdgeInsets.all(5.r), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 5, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - Text(location.user?.fullname ?? '', style: AppFonts.yekan12), - ], - ), - ) - : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - ), - ); - }).toList(); - - return updatedMarkers; - } -} - -Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { - iLog('lat: ${marker.latitude}, lng: ${marker.longitude}'); - return Marker( - point: marker, - child: GestureDetector( - onTap: onTap, - behavior: HitTestBehavior.opaque, - child: SizedBox( - width: 36, - height: 36, - child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30), - ), - ), - ); +*/ } Widget filterWidget({required RxInt filterIndex, required RxInt showIndex}) { diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart new file mode 100644 index 0000000..ff05984 --- /dev/null +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart @@ -0,0 +1,139 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; +import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; + +class MapLogic extends GetxController with GetTickerProviderStateMixin { + RxBool isLoading = false.obs; + RxBool isSelectedDetailsLocation = false.obs; + RxDouble currentZoom = (15.0).obs; + Rx mapController = MapController().obs; + BaseLogic baseLogic = Get.find(); + + Rx currentLocation = LatLng(34.798315281272544, 48.51479142983491).obs; + RxBool hasFilterOrSearch = false.obs; + + Timer? _debounceTimer; + + final distance = Distance(); + + late final AnimatedMapController animatedMapController; + + Rx>> markerLocations = + Resource>.initial().obs; + + Rx>> allLocations = + Resource>.initial().obs; + + Rx>> filteredLocations = + Resource>.initial().obs; + + @override + void onInit() { + super.onInit(); + animatedMapController = AnimatedMapController( + vsync: this, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + cancelPreviousAnimations: true, + ); + + ever(hasFilterOrSearch, (callback) { + if (callback) { + markerLocations.value = filteredLocations.value; + } else { + markerLocations.value = allLocations.value; + } + }); + + ever(allLocations, (_) { + if (!hasFilterOrSearch.value) { + markerLocations.value = allLocations.value; + } + }); + + ever(filteredLocations, (_) { + if (hasFilterOrSearch.value) { + markerLocations.value = filteredLocations.value; + } + }); + } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } + + Future determineCurrentPosition() async { + isLoading.value = true; + final position = await Geolocator.getCurrentPosition( + locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), + ); + final latLng = LatLng(position.latitude, position.longitude); + + /*currentLocation.value = latLng; + markers.add(PoultryLocationModel( + lat: latLng.latitude, + long: latLng.longitude + ));*/ + animatedMapController.animateTo( + dest: latLng, + zoom: 18, + curve: Curves.easeInOut, + duration: const Duration(seconds: 1), + ); + isLoading.value = false; + } + + /* void debouncedUpdateVisibleMarkers({required LatLng center, required double zoom}) { + _debounceTimer?.cancel(); + _debounceTimer = Timer(const Duration(milliseconds: 300), () { + final radius = getVisibleRadiusKm( + zoom: zoom, + screenWidthPx: Get.width.toDouble(), + latitude: center.latitude, + ); + + final filtered = filterNearbyMarkers( + allPoultryLocation.value.data ?? [], + center.latitude, + center.longitude, + radius, + ); + final existingIds = markers2.map((e) => e.id).toSet(); + final uniqueFiltered = filtered.where((e) => !existingIds.contains(e.id)).toList(); + markers2.addAll(uniqueFiltered); + }); + }*/ + + List filterNearbyMarkers( + List allMarkers, + double centerLat, + double centerLng, + double radiusInMeters, + ) { + final center = LatLng(centerLat, centerLng); + + return allMarkers.where((marker) => distance(center, marker) <= radiusInMeters).toList(); + } + + double getVisibleRadiusKm({ + required double zoom, + required double screenWidthPx, + required double latitude, + }) { + double metersPerPixel = 156543.03392 * cos(latitude * pi / 180) / pow(2, zoom); + double visibleWidthInMeters = metersPerPixel * screenWidthPx; + return (visibleWidthInMeters / 2); // radius in Meter + } +} diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart new file mode 100644 index 0000000..c532774 --- /dev/null +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart @@ -0,0 +1,496 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; + +import 'logic.dart'; + +class MapPage extends GetView { + const MapPage({super.key}); + + @override + Widget build(BuildContext context) { + return Expanded( + child: Stack( + fit: StackFit.expand, + children: [ + ObxValue((currentLocation) { + return FlutterMap( + mapController: controller.animatedMapController.mapController, + options: MapOptions( + initialCenter: currentLocation.value, + interactionOptions: const InteractionOptions( + flags: InteractiveFlag.all & ~InteractiveFlag.rotate, + ), + initialZoom: 15, + onPositionChanged: (camera, hasGesture) { + //controller.debouncedUpdateVisibleMarkers(center: camera.center, zoom: camera.zoom); + }, + ), + + children: [ + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'ir.mnpc.rasadyar', + ), + + ObxValue((markers) { + if (markers.value.status == ResourceStatus.success) { + return MarkerLayer( + markers: List.generate(markers.value.data?.length ?? 0, (index) { + final location = markers.value.data![index]; + return markerWidget( + marker: location.latLng ?? LatLng(0, 0), + onTap: () { + controller.isSelectedDetailsLocation.value = true; + controller.animatedMapController.animateTo( + dest: location.latLng ?? LatLng(0, 0), + zoom: 18, + ); + }, + ); + }), + ); + } + return Container(width: 20, height: 20, color: Colors.lightGreen); + }, controller.markerLocations), + + /* ObxValue((markers) { + return MarkerClusterLayerWidget( + options: MarkerClusterLayerOptions( + maxClusterRadius: 80, + size: const Size(40, 40), + alignment: Alignment.center, + padding: const EdgeInsets.all(50), + maxZoom: 15, + markers: buildMarkers(markers), + builder: (context, clusterMarkers) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.blue, + ), + child: Center( + child: Text( + clusterMarkers.length.toString(), + style: const TextStyle(color: Colors.white), + ), + ), + ); + }, + ), + ); + }, controller.allLocations),*/ + ], + ); + }, controller.currentLocation), + + /* Obx(() { + if (controller.baseLogic.isSearchSelected.value) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (Get.isBottomSheetOpen != true) { + Get.bottomSheet( + searchWidget(), + isDismissible: true, + ignoreSafeArea: false, + isScrollControlled: true, + ); + } + }); + } + return const SizedBox.shrink(); + }),*/ + + // Uncomment the following lines to enable the search widget + /* Positioned( + top: 10, + left: 20, + right: 20, + child: ObxValue((data) { + if (data.value) { + return SearchWidget( + onSearchChanged: (data) { + controller.baseLogic.searchValue.value = data; + }, + ); + } else { + return SizedBox.shrink(); + } + }, controller.baseLogic.isSearchSelected), + ),*/ + ], + ), + ); + } + + Widget _buildGpsButton() { + return ObxValue((data) { + return RFab( + backgroundColor: AppColor.greenNormal, + isLoading: data.value, + icon: Assets.vec.gpsSvg.svg(width: 40.w, height: 40.h), + onPressed: () async => await controller.determineCurrentPosition(), + ); + }, controller.isLoading); + } + + List buildMarkers(RxList markers) { + final visibleBounds = controller.animatedMapController.mapController.camera.visibleBounds; + final isZoomedIn = controller.currentZoom > 17; + + final updatedMarkers = markers.map((location) { + final point = LatLng(location.lat ?? 0, location.long ?? 0); + final isVisible = visibleBounds.contains(point); + + return Marker( + point: point, + width: isZoomedIn && isVisible ? 180.w : 40.h, + height: isZoomedIn && isVisible ? 50.h : 50.h, + child: GestureDetector( + onTap: () { + bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; + Get.bottomSheet( + ObxValue((data) { + return BaseBottomSheet( + height: data.value + ? hasHatching + ? 550.h + : 400.h + : 150.h, + child: Column( + spacing: 12, + children: [ + ListItemWithOutCounter( + secondChild: Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1.w, + color: AppColor.blueLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan14.copyWith( + color: AppColor.textColor, + ), + ), + + Text( + hasHatching ? 'دارد' : 'ندارد', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + buildRow( + title: 'مشخصات خریدار', + value: location.user?.fullname ?? 'N/A', + ), + + buildRow( + title: 'تلفن خریدار', + value: location.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + + Visibility( + visible: location.address?.city?.name != null, + child: buildRow( + title: 'شهر', + value: location.address?.city?.name ?? 'N/A', + ), + ), + Visibility( + visible: location.address?.address != null, + child: buildRow( + title: 'آردس', + value: location.address?.address ?? 'N/A', + ), + ), + + buildRow( + title: 'شناسه یکتا', + value: location.breedingUniqueId ?? 'N/A', + ), + ], + ), + ), + Row( + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 7, + children: [ + RElevated( + width: 40.h, + height: 38.h, + backgroundColor: AppColor.greenNormal, + child: Assets.vec.messageAddSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + onPressed: () {}, + ), + RElevated( + width: 150.w, + height: 40.h, + backgroundColor: AppColor.blueNormal, + onPressed: () { + /* controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ).whenComplete(() {});*/ + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + Text( + 'جزییات کامل', + style: AppFonts.yekan14Bold.copyWith( + color: Colors.white, + ), + ), + ], + ), + ), + ROutlinedElevated( + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async {}, + onRefresh: () async {}, + ); + }, + borderColor: AppColor.bgIcon, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.securityTimeSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + AppColor.bgIcon, + BlendMode.srcIn, + ), + ), + Text( + 'سوابق بازرسی', + style: AppFonts.yekan14Bold.copyWith( + color: AppColor.bgIcon, + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + labelIconColor: AppColor.bgIcon, + onTap: () => data.value = !data.value, + selected: data.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + location.user?.fullname ?? '', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + (location.hatching != null && location.hatching!.isNotEmpty) + ? 'دارد' + : 'ندراد', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + ), + + Visibility( + visible: hasHatching, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + padding: EdgeInsets.all(8.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: Column( + spacing: 8.h, + children: [ + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + buildRow( + title: 'باقیمانده', + value: location.hatching?.first.leftOver.separatedByComma ?? 'N/A', + ), + buildRow( + title: 'سن جوجه ریزی', + value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', + ), + buildRow( + title: 'شماره مجوز جوجه ریزی', + value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', + ), + ], + ), + ), + ), + ], + ), + ); + }, controller.isSelectedDetailsLocation), + isScrollControlled: true, + isDismissible: true, + ); + }, + child: isZoomedIn && isVisible + ? Container( + height: 30.h, + padding: EdgeInsets.all(5.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + Text(location.user?.fullname ?? '', style: AppFonts.yekan12), + ], + ), + ) + : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + ), + ); + }).toList(); + + return updatedMarkers; + } + + Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + return Marker( + point: marker, + child: GestureDetector( + onTap: onTap, + behavior: HitTestBehavior.opaque, + child: SizedBox( + width: 36, + height: 36, + child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30), + ), + ), + ); + } +} diff --git a/packages/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart index a6cc79a..02ac975 100644 --- a/packages/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -2,6 +2,7 @@ import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/presentation/pages/auth/logic.dart'; import 'package:rasadyar_inspection/presentation/pages/auth/view.dart'; import 'package:rasadyar_inspection/presentation/pages/filter/logic.dart'; +import 'package:rasadyar_inspection/presentation/pages/inspection_map/widget/map/logic.dart'; import 'package:rasadyar_inspection/presentation/pages/pages.dart'; import 'package:rasadyar_inspection/presentation/pages/users/logic.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; @@ -15,7 +16,7 @@ sealed class InspectionPages { GetPage( name: InspectionRoutes.init, page: () => RootPage(), - middlewares:[ AuthMiddleware()], + middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => RootLogic()); Get.lazyPut(() => InspectorFilterLogic()); @@ -25,8 +26,9 @@ sealed class InspectionPages { Get.lazyPut(() => RecordsLogic()); Get.lazyPut(() => StatisticsLogic()); Get.lazyPut(() => LocationDetailsLogic(), fenix: true); - Get.lazyPut(() => ActionLogic(), fenix: true); - Get.lazyPut(() => ProfileLogic(), fenix: true); + Get.lazyPut(() => ActionLogic()); + Get.lazyPut(() => ProfileLogic()); + Get.lazyPut(() => MapLogic()); }), ), @@ -67,7 +69,7 @@ sealed class InspectionPages { page: () => AuthPage(), binding: BindingsBuilder(() { Get.lazyPut(() => AuthLogic()); - Get.lazyPut(() =>CaptchaWidgetLogic()); + Get.lazyPut(() => CaptchaWidgetLogic()); }), ), ]; From 6040ca9f863d6291100eacf6c6b2bff93de63d7c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 2 Aug 2025 11:10:22 +0330 Subject: [PATCH 251/256] feat : 1 - search location and conditions 2 - parse list in isolate --- packages/core/lib/core.dart | 2 + .../lib/infrastructure/remote/dio_remote.dart | 5 + .../remote/interfaces/i_http_client.dart | 22 +- packages/core/lib/utils/parser.dart | 16 + packages/core/lib/utils/utils.dart | 15 +- .../inspection/inspection_remote_imp.dart | 4 +- .../pages/inspection_map/logic.dart | 3 +- .../pages/inspection_map/view.dart | 4 +- .../inspection_map/widget/map/logic.dart | 40 +- .../pages/inspection_map/widget/map/view.dart | 959 ++++++++++++------ 10 files changed, 695 insertions(+), 375 deletions(-) create mode 100644 packages/core/lib/utils/parser.dart diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 86caf03..c881e08 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -57,3 +57,5 @@ export 'utils/map_utils.dart'; export 'utils/network/network.dart'; export 'utils/route_utils.dart'; export 'utils/separator_input_formatter.dart'; + +export 'utils/utils.dart'; diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 3cfcd98..473ca3e 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -37,6 +37,7 @@ class DioRemote implements IHttpClient { ProgressCallback? onReceiveProgress, T Function(Map json)? fromJson, T Function(List json)? fromJsonList, + Future Function(List json)? fromJsonListAsync, }) async { final response = await dio.get( path, @@ -45,6 +46,10 @@ class DioRemote implements IHttpClient { onReceiveProgress: onReceiveProgress, cancelToken: ApiHandler.globalCancelToken, ); + if (fromJsonListAsync != null && response.data is List) { + response.data = await fromJsonListAsync(response.data); + return DioResponse(response); + } if (fromJsonList != null && response.data is List) { response.data = fromJsonList(response.data); return DioResponse(response); diff --git a/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart b/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart index 9550c18..119222b 100644 --- a/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart +++ b/packages/core/lib/infrastructure/remote/interfaces/i_http_client.dart @@ -1,6 +1,5 @@ - -import 'dart:typed_data'; import 'package:dio/dio.dart'; + import 'i_form_data.dart'; import 'i_http_response.dart'; @@ -8,12 +7,14 @@ abstract class IHttpClient { Future init(); Future> get( - String path, { - Map? queryParameters, - Map? headers, - ProgressCallback? onReceiveProgress, - }); - + String path, { + Map? queryParameters, + Map? headers, + ProgressCallback? onReceiveProgress, + T Function(Map json)? fromJson, + T Function(List json)? fromJsonList, + Future Function(List json)? fromJsonListAsync, + }); Future> post( String path, { @@ -40,10 +41,7 @@ abstract class IHttpClient { Map? headers, }); - Future> download( - String url, { - ProgressCallback? onReceiveProgress, - }); + Future> download(String url, {ProgressCallback? onReceiveProgress}); Future> upload( String path, { diff --git a/packages/core/lib/utils/parser.dart b/packages/core/lib/utils/parser.dart new file mode 100644 index 0000000..319be03 --- /dev/null +++ b/packages/core/lib/utils/parser.dart @@ -0,0 +1,16 @@ +import 'package:flutter/foundation.dart'; + +List _parserList(Map args) { + final list = args['list'] as List; + final T Function(Map) fromJson = + args['fromJson'] as T Function(Map); + + return list.map((e) => fromJson(e as Map)).toList(); +} + +Future> parseListInIsolate( + List list, + T Function(Map) fromJson, +) async { + return compute(_parserList, {'list': list, 'fromJson': fromJson}); +} diff --git a/packages/core/lib/utils/utils.dart b/packages/core/lib/utils/utils.dart index 064ac55..ba7f6b2 100644 --- a/packages/core/lib/utils/utils.dart +++ b/packages/core/lib/utils/utils.dart @@ -1,17 +1,12 @@ -export 'mixins/pagination_controller_mixin.dart'; - -export 'network/network.dart'; - +export 'apk_updater.dart'; export 'extension/date_time_utils.dart'; export 'extension/num_utils.dart'; export 'extension/string_utils.dart'; - -export 'apk_updater.dart'; +export 'local/local_utils.dart'; export 'logger_utils.dart'; export 'map_utils.dart'; +export 'mixins/pagination_controller_mixin.dart'; +export 'network/network.dart'; +export 'parser.dart'; export 'route_utils.dart'; export 'separator_input_formatter.dart'; - - -export 'local/local_utils.dart'; - diff --git a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart index 30a8110..08ac5a2 100644 --- a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart +++ b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart @@ -39,8 +39,8 @@ class InspectionRemoteDataSourceImp implements InspectionRemoteDataSource { value: value, ), headers: {'Content-Type': 'application/json'}, - fromJsonList: (json) => - json.map((item) => PoultryLocationModel.fromJson(item as Map)).toList(), + fromJsonListAsync: (json) async => + parseListInIsolate(json, (json) => PoultryLocationModel.fromJson(json)), ); return res.data; diff --git a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart index 04ef033..b6eb8b1 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/logic.dart @@ -57,8 +57,9 @@ class InspectionMapLogic extends GetxController { allPoultryLocation.value = Resource>.loading(); await safeCall( call: () => inspectionRepository.getNearbyLocation(), - onSuccess: (result) { + onSuccess: (result) async{ if (result != null) { + allPoultryLocation.value = Resource>.success(result); mapLogic.allLocations.value = Resource>.success(result); } else { diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index b83c6f8..044bc48 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -20,7 +20,6 @@ class InspectionMapPage extends GetView { filteringWidget: filterWidget(showIndex: 3.obs, filterIndex: 5.obs), widgets: [ MapPage(), - ObxValue((p0) => Text(p0.toString()), controller.showIndex), ObxValue((data) { if (data.value) { WidgetsBinding.instance.addPostFrameCallback((_) { @@ -66,7 +65,7 @@ class InspectionMapPage extends GetView { controller.baseLogic.searchTextController.clear(); controller.baseLogic.searchValue.value = null; controller.baseLogic.isSearchSelected.value = false; - controller. mapLogic.hasFilterOrSearch.value = false; + controller.mapLogic.hasFilterOrSearch.value = false; controller.searchedPoultryLocation.value = Resource.initial(); }, enableFeedback: true, @@ -92,7 +91,6 @@ class InspectionMapPage extends GetView { ), GestureDetector( onTap: () { - Get.back(); }, child: Assets.vec.mapSvg.svg( diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart index ff05984..07a483b 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart @@ -74,6 +74,8 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { super.onClose(); } + double _deg2rad(double deg) => deg * (pi / 180); + Future determineCurrentPosition() async { isLoading.value = true; final position = await Geolocator.getCurrentPosition( @@ -95,7 +97,8 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { isLoading.value = false; } - /* void debouncedUpdateVisibleMarkers({required LatLng center, required double zoom}) { +/* + void debouncedUpdateVisibleMarkers({required LatLng center, required double zoom}) { _debounceTimer?.cancel(); _debounceTimer = Timer(const Duration(milliseconds: 300), () { final radius = getVisibleRadiusKm( @@ -105,7 +108,7 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { ); final filtered = filterNearbyMarkers( - allPoultryLocation.value.data ?? [], + all.value.data ?? [], center.latitude, center.longitude, radius, @@ -114,7 +117,8 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { final uniqueFiltered = filtered.where((e) => !existingIds.contains(e.id)).toList(); markers2.addAll(uniqueFiltered); }); - }*/ + } +*/ List filterNearbyMarkers( List allMarkers, @@ -127,13 +131,27 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { return allMarkers.where((marker) => distance(center, marker) <= radiusInMeters).toList(); } - double getVisibleRadiusKm({ - required double zoom, - required double screenWidthPx, - required double latitude, - }) { - double metersPerPixel = 156543.03392 * cos(latitude * pi / 180) / pow(2, zoom); - double visibleWidthInMeters = metersPerPixel * screenWidthPx; - return (visibleWidthInMeters / 2); // radius in Meter + double getVisibleRadiusKm({required LatLng center, required LatLng corner}) { + const earthRadius = 6371; // Km + + final dLat = _deg2rad(corner.latitude - center.latitude); + final dLng = _deg2rad(corner.longitude - center.longitude); + + final a = + sin(dLat / 2) * sin(dLat / 2) + + cos(_deg2rad(center.latitude)) * + cos(_deg2rad(corner.latitude)) * + sin(dLng / 2) * + sin(dLng / 2); + + final c = 2 * atan2(sqrt(a), sqrt(1 - a)); + return earthRadius * c; + } + + bool isInVisibleBounds(LatLng point, LatLngBounds bounds) { + return point.latitude <= bounds.north && + point.latitude >= bounds.south && + point.longitude >= bounds.west && + point.longitude <= bounds.east; } } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart index c532774..84a5a73 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart @@ -23,7 +23,11 @@ class MapPage extends GetView { ), initialZoom: 15, onPositionChanged: (camera, hasGesture) { - //controller.debouncedUpdateVisibleMarkers(center: camera.center, zoom: camera.zoom); + controller.currentZoom.value = camera.zoom; + /* controller.debouncedUpdateVisibleMarkers( + center: camera.center, + zoom: camera.zoom, + );*/ }, ), @@ -34,35 +38,14 @@ class MapPage extends GetView { ), ObxValue((markers) { - if (markers.value.status == ResourceStatus.success) { - return MarkerLayer( - markers: List.generate(markers.value.data?.length ?? 0, (index) { - final location = markers.value.data![index]; - return markerWidget( - marker: location.latLng ?? LatLng(0, 0), - onTap: () { - controller.isSelectedDetailsLocation.value = true; - controller.animatedMapController.animateTo( - dest: location.latLng ?? LatLng(0, 0), - zoom: 18, - ); - }, - ); - }), - ); - } - return Container(width: 20, height: 20, color: Colors.lightGreen); - }, controller.markerLocations), - - /* ObxValue((markers) { return MarkerClusterLayerWidget( options: MarkerClusterLayerOptions( maxClusterRadius: 80, size: const Size(40, 40), alignment: Alignment.center, padding: const EdgeInsets.all(50), - maxZoom: 15, - markers: buildMarkers(markers), + maxZoom: 18, + markers: buildMarkers(markers.value.data ?? []), builder: (context, clusterMarkers) { return Container( decoration: BoxDecoration( @@ -79,27 +62,11 @@ class MapPage extends GetView { }, ), ); - }, controller.allLocations),*/ + }, controller.markerLocations), ], ); }, controller.currentLocation), - /* Obx(() { - if (controller.baseLogic.isSearchSelected.value) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (Get.isBottomSheetOpen != true) { - Get.bottomSheet( - searchWidget(), - isDismissible: true, - ignoreSafeArea: false, - isScrollControlled: true, - ); - } - }); - } - return const SizedBox.shrink(); - }),*/ - // Uncomment the following lines to enable the search widget /* Positioned( top: 10, @@ -133,347 +100,667 @@ class MapPage extends GetView { }, controller.isLoading); } - List buildMarkers(RxList markers) { + List buildMarkers(List markers) { final visibleBounds = controller.animatedMapController.mapController.camera.visibleBounds; final isZoomedIn = controller.currentZoom > 17; final updatedMarkers = markers.map((location) { final point = LatLng(location.lat ?? 0, location.long ?? 0); - final isVisible = visibleBounds.contains(point); + final isVisible = controller.isInVisibleBounds(point, visibleBounds); - return Marker( - point: point, - width: isZoomedIn && isVisible ? 180.w : 40.h, - height: isZoomedIn && isVisible ? 50.h : 50.h, - child: GestureDetector( - onTap: () { - bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; - Get.bottomSheet( - ObxValue((data) { - return BaseBottomSheet( - height: data.value - ? hasHatching - ? 550.h - : 400.h - : 150.h, - child: Column( - spacing: 12, - children: [ - ListItemWithOutCounter( - secondChild: Column( - spacing: 8, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - ], - ), - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1.w, - color: AppColor.blueLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, + if (isZoomedIn && isVisible) { + return Marker( + point: point, + width: 180.w, + height: 50.h, + child: GestureDetector( + onTap: () { + bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; + iLog(hasHatching); + Get.bottomSheet( + ObxValue((data) { + return BaseBottomSheet( + height: data.value + ? hasHatching + ? 550.h + : 400.h + : 150.h, + child: Column( + spacing: 12, + children: [ + ListItemWithOutCounter( + secondChild: Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan14.copyWith( - color: AppColor.textColor, - ), - ), - - Text( - hasHatching ? 'دارد' : 'ندارد', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, + location.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, ), ), ], ), - ), - buildRow( - title: 'مشخصات خریدار', - value: location.user?.fullname ?? 'N/A', - ), - - buildRow( - title: 'تلفن خریدار', - value: location.user?.mobile ?? 'N/A', - valueStyle: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - - Visibility( - visible: location.address?.city?.name != null, - child: buildRow( - title: 'شهر', - value: location.address?.city?.name ?? 'N/A', - ), - ), - Visibility( - visible: location.address?.address != null, - child: buildRow( - title: 'آردس', - value: location.address?.address ?? 'N/A', - ), - ), - - buildRow( - title: 'شناسه یکتا', - value: location.breedingUniqueId ?? 'N/A', - ), - ], - ), - ), - Row( - children: [ - Expanded( - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - spacing: 7, - children: [ - RElevated( - width: 40.h, - height: 38.h, - backgroundColor: AppColor.greenNormal, - child: Assets.vec.messageAddSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1.w, + color: AppColor.blueLightHover, ), + borderRadius: BorderRadius.circular(8), ), - onPressed: () {}, ), - RElevated( - width: 150.w, - height: 40.h, - backgroundColor: AppColor.blueNormal, - onPressed: () { - /* controller.setEditData(item); + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan14.copyWith( + color: AppColor.textColor, + ), + ), + + Text( + hasHatching ? 'دارد' : 'ندارد', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + buildRow( + title: 'مشخصات خریدار', + value: location.user?.fullname ?? 'N/A', + ), + + buildRow( + title: 'تلفن خریدار', + value: location.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + + Visibility( + visible: location.address?.city?.name != null, + child: buildRow( + title: 'شهر', + value: location.address?.city?.name ?? 'N/A', + ), + ), + Visibility( + visible: location.address?.address != null, + child: buildRow( + title: 'آردس', + value: location.address?.address ?? 'N/A', + ), + ), + + buildRow( + title: 'شناسه یکتا', + value: location.breedingUniqueId ?? 'N/A', + ), + ], + ), + ), + Row( + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 7, + children: [ + RElevated( + width: 40.h, + height: 38.h, + backgroundColor: AppColor.greenNormal, + child: Assets.vec.messageAddSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + onPressed: () {}, + ), + RElevated( + width: 150.w, + height: 40.h, + backgroundColor: AppColor.blueNormal, + onPressed: () { + /* controller.setEditData(item); Get.bottomSheet( addOrEditBottomSheet(true), isScrollControlled: true, backgroundColor: Colors.transparent, ).whenComplete(() {});*/ - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 8, - children: [ - Assets.vec.mapSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), ), - ), - Text( - 'جزییات کامل', - style: AppFonts.yekan14Bold.copyWith( - color: Colors.white, + Text( + 'جزییات کامل', + style: AppFonts.yekan14Bold.copyWith( + color: Colors.white, + ), ), - ), - ], + ], + ), ), + ROutlinedElevated( + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async {}, + onRefresh: () async {}, + ); + }, + borderColor: AppColor.bgIcon, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.securityTimeSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + AppColor.bgIcon, + BlendMode.srcIn, + ), + ), + Text( + 'سوابق بازرسی', + style: AppFonts.yekan14Bold.copyWith( + color: AppColor.bgIcon, + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + labelIconColor: AppColor.bgIcon, + onTap: () => data.value = !data.value, + selected: data.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + location.user?.fullname ?? '', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + (location.hatching != null && location.hatching!.isNotEmpty) + ? 'دارد' + : 'ندراد', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + ), + + Visibility( + visible: hasHatching, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + padding: EdgeInsets.all(8.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: Column( + spacing: 8.h, + children: [ + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), ), - ROutlinedElevated( - width: 150.w, - height: 40.h, - onPressed: () { - buildDeleteDialog( - onConfirm: () async {}, - onRefresh: () async {}, - ); - }, - borderColor: AppColor.bgIcon, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.securityTimeSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - AppColor.bgIcon, - BlendMode.srcIn, - ), - ), - Text( - 'سوابق بازرسی', - style: AppFonts.yekan14Bold.copyWith( - color: AppColor.bgIcon, - ), - ), - ], + + Text( + location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, ), ), ], ), ), - ], - ), - ], - ), - labelColor: AppColor.blueLight, - labelIcon: Assets.vec.cowSvg.path, - labelIconColor: AppColor.bgIcon, - onTap: () => data.value = !data.value, - selected: data.value, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + buildRow( + title: 'باقیمانده', + value: + location.hatching?.first.leftOver.separatedByComma ?? 'N/A', ), - Text( - location.user?.fullname ?? '', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), + buildRow( + title: 'سن جوجه ریزی', + value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', + ), + buildRow( + title: 'شماره مجوز جوجه ریزی', + value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', ), ], ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - (location.hatching != null && location.hatching!.isNotEmpty) - ? 'دارد' - : 'ندراد', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Assets.vec.scanBarcodeSvg.svg(), - ], - ), - ), - - Visibility( - visible: hasHatching, - child: Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - padding: EdgeInsets.all(8.r), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), ), - child: Column( - spacing: 8.h, + ), + ], + ), + ); + }, controller.isSelectedDetailsLocation), + isScrollControlled: true, + isDismissible: true, + ); + }, + child: Container( + height: 30.h, + padding: EdgeInsets.all(5.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + Text(location.user?.fullname ?? '', style: AppFonts.yekan12), + ], + ), + ), + ), + ); + } else { + return Marker( + point: point, + width: 40.h, + height: 50.h, + child: GestureDetector( + onTap: () { + bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; + Get.bottomSheet( + ObxValue((data) { + return BaseBottomSheet( + height: data.value + ? hasHatching + ? 550.h + : 400.h + : 150.h, + child: Column( + spacing: 12, + children: [ + ListItemWithOutCounter( + secondChild: Column( + spacing: 8, children: [ - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1.w, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, children: [ - Text( - 'تاریخ', - style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.greenDark, + ), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1.w, + color: AppColor.blueLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan14.copyWith( + color: AppColor.textColor, + ), + ), + + Text( + hasHatching ? 'دارد' : 'ندارد', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + buildRow( + title: 'مشخصات مرغدار', + value: location.user?.fullname ?? 'N/A', ), - Text( - location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + buildRow( + title: 'تلفن مرغدار', + value: location.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + + Visibility( + visible: location.address?.city?.name != null, + child: buildRow( + title: 'شهر', + value: location.address?.city?.name ?? 'N/A', + ), + ), + Visibility( + visible: location.address?.address != null, + child: buildRow( + title: 'آردس', + value: location.address?.address ?? 'N/A', + ), + ), + + buildRow( + title: 'شناسه یکتا', + value: location.breedingUniqueId ?? 'N/A', ), ], ), ), - buildRow( - title: 'باقیمانده', - value: location.hatching?.first.leftOver.separatedByComma ?? 'N/A', - ), - buildRow( - title: 'سن جوجه ریزی', - value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', - ), - buildRow( - title: 'شماره مجوز جوجه ریزی', - value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', + Row( + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 7, + children: [ + RElevated( + width: 40.h, + height: 38.h, + backgroundColor: AppColor.greenNormal, + child: Assets.vec.messageAddSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + onPressed: () {}, + ), + RElevated( + width: 150.w, + height: 40.h, + backgroundColor: AppColor.blueNormal, + onPressed: () { + /* controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ).whenComplete(() {});*/ + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + Colors.white, + BlendMode.srcIn, + ), + ), + Text( + 'جزییات کامل', + style: AppFonts.yekan14Bold.copyWith( + color: Colors.white, + ), + ), + ], + ), + ), + ROutlinedElevated( + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async {}, + onRefresh: () async {}, + ); + }, + borderColor: AppColor.bgIcon, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.securityTimeSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode( + AppColor.bgIcon, + BlendMode.srcIn, + ), + ), + Text( + 'سوابق بازرسی', + style: AppFonts.yekan14Bold.copyWith( + color: AppColor.bgIcon, + ), + ), + ], + ), + ), + ], + ), + ), + ], ), ], ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + labelIconColor: AppColor.bgIcon, + onTap: () => data.value = !data.value, + selected: data.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + location.user?.fullname ?? '', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + (location.hatching != null && location.hatching!.isNotEmpty) + ? 'دارد' + : 'ندراد', + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), ), - ), - ], - ), - ); - }, controller.isSelectedDetailsLocation), - isScrollControlled: true, - isDismissible: true, - ); - }, - child: isZoomedIn && isVisible - ? Container( - height: 30.h, - padding: EdgeInsets.all(5.r), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 5, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - Text(location.user?.fullname ?? '', style: AppFonts.yekan12), - ], - ), - ) - : Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - ), - ); + + if (hasHatching) ...{ + Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + padding: EdgeInsets.all(8.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: Column( + spacing: 8.h, + children: [ + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + buildRow( + title: 'باقیمانده', + value: + '${location.hatching?.first.leftOver.separatedByComma ?? 'N/A'} عدد', + ), + buildRow( + title: 'سن جوجه ریزی', + value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', + ), + buildRow( + title: 'شماره مجوز جوجه ریزی', + value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', + ), + ], + ), + ), + }, + ], + ), + ); + }, controller.isSelectedDetailsLocation), + isScrollControlled: true, + isDismissible: true, + ); + }, + child: Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + ), + ); + } }).toList(); return updatedMarkers; From fae6703d8dddf31670630dee2849235ec1149589 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 2 Aug 2025 12:19:25 +0330 Subject: [PATCH 252/256] feat : new auth page --- .../presentation/widget/inputs/r_input.dart | 4 +- .../lib/presentation/pages/auth/logic.dart | 43 ++++-- .../lib/presentation/pages/auth/view.dart | 141 ++++++++++-------- .../pages/inspection_map/view.dart | 1 - .../inspection_map/widget/map/logic.dart | 2 +- .../lib/presentation/widget/captcha/view.dart | 4 + .../lib/presentation/widget/logo_widget.dart | 4 +- 7 files changed, 120 insertions(+), 79 deletions(-) diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index cc98965..81c2ff6 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -49,6 +49,7 @@ class RTextField extends StatefulWidget { final TextInputAction? textInputAction; final double? height; final Iterable? autofillHints; + final InputBorder? focusedBorder; const RTextField({ super.key, @@ -84,6 +85,7 @@ class RTextField extends StatefulWidget { this.hintStyle, this.labelStyle, this.errorStyle, + this.focusedBorder, // 🎨 Decorations this.suffixIcon, @@ -243,7 +245,7 @@ class _RTextFieldState extends State { counter: widget.showCounter ? null : const SizedBox(), hintStyle: widget.hintStyle, enabledBorder: widget._inputBorder, - focusedBorder: widget._inputBorder, + focusedBorder: widget.focusedBorder ?? widget._inputBorder, border: widget._inputBorder, ), ), diff --git a/packages/inspection/lib/presentation/pages/auth/logic.dart b/packages/inspection/lib/presentation/pages/auth/logic.dart index 0e157a2..3d3bc58 100644 --- a/packages/inspection/lib/presentation/pages/auth/logic.dart +++ b/packages/inspection/lib/presentation/pages/auth/logic.dart @@ -16,9 +16,13 @@ enum AuthStatus { init } enum OtpStatus { init, sent, verified, reSend } -class AuthLogic extends GetxController { +class AuthLogic extends GetxController with GetTickerProviderStateMixin { GlobalKey formKey = GlobalKey(); + late AnimationController _textAnimationController; + late Animation textAnimation; + RxBool showCard = false.obs; + Rx> formKeyOtp = GlobalKey().obs; Rx> formKeySentOtp = GlobalKey().obs; Rx usernameController = TextEditingController().obs; @@ -44,6 +48,31 @@ class AuthLogic extends GetxController { final Module _module = Get.arguments; + @override + void onInit() { + super.onInit(); + + _textAnimationController = + AnimationController(vsync: this, duration: const Duration(milliseconds: 1200)) + ..repeat(reverse: true, count: 2).whenComplete(() { + showCard.value = true; + }); + + textAnimation = CurvedAnimation(parent: _textAnimationController, curve: Curves.easeInOut); + } + + @override + void onReady() { + super.onReady(); + //_textAnimationController.forward(); + } + + @override + void onClose() { + _timer?.cancel(); + super.onClose(); + } + void startTimer() { _timer?.cancel(); secondsRemaining.value = 120; @@ -67,18 +96,6 @@ class AuthLogic extends GetxController { return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; } - @override - void onReady() { - super.onReady(); - iLog('module selected : ${_module.toString()}'); - } - - @override - void onClose() { - _timer?.cancel(); - super.onClose(); - } - bool _isFormValid() { final isCaptchaValid = captchaController.formKey.currentState?.validate() ?? false; final isFormValid = formKey.currentState?.validate() ?? false; diff --git a/packages/inspection/lib/presentation/pages/auth/view.dart b/packages/inspection/lib/presentation/pages/auth/view.dart index 0c10507..054ba37 100644 --- a/packages/inspection/lib/presentation/pages/auth/view.dart +++ b/packages/inspection/lib/presentation/pages/auth/view.dart @@ -13,86 +13,97 @@ class AuthPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - body: SingleChildScrollView( - child: Column( - children: [ - SizedBox(height: 80), - LogoWidget(), - ObxValue((types) { - switch (types.value) { - case AuthType.otp: - //return otpForm(); - case AuthType.useAndPass: - return useAndPassFrom(); - } - }, controller.authType), + body: Stack( + alignment: Alignment.center, - SizedBox(height: 20), - RichText( - text: TextSpan( + children: [ + Assets.vec.bgAuthSvg.svg(fit: BoxFit.fill), + + Padding( + padding: EdgeInsets.symmetric(horizontal: 10.r), + child: FadeTransition( + opacity: controller.textAnimation, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 12, children: [ - TextSpan( - text: 'مطالعه بیانیه ', - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDark), + Text( + 'به سامانه رصدیار خوش آمدید!', + textAlign: TextAlign.right, + style: AppFonts.yekan25Bold.copyWith(color: Colors.white), ), - TextSpan( - recognizer: TapGestureRecognizer() - ..onTap = () { - Get.bottomSheet( - privacyPolicyWidget(), - isScrollControlled: true, - enableDrag: true, - ignoreSafeArea: false, - ); - }, - text: 'حریم خصوصی', - style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + Text( + 'سامانه رصد و پایش زنجیره تامین، تولید و توزیع کالا های اساسی', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: Colors.white), ), ], ), ), - /* SizedBox(height: 18), + ), - ObxValue((types) { - return RichText( - text: TextSpan( + Obx(() { + final screenHeight = MediaQuery.of(context).size.height; + final targetTop = (screenHeight - 676) / 2; + + return AnimatedPositioned( + duration: const Duration(milliseconds: 1200), + curve: Curves.linear, + top: controller.showCard.value ? targetTop : screenHeight, + left: 10.r, + right: 10.r, + child: Container( + width: 381.w, + height: 676.h, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(40), + ), + child: Column( children: [ - TextSpan( - recognizer: - TapGestureRecognizer() - ..onTap = () { - if (controller.authType.value == AuthType.otp) { - controller.authType.value = AuthType.useAndPass; - if (controller.otpStatus.value != - OtpStatus.init) { - controller.otpStatus.value = OtpStatus.init; - } - } else { - controller.authType.value = AuthType.otp; - } - }, - text: - controller.authType.value == AuthType.otp - ? 'ورود با رمز ثابت' - : 'ورود با رمز یکبار مصرف', - - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, + SizedBox(height: 50.h), + LogoWidget(), + SizedBox(height: 20.h), + useAndPassFrom(), + SizedBox(height: 24.h), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: 'مطالعه بیانیه ', + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDark), + ), + TextSpan( + recognizer: TapGestureRecognizer() + ..onTap = () { + Get.bottomSheet( + privacyPolicyWidget(), + isScrollControlled: true, + enableDrag: true, + ignoreSafeArea: false, + ); + }, + text: 'حریم خصوصی', + style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + ), + ], ), ), ], ), - ); - }, controller.authType),*/ - ], - ), + ), + ); + }), + ], ), ); } Widget useAndPassFrom() { return Padding( - padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + padding: EdgeInsets.symmetric(horizontal: 30.r), child: Form( key: controller.formKey, child: AutofillGroup( @@ -106,6 +117,10 @@ class AuthPage extends GetView { keyboardType: TextInputType.number, initText: controller.usernameController.value.text, autofillHints: [AutofillHints.username], + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.textColor, width: 1), + ), onChanged: (value) async { controller.usernameController.value.text = value; controller.usernameController.refresh(); @@ -144,6 +159,10 @@ class AuthPage extends GetView { label: 'رمز عبور', filled: false, obscure: true, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.textColor, width: 1), + ), controller: passwordController.value, autofillHints: [AutofillHints.password], variant: RTextFieldVariant.password, diff --git a/packages/inspection/lib/presentation/pages/inspection_map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/view.dart index 044bc48..433fdb9 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/view.dart @@ -177,7 +177,6 @@ class InspectionMapPage extends GetView { } /* - Widget selectedLocationWidget2({ required bool showHint, required SlidableController sliderController, diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart index 07a483b..7612628 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart @@ -97,7 +97,7 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { isLoading.value = false; } -/* + /* void debouncedUpdateVisibleMarkers({required LatLng center, required double zoom}) { _debounceTimer?.cancel(); _debounceTimer = Timer(const Duration(milliseconds: 300), () { diff --git a/packages/inspection/lib/presentation/widget/captcha/view.dart b/packages/inspection/lib/presentation/widget/captcha/view.dart index 80278f9..1c727b7 100644 --- a/packages/inspection/lib/presentation/widget/captcha/view.dart +++ b/packages/inspection/lib/presentation/widget/captcha/view.dart @@ -50,6 +50,10 @@ class CaptchaWidget extends GetView { child: RTextField( label: 'کد امنیتی', controller: controller.textController, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.textColor, width: 1), + ), keyboardType: TextInputType.numberWithOptions(decimal: false, signed: false), maxLines: 1, maxLength: 6, diff --git a/packages/inspection/lib/presentation/widget/logo_widget.dart b/packages/inspection/lib/presentation/widget/logo_widget.dart index 4cf2a26..b8abdb1 100644 --- a/packages/inspection/lib/presentation/widget/logo_widget.dart +++ b/packages/inspection/lib/presentation/widget/logo_widget.dart @@ -10,8 +10,8 @@ class LogoWidget extends StatelessWidget { children: [ Row(), Assets.images.innerSplash.image( - width: 150, - height: 150, + width: 120.w, + height: 120.h, ), Text( 'سامانه رصدیار', From 8b698a8498e77ecd7bfdd6bb3e089a2da0e91524 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 2 Aug 2025 15:09:06 +0330 Subject: [PATCH 253/256] feat : new auth in chicken --- .../service/app_navigation_observer.dart | 7 +- lib/presentation/pages/modules/logic.dart | 2 +- lib/presentation/pages/modules/view.dart | 4 +- .../local/chicken_local.dart | 0 .../local/chicken_local_imp.dart | 3 +- .../data_source/remote/auth/auth_remote.dart | 13 + .../remote/auth/auth_remote_imp.dart | 50 ++ .../remote/chicken}/chicken_remote.dart | 0 .../remote/chicken}/chicken_remote_imp.dart | 4 +- packages/chicken/lib/data/di/chicken_di.dart | 79 ++- .../repositories/auth/auth_repository.dart | 12 + .../auth/auth_repository_imp.dart | 25 + .../{ => chicken}/chicken_repository.dart | 2 +- .../{ => chicken}/chicken_repository_imp.dart | 4 +- .../lib/presentation/pages/auth/logic.dart | 165 ++++++ .../lib/presentation/pages/auth/view.dart | 543 ++++++++++++++++++ .../lib/presentation/pages/root/logic.dart | 7 +- .../lib/presentation/routes/pages.dart | 12 + .../presentation/widget/captcha/logic.dart | 34 ++ .../lib/presentation/widget/captcha/view.dart | 111 ++++ .../presentation/widget/buttons/buttons.dart | 3 +- .../widget/buttons}/clear_button.dart | 0 .../lib/presentation/widget/logo_widget.dart | 0 .../core/lib/presentation/widget/widget.dart | 17 +- .../lib/presentation/pages/auth/view.dart | 95 +-- .../lib/presentation/routes/app_pages.dart | 18 +- .../lib/presentation/widget/captcha/view.dart | 14 +- 27 files changed, 1115 insertions(+), 109 deletions(-) rename packages/chicken/lib/data/{datasource => data_source}/local/chicken_local.dart (100%) rename packages/chicken/lib/data/{datasource => data_source}/local/chicken_local_imp.dart (95%) create mode 100644 packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart create mode 100644 packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart rename packages/chicken/lib/data/{datasource/remote => data_source/remote/chicken}/chicken_remote.dart (100%) rename packages/chicken/lib/data/{datasource/remote => data_source/remote/chicken}/chicken_remote_imp.dart (99%) create mode 100644 packages/chicken/lib/data/repositories/auth/auth_repository.dart create mode 100644 packages/chicken/lib/data/repositories/auth/auth_repository_imp.dart rename packages/chicken/lib/data/repositories/{ => chicken}/chicken_repository.dart (98%) rename packages/chicken/lib/data/repositories/{ => chicken}/chicken_repository_imp.dart (98%) create mode 100644 packages/chicken/lib/presentation/pages/auth/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/auth/view.dart create mode 100644 packages/chicken/lib/presentation/widget/captcha/logic.dart create mode 100644 packages/chicken/lib/presentation/widget/captcha/view.dart rename packages/{inspection/lib/presentation/widget => core/lib/presentation/widget/buttons}/clear_button.dart (100%) rename packages/{inspection => core}/lib/presentation/widget/logo_widget.dart (100%) diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart index 3cebc64..6438add 100644 --- a/lib/infrastructure/service/app_navigation_observer.dart +++ b/lib/infrastructure/service/app_navigation_observer.dart @@ -16,10 +16,11 @@ class CustomNavigationObserver extends NavigatorObserver { void didPush(Route route, Route? previousRoute) async { super.didPush(route, previousRoute); final routeName = route.settings.name; - if (!_isWorkDone && routeName == ChickenRoutes.init) { + if (!_isWorkDone &&( routeName == ChickenRoutes.init || routeName == ChickenRoutes.auth)) { _isWorkDone = true; - setupChickenDI(); - } else if (!_isWorkDone && (routeName == InspectionRoutes.init || routeName == InspectionRoutes.auth)) { + await setupChickenDI(); + } else if (!_isWorkDone && + (routeName == InspectionRoutes.init || routeName == InspectionRoutes.auth)) { _isWorkDone = true; await setupInspectionDI(); diff --git a/lib/presentation/pages/modules/logic.dart b/lib/presentation/pages/modules/logic.dart index d35b096..e73eefe 100644 --- a/lib/presentation/pages/modules/logic.dart +++ b/lib/presentation/pages/modules/logic.dart @@ -5,7 +5,7 @@ class ModulesLogic extends GetxController { List moduleList = [ ModuleModel(title: 'بازرسی', icon: Assets.icons.inspection.path, module: Module.inspection), - ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks), +// ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks), ModuleModel(title: 'مرغ', icon: Assets.icons.liveStock.path, module: Module.chicken), ]; diff --git a/lib/presentation/pages/modules/view.dart b/lib/presentation/pages/modules/view.dart index b1d1bbf..880050a 100644 --- a/lib/presentation/pages/modules/view.dart +++ b/lib/presentation/pages/modules/view.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/inspection.dart'; @@ -33,8 +34,9 @@ class ModulesPage extends GetView { Get.toNamed(InspectionRoutes.init); break; case Module.liveStocks: + //TODO: Implement liveStocks module navigation case Module.chicken: - Get.toNamed(InspectionRoutes.init); + Get.toNamed(ChickenRoutes.init); break; } }, diff --git a/packages/chicken/lib/data/datasource/local/chicken_local.dart b/packages/chicken/lib/data/data_source/local/chicken_local.dart similarity index 100% rename from packages/chicken/lib/data/datasource/local/chicken_local.dart rename to packages/chicken/lib/data/data_source/local/chicken_local.dart diff --git a/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart b/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart similarity index 95% rename from packages/chicken/lib/data/datasource/local/chicken_local_imp.dart rename to packages/chicken/lib/data/data_source/local/chicken_local_imp.dart index 663af1f..a8f2055 100644 --- a/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart +++ b/packages/chicken/lib/data/data_source/local/chicken_local_imp.dart @@ -1,8 +1,9 @@ import 'package:rasadyar_chicken/chicken.dart'; -import 'package:rasadyar_chicken/data/datasource/local/chicken_local.dart'; import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_core/core.dart'; +import 'chicken_local.dart'; + class ChickenLocalDataSourceImp implements ChickenLocalDataSource { HiveLocalStorage local = diCore.get(); final String boxName = 'Chicken_Widley_Box'; diff --git a/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart b/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart new file mode 100644 index 0000000..1705dcf --- /dev/null +++ b/packages/chicken/lib/data/data_source/remote/auth/auth_remote.dart @@ -0,0 +1,13 @@ +import 'package:rasadyar_chicken/data/models/response/captcha/captcha_response_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; + +abstract class AuthRemoteDataSource { + Future login({required Map authRequest}); + + Future logout(); + + Future hasAuthenticated(); + + Future getUserInfo(String phoneNumber); +} diff --git a/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart new file mode 100644 index 0000000..f25e8c2 --- /dev/null +++ b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart @@ -0,0 +1,50 @@ +import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'auth_remote.dart'; + +class AuthRemoteDataSourceImp extends AuthRemoteDataSource { + final DioRemote _httpClient; + final String _BASE_URL = 'auth/api/v1/'; + + AuthRemoteDataSourceImp(this._httpClient); + + @override + Future login({required Map authRequest}) async { + var res = await _httpClient.post( + '/api/login/', + data: authRequest, + fromJson: UserProfileModel.fromJson, + headers: {'Content-Type': 'application/json'}, + ); + return res.data; + } + + @override + Future logout() { + // TODO: implement logout + throw UnimplementedError(); + } + + @override + Future hasAuthenticated() async { + final response = await _httpClient.get( + '$_BASE_URL/login/', + headers: {'Content-Type': 'application/json'}, + ); + + return response.data ?? false; + } + + @override + Future getUserInfo(String phoneNumber) async { + var res = await _httpClient.post( + 'https://userbackend.rasadyaar.ir/api/send_otp/', + data: {"mobile": phoneNumber, "state": ""}, + fromJson: UserInfoModel.fromJson, + headers: {'Content-Type': 'application/json'}, + ); + return res.data; + } +} diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote.dart b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart similarity index 100% rename from packages/chicken/lib/data/datasource/remote/chicken_remote.dart rename to packages/chicken/lib/data/data_source/remote/chicken/chicken_remote.dart diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart similarity index 99% rename from packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart rename to packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart index 700f669..57df1fa 100644 --- a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart +++ b/packages/chicken/lib/data/data_source/remote/chicken/chicken_remote_imp.dart @@ -1,4 +1,4 @@ -import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote.dart'; + import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; @@ -24,6 +24,8 @@ import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_ar hide ProductModel; import 'package:rasadyar_core/core.dart'; +import 'chicken_remote.dart'; + class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource { final DioRemote _httpClient; diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index 45bf9ef..d85f410 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -1,17 +1,15 @@ -import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; -import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; -import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; -import 'package:rasadyar_chicken/hive_registrar.g.dart'; -import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/common/dio_error_handler.dart'; +import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote.dart'; +import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote_imp.dart'; +import 'package:rasadyar_chicken/data/repositories/auth/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; GetIt diChicken = GetIt.instance; Future setupChickenDI() async { + diChicken.registerSingleton(DioErrorHandler()); var tokenService = Get.find(); - Hive.registerAdapters(); - diChicken.registerLazySingleton(() => ChickenLocalDataSourceImp()); - diChicken.get().openBox(); diChicken.registerLazySingleton( () => AppInterceptor( @@ -24,32 +22,53 @@ Future setupChickenDI() async { await tokenService.deleteTokens(); Get.offAllNamed(ChickenRoutes.auth, arguments: Module.chicken); }, - authArguments: Module.chicken, ), instanceName: 'chickenInterceptor', ); - tokenService.getBaseUrl(); - - diChicken.registerLazySingleton(() { - return DioRemote( - baseUrl: tokenService.baseurl.value, - interceptors: diChicken.get(instanceName: 'chickenInterceptor'), - ); - }, instanceName: 'chickenDioRemote'); - - final dioRemote = diChicken.get(instanceName: 'chickenDioRemote'); - - await dioRemote.init(); - - diChicken.registerLazySingleton(() => ChickenRemoteDatasourceImp(dioRemote)); - - diChicken.registerLazySingleton( - () => ChickenRepositoryImp( - local: diChicken.get(), - remote: diChicken.get(), - ), + diChicken.registerLazySingleton( + () => + DioRemote(interceptors: diChicken.get(instanceName: 'chickenInterceptor')), ); - diChicken.registerSingleton(ImagePicker()); + final dioRemote = diChicken.get(); + await dioRemote.init(); + + diChicken.registerLazySingleton( + () => AuthRemoteDataSourceImp(diChicken.get()), + ); + + diChicken.registerLazySingleton( + () => AuthRepositoryImpl(diChicken.get()), + ); +} + +Future newSetupAuthDI(String newUrl) async { + var tokenService = Get.find(); + if (tokenService.baseurl.value == null) { + await tokenService.saveBaseUrl(newUrl); + } + + if (diChicken.isRegistered()) { + await diChicken.unregister(); + diChicken.registerLazySingleton( + () => DioRemote(baseUrl: newUrl, interceptors: diChicken.get()), + ); + final dioRemote = diChicken.get(); + await dioRemote.init(); + } + + if (diChicken.isRegistered()) { + await diChicken.unregister(); + diChicken.registerLazySingleton( + () => AuthRemoteDataSourceImp(diChicken.get()), + ); + } + + if (diChicken.isRegistered()) { + await diChicken.unregister(); + diChicken.registerLazySingleton( + () => AuthRepositoryImpl(diChicken.get()), + ); + } } diff --git a/packages/chicken/lib/data/repositories/auth/auth_repository.dart b/packages/chicken/lib/data/repositories/auth/auth_repository.dart new file mode 100644 index 0000000..c7914c5 --- /dev/null +++ b/packages/chicken/lib/data/repositories/auth/auth_repository.dart @@ -0,0 +1,12 @@ +import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; + +abstract class AuthRepository { + Future login({required Map authRequest}); + + Future logout(); + + Future hasAuthenticated(); + + Future getUserInfo(String phoneNumber); +} diff --git a/packages/chicken/lib/data/repositories/auth/auth_repository_imp.dart b/packages/chicken/lib/data/repositories/auth/auth_repository_imp.dart new file mode 100644 index 0000000..1b84d61 --- /dev/null +++ b/packages/chicken/lib/data/repositories/auth/auth_repository_imp.dart @@ -0,0 +1,25 @@ +import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote.dart'; +import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; + +import 'auth_repository.dart'; + +class AuthRepositoryImpl implements AuthRepository { + final AuthRemoteDataSource authRemote; + + AuthRepositoryImpl(this.authRemote); + + @override + Future login({required Map authRequest}) async => + await authRemote.login(authRequest: authRequest); + + @override + Future logout() async => await authRemote.logout(); + + @override + Future hasAuthenticated() async => await authRemote.hasAuthenticated(); + + @override + Future getUserInfo(String phoneNumber) async => + await authRemote.getUserInfo(phoneNumber); +} diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken/chicken_repository.dart similarity index 98% rename from packages/chicken/lib/data/repositories/chicken_repository.dart rename to packages/chicken/lib/data/repositories/chicken/chicken_repository.dart index 1d0aee9..62b4404 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken/chicken_repository.dart @@ -23,7 +23,7 @@ import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_ar hide ProductModel; import 'package:rasadyar_core/core.dart'; -import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import '../../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { //region Remote diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken/chicken_repository_imp.dart similarity index 98% rename from packages/chicken/lib/data/repositories/chicken_repository_imp.dart rename to packages/chicken/lib/data/repositories/chicken/chicken_repository_imp.dart index 6eaf786..d9d829e 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken/chicken_repository_imp.dart @@ -1,5 +1,5 @@ -import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; -import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; +import 'package:rasadyar_chicken/data/data_source/local/chicken_local_imp.dart'; +import 'package:rasadyar_chicken/data/data_source/remote/chicken/chicken_remote_imp.dart'; import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; diff --git a/packages/chicken/lib/presentation/pages/auth/logic.dart b/packages/chicken/lib/presentation/pages/auth/logic.dart new file mode 100644 index 0000000..bec91ab --- /dev/null +++ b/packages/chicken/lib/presentation/pages/auth/logic.dart @@ -0,0 +1,165 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/common/dio_error_handler.dart'; +import 'package:rasadyar_chicken/data/di/chicken_di.dart'; +import 'package:rasadyar_chicken/data/models/request/login_request/login_request_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart'; +import 'package:rasadyar_chicken/data/repositories/auth/auth_repository_imp.dart'; +import 'package:rasadyar_chicken/presentation/widget/captcha/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +enum AuthType { useAndPass, otp } + +enum AuthStatus { init } + +enum OtpStatus { init, sent, verified, reSend } + +class AuthLogic extends GetxController with GetTickerProviderStateMixin { + GlobalKey formKey = GlobalKey(); + + late AnimationController _textAnimationController; + late Animation textAnimation; + RxBool showCard = false.obs; + + Rx> formKeyOtp = GlobalKey().obs; + Rx> formKeySentOtp = GlobalKey().obs; + Rx usernameController = TextEditingController().obs; + Rx passwordController = TextEditingController().obs; + Rx phoneOtpNumberController = TextEditingController().obs; + Rx otpCodeController = TextEditingController().obs; + + var captchaController = Get.find(); + + RxnString phoneNumber = RxnString(null); + RxBool isLoading = false.obs; + RxBool isDisabled = true.obs; + TokenStorageService tokenStorageService = Get.find(); + + Rx authType = AuthType.useAndPass.obs; + Rx authStatus = AuthStatus.init.obs; + Rx otpStatus = OtpStatus.init.obs; + + RxInt secondsRemaining = 120.obs; + Timer? _timer; + + AuthRepositoryImpl authRepository = diChicken.get(); + + final Module _module = Get.arguments; + + @override + void onInit() { + super.onInit(); + + _textAnimationController = + AnimationController(vsync: this, duration: const Duration(milliseconds: 1200)) + ..repeat(reverse: true, count: 2).whenComplete(() { + showCard.value = true; + }); + + textAnimation = CurvedAnimation(parent: _textAnimationController, curve: Curves.easeInOut); + } + + @override + void onReady() { + super.onReady(); + + } + + @override + void onClose() { + _timer?.cancel(); + super.onClose(); + } + + void startTimer() { + _timer?.cancel(); + secondsRemaining.value = 120; + + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (secondsRemaining.value > 0) { + secondsRemaining.value--; + } else { + timer.cancel(); + } + }); + } + + void stopTimer() { + _timer?.cancel(); + } + + String get timeFormatted { + final minutes = secondsRemaining.value ~/ 60; + final seconds = secondsRemaining.value % 60; + return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; + } + + bool _isFormValid() { + final isCaptchaValid = captchaController.formKey.currentState?.validate() ?? false; + final isFormValid = formKey.currentState?.validate() ?? false; + return isCaptchaValid && isFormValid; + } + + LoginRequestModel _buildLoginRequest() { + final phone = usernameController.value.text; + final pass = passwordController.value.text; + final code = captchaController.textController.value.text; + final key = captchaController.captchaKey.value; + + return LoginRequestModel.createWithCaptcha( + username: phone, + password: pass, + captchaCode: code, + captchaKey: key!, + ); + } + + Future submitLoginForm() async { + if (!_isFormValid()) return; + AuthRepositoryImpl authTmp = diChicken.get(instanceName: 'newUrl'); + isLoading.value = true; + await safeCall( + call: () => authTmp.login( + authRequest: { + "username": usernameController.value.text, + "password": passwordController.value.text, + }, + ), + onSuccess: (result) async { + await tokenStorageService.saveModule(_module); + await tokenStorageService.saveAccessToken(result?.accessToken ?? ''); + await tokenStorageService.saveRefreshToken(result?.accessToken ?? ''); + }, + onError: (error, stackTrace) { + if (error is DioException) { + diChicken.get().handle(error); + } + captchaController.getCaptcha(); + }, + ); + isLoading.value = false; + } + + Future getUserInfo(String value) async { + isLoading.value = true; + await safeCall( + call: () async => await authRepository.getUserInfo(value), + onSuccess: (result) async { + if (result != null) { + await newSetupAuthDI(result.backend ?? ''); + await tokenStorageService.saveApiKey(result.apiKey ?? ''); + await tokenStorageService.saveBaseUrl(result.backend ?? ''); + } + }, + onError: (error, stackTrace) { + if (error is DioException) { + diChicken.get().handle(error); + } + captchaController.getCaptcha(); + }, + ); + isLoading.value = false; + } +} diff --git a/packages/chicken/lib/presentation/pages/auth/view.dart b/packages/chicken/lib/presentation/pages/auth/view.dart new file mode 100644 index 0000000..1700994 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/auth/view.dart @@ -0,0 +1,543 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/widget/captcha/view.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class AuthPage extends GetView { + const AuthPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + alignment: Alignment.center, + + children: [ + Assets.vec.bgAuthSvg.svg(fit: BoxFit.fill), + + Padding( + padding: EdgeInsets.symmetric(horizontal: 10.r), + child: FadeTransition( + opacity: controller.textAnimation, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 12, + children: [ + Text( + 'به سامانه رصدیار خوش آمدید!', + textAlign: TextAlign.right, + style: AppFonts.yekan25Bold.copyWith(color: Colors.white), + ), + Text( + 'سامانه رصد و پایش زنجیره تامین، تولید و توزیع کالا های اساسی', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: Colors.white), + ), + ], + ), + ), + ), + + Obx(() { + final screenHeight = MediaQuery.of(context).size.height; + final targetTop = (screenHeight - 676) / 2; + + return AnimatedPositioned( + duration: const Duration(milliseconds: 1200), + curve: Curves.linear, + top: controller.showCard.value ? targetTop : screenHeight, + left: 10.r, + right: 10.r, + child: Container( + width: 381.w, + height: 676.h, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(40), + ), + child: Column( + children: [ + SizedBox(height: 50.h), + LogoWidget(), + SizedBox(height: 20.h), + useAndPassFrom(), + SizedBox(height: 24.h), + RichText( + text: TextSpan( + children: [ + TextSpan( + text: 'مطالعه بیانیه ', + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDark), + ), + TextSpan( + recognizer: TapGestureRecognizer() + ..onTap = () { + Get.bottomSheet( + privacyPolicyWidget(), + isScrollControlled: true, + enableDrag: true, + ignoreSafeArea: false, + ); + }, + text: 'حریم خصوصی', + style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ], + ), + ), + ); + }), + ], + ), + ); + } + + Widget useAndPassFrom() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 30.r), + child: Form( + key: controller.formKey, + child: AutofillGroup( + child: Column( + children: [ + RTextField( + label: 'نام کاربری', + maxLength: 11, + maxLines: 1, + controller: controller.usernameController.value, + keyboardType: TextInputType.number, + initText: controller.usernameController.value.text, + autofillHints: [AutofillHints.username], + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.textColor, width: 1), + ), + onChanged: (value) async { + controller.usernameController.value.text = value; + if (value.length == 11) { + await controller.getUserInfo(value); + } + }, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: Assets.vec.callSvg.svg(width: 12, height: 12), + ), + suffixIcon: controller.usernameController.value.text.trim().isNotEmpty + ? clearButton(() { + controller.usernameController.value.clear(); + controller.usernameController.refresh(); + }) + : null, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 10) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), + labelStyle: AppFonts.yekan13, + boxConstraints: const BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + ), + const SizedBox(height: 26), + ObxValue( + (passwordController) => RTextField( + label: 'رمز عبور', + filled: false, + obscure: true, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.textColor, width: 1), + ), + controller: passwordController.value, + autofillHints: [AutofillHints.password], + variant: RTextFieldVariant.password, + initText: passwordController.value.text, + onChanged: (value) { + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), + labelStyle: AppFonts.yekan13, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: Assets.vec.keySvg.svg(width: 12, height: 12), + ), + boxConstraints: const BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + ), + controller.passwordController, + ), + SizedBox(height: 26), + CaptchaWidget(), + SizedBox(height: 23), + + Obx(() { + return RElevated( + text: 'ورود', + isLoading: controller.isLoading.value, + onPressed: controller.isDisabled.value + ? null + : () async { + await controller.submitLoginForm(); + }, + width: Get.width, + height: 48, + ); + }), + ], + ), + ), + ), + ); + } + + Widget privacyPolicyWidget() { + return BaseBottomSheet( + child: Column( + spacing: 5, + children: [ + Container( + padding: EdgeInsets.all(8.w), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 3, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'بيانيه حريم خصوصی', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Text( + 'اطلاعات مربوط به هر شخص، حریم خصوصی وی محسوب می‌شود. حفاظت و حراست از اطلاعات شخصی در سامانه رصد یار، نه تنها موجب حفظ امنیت کاربران می‌شود، بلکه باعث اعتماد بیشتر و مشارکت آنها در فعالیت‌های جاری می‌گردد. هدف از این بیانیه، آگاه ساختن شما درباره ی نوع و نحوه ی استفاده از اطلاعاتی است که در هنگام استفاده از سامانه رصد یار ، از جانب شما دریافت می‌گردد. شرکت هوشمند سازان خود را ملزم به رعایت حریم خصوصی همه شهروندان و کاربران سامانه دانسته و آن دسته از اطلاعات کاربران را که فقط به منظور ارائه خدمات کفایت می‌کند، دریافت کرده و از انتشار آن یا در اختیار قرار دادن آن به دیگران خودداری مینماید.', + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), + ), + ], + ), + ), + Container( + padding: EdgeInsets.all(8.w), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'چگونگی جمع آوری و استفاده از اطلاعات کاربران', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Text( + '''الف: اطلاعاتی که شما خود در اختيار این سامانه قرار می‌دهيد، شامل موارد زيرهستند: +اقلام اطلاعاتی شامل شماره تلفن همراه، تاریخ تولد، کد پستی و کد ملی کاربران را دریافت مینماییم که از این اقلام، صرفا جهت احراز هویت کاربران استفاده خواهد شد. +ب: برخی اطلاعات ديگر که به صورت خودکار از شما دريافت میشود شامل موارد زير می‌باشد: +⦁ دستگاهی که از طریق آن سامانه رصد یار را مشاهده می‌نمایید( تلفن همراه، تبلت، رایانه). +⦁ نام و نسخه سیستم عامل و browser کامپیوتر شما. +⦁ اطلاعات صفحات بازدید شده. +⦁ تعداد بازدیدهای روزانه در درگاه. +⦁ هدف ما از دریافت این اطلاعات استفاده از آنها در تحلیل عملکرد کاربران درگاه می باشد تا بتوانیم در خدمت رسانی بهتر عمل کنیم. +''', + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), + ), + ], + ), + ), + Container( + padding: EdgeInsets.all(8.w), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'امنیت اطلاعات', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Text( + 'متعهدیم که امنیت اطلاعات شما را تضمین نماییم و برای جلوگیری از هر نوع دسترسی غیرمجاز و افشای اطلاعات شما از همه شیوه‌‌های لازم استفاده می‌کنیم تا امنیت اطلاعاتی را که به صورت آنلاین گردآوری می‌کنیم، حفظ شود. لازم به ذکر است در سامانه ما، ممکن است به سایت های دیگری لینک شوید، وقتی که شما از طریق این لینک‌ها از سامانه ما خارج می‌شوید، توجه داشته باشید که ما بر دیگر سایت ها کنترل نداریم و سازمان تعهدی بر حفظ حریم شخصی آنان در سایت مقصد نخواهد داشت و مراجعه کنندگان میبایست به بیانیه حریم شخصی آن سایت ها مراجعه نمایند.', + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), + ), + ], + ), + ), + ], + ), + ); + } + + /* + Widget sendCodeForm() { + return ObxValue((data) { + return Form( + key: data.value, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Column( + children: [ + SizedBox(height: 26), + ObxValue((phoneController) { + return TextFormField( + controller: phoneController.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'شماره موبایل', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + prefixIconConstraints: BoxConstraints( + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: vecWidget(Assets.vecCallSvg), + ), + suffix: + phoneController.value.text.trim().isNotEmpty + ? clearButton(() { + phoneController.value.clear(); + phoneController.refresh(); + }) + : null, + counterText: '', + ), + keyboardType: TextInputType.numberWithOptions( + decimal: false, + signed: false, + ), + maxLines: 1, + maxLength: 11, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + data.refresh(); + phoneController.value.text = value; + } + phoneController.refresh(); + }, + textInputAction: TextInputAction.next, + validator: (value) { + if (value == null) { + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.phoneOtpNumberController), + + SizedBox(height: 26), + + CaptchaWidget(), + + SizedBox(height: 23), + RElevated( + text: 'ارسال رمز یکبار مصرف', + onPressed: () { + if (data.value.currentState?.validate() == true) { + controller.otpStatus.value = OtpStatus.sent; + controller.startTimer(); + } + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKeyOtp); + } + + Widget confirmCodeForm() { + return ObxValue((data) { + return Form( + key: data.value, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), + child: Column( + children: [ + SizedBox(height: 26), + + ObxValue((passwordController) { + return TextFormField( + controller: passwordController.value, + obscureText: controller.hidePassword.value, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + gapPadding: 11, + ), + labelText: 'رمز عبور', + labelStyle: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith( + color: AppColor.redNormal, + ), + + prefixIconConstraints: BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: vecWidget(Assets.vecKeySvg), + ), + suffix: + passwordController.value.text.trim().isNotEmpty + ? GestureDetector( + onTap: () { + controller.hidePassword.value = + !controller.hidePassword.value; + }, + child: Icon( + controller.hidePassword.value + ? CupertinoIcons.eye + : CupertinoIcons.eye_slash, + ), + ) + : null, + counterText: '', + ), + textInputAction: TextInputAction.done, + keyboardType: TextInputType.visiblePassword, + maxLines: 1, + onChanged: (value) { + if (controller.isOnError.value) { + controller.isOnError.value = !controller.isOnError.value; + data.value.currentState?.reset(); + passwordController.value.text = value; + } + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; // "Please enter the password" + } + return null; + }, + style: AppFonts.yekan13, + ); + }, controller.passwordController), + + SizedBox(height: 23), + + ObxValue((timer) { + if (timer.value == 0) { + return TextButton( + onPressed: () { + controller.otpStatus.value = OtpStatus.reSend; + controller.startTimer(); + }, + child: Text( + style: AppFonts.yekan13.copyWith( + color: AppColor.blueNormal, + ), + 'ارسال مجدد کد یکبار مصرف', + ), + ); + } else { + return Text( + 'اعتبار رمز ارسال شده ${controller.timeFormatted}', + style: AppFonts.yekan13, + ); + } + }, controller.secondsRemaining), + + RichText( + text: TextSpan( + children: [ + TextSpan( + text: ' کد ارسال شده به شماره ', + style: AppFonts.yekan14.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + text: controller.phoneOtpNumberController.value.text, + style: AppFonts.yekan13Bold.copyWith( + color: AppColor.darkGreyDark, + ), + ), + TextSpan( + recognizer: + TapGestureRecognizer() + ..onTap = () { + controller.otpStatus.value = OtpStatus.init; + }, + text: ' ویرایش', + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + ], + ), + ), + + SizedBox(height: 23), + RElevated( + text: 'ورود', + onPressed: () { + if (controller.formKeyOtp.value.currentState?.validate() == + true) {} + }, + width: Get.width, + height: 48, + ), + ], + ), + ), + ); + }, controller.formKeySentOtp); + }*/ +} diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index bc67ca1..570614a 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,14 +1,15 @@ import 'dart:async'; import 'package:flutter/widgets.dart'; -import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; +import 'package:rasadyar_chicken/data/data_source/local/chicken_local_imp.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; -import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; +import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository.dart'; +import 'package:rasadyar_chicken/data/repositories/chicken/chicken_repository_imp.dart'; + import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/profile/view.dart'; diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 09f4f78..c86c424 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,3 +1,5 @@ +import 'package:rasadyar_chicken/presentation/pages/auth/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/auth/view.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province/logic.dart'; @@ -23,6 +25,7 @@ import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_ import 'package:rasadyar_chicken/presentation/pages/segmentation/logic.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; +import 'package:rasadyar_chicken/presentation/widget/captcha/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/search/logic.dart'; import 'package:rasadyar_core/core.dart'; @@ -30,6 +33,15 @@ sealed class ChickenPages { ChickenPages._(); static final pages = [ + GetPage( + name: ChickenRoutes.auth, + page: () => AuthPage(), + binding: BindingsBuilder(() { + Get.lazyPut(() => AuthLogic()); + Get.lazyPut(() => CaptchaWidgetLogic()); + }), + ), + GetPage( name: ChickenRoutes.init, page: () => RootPage(), diff --git a/packages/chicken/lib/presentation/widget/captcha/logic.dart b/packages/chicken/lib/presentation/widget/captcha/logic.dart new file mode 100644 index 0000000..806df2a --- /dev/null +++ b/packages/chicken/lib/presentation/widget/captcha/logic.dart @@ -0,0 +1,34 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class CaptchaWidgetLogic extends GetxController with StateMixin { + TextEditingController textController = TextEditingController(); + RxnString captchaKey = RxnString(); + GlobalKey formKey = GlobalKey(); + + final Random random = Random(); + + @override + void onInit() { + super.onInit(); + + getCaptcha(); + } + + @override + void onClose() { + textController.clear(); + textController.dispose(); + super.onClose(); + } + + Future getCaptcha() async { + change(null, status: RxStatus.loading()); + textController.clear(); + await Future.delayed(Duration(milliseconds: 500)); + captchaKey.value = (random.nextInt(900_000) + 100_000).toString(); + change(captchaKey.value, status: RxStatus.success()); + } +} diff --git a/packages/chicken/lib/presentation/widget/captcha/view.dart b/packages/chicken/lib/presentation/widget/captcha/view.dart new file mode 100644 index 0000000..364bf9c --- /dev/null +++ b/packages/chicken/lib/presentation/widget/captcha/view.dart @@ -0,0 +1,111 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/auth/logic.dart'; +import 'package:rasadyar_core/core.dart'; + + +import 'logic.dart'; + +class CaptchaWidget extends GetView { + const CaptchaWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: controller.getCaptcha, + child: Container( + width: 135, + height: 50, + alignment: Alignment.center, + clipBehavior: Clip.antiAliasWithSaveLayer, + decoration: BoxDecoration( + color: AppColor.whiteNormalHover, + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(8), + ), + child: controller.obx( + (state) =>Text( + state ?? '', + style: AppFonts.yekan20Bold.copyWith(color: Colors.black,letterSpacing: 2.5), + textAlign: TextAlign.center, + ), + onLoading: const Center( + child: CupertinoActivityIndicator(color: AppColor.blueNormal), + ), + onError: (error) { + return Center( + child: Text('خطا ', style: AppFonts.yekan13.copyWith(color: Colors.red)), + ); + }, + ), + ), + ), + + const SizedBox(width: 8), + Expanded( + child: Form( + key: controller.formKey, + autovalidateMode: AutovalidateMode.disabled, + child: RTextField( + label: 'کد امنیتی', + controller: controller.textController, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.textColor, width: 1), + ), + keyboardType: TextInputType.numberWithOptions(decimal: false, signed: false), + maxLines: 1, + maxLength: 6, + suffixIcon: (controller.textController.text.trim().isNotEmpty ?? false) + ? clearButton(() => controller.textController.clear()) + : null, + + validator: (value) { + if (value == null || value.isEmpty) { + return 'کد امنیتی را وارد کنید'; + } + return null; + }, + onChanged: (pass) { + if (pass.length == 6) { + if (controller.formKey.currentState?.validate() ?? false) { + Get.find().isDisabled.value = false; + } + } + }, + style: AppFonts.yekan13, + ), + ), + ), + ], + ); + } +} + +class _CaptchaLinePainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final random = Random(); + final paint1 = Paint() + ..color = Colors.deepOrange + ..strokeWidth = 2; + final paint2 = Paint() + ..color = Colors.blue + ..strokeWidth = 2; + + // First line: top-left to bottom-right + canvas.drawLine(Offset(0, 0), Offset(size.width, size.height), paint1); + + // Second line: bottom-left to top-right + canvas.drawLine(Offset(0, size.height), Offset(size.width, 0), paint2); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/packages/core/lib/presentation/widget/buttons/buttons.dart b/packages/core/lib/presentation/widget/buttons/buttons.dart index bbb8a45..7dd4917 100644 --- a/packages/core/lib/presentation/widget/buttons/buttons.dart +++ b/packages/core/lib/presentation/widget/buttons/buttons.dart @@ -4,4 +4,5 @@ export 'fab.dart'; export 'fab_outlined.dart'; export 'outline_elevated.dart'; export 'outline_elevated_icon.dart'; -export 'text_button.dart'; \ No newline at end of file +export 'text_button.dart'; +export 'clear_button.dart'; \ No newline at end of file diff --git a/packages/inspection/lib/presentation/widget/clear_button.dart b/packages/core/lib/presentation/widget/buttons/clear_button.dart similarity index 100% rename from packages/inspection/lib/presentation/widget/clear_button.dart rename to packages/core/lib/presentation/widget/buttons/clear_button.dart diff --git a/packages/inspection/lib/presentation/widget/logo_widget.dart b/packages/core/lib/presentation/widget/logo_widget.dart similarity index 100% rename from packages/inspection/lib/presentation/widget/logo_widget.dart rename to packages/core/lib/presentation/widget/logo_widget.dart diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 42bb4a4..9a8b1a3 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -3,6 +3,7 @@ export 'bottom_navigation/r_bottom_navigation.dart'; export 'bottom_navigation/wave_bottom_navigation.dart'; export 'bottom_sheet/base_bottom_sheet.dart'; export 'bottom_sheet/date_picker_bottom_sheet.dart'; +//buttons export 'buttons/buttons.dart'; export 'card/card_with_icon_with_border.dart'; export 'chips/r_chips.dart'; @@ -12,6 +13,13 @@ export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; export 'empty_widget.dart'; +//inputs +export 'inputs/inputs.dart'; +//list_item +export 'list_item/list_item.dart'; +export 'list_item/list_item2.dart'; +export 'list_item/list_item_with_out_number.dart'; +export 'list_row_item.dart'; export 'list_view/list_view.dart'; export 'loading_widget.dart'; export 'overlay_dropdown_widget/view.dart'; @@ -21,11 +29,6 @@ export 'tabs/new_tab.dart'; export 'tabs/r_segment.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; -export 'list_row_item.dart'; -//inputs -export 'inputs/inputs.dart'; -//list_item -export 'list_item/list_item.dart'; -export 'list_item/list_item2.dart'; -export 'list_item/list_item_with_out_number.dart'; +// other +export 'logo_widget.dart'; diff --git a/packages/inspection/lib/presentation/pages/auth/view.dart b/packages/inspection/lib/presentation/pages/auth/view.dart index 054ba37..6ab8612 100644 --- a/packages/inspection/lib/presentation/pages/auth/view.dart +++ b/packages/inspection/lib/presentation/pages/auth/view.dart @@ -2,9 +2,6 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/presentation/widget/captcha/view.dart'; -import 'package:rasadyar_inspection/presentation/widget/clear_button.dart'; -import 'package:rasadyar_inspection/presentation/widget/logo_widget.dart'; - import 'logic.dart'; class AuthPage extends GetView { @@ -45,7 +42,10 @@ class AuthPage extends GetView { ), Obx(() { - final screenHeight = MediaQuery.of(context).size.height; + final screenHeight = MediaQuery + .of(context) + .size + .height; final targetTop = (screenHeight - 676) / 2; return AnimatedPositioned( @@ -129,11 +129,13 @@ class AuthPage extends GetView { padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), child: Assets.vec.callSvg.svg(width: 12, height: 12), ), - suffixIcon: controller.usernameController.value.text.trim().isNotEmpty + suffixIcon: controller.usernameController.value.text + .trim() + .isNotEmpty ? clearButton(() { - controller.usernameController.value.clear(); - controller.usernameController.refresh(); - }) + controller.usernameController.value.clear(); + controller.usernameController.refresh(); + }) : null, validator: (value) { if (value == null || value.isEmpty) { @@ -155,41 +157,42 @@ class AuthPage extends GetView { ), const SizedBox(height: 26), ObxValue( - (passwordController) => RTextField( - label: 'رمز عبور', - filled: false, - obscure: true, - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: AppColor.textColor, width: 1), - ), - controller: passwordController.value, - autofillHints: [AutofillHints.password], - variant: RTextFieldVariant.password, - initText: passwordController.value.text, - onChanged: (value) { - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; - } - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), - labelStyle: AppFonts.yekan13, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: Assets.vec.keySvg.svg(width: 12, height: 12), - ), - boxConstraints: const BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - ), + (passwordController) => + RTextField( + label: 'رمز عبور', + filled: false, + obscure: true, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: BorderSide(color: AppColor.textColor, width: 1), + ), + controller: passwordController.value, + autofillHints: [AutofillHints.password], + variant: RTextFieldVariant.password, + initText: passwordController.value.text, + onChanged: (value) { + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), + labelStyle: AppFonts.yekan13, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: Assets.vec.keySvg.svg(width: 12, height: 12), + ), + boxConstraints: const BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + ), controller.passwordController, ), SizedBox(height: 26), @@ -203,8 +206,8 @@ class AuthPage extends GetView { onPressed: controller.isDisabled.value ? null : () async { - await controller.submitLoginForm(); - }, + await controller.submitLoginForm(); + }, width: Get.width, height: 48, ); @@ -305,7 +308,7 @@ class AuthPage extends GetView { ); } - /* +/* Widget sendCodeForm() { return ObxValue((data) { return Form( diff --git a/packages/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart index 02ac975..e6cc067 100644 --- a/packages/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -13,6 +13,15 @@ sealed class InspectionPages { InspectionPages._(); static final pages = [ + + GetPage( + name: InspectionRoutes.auth, + page: () => AuthPage(), + binding: BindingsBuilder(() { + Get.lazyPut(() => AuthLogic()); + Get.lazyPut(() => CaptchaWidgetLogic()); + }), + ), GetPage( name: InspectionRoutes.init, page: () => RootPage(), @@ -64,13 +73,6 @@ sealed class InspectionPages { page: () => AddMobileInspectorPage(), binding: BindingsBuilder.put(() => AddMobileInspectorLogic()), ), - GetPage( - name: InspectionRoutes.auth, - page: () => AuthPage(), - binding: BindingsBuilder(() { - Get.lazyPut(() => AuthLogic()); - Get.lazyPut(() => CaptchaWidgetLogic()); - }), - ), + ]; } diff --git a/packages/inspection/lib/presentation/widget/captcha/view.dart b/packages/inspection/lib/presentation/widget/captcha/view.dart index 1c727b7..d66d57a 100644 --- a/packages/inspection/lib/presentation/widget/captcha/view.dart +++ b/packages/inspection/lib/presentation/widget/captcha/view.dart @@ -5,7 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/presentation/pages/auth/logic.dart'; -import 'package:rasadyar_inspection/presentation/widget/clear_button.dart'; + import 'logic.dart'; @@ -29,7 +29,8 @@ class CaptchaWidget extends GetView { borderRadius: BorderRadius.circular(8), ), child: controller.obx( - (state) => Image.memory(base64Decode(state?.captchaImage ?? ''), fit: BoxFit.cover), + (state) => + Image.memory(base64Decode(state?.captchaImage ?? ''), fit: BoxFit.cover), onLoading: const Center( child: CupertinoActivityIndicator(color: AppColor.blueNormal), ), @@ -57,7 +58,9 @@ class CaptchaWidget extends GetView { keyboardType: TextInputType.numberWithOptions(decimal: false, signed: false), maxLines: 1, maxLength: 6, - suffixIcon: (controller.textController.text.trim().isNotEmpty ?? false) + suffixIcon: (controller.textController.text + .trim() + .isNotEmpty ?? false) ? clearButton(() => controller.textController.clear()) : null, @@ -70,7 +73,10 @@ class CaptchaWidget extends GetView { onChanged: (pass) { if (pass.length == 6) { if (controller.formKey.currentState?.validate() ?? false) { - Get.find().isDisabled.value = false; + Get + .find() + .isDisabled + .value = false; } } }, From 9314ace295b5ab3444763d9e37f4e682f4e274e2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 2 Aug 2025 15:11:23 +0330 Subject: [PATCH 254/256] feat : new auth in chicken --- packages/chicken/lib/presentation/widget/captcha/view.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/chicken/lib/presentation/widget/captcha/view.dart b/packages/chicken/lib/presentation/widget/captcha/view.dart index 364bf9c..b3418a9 100644 --- a/packages/chicken/lib/presentation/widget/captcha/view.dart +++ b/packages/chicken/lib/presentation/widget/captcha/view.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:math'; import 'package:flutter/cupertino.dart'; @@ -6,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/presentation/pages/auth/logic.dart'; import 'package:rasadyar_core/core.dart'; - import 'logic.dart'; class CaptchaWidget extends GetView { @@ -30,9 +28,9 @@ class CaptchaWidget extends GetView { borderRadius: BorderRadius.circular(8), ), child: controller.obx( - (state) =>Text( + (state) => Text( state ?? '', - style: AppFonts.yekan20Bold.copyWith(color: Colors.black,letterSpacing: 2.5), + style: AppFonts.yekan20Bold.copyWith(color: Colors.black, letterSpacing: 2.5), textAlign: TextAlign.center, ), onLoading: const Center( From f862c93c738c024439d8407dbe19736f0ddac0c4 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 3 Aug 2025 09:57:48 +0330 Subject: [PATCH 255/256] feat : location details --- .../lib/utils/extension/string_utils.dart | 19 +- .../remote/inspection/inspection_remote.dart | 6 + .../inspection/inspection_remote_imp.dart | 14 + .../hatching_details/hatching_details.dart | 2 +- .../hatching_details.freezed.dart | 28 +- .../hatching_details/hatching_details.g.dart | 2 +- .../inspection/inspection_repository.dart | 6 + .../inspection/inspection_repository_imp.dart | 6 + .../inspection_map/widget/map/logic.dart | 32 + .../pages/inspection_map/widget/map/view.dart | 1100 +++++++---------- tools/vecGeneratoe.sh | 1 + 11 files changed, 537 insertions(+), 679 deletions(-) diff --git a/packages/core/lib/utils/extension/string_utils.dart b/packages/core/lib/utils/extension/string_utils.dart index 6e7062b..fbe263e 100644 --- a/packages/core/lib/utils/extension/string_utils.dart +++ b/packages/core/lib/utils/extension/string_utils.dart @@ -12,15 +12,24 @@ extension XString on String { return replaceAll(RegExp(r'\D'), ''); } + String get addCountEXT { + return '$thisعدد'; + } + String get addDayEXT { + return '$thisروزه'; + } - get toDateTime => DateTime.parse(this); + String get addKgEXT { + return '$thisکیلوگرم'; + } + + DateTime get toDateTime => DateTime.parse(this); String get formattedJalaliDate { String tmp = contains("/") ? replaceAll("/", "-") : this; final dateTime = DateTime.parse(tmp); final jalaliDate = Jalali.fromDateTime(dateTime); return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; - } String get formattedJalaliDateYHMS { @@ -33,10 +42,10 @@ extension XString on String { return DateFormat('yyyy-MM-dd HH:mm:ss').format(toDateTime); } - Jalali get toJalali{ + Jalali get toJalali { final dateTime = DateTime.parse(this); return Jalali.fromDateTime(dateTime); } - int get versionNumber => int.parse(replaceAll(".",'')); -} \ No newline at end of file + int get versionNumber => int.parse(replaceAll(".", '')); +} diff --git a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart index d267c96..467ea0c 100644 --- a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart +++ b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_inspection/data/model/response/hatching_details/hatching_details.dart'; import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; abstract class InspectionRemoteDataSource { @@ -19,4 +20,9 @@ abstract class InspectionRemoteDataSource { double? radius, String? value, }); + + Future?> getHatchingDetails({ + String? code, + bool? active, + }); } diff --git a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart index 08ac5a2..ec636b2 100644 --- a/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart +++ b/packages/inspection/lib/data/data_source/remote/inspection/inspection_remote_imp.dart @@ -1,5 +1,6 @@ import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/data/data_source/remote/inspection/inspection_remote.dart'; +import 'package:rasadyar_inspection/data/model/response/hatching_details/hatching_details.dart'; import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; class InspectionRemoteDataSourceImp implements InspectionRemoteDataSource { @@ -45,4 +46,17 @@ class InspectionRemoteDataSourceImp implements InspectionRemoteDataSource { return res.data; } + + @override + Future?> getHatchingDetails({String? code, bool? active}) async { + DioRemote dioRemote = DioRemote(baseUrl: 'https://habackend.rasadyaar.ir/'); + await dioRemote.init(); + var res = await dioRemote.get( + "get_hatching_for_bazrasi/", + queryParameters: buildRawQueryParams(queryParams: {'code': code, 'active': active}), + headers: {'Content-Type': 'application/json'}, + fromJsonList: (json) => json.map((e) => HatchingDetails.fromJson(e)).toList(), + ); + return res.data; + } } diff --git a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart index f8b606d..de8e28a 100644 --- a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart +++ b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.dart @@ -6,7 +6,7 @@ part 'hatching_details.g.dart'; @freezed abstract class HatchingDetails with _$HatchingDetails { const factory HatchingDetails({ - required int id, + int? id, String? chainCompany, int? age, dynamic inspectionLosses, diff --git a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart index e7d53d6..2bbf91e 100644 --- a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart +++ b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.freezed.dart @@ -15,7 +15,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$HatchingDetails { - int get id; String? get chainCompany; int? get age; dynamic get inspectionLosses; VetFarm? get vetFarm; ActiveKill? get activeKill; KillingInfo? get killingInfo; FreeGovernmentalInfo? get freeGovernmentalInfo; String? get key; DateTime? get createDate; DateTime? get modifyDate; bool? get trash; bool? get hasChainCompany; dynamic get poultryIdForeignKey; dynamic get poultryHatchingIdKey; int? get quantity; int? get losses; int? get leftOver; int? get killedQuantity; int? get extraKilledQuantity; double? get governmentalKilledQuantity; double? get governmentalQuantity; double? get freeKilledQuantity; double? get freeQuantity; double? get chainKilledQuantity; double? get chainKilledWeight; double? get outProvinceKilledWeight; double? get outProvinceKilledQuantity; double? get exportKilledWeight; double? get exportKilledQuantity; double? get totalCommitment; String? get commitmentType; double? get totalCommitmentQuantity; double? get totalFreeCommitmentQuantity; double? get totalFreeCommitmentWeight; double? get totalKilledWeight; double? get totalAverageKilledWeight; int? get requestLeftOver; int? get hall; DateTime? get date; DateTime? get predicateDate; String? get chickenBreed; int? get period; String? get allowHatching; String? get state; bool? get archive; bool? get violation; dynamic get message; dynamic get registrar; List? get breed; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; LastChange? get lastChange; int? get chickenAge; int? get nowAge; LatestHatchingChange? get latestHatchingChange; dynamic get violationReport; String? get violationMessage; dynamic get violationImage; dynamic get violationReporter; dynamic get violationReportDate; dynamic get violationReportEditor; dynamic get violationReportEditDate; int? get totalLosses; int? get directLosses; dynamic get directLossesInputer; dynamic get directLossesDate; dynamic get directLossesEditor; dynamic get directLossesLastEditDate; dynamic get endPeriodLossesInputer; dynamic get endPeriodLossesDate; dynamic get endPeriodLossesEditor; dynamic get endPeriodLossesLastEditDate; String? get breedingUniqueId; String? get licenceNumber; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get firstDateInputArchive; dynamic get secondDateInputArchive; dynamic get inputArchiver; dynamic get outputArchiveDate; dynamic get outputArchiver; double? get barDifferenceRequestWeight; double? get barDifferenceRequestQuantity; dynamic get healthCertificate; int? get samasatDischargePercentage; String? get personTypeName; String? get interactTypeName; String? get unionTypeName; String? get certId; int? get increaseQuantity; dynamic get tenantFullname; dynamic get tenantNationalCode; dynamic get tenantMobile; dynamic get tenantCity; bool? get hasTenant; dynamic get createdBy; dynamic get modifiedBy; int? get poultry; + int? get id; String? get chainCompany; int? get age; dynamic get inspectionLosses; VetFarm? get vetFarm; ActiveKill? get activeKill; KillingInfo? get killingInfo; FreeGovernmentalInfo? get freeGovernmentalInfo; String? get key; DateTime? get createDate; DateTime? get modifyDate; bool? get trash; bool? get hasChainCompany; dynamic get poultryIdForeignKey; dynamic get poultryHatchingIdKey; int? get quantity; int? get losses; int? get leftOver; int? get killedQuantity; int? get extraKilledQuantity; double? get governmentalKilledQuantity; double? get governmentalQuantity; double? get freeKilledQuantity; double? get freeQuantity; double? get chainKilledQuantity; double? get chainKilledWeight; double? get outProvinceKilledWeight; double? get outProvinceKilledQuantity; double? get exportKilledWeight; double? get exportKilledQuantity; double? get totalCommitment; String? get commitmentType; double? get totalCommitmentQuantity; double? get totalFreeCommitmentQuantity; double? get totalFreeCommitmentWeight; double? get totalKilledWeight; double? get totalAverageKilledWeight; int? get requestLeftOver; int? get hall; DateTime? get date; DateTime? get predicateDate; String? get chickenBreed; int? get period; String? get allowHatching; String? get state; bool? get archive; bool? get violation; dynamic get message; dynamic get registrar; List? get breed; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; LastChange? get lastChange; int? get chickenAge; int? get nowAge; LatestHatchingChange? get latestHatchingChange; dynamic get violationReport; String? get violationMessage; dynamic get violationImage; dynamic get violationReporter; dynamic get violationReportDate; dynamic get violationReportEditor; dynamic get violationReportEditDate; int? get totalLosses; int? get directLosses; dynamic get directLossesInputer; dynamic get directLossesDate; dynamic get directLossesEditor; dynamic get directLossesLastEditDate; dynamic get endPeriodLossesInputer; dynamic get endPeriodLossesDate; dynamic get endPeriodLossesEditor; dynamic get endPeriodLossesLastEditDate; String? get breedingUniqueId; String? get licenceNumber; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get firstDateInputArchive; dynamic get secondDateInputArchive; dynamic get inputArchiver; dynamic get outputArchiveDate; dynamic get outputArchiver; double? get barDifferenceRequestWeight; double? get barDifferenceRequestQuantity; dynamic get healthCertificate; int? get samasatDischargePercentage; String? get personTypeName; String? get interactTypeName; String? get unionTypeName; String? get certId; int? get increaseQuantity; dynamic get tenantFullname; dynamic get tenantNationalCode; dynamic get tenantMobile; dynamic get tenantCity; bool? get hasTenant; dynamic get createdBy; dynamic get modifiedBy; int? get poultry; /// Create a copy of HatchingDetails /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -48,7 +48,7 @@ abstract mixin class $HatchingDetailsCopyWith<$Res> { factory $HatchingDetailsCopyWith(HatchingDetails value, $Res Function(HatchingDetails) _then) = _$HatchingDetailsCopyWithImpl; @useResult $Res call({ - int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry + int? id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry }); @@ -65,10 +65,10 @@ class _$HatchingDetailsCopyWithImpl<$Res> /// Create a copy of HatchingDetails /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? chainCompany = freezed,Object? age = freezed,Object? inspectionLosses = freezed,Object? vetFarm = freezed,Object? activeKill = freezed,Object? killingInfo = freezed,Object? freeGovernmentalInfo = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? hasChainCompany = freezed,Object? poultryIdForeignKey = freezed,Object? poultryHatchingIdKey = freezed,Object? quantity = freezed,Object? losses = freezed,Object? leftOver = freezed,Object? killedQuantity = freezed,Object? extraKilledQuantity = freezed,Object? governmentalKilledQuantity = freezed,Object? governmentalQuantity = freezed,Object? freeKilledQuantity = freezed,Object? freeQuantity = freezed,Object? chainKilledQuantity = freezed,Object? chainKilledWeight = freezed,Object? outProvinceKilledWeight = freezed,Object? outProvinceKilledQuantity = freezed,Object? exportKilledWeight = freezed,Object? exportKilledQuantity = freezed,Object? totalCommitment = freezed,Object? commitmentType = freezed,Object? totalCommitmentQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? totalFreeCommitmentWeight = freezed,Object? totalKilledWeight = freezed,Object? totalAverageKilledWeight = freezed,Object? requestLeftOver = freezed,Object? hall = freezed,Object? date = freezed,Object? predicateDate = freezed,Object? chickenBreed = freezed,Object? period = freezed,Object? allowHatching = freezed,Object? state = freezed,Object? archive = freezed,Object? violation = freezed,Object? message = freezed,Object? registrar = freezed,Object? breed = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? lastChange = freezed,Object? chickenAge = freezed,Object? nowAge = freezed,Object? latestHatchingChange = freezed,Object? violationReport = freezed,Object? violationMessage = freezed,Object? violationImage = freezed,Object? violationReporter = freezed,Object? violationReportDate = freezed,Object? violationReportEditor = freezed,Object? violationReportEditDate = freezed,Object? totalLosses = freezed,Object? directLosses = freezed,Object? directLossesInputer = freezed,Object? directLossesDate = freezed,Object? directLossesEditor = freezed,Object? directLossesLastEditDate = freezed,Object? endPeriodLossesInputer = freezed,Object? endPeriodLossesDate = freezed,Object? endPeriodLossesEditor = freezed,Object? endPeriodLossesLastEditDate = freezed,Object? breedingUniqueId = freezed,Object? licenceNumber = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? firstDateInputArchive = freezed,Object? secondDateInputArchive = freezed,Object? inputArchiver = freezed,Object? outputArchiveDate = freezed,Object? outputArchiver = freezed,Object? barDifferenceRequestWeight = freezed,Object? barDifferenceRequestQuantity = freezed,Object? healthCertificate = freezed,Object? samasatDischargePercentage = freezed,Object? personTypeName = freezed,Object? interactTypeName = freezed,Object? unionTypeName = freezed,Object? certId = freezed,Object? increaseQuantity = freezed,Object? tenantFullname = freezed,Object? tenantNationalCode = freezed,Object? tenantMobile = freezed,Object? tenantCity = freezed,Object? hasTenant = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? poultry = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? chainCompany = freezed,Object? age = freezed,Object? inspectionLosses = freezed,Object? vetFarm = freezed,Object? activeKill = freezed,Object? killingInfo = freezed,Object? freeGovernmentalInfo = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? hasChainCompany = freezed,Object? poultryIdForeignKey = freezed,Object? poultryHatchingIdKey = freezed,Object? quantity = freezed,Object? losses = freezed,Object? leftOver = freezed,Object? killedQuantity = freezed,Object? extraKilledQuantity = freezed,Object? governmentalKilledQuantity = freezed,Object? governmentalQuantity = freezed,Object? freeKilledQuantity = freezed,Object? freeQuantity = freezed,Object? chainKilledQuantity = freezed,Object? chainKilledWeight = freezed,Object? outProvinceKilledWeight = freezed,Object? outProvinceKilledQuantity = freezed,Object? exportKilledWeight = freezed,Object? exportKilledQuantity = freezed,Object? totalCommitment = freezed,Object? commitmentType = freezed,Object? totalCommitmentQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? totalFreeCommitmentWeight = freezed,Object? totalKilledWeight = freezed,Object? totalAverageKilledWeight = freezed,Object? requestLeftOver = freezed,Object? hall = freezed,Object? date = freezed,Object? predicateDate = freezed,Object? chickenBreed = freezed,Object? period = freezed,Object? allowHatching = freezed,Object? state = freezed,Object? archive = freezed,Object? violation = freezed,Object? message = freezed,Object? registrar = freezed,Object? breed = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? lastChange = freezed,Object? chickenAge = freezed,Object? nowAge = freezed,Object? latestHatchingChange = freezed,Object? violationReport = freezed,Object? violationMessage = freezed,Object? violationImage = freezed,Object? violationReporter = freezed,Object? violationReportDate = freezed,Object? violationReportEditor = freezed,Object? violationReportEditDate = freezed,Object? totalLosses = freezed,Object? directLosses = freezed,Object? directLossesInputer = freezed,Object? directLossesDate = freezed,Object? directLossesEditor = freezed,Object? directLossesLastEditDate = freezed,Object? endPeriodLossesInputer = freezed,Object? endPeriodLossesDate = freezed,Object? endPeriodLossesEditor = freezed,Object? endPeriodLossesLastEditDate = freezed,Object? breedingUniqueId = freezed,Object? licenceNumber = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? firstDateInputArchive = freezed,Object? secondDateInputArchive = freezed,Object? inputArchiver = freezed,Object? outputArchiveDate = freezed,Object? outputArchiver = freezed,Object? barDifferenceRequestWeight = freezed,Object? barDifferenceRequestQuantity = freezed,Object? healthCertificate = freezed,Object? samasatDischargePercentage = freezed,Object? personTypeName = freezed,Object? interactTypeName = freezed,Object? unionTypeName = freezed,Object? certId = freezed,Object? increaseQuantity = freezed,Object? tenantFullname = freezed,Object? tenantNationalCode = freezed,Object? tenantMobile = freezed,Object? tenantCity = freezed,Object? hasTenant = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? poultry = freezed,}) { return _then(_self.copyWith( -id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable -as int,chainCompany: freezed == chainCompany ? _self.chainCompany : chainCompany // ignore: cast_nullable_to_non_nullable +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,chainCompany: freezed == chainCompany ? _self.chainCompany : chainCompany // ignore: cast_nullable_to_non_nullable as String?,age: freezed == age ? _self.age : age // ignore: cast_nullable_to_non_nullable as int?,inspectionLosses: freezed == inspectionLosses ? _self.inspectionLosses : inspectionLosses // ignore: cast_nullable_to_non_nullable as dynamic,vetFarm: freezed == vetFarm ? _self.vetFarm : vetFarm // ignore: cast_nullable_to_non_nullable @@ -325,7 +325,7 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _HatchingDetails() when $default != null: return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_that.vetFarm,_that.activeKill,_that.killingInfo,_that.freeGovernmentalInfo,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.hasChainCompany,_that.poultryIdForeignKey,_that.poultryHatchingIdKey,_that.quantity,_that.losses,_that.leftOver,_that.killedQuantity,_that.extraKilledQuantity,_that.governmentalKilledQuantity,_that.governmentalQuantity,_that.freeKilledQuantity,_that.freeQuantity,_that.chainKilledQuantity,_that.chainKilledWeight,_that.outProvinceKilledWeight,_that.outProvinceKilledQuantity,_that.exportKilledWeight,_that.exportKilledQuantity,_that.totalCommitment,_that.commitmentType,_that.totalCommitmentQuantity,_that.totalFreeCommitmentQuantity,_that.totalFreeCommitmentWeight,_that.totalKilledWeight,_that.totalAverageKilledWeight,_that.requestLeftOver,_that.hall,_that.date,_that.predicateDate,_that.chickenBreed,_that.period,_that.allowHatching,_that.state,_that.archive,_that.violation,_that.message,_that.registrar,_that.breed,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.lastChange,_that.chickenAge,_that.nowAge,_that.latestHatchingChange,_that.violationReport,_that.violationMessage,_that.violationImage,_that.violationReporter,_that.violationReportDate,_that.violationReportEditor,_that.violationReportEditDate,_that.totalLosses,_that.directLosses,_that.directLossesInputer,_that.directLossesDate,_that.directLossesEditor,_that.directLossesLastEditDate,_that.endPeriodLossesInputer,_that.endPeriodLossesDate,_that.endPeriodLossesEditor,_that.endPeriodLossesLastEditDate,_that.breedingUniqueId,_that.licenceNumber,_that.temporaryTrash,_that.temporaryDeleted,_that.firstDateInputArchive,_that.secondDateInputArchive,_that.inputArchiver,_that.outputArchiveDate,_that.outputArchiver,_that.barDifferenceRequestWeight,_that.barDifferenceRequestQuantity,_that.healthCertificate,_that.samasatDischargePercentage,_that.personTypeName,_that.interactTypeName,_that.unionTypeName,_that.certId,_that.increaseQuantity,_that.tenantFullname,_that.tenantNationalCode,_that.tenantMobile,_that.tenantCity,_that.hasTenant,_that.createdBy,_that.modifiedBy,_that.poultry);case _: @@ -346,7 +346,7 @@ return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_th /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( int? id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry) $default,) {final _that = this; switch (_that) { case _HatchingDetails(): return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_that.vetFarm,_that.activeKill,_that.killingInfo,_that.freeGovernmentalInfo,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.hasChainCompany,_that.poultryIdForeignKey,_that.poultryHatchingIdKey,_that.quantity,_that.losses,_that.leftOver,_that.killedQuantity,_that.extraKilledQuantity,_that.governmentalKilledQuantity,_that.governmentalQuantity,_that.freeKilledQuantity,_that.freeQuantity,_that.chainKilledQuantity,_that.chainKilledWeight,_that.outProvinceKilledWeight,_that.outProvinceKilledQuantity,_that.exportKilledWeight,_that.exportKilledQuantity,_that.totalCommitment,_that.commitmentType,_that.totalCommitmentQuantity,_that.totalFreeCommitmentQuantity,_that.totalFreeCommitmentWeight,_that.totalKilledWeight,_that.totalAverageKilledWeight,_that.requestLeftOver,_that.hall,_that.date,_that.predicateDate,_that.chickenBreed,_that.period,_that.allowHatching,_that.state,_that.archive,_that.violation,_that.message,_that.registrar,_that.breed,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.lastChange,_that.chickenAge,_that.nowAge,_that.latestHatchingChange,_that.violationReport,_that.violationMessage,_that.violationImage,_that.violationReporter,_that.violationReportDate,_that.violationReportEditor,_that.violationReportEditDate,_that.totalLosses,_that.directLosses,_that.directLossesInputer,_that.directLossesDate,_that.directLossesEditor,_that.directLossesLastEditDate,_that.endPeriodLossesInputer,_that.endPeriodLossesDate,_that.endPeriodLossesEditor,_that.endPeriodLossesLastEditDate,_that.breedingUniqueId,_that.licenceNumber,_that.temporaryTrash,_that.temporaryDeleted,_that.firstDateInputArchive,_that.secondDateInputArchive,_that.inputArchiver,_that.outputArchiveDate,_that.outputArchiver,_that.barDifferenceRequestWeight,_that.barDifferenceRequestQuantity,_that.healthCertificate,_that.samasatDischargePercentage,_that.personTypeName,_that.interactTypeName,_that.unionTypeName,_that.certId,_that.increaseQuantity,_that.tenantFullname,_that.tenantNationalCode,_that.tenantMobile,_that.tenantCity,_that.hasTenant,_that.createdBy,_that.modifiedBy,_that.poultry);case _: @@ -366,7 +366,7 @@ return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_th /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry)? $default,) {final _that = this; switch (_that) { case _HatchingDetails() when $default != null: return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_that.vetFarm,_that.activeKill,_that.killingInfo,_that.freeGovernmentalInfo,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.hasChainCompany,_that.poultryIdForeignKey,_that.poultryHatchingIdKey,_that.quantity,_that.losses,_that.leftOver,_that.killedQuantity,_that.extraKilledQuantity,_that.governmentalKilledQuantity,_that.governmentalQuantity,_that.freeKilledQuantity,_that.freeQuantity,_that.chainKilledQuantity,_that.chainKilledWeight,_that.outProvinceKilledWeight,_that.outProvinceKilledQuantity,_that.exportKilledWeight,_that.exportKilledQuantity,_that.totalCommitment,_that.commitmentType,_that.totalCommitmentQuantity,_that.totalFreeCommitmentQuantity,_that.totalFreeCommitmentWeight,_that.totalKilledWeight,_that.totalAverageKilledWeight,_that.requestLeftOver,_that.hall,_that.date,_that.predicateDate,_that.chickenBreed,_that.period,_that.allowHatching,_that.state,_that.archive,_that.violation,_that.message,_that.registrar,_that.breed,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.lastChange,_that.chickenAge,_that.nowAge,_that.latestHatchingChange,_that.violationReport,_that.violationMessage,_that.violationImage,_that.violationReporter,_that.violationReportDate,_that.violationReportEditor,_that.violationReportEditDate,_that.totalLosses,_that.directLosses,_that.directLossesInputer,_that.directLossesDate,_that.directLossesEditor,_that.directLossesLastEditDate,_that.endPeriodLossesInputer,_that.endPeriodLossesDate,_that.endPeriodLossesEditor,_that.endPeriodLossesLastEditDate,_that.breedingUniqueId,_that.licenceNumber,_that.temporaryTrash,_that.temporaryDeleted,_that.firstDateInputArchive,_that.secondDateInputArchive,_that.inputArchiver,_that.outputArchiveDate,_that.outputArchiver,_that.barDifferenceRequestWeight,_that.barDifferenceRequestQuantity,_that.healthCertificate,_that.samasatDischargePercentage,_that.personTypeName,_that.interactTypeName,_that.unionTypeName,_that.certId,_that.increaseQuantity,_that.tenantFullname,_that.tenantNationalCode,_that.tenantMobile,_that.tenantCity,_that.hasTenant,_that.createdBy,_that.modifiedBy,_that.poultry);case _: @@ -381,10 +381,10 @@ return $default(_that.id,_that.chainCompany,_that.age,_that.inspectionLosses,_th @JsonSerializable() class _HatchingDetails implements HatchingDetails { - const _HatchingDetails({required this.id, this.chainCompany, this.age, this.inspectionLosses, this.vetFarm, this.activeKill, this.killingInfo, this.freeGovernmentalInfo, this.key, this.createDate, this.modifyDate, this.trash, this.hasChainCompany, this.poultryIdForeignKey, this.poultryHatchingIdKey, this.quantity, this.losses, this.leftOver, this.killedQuantity, this.extraKilledQuantity, this.governmentalKilledQuantity, this.governmentalQuantity, this.freeKilledQuantity, this.freeQuantity, this.chainKilledQuantity, this.chainKilledWeight, this.outProvinceKilledWeight, this.outProvinceKilledQuantity, this.exportKilledWeight, this.exportKilledQuantity, this.totalCommitment, this.commitmentType, this.totalCommitmentQuantity, this.totalFreeCommitmentQuantity, this.totalFreeCommitmentWeight, this.totalKilledWeight, this.totalAverageKilledWeight, this.requestLeftOver, this.hall, this.date, this.predicateDate, this.chickenBreed, this.period, this.allowHatching, this.state, this.archive, this.violation, this.message, this.registrar, final List? breed, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.lastChange, this.chickenAge, this.nowAge, this.latestHatchingChange, this.violationReport, this.violationMessage, this.violationImage, this.violationReporter, this.violationReportDate, this.violationReportEditor, this.violationReportEditDate, this.totalLosses, this.directLosses, this.directLossesInputer, this.directLossesDate, this.directLossesEditor, this.directLossesLastEditDate, this.endPeriodLossesInputer, this.endPeriodLossesDate, this.endPeriodLossesEditor, this.endPeriodLossesLastEditDate, this.breedingUniqueId, this.licenceNumber, this.temporaryTrash, this.temporaryDeleted, this.firstDateInputArchive, this.secondDateInputArchive, this.inputArchiver, this.outputArchiveDate, this.outputArchiver, this.barDifferenceRequestWeight, this.barDifferenceRequestQuantity, this.healthCertificate, this.samasatDischargePercentage, this.personTypeName, this.interactTypeName, this.unionTypeName, this.certId, this.increaseQuantity, this.tenantFullname, this.tenantNationalCode, this.tenantMobile, this.tenantCity, this.hasTenant, this.createdBy, this.modifiedBy, this.poultry}): _breed = breed; + const _HatchingDetails({this.id, this.chainCompany, this.age, this.inspectionLosses, this.vetFarm, this.activeKill, this.killingInfo, this.freeGovernmentalInfo, this.key, this.createDate, this.modifyDate, this.trash, this.hasChainCompany, this.poultryIdForeignKey, this.poultryHatchingIdKey, this.quantity, this.losses, this.leftOver, this.killedQuantity, this.extraKilledQuantity, this.governmentalKilledQuantity, this.governmentalQuantity, this.freeKilledQuantity, this.freeQuantity, this.chainKilledQuantity, this.chainKilledWeight, this.outProvinceKilledWeight, this.outProvinceKilledQuantity, this.exportKilledWeight, this.exportKilledQuantity, this.totalCommitment, this.commitmentType, this.totalCommitmentQuantity, this.totalFreeCommitmentQuantity, this.totalFreeCommitmentWeight, this.totalKilledWeight, this.totalAverageKilledWeight, this.requestLeftOver, this.hall, this.date, this.predicateDate, this.chickenBreed, this.period, this.allowHatching, this.state, this.archive, this.violation, this.message, this.registrar, final List? breed, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.lastChange, this.chickenAge, this.nowAge, this.latestHatchingChange, this.violationReport, this.violationMessage, this.violationImage, this.violationReporter, this.violationReportDate, this.violationReportEditor, this.violationReportEditDate, this.totalLosses, this.directLosses, this.directLossesInputer, this.directLossesDate, this.directLossesEditor, this.directLossesLastEditDate, this.endPeriodLossesInputer, this.endPeriodLossesDate, this.endPeriodLossesEditor, this.endPeriodLossesLastEditDate, this.breedingUniqueId, this.licenceNumber, this.temporaryTrash, this.temporaryDeleted, this.firstDateInputArchive, this.secondDateInputArchive, this.inputArchiver, this.outputArchiveDate, this.outputArchiver, this.barDifferenceRequestWeight, this.barDifferenceRequestQuantity, this.healthCertificate, this.samasatDischargePercentage, this.personTypeName, this.interactTypeName, this.unionTypeName, this.certId, this.increaseQuantity, this.tenantFullname, this.tenantNationalCode, this.tenantMobile, this.tenantCity, this.hasTenant, this.createdBy, this.modifiedBy, this.poultry}): _breed = breed; factory _HatchingDetails.fromJson(Map json) => _$HatchingDetailsFromJson(json); -@override final int id; +@override final int? id; @override final String? chainCompany; @override final int? age; @override final dynamic inspectionLosses; @@ -527,7 +527,7 @@ abstract mixin class _$HatchingDetailsCopyWith<$Res> implements $HatchingDetails factory _$HatchingDetailsCopyWith(_HatchingDetails value, $Res Function(_HatchingDetails) _then) = __$HatchingDetailsCopyWithImpl; @override @useResult $Res call({ - int id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry + int? id, String? chainCompany, int? age, dynamic inspectionLosses, VetFarm? vetFarm, ActiveKill? activeKill, KillingInfo? killingInfo, FreeGovernmentalInfo? freeGovernmentalInfo, String? key, DateTime? createDate, DateTime? modifyDate, bool? trash, bool? hasChainCompany, dynamic poultryIdForeignKey, dynamic poultryHatchingIdKey, int? quantity, int? losses, int? leftOver, int? killedQuantity, int? extraKilledQuantity, double? governmentalKilledQuantity, double? governmentalQuantity, double? freeKilledQuantity, double? freeQuantity, double? chainKilledQuantity, double? chainKilledWeight, double? outProvinceKilledWeight, double? outProvinceKilledQuantity, double? exportKilledWeight, double? exportKilledQuantity, double? totalCommitment, String? commitmentType, double? totalCommitmentQuantity, double? totalFreeCommitmentQuantity, double? totalFreeCommitmentWeight, double? totalKilledWeight, double? totalAverageKilledWeight, int? requestLeftOver, int? hall, DateTime? date, DateTime? predicateDate, String? chickenBreed, int? period, String? allowHatching, String? state, bool? archive, bool? violation, dynamic message, dynamic registrar, List? breed, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, LastChange? lastChange, int? chickenAge, int? nowAge, LatestHatchingChange? latestHatchingChange, dynamic violationReport, String? violationMessage, dynamic violationImage, dynamic violationReporter, dynamic violationReportDate, dynamic violationReportEditor, dynamic violationReportEditDate, int? totalLosses, int? directLosses, dynamic directLossesInputer, dynamic directLossesDate, dynamic directLossesEditor, dynamic directLossesLastEditDate, dynamic endPeriodLossesInputer, dynamic endPeriodLossesDate, dynamic endPeriodLossesEditor, dynamic endPeriodLossesLastEditDate, String? breedingUniqueId, String? licenceNumber, bool? temporaryTrash, bool? temporaryDeleted, dynamic firstDateInputArchive, dynamic secondDateInputArchive, dynamic inputArchiver, dynamic outputArchiveDate, dynamic outputArchiver, double? barDifferenceRequestWeight, double? barDifferenceRequestQuantity, dynamic healthCertificate, int? samasatDischargePercentage, String? personTypeName, String? interactTypeName, String? unionTypeName, String? certId, int? increaseQuantity, dynamic tenantFullname, dynamic tenantNationalCode, dynamic tenantMobile, dynamic tenantCity, bool? hasTenant, dynamic createdBy, dynamic modifiedBy, int? poultry }); @@ -544,10 +544,10 @@ class __$HatchingDetailsCopyWithImpl<$Res> /// Create a copy of HatchingDetails /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? chainCompany = freezed,Object? age = freezed,Object? inspectionLosses = freezed,Object? vetFarm = freezed,Object? activeKill = freezed,Object? killingInfo = freezed,Object? freeGovernmentalInfo = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? hasChainCompany = freezed,Object? poultryIdForeignKey = freezed,Object? poultryHatchingIdKey = freezed,Object? quantity = freezed,Object? losses = freezed,Object? leftOver = freezed,Object? killedQuantity = freezed,Object? extraKilledQuantity = freezed,Object? governmentalKilledQuantity = freezed,Object? governmentalQuantity = freezed,Object? freeKilledQuantity = freezed,Object? freeQuantity = freezed,Object? chainKilledQuantity = freezed,Object? chainKilledWeight = freezed,Object? outProvinceKilledWeight = freezed,Object? outProvinceKilledQuantity = freezed,Object? exportKilledWeight = freezed,Object? exportKilledQuantity = freezed,Object? totalCommitment = freezed,Object? commitmentType = freezed,Object? totalCommitmentQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? totalFreeCommitmentWeight = freezed,Object? totalKilledWeight = freezed,Object? totalAverageKilledWeight = freezed,Object? requestLeftOver = freezed,Object? hall = freezed,Object? date = freezed,Object? predicateDate = freezed,Object? chickenBreed = freezed,Object? period = freezed,Object? allowHatching = freezed,Object? state = freezed,Object? archive = freezed,Object? violation = freezed,Object? message = freezed,Object? registrar = freezed,Object? breed = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? lastChange = freezed,Object? chickenAge = freezed,Object? nowAge = freezed,Object? latestHatchingChange = freezed,Object? violationReport = freezed,Object? violationMessage = freezed,Object? violationImage = freezed,Object? violationReporter = freezed,Object? violationReportDate = freezed,Object? violationReportEditor = freezed,Object? violationReportEditDate = freezed,Object? totalLosses = freezed,Object? directLosses = freezed,Object? directLossesInputer = freezed,Object? directLossesDate = freezed,Object? directLossesEditor = freezed,Object? directLossesLastEditDate = freezed,Object? endPeriodLossesInputer = freezed,Object? endPeriodLossesDate = freezed,Object? endPeriodLossesEditor = freezed,Object? endPeriodLossesLastEditDate = freezed,Object? breedingUniqueId = freezed,Object? licenceNumber = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? firstDateInputArchive = freezed,Object? secondDateInputArchive = freezed,Object? inputArchiver = freezed,Object? outputArchiveDate = freezed,Object? outputArchiver = freezed,Object? barDifferenceRequestWeight = freezed,Object? barDifferenceRequestQuantity = freezed,Object? healthCertificate = freezed,Object? samasatDischargePercentage = freezed,Object? personTypeName = freezed,Object? interactTypeName = freezed,Object? unionTypeName = freezed,Object? certId = freezed,Object? increaseQuantity = freezed,Object? tenantFullname = freezed,Object? tenantNationalCode = freezed,Object? tenantMobile = freezed,Object? tenantCity = freezed,Object? hasTenant = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? poultry = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? chainCompany = freezed,Object? age = freezed,Object? inspectionLosses = freezed,Object? vetFarm = freezed,Object? activeKill = freezed,Object? killingInfo = freezed,Object? freeGovernmentalInfo = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? hasChainCompany = freezed,Object? poultryIdForeignKey = freezed,Object? poultryHatchingIdKey = freezed,Object? quantity = freezed,Object? losses = freezed,Object? leftOver = freezed,Object? killedQuantity = freezed,Object? extraKilledQuantity = freezed,Object? governmentalKilledQuantity = freezed,Object? governmentalQuantity = freezed,Object? freeKilledQuantity = freezed,Object? freeQuantity = freezed,Object? chainKilledQuantity = freezed,Object? chainKilledWeight = freezed,Object? outProvinceKilledWeight = freezed,Object? outProvinceKilledQuantity = freezed,Object? exportKilledWeight = freezed,Object? exportKilledQuantity = freezed,Object? totalCommitment = freezed,Object? commitmentType = freezed,Object? totalCommitmentQuantity = freezed,Object? totalFreeCommitmentQuantity = freezed,Object? totalFreeCommitmentWeight = freezed,Object? totalKilledWeight = freezed,Object? totalAverageKilledWeight = freezed,Object? requestLeftOver = freezed,Object? hall = freezed,Object? date = freezed,Object? predicateDate = freezed,Object? chickenBreed = freezed,Object? period = freezed,Object? allowHatching = freezed,Object? state = freezed,Object? archive = freezed,Object? violation = freezed,Object? message = freezed,Object? registrar = freezed,Object? breed = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? lastChange = freezed,Object? chickenAge = freezed,Object? nowAge = freezed,Object? latestHatchingChange = freezed,Object? violationReport = freezed,Object? violationMessage = freezed,Object? violationImage = freezed,Object? violationReporter = freezed,Object? violationReportDate = freezed,Object? violationReportEditor = freezed,Object? violationReportEditDate = freezed,Object? totalLosses = freezed,Object? directLosses = freezed,Object? directLossesInputer = freezed,Object? directLossesDate = freezed,Object? directLossesEditor = freezed,Object? directLossesLastEditDate = freezed,Object? endPeriodLossesInputer = freezed,Object? endPeriodLossesDate = freezed,Object? endPeriodLossesEditor = freezed,Object? endPeriodLossesLastEditDate = freezed,Object? breedingUniqueId = freezed,Object? licenceNumber = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? firstDateInputArchive = freezed,Object? secondDateInputArchive = freezed,Object? inputArchiver = freezed,Object? outputArchiveDate = freezed,Object? outputArchiver = freezed,Object? barDifferenceRequestWeight = freezed,Object? barDifferenceRequestQuantity = freezed,Object? healthCertificate = freezed,Object? samasatDischargePercentage = freezed,Object? personTypeName = freezed,Object? interactTypeName = freezed,Object? unionTypeName = freezed,Object? certId = freezed,Object? increaseQuantity = freezed,Object? tenantFullname = freezed,Object? tenantNationalCode = freezed,Object? tenantMobile = freezed,Object? tenantCity = freezed,Object? hasTenant = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? poultry = freezed,}) { return _then(_HatchingDetails( -id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable -as int,chainCompany: freezed == chainCompany ? _self.chainCompany : chainCompany // ignore: cast_nullable_to_non_nullable +id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as int?,chainCompany: freezed == chainCompany ? _self.chainCompany : chainCompany // ignore: cast_nullable_to_non_nullable as String?,age: freezed == age ? _self.age : age // ignore: cast_nullable_to_non_nullable as int?,inspectionLosses: freezed == inspectionLosses ? _self.inspectionLosses : inspectionLosses // ignore: cast_nullable_to_non_nullable as dynamic,vetFarm: freezed == vetFarm ? _self.vetFarm : vetFarm // ignore: cast_nullable_to_non_nullable diff --git a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart index 0c94208..2522641 100644 --- a/packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart +++ b/packages/inspection/lib/data/model/response/hatching_details/hatching_details.g.dart @@ -9,7 +9,7 @@ part of 'hatching_details.dart'; _HatchingDetails _$HatchingDetailsFromJson( Map json, ) => _HatchingDetails( - id: (json['id'] as num).toInt(), + id: (json['id'] as num?)?.toInt(), chainCompany: json['chain_company'] as String?, age: (json['age'] as num?)?.toInt(), inspectionLosses: json['inspection_losses'], diff --git a/packages/inspection/lib/data/repositories/inspection/inspection_repository.dart b/packages/inspection/lib/data/repositories/inspection/inspection_repository.dart index 148ce5b..283b5ca 100644 --- a/packages/inspection/lib/data/repositories/inspection/inspection_repository.dart +++ b/packages/inspection/lib/data/repositories/inspection/inspection_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_inspection/data/model/response/hatching_details/hatching_details.dart'; import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; abstract class InspectionRepository { @@ -21,4 +22,9 @@ abstract class InspectionRepository { double? centerLng, double? radius, }); + + Future?> getHatchingDetails({ + String? code, + bool? active, + }); } \ No newline at end of file diff --git a/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart b/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart index 67a8d92..5eecf18 100644 --- a/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart +++ b/packages/inspection/lib/data/repositories/inspection/inspection_repository_imp.dart @@ -1,4 +1,5 @@ import 'package:rasadyar_inspection/data/data_source/remote/inspection/inspection_remote.dart'; +import 'package:rasadyar_inspection/data/model/response/hatching_details/hatching_details.dart'; import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; import 'package:rasadyar_inspection/data/repositories/inspection/inspection_repository.dart'; @@ -33,4 +34,9 @@ class InspectionRepositoryImp implements InspectionRepository { value: value, ); } + + @override + Future?> getHatchingDetails({String? code, bool? active}) async { + return await remoteDataSource.getHatchingDetails(code: code, active: active ?? false); + } } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart index 7612628..1d217b4 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/logic.dart @@ -3,7 +3,10 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/hatching_details/hatching_details.dart'; import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; +import 'package:rasadyar_inspection/data/repositories/inspection/inspection_repository_imp.dart'; +import 'package:rasadyar_inspection/injection/inspection_di.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; class MapLogic extends GetxController with GetTickerProviderStateMixin { @@ -12,6 +15,7 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { RxDouble currentZoom = (15.0).obs; Rx mapController = MapController().obs; BaseLogic baseLogic = Get.find(); + InspectionRepositoryImp inspectionRepository = diInspection.get(); Rx currentLocation = LatLng(34.798315281272544, 48.51479142983491).obs; RxBool hasFilterOrSearch = false.obs; @@ -31,6 +35,9 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { Rx>> filteredLocations = Resource>.initial().obs; + Rx>> hatchingDetails = + Resource>.initial().obs; + @override void onInit() { super.onInit(); @@ -154,4 +161,29 @@ class MapLogic extends GetxController with GetTickerProviderStateMixin { point.longitude >= bounds.west && point.longitude <= bounds.east; } + + Future getFullDetailsLocation(PoultryLocationModel model) async { + hatchingDetails.value = Resource>.loading(); + await safeCall( + call: () => inspectionRepository.getHatchingDetails( + code: model.breedingUniqueId, + active: (model.hatching != null && model.hatching!.isNotEmpty), + ), + onSuccess: (result) { + if (result != null && result.isNotEmpty) { + hatchingDetails.value = Resource>.success(result); + } else { + hatchingDetails.value = Resource>.empty(); + } + }, + onError: (error, stackTrace) { + hatchingDetails.value = Resource>.error('$error / $stackTrace'); + }, + ); + } + + void cleanDataAfterBottomSheet() { + eLog('cleanDataAfterBottomSheet'); + hatchingDetails.value = Resource>.initial(); + } } diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart index 84a5a73..1d057c0 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart @@ -1,5 +1,7 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/model/response/hatching_details/hatching_details.dart'; import 'package:rasadyar_inspection/data/model/response/poultry_location/poultry_location_model.dart'; import 'logic.dart'; @@ -109,675 +111,457 @@ class MapPage extends GetView { final isVisible = controller.isInVisibleBounds(point, visibleBounds); if (isZoomedIn && isVisible) { - return Marker( - point: point, - width: 180.w, - height: 50.h, - child: GestureDetector( - onTap: () { - bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; - iLog(hasHatching); - Get.bottomSheet( - ObxValue((data) { - return BaseBottomSheet( - height: data.value - ? hasHatching - ? 550.h - : 400.h - : 150.h, - child: Column( - spacing: 12, - children: [ - ListItemWithOutCounter( - secondChild: Column( - spacing: 8, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), - ), - ], - ), - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1.w, - color: AppColor.blueLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, - children: [ - Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan14.copyWith( - color: AppColor.textColor, - ), - ), - - Text( - hasHatching ? 'دارد' : 'ندارد', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - buildRow( - title: 'مشخصات خریدار', - value: location.user?.fullname ?? 'N/A', - ), - - buildRow( - title: 'تلفن خریدار', - value: location.user?.mobile ?? 'N/A', - valueStyle: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - - Visibility( - visible: location.address?.city?.name != null, - child: buildRow( - title: 'شهر', - value: location.address?.city?.name ?? 'N/A', - ), - ), - Visibility( - visible: location.address?.address != null, - child: buildRow( - title: 'آردس', - value: location.address?.address ?? 'N/A', - ), - ), - - buildRow( - title: 'شناسه یکتا', - value: location.breedingUniqueId ?? 'N/A', - ), - ], - ), - ), - Row( - children: [ - Expanded( - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - spacing: 7, - children: [ - RElevated( - width: 40.h, - height: 38.h, - backgroundColor: AppColor.greenNormal, - child: Assets.vec.messageAddSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - onPressed: () {}, - ), - RElevated( - width: 150.w, - height: 40.h, - backgroundColor: AppColor.blueNormal, - onPressed: () { - /* controller.setEditData(item); - Get.bottomSheet( - addOrEditBottomSheet(true), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ).whenComplete(() {});*/ - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 8, - children: [ - Assets.vec.mapSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - Text( - 'جزییات کامل', - style: AppFonts.yekan14Bold.copyWith( - color: Colors.white, - ), - ), - ], - ), - ), - ROutlinedElevated( - width: 150.w, - height: 40.h, - onPressed: () { - buildDeleteDialog( - onConfirm: () async {}, - onRefresh: () async {}, - ); - }, - borderColor: AppColor.bgIcon, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.securityTimeSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - AppColor.bgIcon, - BlendMode.srcIn, - ), - ), - Text( - 'سوابق بازرسی', - style: AppFonts.yekan14Bold.copyWith( - color: AppColor.bgIcon, - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ], - ), - labelColor: AppColor.blueLight, - labelIcon: Assets.vec.cowSvg.path, - labelIconColor: AppColor.bgIcon, - onTap: () => data.value = !data.value, - selected: data.value, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - location.user?.fullname ?? '', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - (location.hatching != null && location.hatching!.isNotEmpty) - ? 'دارد' - : 'ندراد', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Assets.vec.scanBarcodeSvg.svg(), - ], - ), - ), - - Visibility( - visible: hasHatching, - child: Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - padding: EdgeInsets.all(8.r), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), - ), - child: Column( - spacing: 8.h, - children: [ - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1.w, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, - children: [ - Text( - 'تاریخ', - style: AppFonts.yekan14.copyWith(color: AppColor.textColor), - ), - - Text( - location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - buildRow( - title: 'باقیمانده', - value: - location.hatching?.first.leftOver.separatedByComma ?? 'N/A', - ), - buildRow( - title: 'سن جوجه ریزی', - value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', - ), - buildRow( - title: 'شماره مجوز جوجه ریزی', - value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', - ), - ], - ), - ), - ), - ], - ), - ); - }, controller.isSelectedDetailsLocation), - isScrollControlled: true, - isDismissible: true, - ); - }, - child: Container( - height: 30.h, - padding: EdgeInsets.all(5.r), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15.r), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 5, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - Text(location.user?.fullname ?? '', style: AppFonts.yekan12), - ], - ), - ), - ), - ); + return buildMarkerWithHatching(point, location); } else { - return Marker( - point: point, - width: 40.h, - height: 50.h, - child: GestureDetector( - onTap: () { - bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; - Get.bottomSheet( - ObxValue((data) { - return BaseBottomSheet( - height: data.value - ? hasHatching - ? 550.h - : 400.h - : 150.h, - child: Column( - spacing: 12, - children: [ - ListItemWithOutCounter( - secondChild: Column( - spacing: 8, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), - ), - ], - ), - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1.w, - color: AppColor.blueLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, - children: [ - Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan14.copyWith( - color: AppColor.textColor, - ), - ), - - Text( - hasHatching ? 'دارد' : 'ندارد', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - buildRow( - title: 'مشخصات مرغدار', - value: location.user?.fullname ?? 'N/A', - ), - - buildRow( - title: 'تلفن مرغدار', - value: location.user?.mobile ?? 'N/A', - valueStyle: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - - Visibility( - visible: location.address?.city?.name != null, - child: buildRow( - title: 'شهر', - value: location.address?.city?.name ?? 'N/A', - ), - ), - Visibility( - visible: location.address?.address != null, - child: buildRow( - title: 'آردس', - value: location.address?.address ?? 'N/A', - ), - ), - - buildRow( - title: 'شناسه یکتا', - value: location.breedingUniqueId ?? 'N/A', - ), - ], - ), - ), - Row( - children: [ - Expanded( - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - spacing: 7, - children: [ - RElevated( - width: 40.h, - height: 38.h, - backgroundColor: AppColor.greenNormal, - child: Assets.vec.messageAddSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - onPressed: () {}, - ), - RElevated( - width: 150.w, - height: 40.h, - backgroundColor: AppColor.blueNormal, - onPressed: () { - /* controller.setEditData(item); - Get.bottomSheet( - addOrEditBottomSheet(true), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ).whenComplete(() {});*/ - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - spacing: 8, - children: [ - Assets.vec.mapSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - Colors.white, - BlendMode.srcIn, - ), - ), - Text( - 'جزییات کامل', - style: AppFonts.yekan14Bold.copyWith( - color: Colors.white, - ), - ), - ], - ), - ), - ROutlinedElevated( - width: 150.w, - height: 40.h, - onPressed: () { - buildDeleteDialog( - onConfirm: () async {}, - onRefresh: () async {}, - ); - }, - borderColor: AppColor.bgIcon, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - Assets.vec.securityTimeSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode( - AppColor.bgIcon, - BlendMode.srcIn, - ), - ), - Text( - 'سوابق بازرسی', - style: AppFonts.yekan14Bold.copyWith( - color: AppColor.bgIcon, - ), - ), - ], - ), - ), - ], - ), - ), - ], - ), - ], - ), - labelColor: AppColor.blueLight, - labelIcon: Assets.vec.cowSvg.path, - labelIconColor: AppColor.bgIcon, - onTap: () => data.value = !data.value, - selected: data.value, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - location.unitName ?? 'N/A', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - location.user?.fullname ?? '', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'جوجه ریزی فعال', - style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), - ), - Text( - (location.hatching != null && location.hatching!.isNotEmpty) - ? 'دارد' - : 'ندراد', - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ], - ), - Assets.vec.scanBarcodeSvg.svg(), - ], - ), - ), - - if (hasHatching) ...{ - Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - padding: EdgeInsets.all(8.r), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), - ), - child: Column( - spacing: 8.h, - children: [ - Container( - height: 32.h, - padding: EdgeInsets.symmetric(horizontal: 8), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1.w, color: AppColor.blueLightHover), - borderRadius: BorderRadius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, - children: [ - Text( - 'تاریخ', - style: AppFonts.yekan14.copyWith(color: AppColor.textColor), - ), - - Text( - location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - buildRow( - title: 'باقیمانده', - value: - '${location.hatching?.first.leftOver.separatedByComma ?? 'N/A'} عدد', - ), - buildRow( - title: 'سن جوجه ریزی', - value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', - ), - buildRow( - title: 'شماره مجوز جوجه ریزی', - value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', - ), - ], - ), - ), - }, - ], - ), - ); - }, controller.isSelectedDetailsLocation), - isScrollControlled: true, - isDismissible: true, - ); - }, - child: Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), - ), - ); + return buildMarkerWithOutHatching(point, location); } }).toList(); return updatedMarkers; } - Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + Marker buildMarkerWithHatching(LatLng point, PoultryLocationModel location) { return Marker( - point: marker, + point: point, + width: 180.w, + height: 50.h, child: GestureDetector( - onTap: onTap, - behavior: HitTestBehavior.opaque, - child: SizedBox( - width: 36, - height: 36, - child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30), + onTap: () { + bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; + Get.bottomSheet( + detailsBottomSheet(hasHatching, location), + isScrollControlled: true, + isDismissible: true, + ).then((_) => controller.cleanDataAfterBottomSheet()); + }, + child: Container( + height: 30.h, + padding: EdgeInsets.all(5.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + Text(location.user?.fullname ?? '', style: AppFonts.yekan12), + ], + ), ), ), ); } + + Marker buildMarkerWithOutHatching(LatLng point, PoultryLocationModel location) { + return Marker( + point: point, + width: 40.h, + height: 50.h, + child: GestureDetector( + onTap: () { + bool hasHatching = location.hatching != null && location.hatching!.isNotEmpty; + Get.bottomSheet( + detailsBottomSheet(hasHatching, location), + isScrollControlled: true, + isDismissible: true, + ).then((_) => controller.cleanDataAfterBottomSheet()); + }, + child: Assets.vec.chickenMapMarkerSvg.svg(width: 24.w, height: 24.h), + ), + ); + } + + Widget detailsBottomSheet(bool hasHatching, PoultryLocationModel location) { + return ObxValue((data) { + return BaseBottomSheet( + height: data.value + ? hasHatching + ? 550.h + : 400.h + : 150.h, + child: Column( + spacing: 12, + children: [ + ListItemWithOutCounter( + secondChild: Column( + spacing: 8, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + hasHatching ? 'دارد' : 'ندارد', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + buildRow(title: 'مشخصات مرغدار', value: location.user?.fullname ?? 'N/A'), + + buildRow( + title: 'تلفن مرغدار', + value: location.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + Visibility( + visible: location.address?.city?.name != null, + child: buildRow( + title: 'شهر', + value: location.address?.city?.name ?? 'N/A', + ), + ), + Visibility( + visible: location.address?.address != null, + child: buildRow(title: 'آردس', value: location.address?.address ?? 'N/A'), + ), + + buildRow(title: 'شناسه یکتا', value: location.breedingUniqueId ?? 'N/A'), + ], + ), + ), + Row( + children: [ + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 7, + children: [ + RElevated( + width: 40.h, + height: 38.h, + backgroundColor: AppColor.greenNormal, + child: Assets.vec.messageAddSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + onPressed: () {}, + ), + RElevated( + width: 150.w, + height: 40.h, + backgroundColor: AppColor.blueNormal, + onPressed: () { + if (controller.hatchingDetails.value.status != + ResourceStatus.success) { + controller.getFullDetailsLocation(location); + } + Get.bottomSheet( + fullDetailsBottomSheet(location), + isScrollControlled: true, + isDismissible: true, + ignoreSafeArea: false, + ); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 8, + children: [ + Assets.vec.mapSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Text( + 'جزییات کامل', + style: AppFonts.yekan14Bold.copyWith(color: Colors.white), + ), + ], + ), + ), + ROutlinedElevated( + width: 150.w, + height: 40.h, + onPressed: () { + // buildDeleteDialog(onConfirm: () async {}, onRefresh: () async {}); + }, + borderColor: AppColor.bgIcon, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Assets.vec.securityTimeSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(AppColor.bgIcon, BlendMode.srcIn), + ), + Text( + 'سوابق بازرسی', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.bgIcon), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.cowSvg.path, + labelIconColor: AppColor.bgIcon, + onTap: () => data.value = !data.value, + selected: data.value, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + location.unitName ?? 'N/A', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + location.user?.fullname ?? '', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'جوجه ریزی فعال', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + (location.hatching != null && location.hatching!.isNotEmpty) + ? 'دارد' + : 'ندراد', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + ), + + if (hasHatching) ...{hatchingWidget(location)}, + ], + ), + ); + }, controller.isSelectedDetailsLocation); + } + + Container hatchingWidget(PoultryLocationModel location) { + return Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + padding: EdgeInsets.all(8.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: Column( + spacing: 8.h, + children: [ + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text('تاریخ', style: AppFonts.yekan14.copyWith(color: AppColor.textColor)), + + Text( + location.hatching?.first.date?.formattedJalaliDate ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + buildRow( + title: 'باقیمانده', + value: '${location.hatching?.first.leftOver.separatedByComma ?? 'N/A'} عدد', + ), + buildRow( + title: 'سن جوجه ریزی', + value: '${location.hatching?.first.chickenAge ?? 'N/A'} روز', + ), + buildRow( + title: 'شماره مجوز جوجه ریزی', + value: location.hatching?.first.licenceNumber.toString() ?? 'N/A', + ), + ], + ), + ); + } + + Widget fullDetailsBottomSheet(PoultryLocationModel location) { + return BaseBottomSheet( + height: 550.h, + child: ObxValue((state) { + switch (state.value.status) { + case ResourceStatus.initial: + case ResourceStatus.loading: + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [CupertinoActivityIndicator(), Text('در حال دریافت اطلاعات ...')], + ); + + case ResourceStatus.success: + return widgetFullDetailsBottomSheet(); + case ResourceStatus.error: + return ErrorWidget(state.value.message ?? 'خطا در دریافت اطلاعات'); + case ResourceStatus.empty: + return EmptyWidget(); + } + }, controller.hatchingDetails), + ); + } + + Container widgetFullDetailsBottomSheet() => Container( + padding: EdgeInsets.all(8.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.r), + border: Border.all(width: 1.w, color: AppColor.lightGreyNormalHover), + ), + child: ObxValue((data) { + final HatchingDetails? hatchingDetails = data.value.data?.first; + return Column( + spacing: 6.h, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1.w, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + spacing: 3, + children: [ + Text( + 'تاریخ جوجه ریزی', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + hatchingDetails?.date.toString().formattedJalaliDate ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + + buildRow( + title: 'مشخصات مرغدار', + value: hatchingDetails?.vetFarm?.vetFarmFullName ?? 'N/A', + ), + + buildRow( + title: 'تلفن مرغدار', + value: hatchingDetails?.vetFarm?.vetFarmMobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow( + title: 'جوجه ریزی فعال', + value: (hatchingDetails?.archive ?? false) ? 'ندارد' : 'دارد', + ), + buildRow(title: 'دوره', value: hatchingDetails?.period.toString() ?? 'N/A'), + + buildRow( + title: 'تعداد جوجه ریزی', + value: hatchingDetails?.quantity.separatedByComma.addCountEXT ?? 'N/A', + ), + + buildRow( + title: 'تلفات کل', + value: hatchingDetails?.totalLosses.separatedByComma.addCountEXT ?? 'N/A', + ), + buildRow( + title: 'تلفات دامپزشکی', + value: hatchingDetails?.losses.separatedByComma.addCountEXT ?? 'N/A', + ), + + buildRow( + title: 'باقیمانده در سالن', + value: hatchingDetails?.leftOver.separatedByComma.addCountEXT ?? 'N/A', + ), + + buildRow(title: 'نژاد', value: hatchingDetails?.chickenBreed ?? 'N/A'), + + buildRow(title: 'شماره مجوز جوجه ریزی', value: hatchingDetails?.licenceNumber ?? 'N/A'), + + buildRow( + title: 'سن جوجه', + value: ((hatchingDetails?.archive ?? false) == true) + ? hatchingDetails?.nowAge.toString().addDayEXT ?? 'N/A' + : hatchingDetails?.chickenAge.toString().addDayEXT ?? 'N/A', + ), + + buildRow( + title: 'تعداد کشتار', + value: hatchingDetails?.killedQuantity.separatedByComma.addCountEXT ?? 'N/A', + ), + + buildRow( + title: 'وزن کشتار', + value: hatchingDetails?.totalKilledWeight.separatedByComma.addKgEXT ?? 'N/A', + ), + ], + ); + }, controller.hatchingDetails), + ); } diff --git a/tools/vecGeneratoe.sh b/tools/vecGeneratoe.sh index 0240a5d..0e52b5d 100644 --- a/tools/vecGeneratoe.sh +++ b/tools/vecGeneratoe.sh @@ -65,6 +65,7 @@ find "$targetPath" -type f -name "*.vec" -exec rm {} \; # Generate .vec files in parallel echo "⚙️ Generating .vec files in parallel..." +# shellcheck disable=SC2016 find "$sourcePath" -type f | xargs -P 10 -I {} bash -c ' input="{}" filename=$(basename "$input") From 2800634cabe48f947a181b22c987797526acb5f9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 3 Aug 2025 10:07:15 +0330 Subject: [PATCH 256/256] fix : location details --- packages/core/lib/utils/extension/string_utils.dart | 5 +++-- .../presentation/pages/inspection_map/widget/map/view.dart | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/utils/extension/string_utils.dart b/packages/core/lib/utils/extension/string_utils.dart index fbe263e..a464443 100644 --- a/packages/core/lib/utils/extension/string_utils.dart +++ b/packages/core/lib/utils/extension/string_utils.dart @@ -13,14 +13,15 @@ extension XString on String { } String get addCountEXT { - return '$thisعدد'; + return '$this قطعه'; } + String get addDayEXT { return '$thisروزه'; } String get addKgEXT { - return '$thisکیلوگرم'; + return '$this کیلوگرم'; } DateTime get toDateTime => DateTime.parse(this); diff --git a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart index 1d057c0..417f50d 100644 --- a/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart +++ b/packages/inspection/lib/presentation/pages/inspection_map/widget/map/view.dart @@ -556,6 +556,11 @@ class MapPage extends GetView { value: hatchingDetails?.killedQuantity.separatedByComma.addCountEXT ?? 'N/A', ), + buildRow( + title: 'میانگین وزن کشتار', + value: hatchingDetails?.totalAverageKilledWeight.toString().addKgEXT ?? 'N/A', + ), + buildRow( title: 'وزن کشتار', value: hatchingDetails?.totalKilledWeight.separatedByComma.addKgEXT ?? 'N/A',

    Object.hash(runtimeType,weightAverage); +int get hashCode => Object.hash(runtimeType,name,weightAverage); @override String toString() { - return 'ProductModel(weightAverage: $weightAverage)'; + return 'ProductModel(name: $name, weightAverage: $weightAverage)'; } @@ -564,7 +419,7 @@ abstract mixin class $ProductModelCopyWith<$Res> { factory $ProductModelCopyWith(ProductModel value, $Res Function(ProductModel) _then) = _$ProductModelCopyWithImpl; @useResult $Res call({ - double? weightAverage + String? name, double? weightAverage }); @@ -581,9 +436,10 @@ class _$ProductModelCopyWithImpl<$Res> /// Create a copy of ProductModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? weightAverage = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? name = freezed,Object? weightAverage = freezed,}) { return _then(_self.copyWith( -weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable as double?, )); } @@ -595,9 +451,10 @@ as double?, @JsonSerializable() class _ProductModel implements ProductModel { - _ProductModel({this.weightAverage}); + _ProductModel({this.name, this.weightAverage}); factory _ProductModel.fromJson(Map json) => _$ProductModelFromJson(json); +@override final String? name; @override final double? weightAverage; /// Create a copy of ProductModel @@ -613,16 +470,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ProductModel&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ProductModel&&(identical(other.name, name) || other.name == name)&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,weightAverage); +int get hashCode => Object.hash(runtimeType,name,weightAverage); @override String toString() { - return 'ProductModel(weightAverage: $weightAverage)'; + return 'ProductModel(name: $name, weightAverage: $weightAverage)'; } @@ -633,7 +490,7 @@ abstract mixin class _$ProductModelCopyWith<$Res> implements $ProductModelCopyWi factory _$ProductModelCopyWith(_ProductModel value, $Res Function(_ProductModel) _then) = __$ProductModelCopyWithImpl; @override @useResult $Res call({ - double? weightAverage + String? name, double? weightAverage }); @@ -650,9 +507,10 @@ class __$ProductModelCopyWithImpl<$Res> /// Create a copy of ProductModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? weightAverage = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? name = freezed,Object? weightAverage = freezed,}) { return _then(_ProductModel( -weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable +name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?,weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable as double?, )); } @@ -662,66 +520,66 @@ as double?, /// @nodoc -mixin _$ToStewardModel { +mixin _$StewardModel { - int? get id; ToStewardUserModel? get user; AddressModel? get address; GuildAreaActivityModel? get guildAreaActivity; GuildTypeActivityModel? get guildTypeActivity; List? get killHouse; List? get stewardKillHouse; List? get stewards; GetPosStatusModel? get getPosStatus; String? get key;@JsonKey(name: 'create_date') String? get createDate;@JsonKey(name: 'modify_date') String? get modifyDate; bool? get trash; bool? get active; String? get guildsId; String? get licenseNumber; String? get guildsName; String? get typeActivity; String? get areaActivity; bool? get steward; bool? get hasPos; String? get provinceAcceptState; -/// Create a copy of ToStewardModel + int? get id; StewardUserModel? get user; AddressModel? get address; dynamic get guildAreaActivity; dynamic get guildTypeActivity; List? get killHouse; List? get stewardKillHouse; List? get stewards; GetPosStatusModel? get getPosStatus; String? get key; String? get createDate; String? get modifyDate; bool? get trash; bool? get active; int? get cityNumber; String? get cityName; String? get guildsId; String? get licenseNumber; String? get guildsName; String? get phone; String? get typeActivity; String? get areaActivity; int? get provinceNumber; String? get provinceName; bool? get steward; bool? get hasPos; int? get allocationLimit; bool? get limitationAllocation; String? get provinceAcceptState; bool? get stewardActive; bool? get stewardLimitationAllocation; bool? get license; int? get wallet; List? get cars; List? get userLevel; +/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -$ToStewardModelCopyWith get copyWith => _$ToStewardModelCopyWithImpl(this as ToStewardModel, _$identity); +$StewardModelCopyWith get copyWith => _$StewardModelCopyWithImpl(this as StewardModel, _$identity); - /// Serializes this ToStewardModel to a JSON map. + /// Serializes this StewardModel to a JSON map. Map toJson(); @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardModel&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.stewardKillHouse, stewardKillHouse)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.active, active) || other.active == active)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardModel&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&const DeepCollectionEquality().equals(other.guildAreaActivity, guildAreaActivity)&&const DeepCollectionEquality().equals(other.guildTypeActivity, guildTypeActivity)&&const DeepCollectionEquality().equals(other.killHouse, killHouse)&&const DeepCollectionEquality().equals(other.stewardKillHouse, stewardKillHouse)&&const DeepCollectionEquality().equals(other.stewards, stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.active, active) || other.active == active)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&(identical(other.allocationLimit, allocationLimit) || other.allocationLimit == allocationLimit)&&(identical(other.limitationAllocation, limitationAllocation) || other.limitationAllocation == limitationAllocation)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)&&(identical(other.stewardActive, stewardActive) || other.stewardActive == stewardActive)&&(identical(other.stewardLimitationAllocation, stewardLimitationAllocation) || other.stewardLimitationAllocation == stewardLimitationAllocation)&&(identical(other.license, license) || other.license == license)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other.cars, cars)&&const DeepCollectionEquality().equals(other.userLevel, userLevel)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(stewardKillHouse),const DeepCollectionEquality().hash(stewards),getPosStatus,key,createDate,modifyDate,trash,active,guildsId,licenseNumber,guildsName,typeActivity,areaActivity,steward,hasPos,provinceAcceptState]); +int get hashCode => Object.hashAll([runtimeType,id,user,address,const DeepCollectionEquality().hash(guildAreaActivity),const DeepCollectionEquality().hash(guildTypeActivity),const DeepCollectionEquality().hash(killHouse),const DeepCollectionEquality().hash(stewardKillHouse),const DeepCollectionEquality().hash(stewards),getPosStatus,key,createDate,modifyDate,trash,active,cityNumber,cityName,guildsId,licenseNumber,guildsName,phone,typeActivity,areaActivity,provinceNumber,provinceName,steward,hasPos,allocationLimit,limitationAllocation,provinceAcceptState,stewardActive,stewardLimitationAllocation,license,wallet,const DeepCollectionEquality().hash(cars),const DeepCollectionEquality().hash(userLevel)]); @override String toString() { - return 'ToStewardModel(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, active: $active, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, typeActivity: $typeActivity, areaActivity: $areaActivity, steward: $steward, hasPos: $hasPos, provinceAcceptState: $provinceAcceptState)'; + return 'StewardModel(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, active: $active, cityNumber: $cityNumber, cityName: $cityName, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, phone: $phone, typeActivity: $typeActivity, areaActivity: $areaActivity, provinceNumber: $provinceNumber, provinceName: $provinceName, steward: $steward, hasPos: $hasPos, allocationLimit: $allocationLimit, limitationAllocation: $limitationAllocation, provinceAcceptState: $provinceAcceptState, stewardActive: $stewardActive, stewardLimitationAllocation: $stewardLimitationAllocation, license: $license, wallet: $wallet, cars: $cars, userLevel: $userLevel)'; } } /// @nodoc -abstract mixin class $ToStewardModelCopyWith<$Res> { - factory $ToStewardModelCopyWith(ToStewardModel value, $Res Function(ToStewardModel) _then) = _$ToStewardModelCopyWithImpl; +abstract mixin class $StewardModelCopyWith<$Res> { + factory $StewardModelCopyWith(StewardModel value, $Res Function(StewardModel) _then) = _$StewardModelCopyWithImpl; @useResult $Res call({ - int? id, ToStewardUserModel? user, AddressModel? address, GuildAreaActivityModel? guildAreaActivity, GuildTypeActivityModel? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key,@JsonKey(name: 'create_date') String? createDate,@JsonKey(name: 'modify_date') String? modifyDate, bool? trash, bool? active, String? guildsId, String? licenseNumber, String? guildsName, String? typeActivity, String? areaActivity, bool? steward, bool? hasPos, String? provinceAcceptState + int? id, StewardUserModel? user, AddressModel? address, dynamic guildAreaActivity, dynamic guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, int? allocationLimit, bool? limitationAllocation, String? provinceAcceptState, bool? stewardActive, bool? stewardLimitationAllocation, bool? license, int? wallet, List? cars, List? userLevel }); -$ToStewardUserModelCopyWith<$Res>? get user;$AddressModelCopyWith<$Res>? get address;$GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity;$GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity;$GetPosStatusModelCopyWith<$Res>? get getPosStatus; +$StewardUserModelCopyWith<$Res>? get user;$AddressModelCopyWith<$Res>? get address;$GetPosStatusModelCopyWith<$Res>? get getPosStatus; } /// @nodoc -class _$ToStewardModelCopyWithImpl<$Res> - implements $ToStewardModelCopyWith<$Res> { - _$ToStewardModelCopyWithImpl(this._self, this._then); +class _$StewardModelCopyWithImpl<$Res> + implements $StewardModelCopyWith<$Res> { + _$StewardModelCopyWithImpl(this._self, this._then); - final ToStewardModel _self; - final $Res Function(ToStewardModel) _then; + final StewardModel _self; + final $Res Function(StewardModel) _then; -/// Create a copy of ToStewardModel +/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? active = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? provinceAcceptState = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? active = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? phone = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? allocationLimit = freezed,Object? limitationAllocation = freezed,Object? provinceAcceptState = freezed,Object? stewardActive = freezed,Object? stewardLimitationAllocation = freezed,Object? license = freezed,Object? wallet = freezed,Object? cars = freezed,Object? userLevel = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable -as ToStewardUserModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as StewardUserModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as AddressModel?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable -as GuildAreaActivityModel?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable -as GuildTypeActivityModel?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as dynamic,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable as List?,stewardKillHouse: freezed == stewardKillHouse ? _self.stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable as List?,stewards: freezed == stewards ? _self.stewards : stewards // ignore: cast_nullable_to_non_nullable as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable @@ -730,30 +588,43 @@ as String?,createDate: freezed == createDate ? _self.createDate : createDate // as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable as bool?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable -as bool?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as int?,limitationAllocation: freezed == limitationAllocation ? _self.limitationAllocation : limitationAllocation // ignore: cast_nullable_to_non_nullable as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable -as String?, +as String?,stewardActive: freezed == stewardActive ? _self.stewardActive : stewardActive // ignore: cast_nullable_to_non_nullable +as bool?,stewardLimitationAllocation: freezed == stewardLimitationAllocation ? _self.stewardLimitationAllocation : stewardLimitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self.cars : cars // ignore: cast_nullable_to_non_nullable +as List?,userLevel: freezed == userLevel ? _self.userLevel : userLevel // ignore: cast_nullable_to_non_nullable +as List?, )); } -/// Create a copy of ToStewardModel +/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardUserModelCopyWith<$Res>? get user { +$StewardUserModelCopyWith<$Res>? get user { if (_self.user == null) { return null; } - return $ToStewardUserModelCopyWith<$Res>(_self.user!, (value) { + return $StewardUserModelCopyWith<$Res>(_self.user!, (value) { return _then(_self.copyWith(user: value)); }); -}/// Create a copy of ToStewardModel +}/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -765,31 +636,7 @@ $AddressModelCopyWith<$Res>? get address { return $AddressModelCopyWith<$Res>(_self.address!, (value) { return _then(_self.copyWith(address: value)); }); -}/// Create a copy of ToStewardModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity { - if (_self.guildAreaActivity == null) { - return null; - } - - return $GuildAreaActivityModelCopyWith<$Res>(_self.guildAreaActivity!, (value) { - return _then(_self.copyWith(guildAreaActivity: value)); - }); -}/// Create a copy of ToStewardModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity { - if (_self.guildTypeActivity == null) { - return null; - } - - return $GuildTypeActivityModelCopyWith<$Res>(_self.guildTypeActivity!, (value) { - return _then(_self.copyWith(guildTypeActivity: value)); - }); -}/// Create a copy of ToStewardModel +}/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -808,15 +655,15 @@ $GetPosStatusModelCopyWith<$Res>? get getPosStatus { /// @nodoc @JsonSerializable() -class _ToStewardModel implements ToStewardModel { - _ToStewardModel({this.id, this.user, this.address, this.guildAreaActivity, this.guildTypeActivity, final List? killHouse, final List? stewardKillHouse, final List? stewards, this.getPosStatus, this.key, @JsonKey(name: 'create_date') this.createDate, @JsonKey(name: 'modify_date') this.modifyDate, this.trash, this.active, this.guildsId, this.licenseNumber, this.guildsName, this.typeActivity, this.areaActivity, this.steward, this.hasPos, this.provinceAcceptState}): _killHouse = killHouse,_stewardKillHouse = stewardKillHouse,_stewards = stewards; - factory _ToStewardModel.fromJson(Map json) => _$ToStewardModelFromJson(json); +class _StewardModel implements StewardModel { + _StewardModel({this.id, this.user, this.address, this.guildAreaActivity, this.guildTypeActivity, final List? killHouse, final List? stewardKillHouse, final List? stewards, this.getPosStatus, this.key, this.createDate, this.modifyDate, this.trash, this.active, this.cityNumber, this.cityName, this.guildsId, this.licenseNumber, this.guildsName, this.phone, this.typeActivity, this.areaActivity, this.provinceNumber, this.provinceName, this.steward, this.hasPos, this.allocationLimit, this.limitationAllocation, this.provinceAcceptState, this.stewardActive, this.stewardLimitationAllocation, this.license, this.wallet, final List? cars, final List? userLevel}): _killHouse = killHouse,_stewardKillHouse = stewardKillHouse,_stewards = stewards,_cars = cars,_userLevel = userLevel; + factory _StewardModel.fromJson(Map json) => _$StewardModelFromJson(json); @override final int? id; -@override final ToStewardUserModel? user; +@override final StewardUserModel? user; @override final AddressModel? address; -@override final GuildAreaActivityModel? guildAreaActivity; -@override final GuildTypeActivityModel? guildTypeActivity; +@override final dynamic guildAreaActivity; +@override final dynamic guildTypeActivity; final List? _killHouse; @override List? get killHouse { final value = _killHouse; @@ -846,77 +693,106 @@ class _ToStewardModel implements ToStewardModel { @override final GetPosStatusModel? getPosStatus; @override final String? key; -@override@JsonKey(name: 'create_date') final String? createDate; -@override@JsonKey(name: 'modify_date') final String? modifyDate; +@override final String? createDate; +@override final String? modifyDate; @override final bool? trash; @override final bool? active; +@override final int? cityNumber; +@override final String? cityName; @override final String? guildsId; @override final String? licenseNumber; @override final String? guildsName; +@override final String? phone; @override final String? typeActivity; @override final String? areaActivity; +@override final int? provinceNumber; +@override final String? provinceName; @override final bool? steward; @override final bool? hasPos; +@override final int? allocationLimit; +@override final bool? limitationAllocation; @override final String? provinceAcceptState; +@override final bool? stewardActive; +@override final bool? stewardLimitationAllocation; +@override final bool? license; +@override final int? wallet; + final List? _cars; +@override List? get cars { + final value = _cars; + if (value == null) return null; + if (_cars is EqualUnmodifiableListView) return _cars; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} -/// Create a copy of ToStewardModel + final List? _userLevel; +@override List? get userLevel { + final value = _userLevel; + if (value == null) return null; + if (_userLevel is EqualUnmodifiableListView) return _userLevel; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -_$ToStewardModelCopyWith<_ToStewardModel> get copyWith => __$ToStewardModelCopyWithImpl<_ToStewardModel>(this, _$identity); +_$StewardModelCopyWith<_StewardModel> get copyWith => __$StewardModelCopyWithImpl<_StewardModel>(this, _$identity); @override Map toJson() { - return _$ToStewardModelToJson(this, ); + return _$StewardModelToJson(this, ); } @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardModel&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&(identical(other.guildAreaActivity, guildAreaActivity) || other.guildAreaActivity == guildAreaActivity)&&(identical(other.guildTypeActivity, guildTypeActivity) || other.guildTypeActivity == guildTypeActivity)&&const DeepCollectionEquality().equals(other._killHouse, _killHouse)&&const DeepCollectionEquality().equals(other._stewardKillHouse, _stewardKillHouse)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.active, active) || other.active == active)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardModel&&(identical(other.id, id) || other.id == id)&&(identical(other.user, user) || other.user == user)&&(identical(other.address, address) || other.address == address)&&const DeepCollectionEquality().equals(other.guildAreaActivity, guildAreaActivity)&&const DeepCollectionEquality().equals(other.guildTypeActivity, guildTypeActivity)&&const DeepCollectionEquality().equals(other._killHouse, _killHouse)&&const DeepCollectionEquality().equals(other._stewardKillHouse, _stewardKillHouse)&&const DeepCollectionEquality().equals(other._stewards, _stewards)&&(identical(other.getPosStatus, getPosStatus) || other.getPosStatus == getPosStatus)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.active, active) || other.active == active)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.licenseNumber, licenseNumber) || other.licenseNumber == licenseNumber)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.hasPos, hasPos) || other.hasPos == hasPos)&&(identical(other.allocationLimit, allocationLimit) || other.allocationLimit == allocationLimit)&&(identical(other.limitationAllocation, limitationAllocation) || other.limitationAllocation == limitationAllocation)&&(identical(other.provinceAcceptState, provinceAcceptState) || other.provinceAcceptState == provinceAcceptState)&&(identical(other.stewardActive, stewardActive) || other.stewardActive == stewardActive)&&(identical(other.stewardLimitationAllocation, stewardLimitationAllocation) || other.stewardLimitationAllocation == stewardLimitationAllocation)&&(identical(other.license, license) || other.license == license)&&(identical(other.wallet, wallet) || other.wallet == wallet)&&const DeepCollectionEquality().equals(other._cars, _cars)&&const DeepCollectionEquality().equals(other._userLevel, _userLevel)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hashAll([runtimeType,id,user,address,guildAreaActivity,guildTypeActivity,const DeepCollectionEquality().hash(_killHouse),const DeepCollectionEquality().hash(_stewardKillHouse),const DeepCollectionEquality().hash(_stewards),getPosStatus,key,createDate,modifyDate,trash,active,guildsId,licenseNumber,guildsName,typeActivity,areaActivity,steward,hasPos,provinceAcceptState]); +int get hashCode => Object.hashAll([runtimeType,id,user,address,const DeepCollectionEquality().hash(guildAreaActivity),const DeepCollectionEquality().hash(guildTypeActivity),const DeepCollectionEquality().hash(_killHouse),const DeepCollectionEquality().hash(_stewardKillHouse),const DeepCollectionEquality().hash(_stewards),getPosStatus,key,createDate,modifyDate,trash,active,cityNumber,cityName,guildsId,licenseNumber,guildsName,phone,typeActivity,areaActivity,provinceNumber,provinceName,steward,hasPos,allocationLimit,limitationAllocation,provinceAcceptState,stewardActive,stewardLimitationAllocation,license,wallet,const DeepCollectionEquality().hash(_cars),const DeepCollectionEquality().hash(_userLevel)]); @override String toString() { - return 'ToStewardModel(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, active: $active, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, typeActivity: $typeActivity, areaActivity: $areaActivity, steward: $steward, hasPos: $hasPos, provinceAcceptState: $provinceAcceptState)'; + return 'StewardModel(id: $id, user: $user, address: $address, guildAreaActivity: $guildAreaActivity, guildTypeActivity: $guildTypeActivity, killHouse: $killHouse, stewardKillHouse: $stewardKillHouse, stewards: $stewards, getPosStatus: $getPosStatus, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, active: $active, cityNumber: $cityNumber, cityName: $cityName, guildsId: $guildsId, licenseNumber: $licenseNumber, guildsName: $guildsName, phone: $phone, typeActivity: $typeActivity, areaActivity: $areaActivity, provinceNumber: $provinceNumber, provinceName: $provinceName, steward: $steward, hasPos: $hasPos, allocationLimit: $allocationLimit, limitationAllocation: $limitationAllocation, provinceAcceptState: $provinceAcceptState, stewardActive: $stewardActive, stewardLimitationAllocation: $stewardLimitationAllocation, license: $license, wallet: $wallet, cars: $cars, userLevel: $userLevel)'; } } /// @nodoc -abstract mixin class _$ToStewardModelCopyWith<$Res> implements $ToStewardModelCopyWith<$Res> { - factory _$ToStewardModelCopyWith(_ToStewardModel value, $Res Function(_ToStewardModel) _then) = __$ToStewardModelCopyWithImpl; +abstract mixin class _$StewardModelCopyWith<$Res> implements $StewardModelCopyWith<$Res> { + factory _$StewardModelCopyWith(_StewardModel value, $Res Function(_StewardModel) _then) = __$StewardModelCopyWithImpl; @override @useResult $Res call({ - int? id, ToStewardUserModel? user, AddressModel? address, GuildAreaActivityModel? guildAreaActivity, GuildTypeActivityModel? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key,@JsonKey(name: 'create_date') String? createDate,@JsonKey(name: 'modify_date') String? modifyDate, bool? trash, bool? active, String? guildsId, String? licenseNumber, String? guildsName, String? typeActivity, String? areaActivity, bool? steward, bool? hasPos, String? provinceAcceptState + int? id, StewardUserModel? user, AddressModel? address, dynamic guildAreaActivity, dynamic guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, int? allocationLimit, bool? limitationAllocation, String? provinceAcceptState, bool? stewardActive, bool? stewardLimitationAllocation, bool? license, int? wallet, List? cars, List? userLevel }); -@override $ToStewardUserModelCopyWith<$Res>? get user;@override $AddressModelCopyWith<$Res>? get address;@override $GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity;@override $GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity;@override $GetPosStatusModelCopyWith<$Res>? get getPosStatus; +@override $StewardUserModelCopyWith<$Res>? get user;@override $AddressModelCopyWith<$Res>? get address;@override $GetPosStatusModelCopyWith<$Res>? get getPosStatus; } /// @nodoc -class __$ToStewardModelCopyWithImpl<$Res> - implements _$ToStewardModelCopyWith<$Res> { - __$ToStewardModelCopyWithImpl(this._self, this._then); +class __$StewardModelCopyWithImpl<$Res> + implements _$StewardModelCopyWith<$Res> { + __$StewardModelCopyWithImpl(this._self, this._then); - final _ToStewardModel _self; - final $Res Function(_ToStewardModel) _then; + final _StewardModel _self; + final $Res Function(_StewardModel) _then; -/// Create a copy of ToStewardModel +/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? active = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? provinceAcceptState = freezed,}) { - return _then(_ToStewardModel( +@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? user = freezed,Object? address = freezed,Object? guildAreaActivity = freezed,Object? guildTypeActivity = freezed,Object? killHouse = freezed,Object? stewardKillHouse = freezed,Object? stewards = freezed,Object? getPosStatus = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? active = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? guildsId = freezed,Object? licenseNumber = freezed,Object? guildsName = freezed,Object? phone = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? steward = freezed,Object? hasPos = freezed,Object? allocationLimit = freezed,Object? limitationAllocation = freezed,Object? provinceAcceptState = freezed,Object? stewardActive = freezed,Object? stewardLimitationAllocation = freezed,Object? license = freezed,Object? wallet = freezed,Object? cars = freezed,Object? userLevel = freezed,}) { + return _then(_StewardModel( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable -as ToStewardUserModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as StewardUserModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as AddressModel?,guildAreaActivity: freezed == guildAreaActivity ? _self.guildAreaActivity : guildAreaActivity // ignore: cast_nullable_to_non_nullable -as GuildAreaActivityModel?,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable -as GuildTypeActivityModel?,killHouse: freezed == killHouse ? _self._killHouse : killHouse // ignore: cast_nullable_to_non_nullable +as dynamic,guildTypeActivity: freezed == guildTypeActivity ? _self.guildTypeActivity : guildTypeActivity // ignore: cast_nullable_to_non_nullable +as dynamic,killHouse: freezed == killHouse ? _self._killHouse : killHouse // ignore: cast_nullable_to_non_nullable as List?,stewardKillHouse: freezed == stewardKillHouse ? _self._stewardKillHouse : stewardKillHouse // ignore: cast_nullable_to_non_nullable as List?,stewards: freezed == stewards ? _self._stewards : stewards // ignore: cast_nullable_to_non_nullable as List?,getPosStatus: freezed == getPosStatus ? _self.getPosStatus : getPosStatus // ignore: cast_nullable_to_non_nullable @@ -925,31 +801,44 @@ as String?,createDate: freezed == createDate ? _self.createDate : createDate // as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable as bool?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable -as bool?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable as String?,licenseNumber: freezed == licenseNumber ? _self.licenseNumber : licenseNumber // ignore: cast_nullable_to_non_nullable as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,phone: freezed == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable as bool?,hasPos: freezed == hasPos ? _self.hasPos : hasPos // ignore: cast_nullable_to_non_nullable +as bool?,allocationLimit: freezed == allocationLimit ? _self.allocationLimit : allocationLimit // ignore: cast_nullable_to_non_nullable +as int?,limitationAllocation: freezed == limitationAllocation ? _self.limitationAllocation : limitationAllocation // ignore: cast_nullable_to_non_nullable as bool?,provinceAcceptState: freezed == provinceAcceptState ? _self.provinceAcceptState : provinceAcceptState // ignore: cast_nullable_to_non_nullable -as String?, +as String?,stewardActive: freezed == stewardActive ? _self.stewardActive : stewardActive // ignore: cast_nullable_to_non_nullable +as bool?,stewardLimitationAllocation: freezed == stewardLimitationAllocation ? _self.stewardLimitationAllocation : stewardLimitationAllocation // ignore: cast_nullable_to_non_nullable +as bool?,license: freezed == license ? _self.license : license // ignore: cast_nullable_to_non_nullable +as bool?,wallet: freezed == wallet ? _self.wallet : wallet // ignore: cast_nullable_to_non_nullable +as int?,cars: freezed == cars ? _self._cars : cars // ignore: cast_nullable_to_non_nullable +as List?,userLevel: freezed == userLevel ? _self._userLevel : userLevel // ignore: cast_nullable_to_non_nullable +as List?, )); } -/// Create a copy of ToStewardModel +/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardUserModelCopyWith<$Res>? get user { +$StewardUserModelCopyWith<$Res>? get user { if (_self.user == null) { return null; } - return $ToStewardUserModelCopyWith<$Res>(_self.user!, (value) { + return $StewardUserModelCopyWith<$Res>(_self.user!, (value) { return _then(_self.copyWith(user: value)); }); -}/// Create a copy of ToStewardModel +}/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -961,31 +850,7 @@ $AddressModelCopyWith<$Res>? get address { return $AddressModelCopyWith<$Res>(_self.address!, (value) { return _then(_self.copyWith(address: value)); }); -}/// Create a copy of ToStewardModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$GuildAreaActivityModelCopyWith<$Res>? get guildAreaActivity { - if (_self.guildAreaActivity == null) { - return null; - } - - return $GuildAreaActivityModelCopyWith<$Res>(_self.guildAreaActivity!, (value) { - return _then(_self.copyWith(guildAreaActivity: value)); - }); -}/// Create a copy of ToStewardModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$GuildTypeActivityModelCopyWith<$Res>? get guildTypeActivity { - if (_self.guildTypeActivity == null) { - return null; - } - - return $GuildTypeActivityModelCopyWith<$Res>(_self.guildTypeActivity!, (value) { - return _then(_self.copyWith(guildTypeActivity: value)); - }); -}/// Create a copy of ToStewardModel +}/// Create a copy of StewardModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -1002,22 +867,22 @@ $GetPosStatusModelCopyWith<$Res>? get getPosStatus { /// @nodoc -mixin _$ToStewardUserModel { +mixin _$StewardUserModel { - String? get fullname;@JsonKey(name: 'first_name') String? get firstName;@JsonKey(name: 'last_name') String? get lastName; String? get mobile;@JsonKey(name: 'national_id') String? get nationalId; String? get city; -/// Create a copy of ToStewardUserModel + String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get nationalId; String? get city; +/// Create a copy of StewardUserModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -$ToStewardUserModelCopyWith get copyWith => _$ToStewardUserModelCopyWithImpl(this as ToStewardUserModel, _$identity); +$StewardUserModelCopyWith get copyWith => _$StewardUserModelCopyWithImpl(this as StewardUserModel, _$identity); - /// Serializes this ToStewardUserModel to a JSON map. + /// Serializes this StewardUserModel to a JSON map. Map toJson(); @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardUserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is StewardUserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); } @JsonKey(includeFromJson: false, includeToJson: false) @@ -1026,18 +891,18 @@ int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,n @override String toString() { - return 'ToStewardUserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; + return 'StewardUserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; } } /// @nodoc -abstract mixin class $ToStewardUserModelCopyWith<$Res> { - factory $ToStewardUserModelCopyWith(ToStewardUserModel value, $Res Function(ToStewardUserModel) _then) = _$ToStewardUserModelCopyWithImpl; +abstract mixin class $StewardUserModelCopyWith<$Res> { + factory $StewardUserModelCopyWith(StewardUserModel value, $Res Function(StewardUserModel) _then) = _$StewardUserModelCopyWithImpl; @useResult $Res call({ - String? fullname,@JsonKey(name: 'first_name') String? firstName,@JsonKey(name: 'last_name') String? lastName, String? mobile,@JsonKey(name: 'national_id') String? nationalId, String? city + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city }); @@ -1045,14 +910,14 @@ $Res call({ } /// @nodoc -class _$ToStewardUserModelCopyWithImpl<$Res> - implements $ToStewardUserModelCopyWith<$Res> { - _$ToStewardUserModelCopyWithImpl(this._self, this._then); +class _$StewardUserModelCopyWithImpl<$Res> + implements $StewardUserModelCopyWith<$Res> { + _$StewardUserModelCopyWithImpl(this._self, this._then); - final ToStewardUserModel _self; - final $Res Function(ToStewardUserModel) _then; + final StewardUserModel _self; + final $Res Function(StewardUserModel) _then; -/// Create a copy of ToStewardUserModel +/// Create a copy of StewardUserModel /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { return _then(_self.copyWith( @@ -1072,31 +937,31 @@ as String?, /// @nodoc @JsonSerializable() -class _ToStewardUserModel implements ToStewardUserModel { - _ToStewardUserModel({this.fullname, @JsonKey(name: 'first_name') this.firstName, @JsonKey(name: 'last_name') this.lastName, this.mobile, @JsonKey(name: 'national_id') this.nationalId, this.city}); - factory _ToStewardUserModel.fromJson(Map json) => _$ToStewardUserModelFromJson(json); +class _StewardUserModel implements StewardUserModel { + _StewardUserModel({this.fullname, this.firstName, this.lastName, this.mobile, this.nationalId, this.city}); + factory _StewardUserModel.fromJson(Map json) => _$StewardUserModelFromJson(json); @override final String? fullname; -@override@JsonKey(name: 'first_name') final String? firstName; -@override@JsonKey(name: 'last_name') final String? lastName; +@override final String? firstName; +@override final String? lastName; @override final String? mobile; -@override@JsonKey(name: 'national_id') final String? nationalId; +@override final String? nationalId; @override final String? city; -/// Create a copy of ToStewardUserModel +/// Create a copy of StewardUserModel /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -_$ToStewardUserModelCopyWith<_ToStewardUserModel> get copyWith => __$ToStewardUserModelCopyWithImpl<_ToStewardUserModel>(this, _$identity); +_$StewardUserModelCopyWith<_StewardUserModel> get copyWith => __$StewardUserModelCopyWithImpl<_StewardUserModel>(this, _$identity); @override Map toJson() { - return _$ToStewardUserModelToJson(this, ); + return _$StewardUserModelToJson(this, ); } @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardUserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _StewardUserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); } @JsonKey(includeFromJson: false, includeToJson: false) @@ -1105,18 +970,18 @@ int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,n @override String toString() { - return 'ToStewardUserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; + return 'StewardUserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; } } /// @nodoc -abstract mixin class _$ToStewardUserModelCopyWith<$Res> implements $ToStewardUserModelCopyWith<$Res> { - factory _$ToStewardUserModelCopyWith(_ToStewardUserModel value, $Res Function(_ToStewardUserModel) _then) = __$ToStewardUserModelCopyWithImpl; +abstract mixin class _$StewardUserModelCopyWith<$Res> implements $StewardUserModelCopyWith<$Res> { + factory _$StewardUserModelCopyWith(_StewardUserModel value, $Res Function(_StewardUserModel) _then) = __$StewardUserModelCopyWithImpl; @override @useResult $Res call({ - String? fullname,@JsonKey(name: 'first_name') String? firstName,@JsonKey(name: 'last_name') String? lastName, String? mobile,@JsonKey(name: 'national_id') String? nationalId, String? city + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city }); @@ -1124,17 +989,17 @@ $Res call({ } /// @nodoc -class __$ToStewardUserModelCopyWithImpl<$Res> - implements _$ToStewardUserModelCopyWith<$Res> { - __$ToStewardUserModelCopyWithImpl(this._self, this._then); +class __$StewardUserModelCopyWithImpl<$Res> + implements _$StewardUserModelCopyWith<$Res> { + __$StewardUserModelCopyWithImpl(this._self, this._then); - final _ToStewardUserModel _self; - final $Res Function(_ToStewardUserModel) _then; + final _StewardUserModel _self; + final $Res Function(_StewardUserModel) _then; -/// Create a copy of ToStewardUserModel +/// Create a copy of StewardUserModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { - return _then(_ToStewardUserModel( + return _then(_StewardUserModel( fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable @@ -1149,282 +1014,10 @@ as String?, } -/// @nodoc -mixin _$ToStewardCityModel { - - String? get key;@JsonKey(name: 'name') String? get title; -/// Create a copy of ToStewardCityModel -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$ToStewardCityModelCopyWith get copyWith => _$ToStewardCityModelCopyWithImpl(this as ToStewardCityModel, _$identity); - - /// Serializes this ToStewardCityModel to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardCityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,key,title); - -@override -String toString() { - return 'ToStewardCityModel(key: $key, title: $title)'; -} - - -} - -/// @nodoc -abstract mixin class $ToStewardCityModelCopyWith<$Res> { - factory $ToStewardCityModelCopyWith(ToStewardCityModel value, $Res Function(ToStewardCityModel) _then) = _$ToStewardCityModelCopyWithImpl; -@useResult -$Res call({ - String? key,@JsonKey(name: 'name') String? title -}); - - - - -} -/// @nodoc -class _$ToStewardCityModelCopyWithImpl<$Res> - implements $ToStewardCityModelCopyWith<$Res> { - _$ToStewardCityModelCopyWithImpl(this._self, this._then); - - final ToStewardCityModel _self; - final $Res Function(ToStewardCityModel) _then; - -/// Create a copy of ToStewardCityModel -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { - return _then(_self.copyWith( -key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable -as String?, - )); -} - -} - - -/// @nodoc -@JsonSerializable() - -class _ToStewardCityModel implements ToStewardCityModel { - _ToStewardCityModel({this.key, @JsonKey(name: 'name') this.title}); - factory _ToStewardCityModel.fromJson(Map json) => _$ToStewardCityModelFromJson(json); - -@override final String? key; -@override@JsonKey(name: 'name') final String? title; - -/// Create a copy of ToStewardCityModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$ToStewardCityModelCopyWith<_ToStewardCityModel> get copyWith => __$ToStewardCityModelCopyWithImpl<_ToStewardCityModel>(this, _$identity); - -@override -Map toJson() { - return _$ToStewardCityModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardCityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,key,title); - -@override -String toString() { - return 'ToStewardCityModel(key: $key, title: $title)'; -} - - -} - -/// @nodoc -abstract mixin class _$ToStewardCityModelCopyWith<$Res> implements $ToStewardCityModelCopyWith<$Res> { - factory _$ToStewardCityModelCopyWith(_ToStewardCityModel value, $Res Function(_ToStewardCityModel) _then) = __$ToStewardCityModelCopyWithImpl; -@override @useResult -$Res call({ - String? key,@JsonKey(name: 'name') String? title -}); - - - - -} -/// @nodoc -class __$ToStewardCityModelCopyWithImpl<$Res> - implements _$ToStewardCityModelCopyWith<$Res> { - __$ToStewardCityModelCopyWithImpl(this._self, this._then); - - final _ToStewardCityModel _self; - final $Res Function(_ToStewardCityModel) _then; - -/// Create a copy of ToStewardCityModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { - return _then(_ToStewardCityModel( -key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable -as String?, - )); -} - - -} - - -/// @nodoc -mixin _$ToStewardProvinceModel { - - String? get key;@JsonKey(name: 'name') String? get title; -/// Create a copy of ToStewardProvinceModel -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$ToStewardProvinceModelCopyWith get copyWith => _$ToStewardProvinceModelCopyWithImpl(this as ToStewardProvinceModel, _$identity); - - /// Serializes this ToStewardProvinceModel to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is ToStewardProvinceModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,key,title); - -@override -String toString() { - return 'ToStewardProvinceModel(key: $key, title: $title)'; -} - - -} - -/// @nodoc -abstract mixin class $ToStewardProvinceModelCopyWith<$Res> { - factory $ToStewardProvinceModelCopyWith(ToStewardProvinceModel value, $Res Function(ToStewardProvinceModel) _then) = _$ToStewardProvinceModelCopyWithImpl; -@useResult -$Res call({ - String? key,@JsonKey(name: 'name') String? title -}); - - - - -} -/// @nodoc -class _$ToStewardProvinceModelCopyWithImpl<$Res> - implements $ToStewardProvinceModelCopyWith<$Res> { - _$ToStewardProvinceModelCopyWithImpl(this._self, this._then); - - final ToStewardProvinceModel _self; - final $Res Function(ToStewardProvinceModel) _then; - -/// Create a copy of ToStewardProvinceModel -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { - return _then(_self.copyWith( -key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable -as String?, - )); -} - -} - - -/// @nodoc -@JsonSerializable() - -class _ToStewardProvinceModel implements ToStewardProvinceModel { - _ToStewardProvinceModel({this.key, @JsonKey(name: 'name') this.title}); - factory _ToStewardProvinceModel.fromJson(Map json) => _$ToStewardProvinceModelFromJson(json); - -@override final String? key; -@override@JsonKey(name: 'name') final String? title; - -/// Create a copy of ToStewardProvinceModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$ToStewardProvinceModelCopyWith<_ToStewardProvinceModel> get copyWith => __$ToStewardProvinceModelCopyWithImpl<_ToStewardProvinceModel>(this, _$identity); - -@override -Map toJson() { - return _$ToStewardProvinceModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToStewardProvinceModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,key,title); - -@override -String toString() { - return 'ToStewardProvinceModel(key: $key, title: $title)'; -} - - -} - -/// @nodoc -abstract mixin class _$ToStewardProvinceModelCopyWith<$Res> implements $ToStewardProvinceModelCopyWith<$Res> { - factory _$ToStewardProvinceModelCopyWith(_ToStewardProvinceModel value, $Res Function(_ToStewardProvinceModel) _then) = __$ToStewardProvinceModelCopyWithImpl; -@override @useResult -$Res call({ - String? key,@JsonKey(name: 'name') String? title -}); - - - - -} -/// @nodoc -class __$ToStewardProvinceModelCopyWithImpl<$Res> - implements _$ToStewardProvinceModelCopyWith<$Res> { - __$ToStewardProvinceModelCopyWithImpl(this._self, this._then); - - final _ToStewardProvinceModel _self; - final $Res Function(_ToStewardProvinceModel) _then; - -/// Create a copy of ToStewardProvinceModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { - return _then(_ToStewardProvinceModel( -key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable -as String?, - )); -} - - -} - - /// @nodoc mixin _$AddressModel { - ToStewardProvinceModel? get province; ToStewardCityModel? get city; String? get address; String? get postalCode; + ProvinceModel? get province; CityModel? get city; String? get address; String? get postalCode; /// Create a copy of AddressModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -1457,11 +1050,11 @@ abstract mixin class $AddressModelCopyWith<$Res> { factory $AddressModelCopyWith(AddressModel value, $Res Function(AddressModel) _then) = _$AddressModelCopyWithImpl; @useResult $Res call({ - ToStewardProvinceModel? province, ToStewardCityModel? city, String? address, String? postalCode + ProvinceModel? province, CityModel? city, String? address, String? postalCode }); -$ToStewardProvinceModelCopyWith<$Res>? get province;$ToStewardCityModelCopyWith<$Res>? get city; +$ProvinceModelCopyWith<$Res>? get province;$CityModelCopyWith<$Res>? get city; } /// @nodoc @@ -1477,8 +1070,8 @@ class _$AddressModelCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { return _then(_self.copyWith( province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable -as ToStewardProvinceModel?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as ToStewardCityModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as ProvinceModel?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as CityModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable as String?, )); @@ -1487,24 +1080,24 @@ as String?, /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardProvinceModelCopyWith<$Res>? get province { +$ProvinceModelCopyWith<$Res>? get province { if (_self.province == null) { return null; } - return $ToStewardProvinceModelCopyWith<$Res>(_self.province!, (value) { + return $ProvinceModelCopyWith<$Res>(_self.province!, (value) { return _then(_self.copyWith(province: value)); }); }/// Create a copy of AddressModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardCityModelCopyWith<$Res>? get city { +$CityModelCopyWith<$Res>? get city { if (_self.city == null) { return null; } - return $ToStewardCityModelCopyWith<$Res>(_self.city!, (value) { + return $CityModelCopyWith<$Res>(_self.city!, (value) { return _then(_self.copyWith(city: value)); }); } @@ -1518,8 +1111,8 @@ class _AddressModel implements AddressModel { _AddressModel({this.province, this.city, this.address, this.postalCode}); factory _AddressModel.fromJson(Map json) => _$AddressModelFromJson(json); -@override final ToStewardProvinceModel? province; -@override final ToStewardCityModel? city; +@override final ProvinceModel? province; +@override final CityModel? city; @override final String? address; @override final String? postalCode; @@ -1556,11 +1149,11 @@ abstract mixin class _$AddressModelCopyWith<$Res> implements $AddressModelCopyWi factory _$AddressModelCopyWith(_AddressModel value, $Res Function(_AddressModel) _then) = __$AddressModelCopyWithImpl; @override @useResult $Res call({ - ToStewardProvinceModel? province, ToStewardCityModel? city, String? address, String? postalCode + ProvinceModel? province, CityModel? city, String? address, String? postalCode }); -@override $ToStewardProvinceModelCopyWith<$Res>? get province;@override $ToStewardCityModelCopyWith<$Res>? get city; +@override $ProvinceModelCopyWith<$Res>? get province;@override $CityModelCopyWith<$Res>? get city; } /// @nodoc @@ -1576,8 +1169,8 @@ class __$AddressModelCopyWithImpl<$Res> @override @pragma('vm:prefer-inline') $Res call({Object? province = freezed,Object? city = freezed,Object? address = freezed,Object? postalCode = freezed,}) { return _then(_AddressModel( province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable -as ToStewardProvinceModel?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as ToStewardCityModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as ProvinceModel?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as CityModel?,address: freezed == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as String?,postalCode: freezed == postalCode ? _self.postalCode : postalCode // ignore: cast_nullable_to_non_nullable as String?, )); @@ -1587,24 +1180,24 @@ as String?, /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardProvinceModelCopyWith<$Res>? get province { +$ProvinceModelCopyWith<$Res>? get province { if (_self.province == null) { return null; } - return $ToStewardProvinceModelCopyWith<$Res>(_self.province!, (value) { + return $ProvinceModelCopyWith<$Res>(_self.province!, (value) { return _then(_self.copyWith(province: value)); }); }/// Create a copy of AddressModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$ToStewardCityModelCopyWith<$Res>? get city { +$CityModelCopyWith<$Res>? get city { if (_self.city == null) { return null; } - return $ToStewardCityModelCopyWith<$Res>(_self.city!, (value) { + return $CityModelCopyWith<$Res>(_self.city!, (value) { return _then(_self.copyWith(city: value)); }); } @@ -1612,42 +1205,42 @@ $ToStewardCityModelCopyWith<$Res>? get city { /// @nodoc -mixin _$GuildAreaActivityModel { +mixin _$ProvinceModel { - String? get key; String? get title; -/// Create a copy of GuildAreaActivityModel + String? get key; String? get name; +/// Create a copy of ProvinceModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -$GuildAreaActivityModelCopyWith get copyWith => _$GuildAreaActivityModelCopyWithImpl(this as GuildAreaActivityModel, _$identity); +$ProvinceModelCopyWith get copyWith => _$ProvinceModelCopyWithImpl(this as ProvinceModel, _$identity); - /// Serializes this GuildAreaActivityModel to a JSON map. + /// Serializes this ProvinceModel to a JSON map. Map toJson(); @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildAreaActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is ProvinceModel&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,title); +int get hashCode => Object.hash(runtimeType,key,name); @override String toString() { - return 'GuildAreaActivityModel(key: $key, title: $title)'; + return 'ProvinceModel(key: $key, name: $name)'; } } /// @nodoc -abstract mixin class $GuildAreaActivityModelCopyWith<$Res> { - factory $GuildAreaActivityModelCopyWith(GuildAreaActivityModel value, $Res Function(GuildAreaActivityModel) _then) = _$GuildAreaActivityModelCopyWithImpl; +abstract mixin class $ProvinceModelCopyWith<$Res> { + factory $ProvinceModelCopyWith(ProvinceModel value, $Res Function(ProvinceModel) _then) = _$ProvinceModelCopyWithImpl; @useResult $Res call({ - String? key, String? title + String? key, String? name }); @@ -1655,19 +1248,19 @@ $Res call({ } /// @nodoc -class _$GuildAreaActivityModelCopyWithImpl<$Res> - implements $GuildAreaActivityModelCopyWith<$Res> { - _$GuildAreaActivityModelCopyWithImpl(this._self, this._then); +class _$ProvinceModelCopyWithImpl<$Res> + implements $ProvinceModelCopyWith<$Res> { + _$ProvinceModelCopyWithImpl(this._self, this._then); - final GuildAreaActivityModel _self; - final $Res Function(GuildAreaActivityModel) _then; + final ProvinceModel _self; + final $Res Function(ProvinceModel) _then; -/// Create a copy of GuildAreaActivityModel +/// Create a copy of ProvinceModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -1678,47 +1271,47 @@ as String?, /// @nodoc @JsonSerializable() -class _GuildAreaActivityModel implements GuildAreaActivityModel { - _GuildAreaActivityModel({this.key, this.title}); - factory _GuildAreaActivityModel.fromJson(Map json) => _$GuildAreaActivityModelFromJson(json); +class _ProvinceModel implements ProvinceModel { + _ProvinceModel({this.key, this.name}); + factory _ProvinceModel.fromJson(Map json) => _$ProvinceModelFromJson(json); @override final String? key; -@override final String? title; +@override final String? name; -/// Create a copy of GuildAreaActivityModel +/// Create a copy of ProvinceModel /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -_$GuildAreaActivityModelCopyWith<_GuildAreaActivityModel> get copyWith => __$GuildAreaActivityModelCopyWithImpl<_GuildAreaActivityModel>(this, _$identity); +_$ProvinceModelCopyWith<_ProvinceModel> get copyWith => __$ProvinceModelCopyWithImpl<_ProvinceModel>(this, _$identity); @override Map toJson() { - return _$GuildAreaActivityModelToJson(this, ); + return _$ProvinceModelToJson(this, ); } @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildAreaActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ProvinceModel&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,title); +int get hashCode => Object.hash(runtimeType,key,name); @override String toString() { - return 'GuildAreaActivityModel(key: $key, title: $title)'; + return 'ProvinceModel(key: $key, name: $name)'; } } /// @nodoc -abstract mixin class _$GuildAreaActivityModelCopyWith<$Res> implements $GuildAreaActivityModelCopyWith<$Res> { - factory _$GuildAreaActivityModelCopyWith(_GuildAreaActivityModel value, $Res Function(_GuildAreaActivityModel) _then) = __$GuildAreaActivityModelCopyWithImpl; +abstract mixin class _$ProvinceModelCopyWith<$Res> implements $ProvinceModelCopyWith<$Res> { + factory _$ProvinceModelCopyWith(_ProvinceModel value, $Res Function(_ProvinceModel) _then) = __$ProvinceModelCopyWithImpl; @override @useResult $Res call({ - String? key, String? title + String? key, String? name }); @@ -1726,19 +1319,19 @@ $Res call({ } /// @nodoc -class __$GuildAreaActivityModelCopyWithImpl<$Res> - implements _$GuildAreaActivityModelCopyWith<$Res> { - __$GuildAreaActivityModelCopyWithImpl(this._self, this._then); +class __$ProvinceModelCopyWithImpl<$Res> + implements _$ProvinceModelCopyWith<$Res> { + __$ProvinceModelCopyWithImpl(this._self, this._then); - final _GuildAreaActivityModel _self; - final $Res Function(_GuildAreaActivityModel) _then; + final _ProvinceModel _self; + final $Res Function(_ProvinceModel) _then; -/// Create a copy of GuildAreaActivityModel +/// Create a copy of ProvinceModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { - return _then(_GuildAreaActivityModel( +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_ProvinceModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -1748,42 +1341,42 @@ as String?, /// @nodoc -mixin _$GuildTypeActivityModel { +mixin _$CityModel { - String? get key; String? get title; -/// Create a copy of GuildTypeActivityModel + String? get key; String? get name; +/// Create a copy of CityModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -$GuildTypeActivityModelCopyWith get copyWith => _$GuildTypeActivityModelCopyWithImpl(this as GuildTypeActivityModel, _$identity); +$CityModelCopyWith get copyWith => _$CityModelCopyWithImpl(this as CityModel, _$identity); - /// Serializes this GuildTypeActivityModel to a JSON map. + /// Serializes this CityModel to a JSON map. Map toJson(); @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is GuildTypeActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is CityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,title); +int get hashCode => Object.hash(runtimeType,key,name); @override String toString() { - return 'GuildTypeActivityModel(key: $key, title: $title)'; + return 'CityModel(key: $key, name: $name)'; } } /// @nodoc -abstract mixin class $GuildTypeActivityModelCopyWith<$Res> { - factory $GuildTypeActivityModelCopyWith(GuildTypeActivityModel value, $Res Function(GuildTypeActivityModel) _then) = _$GuildTypeActivityModelCopyWithImpl; +abstract mixin class $CityModelCopyWith<$Res> { + factory $CityModelCopyWith(CityModel value, $Res Function(CityModel) _then) = _$CityModelCopyWithImpl; @useResult $Res call({ - String? key, String? title + String? key, String? name }); @@ -1791,19 +1384,19 @@ $Res call({ } /// @nodoc -class _$GuildTypeActivityModelCopyWithImpl<$Res> - implements $GuildTypeActivityModelCopyWith<$Res> { - _$GuildTypeActivityModelCopyWithImpl(this._self, this._then); +class _$CityModelCopyWithImpl<$Res> + implements $CityModelCopyWith<$Res> { + _$CityModelCopyWithImpl(this._self, this._then); - final GuildTypeActivityModel _self; - final $Res Function(GuildTypeActivityModel) _then; + final CityModel _self; + final $Res Function(CityModel) _then; -/// Create a copy of GuildTypeActivityModel +/// Create a copy of CityModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? title = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? name = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -1814,47 +1407,47 @@ as String?, /// @nodoc @JsonSerializable() -class _GuildTypeActivityModel implements GuildTypeActivityModel { - _GuildTypeActivityModel({this.key, this.title}); - factory _GuildTypeActivityModel.fromJson(Map json) => _$GuildTypeActivityModelFromJson(json); +class _CityModel implements CityModel { + _CityModel({this.key, this.name}); + factory _CityModel.fromJson(Map json) => _$CityModelFromJson(json); @override final String? key; -@override final String? title; +@override final String? name; -/// Create a copy of GuildTypeActivityModel +/// Create a copy of CityModel /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -_$GuildTypeActivityModelCopyWith<_GuildTypeActivityModel> get copyWith => __$GuildTypeActivityModelCopyWithImpl<_GuildTypeActivityModel>(this, _$identity); +_$CityModelCopyWith<_CityModel> get copyWith => __$CityModelCopyWithImpl<_CityModel>(this, _$identity); @override Map toJson() { - return _$GuildTypeActivityModelToJson(this, ); + return _$CityModelToJson(this, ); } @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _GuildTypeActivityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.title, title) || other.title == title)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CityModel&&(identical(other.key, key) || other.key == key)&&(identical(other.name, name) || other.name == name)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,title); +int get hashCode => Object.hash(runtimeType,key,name); @override String toString() { - return 'GuildTypeActivityModel(key: $key, title: $title)'; + return 'CityModel(key: $key, name: $name)'; } } /// @nodoc -abstract mixin class _$GuildTypeActivityModelCopyWith<$Res> implements $GuildTypeActivityModelCopyWith<$Res> { - factory _$GuildTypeActivityModelCopyWith(_GuildTypeActivityModel value, $Res Function(_GuildTypeActivityModel) _then) = __$GuildTypeActivityModelCopyWithImpl; +abstract mixin class _$CityModelCopyWith<$Res> implements $CityModelCopyWith<$Res> { + factory _$CityModelCopyWith(_CityModel value, $Res Function(_CityModel) _then) = __$CityModelCopyWithImpl; @override @useResult $Res call({ - String? key, String? title + String? key, String? name }); @@ -1862,19 +1455,19 @@ $Res call({ } /// @nodoc -class __$GuildTypeActivityModelCopyWithImpl<$Res> - implements _$GuildTypeActivityModelCopyWith<$Res> { - __$GuildTypeActivityModelCopyWithImpl(this._self, this._then); +class __$CityModelCopyWithImpl<$Res> + implements _$CityModelCopyWith<$Res> { + __$CityModelCopyWithImpl(this._self, this._then); - final _GuildTypeActivityModel _self; - final $Res Function(_GuildTypeActivityModel) _then; + final _CityModel _self; + final $Res Function(_CityModel) _then; -/// Create a copy of GuildTypeActivityModel +/// Create a copy of CityModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? title = freezed,}) { - return _then(_GuildTypeActivityModel( +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? name = freezed,}) { + return _then(_CityModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -2019,715 +1612,6 @@ as bool?, } -} - - -/// @nodoc -mixin _$KillHouseModel { - - String? get key;@JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? get operator; String? get name; bool? get killer; -/// Create a copy of KillHouseModel -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$KillHouseModelCopyWith get copyWith => _$KillHouseModelCopyWithImpl(this as KillHouseModel, _$identity); - - /// Serializes this KillHouseModel to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouseModel&&(identical(other.key, key) || other.key == key)&&(identical(other.operator, operator) || other.operator == operator)&&(identical(other.name, name) || other.name == name)&&(identical(other.killer, killer) || other.killer == killer)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,key,operator,name,killer); - -@override -String toString() { - return 'KillHouseModel(key: $key, operator: $operator, name: $name, killer: $killer)'; -} - - -} - -/// @nodoc -abstract mixin class $KillHouseModelCopyWith<$Res> { - factory $KillHouseModelCopyWith(KillHouseModel value, $Res Function(KillHouseModel) _then) = _$KillHouseModelCopyWithImpl; -@useResult -$Res call({ - String? key,@JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? operator, String? name, bool? killer -}); - - -$KillHouseOperatorModelCopyWith<$Res>? get operator; - -} -/// @nodoc -class _$KillHouseModelCopyWithImpl<$Res> - implements $KillHouseModelCopyWith<$Res> { - _$KillHouseModelCopyWithImpl(this._self, this._then); - - final KillHouseModel _self; - final $Res Function(KillHouseModel) _then; - -/// Create a copy of KillHouseModel -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? operator = freezed,Object? name = freezed,Object? killer = freezed,}) { - return _then(_self.copyWith( -key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,operator: freezed == operator ? _self.operator : operator // ignore: cast_nullable_to_non_nullable -as KillHouseOperatorModel?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String?,killer: freezed == killer ? _self.killer : killer // ignore: cast_nullable_to_non_nullable -as bool?, - )); -} -/// Create a copy of KillHouseModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$KillHouseOperatorModelCopyWith<$Res>? get operator { - if (_self.operator == null) { - return null; - } - - return $KillHouseOperatorModelCopyWith<$Res>(_self.operator!, (value) { - return _then(_self.copyWith(operator: value)); - }); -} -} - - -/// @nodoc -@JsonSerializable() - -class _KillHouseModel implements KillHouseModel { - _KillHouseModel({this.key, @JsonKey(name: 'kill_house_operator') this.operator, this.name, this.killer}); - factory _KillHouseModel.fromJson(Map json) => _$KillHouseModelFromJson(json); - -@override final String? key; -@override@JsonKey(name: 'kill_house_operator') final KillHouseOperatorModel? operator; -@override final String? name; -@override final bool? killer; - -/// Create a copy of KillHouseModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$KillHouseModelCopyWith<_KillHouseModel> get copyWith => __$KillHouseModelCopyWithImpl<_KillHouseModel>(this, _$identity); - -@override -Map toJson() { - return _$KillHouseModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouseModel&&(identical(other.key, key) || other.key == key)&&(identical(other.operator, operator) || other.operator == operator)&&(identical(other.name, name) || other.name == name)&&(identical(other.killer, killer) || other.killer == killer)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,key,operator,name,killer); - -@override -String toString() { - return 'KillHouseModel(key: $key, operator: $operator, name: $name, killer: $killer)'; -} - - -} - -/// @nodoc -abstract mixin class _$KillHouseModelCopyWith<$Res> implements $KillHouseModelCopyWith<$Res> { - factory _$KillHouseModelCopyWith(_KillHouseModel value, $Res Function(_KillHouseModel) _then) = __$KillHouseModelCopyWithImpl; -@override @useResult -$Res call({ - String? key,@JsonKey(name: 'kill_house_operator') KillHouseOperatorModel? operator, String? name, bool? killer -}); - - -@override $KillHouseOperatorModelCopyWith<$Res>? get operator; - -} -/// @nodoc -class __$KillHouseModelCopyWithImpl<$Res> - implements _$KillHouseModelCopyWith<$Res> { - __$KillHouseModelCopyWithImpl(this._self, this._then); - - final _KillHouseModel _self; - final $Res Function(_KillHouseModel) _then; - -/// Create a copy of KillHouseModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? operator = freezed,Object? name = freezed,Object? killer = freezed,}) { - return _then(_KillHouseModel( -key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,operator: freezed == operator ? _self.operator : operator // ignore: cast_nullable_to_non_nullable -as KillHouseOperatorModel?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String?,killer: freezed == killer ? _self.killer : killer // ignore: cast_nullable_to_non_nullable -as bool?, - )); -} - -/// Create a copy of KillHouseModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$KillHouseOperatorModelCopyWith<$Res>? get operator { - if (_self.operator == null) { - return null; - } - - return $KillHouseOperatorModelCopyWith<$Res>(_self.operator!, (value) { - return _then(_self.copyWith(operator: value)); - }); -} -} - - -/// @nodoc -mixin _$KillHouseOperatorModel { - - UserModel? get user; -/// Create a copy of KillHouseOperatorModel -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$KillHouseOperatorModelCopyWith get copyWith => _$KillHouseOperatorModelCopyWithImpl(this as KillHouseOperatorModel, _$identity); - - /// Serializes this KillHouseOperatorModel to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is KillHouseOperatorModel&&(identical(other.user, user) || other.user == user)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,user); - -@override -String toString() { - return 'KillHouseOperatorModel(user: $user)'; -} - - -} - -/// @nodoc -abstract mixin class $KillHouseOperatorModelCopyWith<$Res> { - factory $KillHouseOperatorModelCopyWith(KillHouseOperatorModel value, $Res Function(KillHouseOperatorModel) _then) = _$KillHouseOperatorModelCopyWithImpl; -@useResult -$Res call({ - UserModel? user -}); - - -$UserModelCopyWith<$Res>? get user; - -} -/// @nodoc -class _$KillHouseOperatorModelCopyWithImpl<$Res> - implements $KillHouseOperatorModelCopyWith<$Res> { - _$KillHouseOperatorModelCopyWithImpl(this._self, this._then); - - final KillHouseOperatorModel _self; - final $Res Function(KillHouseOperatorModel) _then; - -/// Create a copy of KillHouseOperatorModel -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? user = freezed,}) { - return _then(_self.copyWith( -user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable -as UserModel?, - )); -} -/// Create a copy of KillHouseOperatorModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$UserModelCopyWith<$Res>? get user { - if (_self.user == null) { - return null; - } - - return $UserModelCopyWith<$Res>(_self.user!, (value) { - return _then(_self.copyWith(user: value)); - }); -} -} - - -/// @nodoc -@JsonSerializable() - -class _KillHouseOperatorModel implements KillHouseOperatorModel { - _KillHouseOperatorModel({this.user}); - factory _KillHouseOperatorModel.fromJson(Map json) => _$KillHouseOperatorModelFromJson(json); - -@override final UserModel? user; - -/// Create a copy of KillHouseOperatorModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$KillHouseOperatorModelCopyWith<_KillHouseOperatorModel> get copyWith => __$KillHouseOperatorModelCopyWithImpl<_KillHouseOperatorModel>(this, _$identity); - -@override -Map toJson() { - return _$KillHouseOperatorModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _KillHouseOperatorModel&&(identical(other.user, user) || other.user == user)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,user); - -@override -String toString() { - return 'KillHouseOperatorModel(user: $user)'; -} - - -} - -/// @nodoc -abstract mixin class _$KillHouseOperatorModelCopyWith<$Res> implements $KillHouseOperatorModelCopyWith<$Res> { - factory _$KillHouseOperatorModelCopyWith(_KillHouseOperatorModel value, $Res Function(_KillHouseOperatorModel) _then) = __$KillHouseOperatorModelCopyWithImpl; -@override @useResult -$Res call({ - UserModel? user -}); - - -@override $UserModelCopyWith<$Res>? get user; - -} -/// @nodoc -class __$KillHouseOperatorModelCopyWithImpl<$Res> - implements _$KillHouseOperatorModelCopyWith<$Res> { - __$KillHouseOperatorModelCopyWithImpl(this._self, this._then); - - final _KillHouseOperatorModel _self; - final $Res Function(_KillHouseOperatorModel) _then; - -/// Create a copy of KillHouseOperatorModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? user = freezed,}) { - return _then(_KillHouseOperatorModel( -user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable -as UserModel?, - )); -} - -/// Create a copy of KillHouseOperatorModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$UserModelCopyWith<$Res>? get user { - if (_self.user == null) { - return null; - } - - return $UserModelCopyWith<$Res>(_self.user!, (value) { - return _then(_self.copyWith(user: value)); - }); -} -} - - -/// @nodoc -mixin _$UserModel { - - String? get fullname; String? get firstName; String? get lastName; int? get baseOrder; String? get mobile; String? get nationalId; String? get nationalCode; String? get key; CityModel? get city; String? get unitName; String? get unitNationalId; String? get unitRegistrationNumber; String? get unitEconomicalNumber; String? get unitProvince; String? get unitCity; String? get unitPostalCode; String? get unitAddress; -/// Create a copy of UserModel -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$UserModelCopyWith get copyWith => _$UserModelCopyWithImpl(this as UserModel, _$identity); - - /// Serializes this UserModel to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is UserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); - -@override -String toString() { - return 'UserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; -} - - -} - -/// @nodoc -abstract mixin class $UserModelCopyWith<$Res> { - factory $UserModelCopyWith(UserModel value, $Res Function(UserModel) _then) = _$UserModelCopyWithImpl; -@useResult -$Res call({ - String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, CityModel? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress -}); - - -$CityModelCopyWith<$Res>? get city; - -} -/// @nodoc -class _$UserModelCopyWithImpl<$Res> - implements $UserModelCopyWith<$Res> { - _$UserModelCopyWithImpl(this._self, this._then); - - final UserModel _self; - final $Res Function(UserModel) _then; - -/// Create a copy of UserModel -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { - return _then(_self.copyWith( -fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable -as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable -as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable -as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable -as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable -as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable -as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable -as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as CityModel?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable -as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable -as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable -as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable -as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable -as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable -as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable -as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable -as String?, - )); -} -/// Create a copy of UserModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$CityModelCopyWith<$Res>? get city { - if (_self.city == null) { - return null; - } - - return $CityModelCopyWith<$Res>(_self.city!, (value) { - return _then(_self.copyWith(city: value)); - }); -} -} - - -/// @nodoc -@JsonSerializable() - -class _UserModel implements UserModel { - _UserModel({this.fullname, this.firstName, this.lastName, this.baseOrder, this.mobile, this.nationalId, this.nationalCode, this.key, this.city, this.unitName, this.unitNationalId, this.unitRegistrationNumber, this.unitEconomicalNumber, this.unitProvince, this.unitCity, this.unitPostalCode, this.unitAddress}); - factory _UserModel.fromJson(Map json) => _$UserModelFromJson(json); - -@override final String? fullname; -@override final String? firstName; -@override final String? lastName; -@override final int? baseOrder; -@override final String? mobile; -@override final String? nationalId; -@override final String? nationalCode; -@override final String? key; -@override final CityModel? city; -@override final String? unitName; -@override final String? unitNationalId; -@override final String? unitRegistrationNumber; -@override final String? unitEconomicalNumber; -@override final String? unitProvince; -@override final String? unitCity; -@override final String? unitPostalCode; -@override final String? unitAddress; - -/// Create a copy of UserModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$UserModelCopyWith<_UserModel> get copyWith => __$UserModelCopyWithImpl<_UserModel>(this, _$identity); - -@override -Map toJson() { - return _$UserModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _UserModel&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.key, key) || other.key == key)&&(identical(other.city, city) || other.city == city)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,baseOrder,mobile,nationalId,nationalCode,key,city,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress); - -@override -String toString() { - return 'UserModel(fullname: $fullname, firstName: $firstName, lastName: $lastName, baseOrder: $baseOrder, mobile: $mobile, nationalId: $nationalId, nationalCode: $nationalCode, key: $key, city: $city, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress)'; -} - - -} - -/// @nodoc -abstract mixin class _$UserModelCopyWith<$Res> implements $UserModelCopyWith<$Res> { - factory _$UserModelCopyWith(_UserModel value, $Res Function(_UserModel) _then) = __$UserModelCopyWithImpl; -@override @useResult -$Res call({ - String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, CityModel? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress -}); - - -@override $CityModelCopyWith<$Res>? get city; - -} -/// @nodoc -class __$UserModelCopyWithImpl<$Res> - implements _$UserModelCopyWith<$Res> { - __$UserModelCopyWithImpl(this._self, this._then); - - final _UserModel _self; - final $Res Function(_UserModel) _then; - -/// Create a copy of UserModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? baseOrder = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,Object? key = freezed,Object? city = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,}) { - return _then(_UserModel( -fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable -as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable -as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable -as String?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable -as int?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable -as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable -as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable -as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable -as CityModel?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable -as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable -as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable -as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable -as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable -as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable -as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable -as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable -as String?, - )); -} - -/// Create a copy of UserModel -/// with the given fields replaced by the non-null parameter values. -@override -@pragma('vm:prefer-inline') -$CityModelCopyWith<$Res>? get city { - if (_self.city == null) { - return null; - } - - return $CityModelCopyWith<$Res>(_self.city!, (value) { - return _then(_self.copyWith(city: value)); - }); -} -} - - -/// @nodoc -mixin _$CityModel { - - int? get id; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get provinceIdForeignKey; int? get cityIdKey; String? get name; double? get productPrice; bool? get provinceCenter; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; dynamic get createdBy; dynamic get modifiedBy; int? get province; -/// Create a copy of CityModel -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$CityModelCopyWith get copyWith => _$CityModelCopyWithImpl(this as CityModel, _$identity); - - /// Serializes this CityModel to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is CityModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.province, province) || other.province == province)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),province); - -@override -String toString() { - return 'CityModel(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; -} - - -} - -/// @nodoc -abstract mixin class $CityModelCopyWith<$Res> { - factory $CityModelCopyWith(CityModel value, $Res Function(CityModel) _then) = _$CityModelCopyWithImpl; -@useResult -$Res call({ - int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province -}); - - - - -} -/// @nodoc -class _$CityModelCopyWithImpl<$Res> - implements $CityModelCopyWith<$Res> { - _$CityModelCopyWithImpl(this._self, this._then); - - final CityModel _self; - final $Res Function(CityModel) _then; - -/// Create a copy of CityModel -/// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { - return _then(_self.copyWith( -id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable -as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable -as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable -as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable -as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable -as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable -as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable -as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable -as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable -as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable -as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable -as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable -as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable -as dynamic,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable -as int?, - )); -} - -} - - -/// @nodoc -@JsonSerializable() - -class _CityModel implements CityModel { - _CityModel({this.id, this.key, this.createDate, this.modifyDate, this.trash, this.provinceIdForeignKey, this.cityIdKey, this.name, this.productPrice, this.provinceCenter, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.createdBy, this.modifiedBy, this.province}); - factory _CityModel.fromJson(Map json) => _$CityModelFromJson(json); - -@override final int? id; -@override final String? key; -@override final String? createDate; -@override final String? modifyDate; -@override final bool? trash; -@override final int? provinceIdForeignKey; -@override final int? cityIdKey; -@override final String? name; -@override final double? productPrice; -@override final bool? provinceCenter; -@override final int? cityNumber; -@override final String? cityName; -@override final int? provinceNumber; -@override final String? provinceName; -@override final dynamic createdBy; -@override final dynamic modifiedBy; -@override final int? province; - -/// Create a copy of CityModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$CityModelCopyWith<_CityModel> get copyWith => __$CityModelCopyWithImpl<_CityModel>(this, _$identity); - -@override -Map toJson() { - return _$CityModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _CityModel&&(identical(other.id, id) || other.id == id)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.provinceIdForeignKey, provinceIdForeignKey) || other.provinceIdForeignKey == provinceIdForeignKey)&&(identical(other.cityIdKey, cityIdKey) || other.cityIdKey == cityIdKey)&&(identical(other.name, name) || other.name == name)&&(identical(other.productPrice, productPrice) || other.productPrice == productPrice)&&(identical(other.provinceCenter, provinceCenter) || other.provinceCenter == provinceCenter)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&(identical(other.province, province) || other.province == province)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,id,key,createDate,modifyDate,trash,provinceIdForeignKey,cityIdKey,name,productPrice,provinceCenter,cityNumber,cityName,provinceNumber,provinceName,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),province); - -@override -String toString() { - return 'CityModel(id: $id, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, provinceIdForeignKey: $provinceIdForeignKey, cityIdKey: $cityIdKey, name: $name, productPrice: $productPrice, provinceCenter: $provinceCenter, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, createdBy: $createdBy, modifiedBy: $modifiedBy, province: $province)'; -} - - -} - -/// @nodoc -abstract mixin class _$CityModelCopyWith<$Res> implements $CityModelCopyWith<$Res> { - factory _$CityModelCopyWith(_CityModel value, $Res Function(_CityModel) _then) = __$CityModelCopyWithImpl; -@override @useResult -$Res call({ - int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province -}); - - - - -} -/// @nodoc -class __$CityModelCopyWithImpl<$Res> - implements _$CityModelCopyWith<$Res> { - __$CityModelCopyWithImpl(this._self, this._then); - - final _CityModel _self; - final $Res Function(_CityModel) _then; - -/// Create a copy of CityModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdKey = freezed,Object? name = freezed,Object? productPrice = freezed,Object? provinceCenter = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? province = freezed,}) { - return _then(_CityModel( -id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable -as int?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String?,createDate: freezed == createDate ? _self.createDate : createDate // ignore: cast_nullable_to_non_nullable -as String?,modifyDate: freezed == modifyDate ? _self.modifyDate : modifyDate // ignore: cast_nullable_to_non_nullable -as String?,trash: freezed == trash ? _self.trash : trash // ignore: cast_nullable_to_non_nullable -as bool?,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable -as int?,cityIdKey: freezed == cityIdKey ? _self.cityIdKey : cityIdKey // ignore: cast_nullable_to_non_nullable -as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable -as String?,productPrice: freezed == productPrice ? _self.productPrice : productPrice // ignore: cast_nullable_to_non_nullable -as double?,provinceCenter: freezed == provinceCenter ? _self.provinceCenter : provinceCenter // ignore: cast_nullable_to_non_nullable -as bool?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable -as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable -as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable -as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable -as String?,createdBy: freezed == createdBy ? _self.createdBy : createdBy // ignore: cast_nullable_to_non_nullable -as dynamic,modifiedBy: freezed == modifiedBy ? _self.modifiedBy : modifiedBy // ignore: cast_nullable_to_non_nullable -as dynamic,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable -as int?, - )); -} - - } // dart format on diff --git a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart index 92eaf82..a8dc384 100644 --- a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart +++ b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.g.dart @@ -6,38 +6,21 @@ part of 'waiting_arrival.dart'; // JsonSerializableGenerator // ************************************************************************** -_WaitingArrivalModel _$WaitingArrivalModelFromJson(Map json) => - _WaitingArrivalModel( - count: (json['count'] as num).toInt(), - next: json['next'] as String?, - previous: json['previous'] as String?, - results: (json['results'] as List) - .map((e) => ResultModel.fromJson(e as Map)) - .toList(), - ); - -Map _$WaitingArrivalModelToJson( - _WaitingArrivalModel instance, -) => { - 'count': instance.count, - 'next': instance.next, - 'previous': instance.previous, - 'results': instance.results, -}; - -_ResultModel _$ResultModelFromJson(Map json) => _ResultModel( +_WaitingArrivalModel _$WaitingArrivalModelFromJson( + Map json, +) => _WaitingArrivalModel( id: (json['id'] as num?)?.toInt(), product: json['product'] == null ? null : ProductModel.fromJson(json['product'] as Map), - killHouse: json['kill_house'] == null - ? null - : KillHouseModel.fromJson(json['kill_house'] as Map), + killHouse: json['kill_house'], toKillHouse: json['to_kill_house'], - steward: json['steward'], + steward: json['steward'] == null + ? null + : StewardModel.fromJson(json['steward'] as Map), toSteward: json['to_steward'] == null ? null - : ToStewardModel.fromJson(json['to_steward'] as Map), + : StewardModel.fromJson(json['to_steward'] as Map), guilds: json['guilds'], toGuilds: json['to_guilds'], toColdHouse: json['to_cold_house'], @@ -83,6 +66,7 @@ _ResultModel _$ResultModelFromJson(Map json) => _ResultModel( calculateStatus: json['calculate_status'] as bool?, temporaryTrash: json['temporary_trash'] as bool?, temporaryDeleted: json['temporary_deleted'] as bool?, + overhead: json['overhead'] as bool?, createdBy: json['created_by'], modifiedBy: json['modified_by'], wareHouse: json['ware_house'], @@ -91,8 +75,8 @@ _ResultModel _$ResultModelFromJson(Map json) => _ResultModel( dispenser: json['dispenser'], ); -Map _$ResultModelToJson( - _ResultModel instance, +Map _$WaitingArrivalModelToJson( + _WaitingArrivalModel instance, ) => { 'id': instance.id, 'product': instance.product, @@ -143,6 +127,7 @@ Map _$ResultModelToJson( 'calculate_status': instance.calculateStatus, 'temporary_trash': instance.temporaryTrash, 'temporary_deleted': instance.temporaryDeleted, + 'overhead': instance.overhead, 'created_by': instance.createdBy, 'modified_by': instance.modifiedBy, 'ware_house': instance.wareHouse, @@ -152,30 +137,28 @@ Map _$ResultModelToJson( }; _ProductModel _$ProductModelFromJson(Map json) => - _ProductModel(weightAverage: (json['weight_average'] as num?)?.toDouble()); + _ProductModel( + name: json['name'] as String?, + weightAverage: (json['weight_average'] as num?)?.toDouble(), + ); Map _$ProductModelToJson(_ProductModel instance) => - {'weight_average': instance.weightAverage}; + { + 'name': instance.name, + 'weight_average': instance.weightAverage, + }; -_ToStewardModel _$ToStewardModelFromJson(Map json) => - _ToStewardModel( +_StewardModel _$StewardModelFromJson(Map json) => + _StewardModel( id: (json['id'] as num?)?.toInt(), user: json['user'] == null ? null - : ToStewardUserModel.fromJson(json['user'] as Map), + : StewardUserModel.fromJson(json['user'] as Map), address: json['address'] == null ? null : AddressModel.fromJson(json['address'] as Map), - guildAreaActivity: json['guild_area_activity'] == null - ? null - : GuildAreaActivityModel.fromJson( - json['guild_area_activity'] as Map, - ), - guildTypeActivity: json['guild_type_activity'] == null - ? null - : GuildTypeActivityModel.fromJson( - json['guild_type_activity'] as Map, - ), + guildAreaActivity: json['guild_area_activity'], + guildTypeActivity: json['guild_type_activity'], killHouse: json['kill_house'] as List?, stewardKillHouse: json['steward_kill_house'] as List?, stewards: json['stewards'] as List?, @@ -189,17 +172,31 @@ _ToStewardModel _$ToStewardModelFromJson(Map json) => modifyDate: json['modify_date'] as String?, trash: json['trash'] as bool?, active: json['active'] as bool?, + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, guildsId: json['guilds_id'] as String?, licenseNumber: json['license_number'] as String?, guildsName: json['guilds_name'] as String?, + phone: json['phone'] as String?, typeActivity: json['type_activity'] as String?, areaActivity: json['area_activity'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, steward: json['steward'] as bool?, hasPos: json['has_pos'] as bool?, + allocationLimit: (json['allocation_limit'] as num?)?.toInt(), + limitationAllocation: json['limitation_allocation'] as bool?, provinceAcceptState: json['province_accept_state'] as String?, + stewardActive: json['steward_active'] as bool?, + stewardLimitationAllocation: + json['steward_limitation_allocation'] as bool?, + license: json['license'] as bool?, + wallet: (json['wallet'] as num?)?.toInt(), + cars: json['cars'] as List?, + userLevel: json['user_level'] as List?, ); -Map _$ToStewardModelToJson(_ToStewardModel instance) => +Map _$StewardModelToJson(_StewardModel instance) => { 'id': instance.id, 'user': instance.user, @@ -215,18 +212,31 @@ Map _$ToStewardModelToJson(_ToStewardModel instance) => 'modify_date': instance.modifyDate, 'trash': instance.trash, 'active': instance.active, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, 'guilds_id': instance.guildsId, 'license_number': instance.licenseNumber, 'guilds_name': instance.guildsName, + 'phone': instance.phone, 'type_activity': instance.typeActivity, 'area_activity': instance.areaActivity, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, 'steward': instance.steward, 'has_pos': instance.hasPos, + 'allocation_limit': instance.allocationLimit, + 'limitation_allocation': instance.limitationAllocation, 'province_accept_state': instance.provinceAcceptState, + 'steward_active': instance.stewardActive, + 'steward_limitation_allocation': instance.stewardLimitationAllocation, + 'license': instance.license, + 'wallet': instance.wallet, + 'cars': instance.cars, + 'user_level': instance.userLevel, }; -_ToStewardUserModel _$ToStewardUserModelFromJson(Map json) => - _ToStewardUserModel( +_StewardUserModel _$StewardUserModelFromJson(Map json) => + _StewardUserModel( fullname: json['fullname'] as String?, firstName: json['first_name'] as String?, lastName: json['last_name'] as String?, @@ -235,7 +245,7 @@ _ToStewardUserModel _$ToStewardUserModelFromJson(Map json) => city: json['city'] as String?, ); -Map _$ToStewardUserModelToJson(_ToStewardUserModel instance) => +Map _$StewardUserModelToJson(_StewardUserModel instance) => { 'fullname': instance.fullname, 'first_name': instance.firstName, @@ -245,36 +255,14 @@ Map _$ToStewardUserModelToJson(_ToStewardUserModel instance) => 'city': instance.city, }; -_ToStewardCityModel _$ToStewardCityModelFromJson(Map json) => - _ToStewardCityModel( - key: json['key'] as String?, - title: json['name'] as String?, - ); - -Map _$ToStewardCityModelToJson(_ToStewardCityModel instance) => - {'key': instance.key, 'name': instance.title}; - -_ToStewardProvinceModel _$ToStewardProvinceModelFromJson( - Map json, -) => _ToStewardProvinceModel( - key: json['key'] as String?, - title: json['name'] as String?, -); - -Map _$ToStewardProvinceModelToJson( - _ToStewardProvinceModel instance, -) => {'key': instance.key, 'name': instance.title}; - _AddressModel _$AddressModelFromJson(Map json) => _AddressModel( province: json['province'] == null ? null - : ToStewardProvinceModel.fromJson( - json['province'] as Map, - ), + : ProvinceModel.fromJson(json['province'] as Map), city: json['city'] == null ? null - : ToStewardCityModel.fromJson(json['city'] as Map), + : CityModel.fromJson(json['city'] as Map), address: json['address'] as String?, postalCode: json['postal_code'] as String?, ); @@ -287,27 +275,17 @@ Map _$AddressModelToJson(_AddressModel instance) => 'postal_code': instance.postalCode, }; -_GuildAreaActivityModel _$GuildAreaActivityModelFromJson( - Map json, -) => _GuildAreaActivityModel( - key: json['key'] as String?, - title: json['title'] as String?, -); +_ProvinceModel _$ProvinceModelFromJson(Map json) => + _ProvinceModel(key: json['key'] as String?, name: json['name'] as String?); -Map _$GuildAreaActivityModelToJson( - _GuildAreaActivityModel instance, -) => {'key': instance.key, 'title': instance.title}; +Map _$ProvinceModelToJson(_ProvinceModel instance) => + {'key': instance.key, 'name': instance.name}; -_GuildTypeActivityModel _$GuildTypeActivityModelFromJson( - Map json, -) => _GuildTypeActivityModel( - key: json['key'] as String?, - title: json['title'] as String?, -); +_CityModel _$CityModelFromJson(Map json) => + _CityModel(key: json['key'] as String?, name: json['name'] as String?); -Map _$GuildTypeActivityModelToJson( - _GuildTypeActivityModel instance, -) => {'key': instance.key, 'title': instance.title}; +Map _$CityModelToJson(_CityModel instance) => + {'key': instance.key, 'name': instance.name}; _GetPosStatusModel _$GetPosStatusModelFromJson(Map json) => _GetPosStatusModel( @@ -322,119 +300,3 @@ Map _$GetPosStatusModelToJson(_GetPosStatusModel instance) => 'has_pons': instance.hasPons, 'has_active_pons': instance.hasActivePons, }; - -_KillHouseModel _$KillHouseModelFromJson(Map json) => - _KillHouseModel( - key: json['key'] as String?, - operator: json['kill_house_operator'] == null - ? null - : KillHouseOperatorModel.fromJson( - json['kill_house_operator'] as Map, - ), - name: json['name'] as String?, - killer: json['killer'] as bool?, - ); - -Map _$KillHouseModelToJson(_KillHouseModel instance) => - { - 'key': instance.key, - 'kill_house_operator': instance.operator, - 'name': instance.name, - 'killer': instance.killer, - }; - -_KillHouseOperatorModel _$KillHouseOperatorModelFromJson( - Map json, -) => _KillHouseOperatorModel( - user: json['user'] == null - ? null - : UserModel.fromJson(json['user'] as Map), -); - -Map _$KillHouseOperatorModelToJson( - _KillHouseOperatorModel instance, -) => {'user': instance.user}; - -_UserModel _$UserModelFromJson(Map json) => _UserModel( - fullname: json['fullname'] as String?, - firstName: json['first_name'] as String?, - lastName: json['last_name'] as String?, - baseOrder: (json['base_order'] as num?)?.toInt(), - mobile: json['mobile'] as String?, - nationalId: json['national_id'] as String?, - nationalCode: json['national_code'] as String?, - key: json['key'] as String?, - city: json['city'] == null - ? null - : CityModel.fromJson(json['city'] as Map), - unitName: json['unit_name'] as String?, - unitNationalId: json['unit_national_id'] as String?, - unitRegistrationNumber: json['unit_registration_number'] as String?, - unitEconomicalNumber: json['unit_economical_number'] as String?, - unitProvince: json['unit_province'] as String?, - unitCity: json['unit_city'] as String?, - unitPostalCode: json['unit_postal_code'] as String?, - unitAddress: json['unit_address'] as String?, -); - -Map _$UserModelToJson(_UserModel instance) => - { - 'fullname': instance.fullname, - 'first_name': instance.firstName, - 'last_name': instance.lastName, - 'base_order': instance.baseOrder, - 'mobile': instance.mobile, - 'national_id': instance.nationalId, - 'national_code': instance.nationalCode, - 'key': instance.key, - 'city': instance.city, - 'unit_name': instance.unitName, - 'unit_national_id': instance.unitNationalId, - 'unit_registration_number': instance.unitRegistrationNumber, - 'unit_economical_number': instance.unitEconomicalNumber, - 'unit_province': instance.unitProvince, - 'unit_city': instance.unitCity, - 'unit_postal_code': instance.unitPostalCode, - 'unit_address': instance.unitAddress, - }; - -_CityModel _$CityModelFromJson(Map json) => _CityModel( - id: (json['id'] as num?)?.toInt(), - key: json['key'] as String?, - createDate: json['create_date'] as String?, - modifyDate: json['modify_date'] as String?, - trash: json['trash'] as bool?, - provinceIdForeignKey: (json['province_id_foreign_key'] as num?)?.toInt(), - cityIdKey: (json['city_id_key'] as num?)?.toInt(), - name: json['name'] as String?, - productPrice: (json['product_price'] as num?)?.toDouble(), - provinceCenter: json['province_center'] as bool?, - cityNumber: (json['city_number'] as num?)?.toInt(), - cityName: json['city_name'] as String?, - provinceNumber: (json['province_number'] as num?)?.toInt(), - provinceName: json['province_name'] as String?, - createdBy: json['created_by'], - modifiedBy: json['modified_by'], - province: (json['province'] as num?)?.toInt(), -); - -Map _$CityModelToJson(_CityModel instance) => - { - 'id': instance.id, - 'key': instance.key, - 'create_date': instance.createDate, - 'modify_date': instance.modifyDate, - 'trash': instance.trash, - 'province_id_foreign_key': instance.provinceIdForeignKey, - 'city_id_key': instance.cityIdKey, - 'name': instance.name, - 'product_price': instance.productPrice, - 'province_center': instance.provinceCenter, - 'city_number': instance.cityNumber, - 'city_name': instance.cityName, - 'province_number': instance.provinceNumber, - 'province_name': instance.provinceName, - 'created_by': instance.createdBy, - 'modified_by': instance.modifiedBy, - 'province': instance.province, - }; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 5f5092c..654dbca 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -33,9 +33,9 @@ abstract class ChickenRepository { Map? queryParameters, }); - Future getWaitingArrivals({ + Future?> getWaitingArrivals({ required String token, - int? page, + Map? queryParameters, }); Future setSateForArrivals({ diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index d5d33d8..3e948d4 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -33,18 +33,15 @@ class ChickenRepositoryImpl implements ChickenRepository { var res = await _httpClient.get( '/roles-products/?role=Steward', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => (json) - .map((item) => InventoryModel.fromJson(item as Map)) - .toList(), + fromJsonList: (json) => + (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), ); return res.data; } @override - Future getKillHouseDistributionInfo({ - required String token, - }) async { + Future getKillHouseDistributionInfo({required String token}) async { var res = await _httpClient.get( '/kill-house-distribution-info/?role=Steward', headers: {'Authorization': 'Bearer $token'}, @@ -69,14 +66,18 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getWaitingArrivals({ + Future?> getWaitingArrivals({ required String token, - int? page, + Map? queryParameters, }) async { var res = await _httpClient.get( - '/steward-allocation/?search=filter&value=&role=Steward&page=${page ?? 1}&page_size=10&type=not_entered', + '/steward-allocation/', headers: {'Authorization': 'Bearer $token'}, - fromJson: WaitingArrivalModel.fromJson, + queryParameters: queryParameters, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => WaitingArrivalModel.fromJson(json as Map), + ), ); return res.data; } @@ -136,10 +137,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future denyAllocation({ - required String token, - required String allocationToken, - }) async { + Future denyAllocation({required String token, required String allocationToken}) async { await _httpClient.delete( '/steward-allocation/0/?steward_allocation_key=$allocationToken', headers: {'Authorization': 'Bearer $token'}, @@ -163,9 +161,8 @@ class ChickenRepositoryImpl implements ChickenRepository { var res = await _httpClient.get( '/roles-products/?role=Steward', headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => json - .map((item) => ProductModel.fromJson(item as Map)) - .toList(), + fromJsonList: (json) => + json.map((item) => ProductModel.fromJson(item as Map)).toList(), ); return res.data; } @@ -179,9 +176,8 @@ class ChickenRepositoryImpl implements ChickenRepository { '/guilds/?', queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => json - .map((item) => GuildModel.fromJson(item as Map)) - .toList(), + fromJsonList: (json) => + json.map((item) => GuildModel.fromJson(item as Map)).toList(), ); return res.data; } @@ -261,8 +257,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future?> - getStewardPurchasesOutSideOfTheProvince({ + Future?> getStewardPurchasesOutSideOfTheProvince({ required String token, Map? queryParameters, }) async { @@ -279,18 +274,12 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future?> getCity({ - required String provinceName, - }) async { + Future?> getCity({required String provinceName}) async { var res = await _httpClient.get( '/iran_city/?', queryParameters: {'name': provinceName}, - fromJsonList: (json) => json - .map( - (item) => - IranProvinceCityModel.fromJson(item as Map), - ) - .toList(), + fromJsonList: (json) => + json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), ); return res.data; } @@ -299,12 +288,8 @@ class ChickenRepositoryImpl implements ChickenRepository { Future?> getProvince() async { var res = await _httpClient.get( '/iran_province/', - fromJsonList: (json) => json - .map( - (item) => - IranProvinceCityModel.fromJson(item as Map), - ) - .toList(), + fromJsonList: (json) => + json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), ); return res.data; } @@ -334,8 +319,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future?> - getOutProvinceCarcassesBuyer({ + Future?> getOutProvinceCarcassesBuyer({ required String token, Map? queryParameters, }) async { @@ -345,8 +329,7 @@ class ChickenRepositoryImpl implements ChickenRepository { headers: {'Authorization': 'Bearer $token'}, fromJson: (json) => PaginationModel.fromJson( json, - (json) => - OutProvinceCarcassesBuyer.fromJson(json as Map), + (json) => OutProvinceCarcassesBuyer.fromJson(json as Map), ), ); return res.data; @@ -402,10 +385,7 @@ class ChickenRepositoryImpl implements ChickenRepository { '/steward_free_sale_bar/0/', data: body.toJson() ..removeWhere((key, value) => value == null) - ..addAll({ - 'carcassWeight': body.weightOfCarcasses, - 'carcassCount': body.numberOfCarcasses, - }), + ..addAll({'carcassWeight': body.weightOfCarcasses, 'carcassCount': body.numberOfCarcasses}), headers: {'Authorization': 'Bearer $token'}, ); } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart index 3df5e79..65a11bc 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart @@ -1,6 +1,31 @@ -import 'package:get/get.dart'; + + +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; class BuyInProvinceLogic extends GetxController { + RxList routesName = RxList(); + RxList isExpandedList = [].obs; + RxnString searchedValue = RxnString(); + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RootLogic get rootLogic => Get.find(); + BuyLogic get buyLogic => Get.find(); + RxInt selectedSegmentIndex = 0.obs; + + @override + void onInit() { + super.onInit(); + routesName.value = [...buyLogic.routesName, 'داخل استان'].toList(); + routesName.add(selectedSegmentIndex.value ==0 ? 'در انتظار':'همه'); + ever(selectedSegmentIndex, (callback) { + routesName.removeLast(); + routesName.add(callback ==0 ? 'در انتظار':'همه'); + },); + + } @override void onReady() { // TODO: implement onReady @@ -12,4 +37,9 @@ class BuyInProvinceLogic extends GetxController { // TODO: implement onClose super.onClose(); } + + void setSearchValue(String? data) { + searchedValue.value = data?.trim(); + //TODO + } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart index ae222d6..2ca51d6 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart @@ -1,5 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_all/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_waiting/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; +import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -8,9 +12,40 @@ class BuyInProvincePage extends GetView { @override Widget build(BuildContext context) { + return BasePage( + routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName), + onBackPressed: () => Get.back(id: 0), + onSearchChanged: (data) => controller.setSearchValue(data), + filteringWidget: Container(color: Colors.redAccent), + widgets: [ + segmentWidget(), + ObxValue((index) { + return Expanded( + child: index.value == 0 ? BuyInProvinceWaitingPage() : BuyInProvinceAllPage(), + ); + }, controller.selectedSegmentIndex), + ], + ); + } - return Container( - color: Colors.amberAccent, + Padding segmentWidget() { + return Padding( + padding: const EdgeInsets.fromLTRB(8, 0, 8, 8), + child: Row( + children: [ + Expanded( + child: RSegment( + children: ['در انتظار', 'همه'], + selectedIndex: 0, + borderColor: const Color(0xFFB4B4B4), + selectedBorderColor: AppColor.blueNormal, + selectedBackgroundColor: AppColor.blueLight, + onSegmentSelected: (index) => controller.selectedSegmentIndex.value = index, + backgroundColor: AppColor.whiteGreyNormal, + ), + ), + ], + ), ); } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart new file mode 100644 index 0000000..dea5e83 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart @@ -0,0 +1,15 @@ +import 'package:rasadyar_core/core.dart'; + +class BuyInProvinceAllLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart new file mode 100644 index 0000000..fab0ebc --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class BuyInProvinceAllPage extends GetView { + const BuyInProvinceAllPage({super.key}); + + @override + Widget build(BuildContext context) { + return Container(color: Colors.blue); + } +} diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart new file mode 100644 index 0000000..0d5e1f4 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -0,0 +1,58 @@ +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +class BuyInProvinceWaitingLogic extends GetxController { + RxList isExpandedList = [].obs; + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); + + RootLogic rootLogic = Get.find(); + Rx>> waitingProduct = + Resource>.loading().obs; + + @override + void onReady() { + super.onReady(); + getWaitingArrivals(); + } + + @override + void onClose() { + super.onClose(); + } + + Future getWaitingArrivals() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getWaitingArrivals( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + queryParams: { + 'type':'not_entered' + }, + pageSize: 10, + page: 1, + search: 'filter', + role: 'Steward', + value: searchedValue.value, + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), + onSuccess: (res) async { + await Future.delayed(Duration(milliseconds: 500)); + if ((res?.count ?? 0) == 0) { + waitingProduct.value = Resource>.empty(); + } else { + waitingProduct.value = Resource>.success(res!.results!); + } + }, + ); + } + + void setSearchValue(String? data) { + searchedValue.value = data?.trim(); + } +} diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart new file mode 100644 index 0000000..4d49bf3 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -0,0 +1,264 @@ + +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class BuyInProvinceWaitingPage extends GetView { + const BuyInProvinceWaitingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.truckFastOutlinedSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + onLoadMore: () async {}, + ); + }, controller.waitingProduct), + ); + } + + + Row itemListWidget(WaitingArrivalModel item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 20), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 3, + children: [ + Text( + item.toSteward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.start, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 3, + children: [ + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + SizedBox(height: 2), + + + ], + ), + ), + Expanded( + flex: 1, + child: Assets.vec.scanSvg.svg( + width: 32.w, + height: 32.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ], + ); + } + + Container itemListExpandedWidget(WaitingArrivalModel item) { + return Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + item.steward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + item.date?.toJalali.formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${item.date?.toJalali.formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + + // buildRow(title: 'مشخصات فروشنده', value: item.killHouseName ?? 'N/A'), + + buildRow( + title: 'تلفن فروشنده', + value: item.steward?.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), + buildRow( + title: 'وزن خریداری شده', + value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', + ), + buildRowOnTapped( + title: 'مشاهده بارنامه', + titleStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + valueWidget: Assets.vec.clipboardEyeSvg.svg( + width: 20, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + onTap: () { + Get.bottomSheet( + BaseBottomSheet( + height: 400, + child: Column( + spacing: 16, + children: [ + Text( + 'بارنامه', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + /* Image.network( + item.barImage ?? '', + fit: BoxFit.cover, + height: 300, + errorBuilder: (context, error, stackTrace) { + eLog(error.toString()); + return Center(child: Text('خطایی پیش آمده!')); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return CupertinoActivityIndicator(); + }, + ),*/ + ], + ), + ), + ); + }, + ), + /* Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditData(item); + Get.bottomSheet( + addPurchasedInformationBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), + onRefresh: () => controller.getStewardPurchaseOutOfProvince(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ),*/ + ], + ), + ); + } + +} diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index 76bf003..fee137e 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -31,7 +31,6 @@ class BuyOutOfProvinceLogic extends GetxController { RxnString editImageUrl = RxnString(); RootLogic get rootLogic => Get.find(); - BuyLogic get buyLogic => Get.find(); SaleLogic get outOfTheProvinceLogic => Get.find(); diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart index 70de9f7..9fb4a42 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart @@ -33,9 +33,9 @@ class EnteringTheWarehouseLogic extends GetxController { @override void onReady() { super.onReady(); - //rootLogic.getInventory(); + getBarGeneralInformation(); - getWaitingArrivals(); + getImportedEntried(); scrollControllerImportedLoad.addListener(() { @@ -50,7 +50,7 @@ class EnteringTheWarehouseLogic extends GetxController { if (scrollControllerWaitingForArrival.position.pixels >= scrollControllerWaitingForArrival.position.maxScrollExtent - 100) { addPageWaitingForArrival.value = true; - getWaitingArrivals(); + } }); } @@ -72,38 +72,7 @@ class EnteringTheWarehouseLogic extends GetxController { ); } - Future getWaitingArrivals() async { - if (isLoadingMoreWaitingForArrival.value || - !hasMoreDataWaitingForArrival.value) { - return; - } - if (addPageWaitingForArrival.value) { - currentPageWaitingForArrival.value++; - } - - safeCall( - call: () async => await rootLogic.chickenRepository.getWaitingArrivals( - token: rootLogic.tokenService.accessToken.value!, - page: currentPageWaitingForArrival.value, - ), - onError: (error, stackTrace) { - isLoadingMoreImportedLoad.value = false; - }, - onSuccess: (result) { - if (result != null) { - waitingForArrival.value = result; - if (isLoadingMoreWaitingForArrival.value) { - waitingForArrival.value?.results.addAll(result.results); - } else { - waitingForArrival.value = result; - } - } - - isLoadingMoreImportedLoad.value = false; - }, - ); - } Future acceptEntried(String key) async { var request = StewardAllocationRequest( @@ -139,7 +108,7 @@ class EnteringTheWarehouseLogic extends GetxController { }, onSuccess: (result) { clearControllers(); - getWaitingArrivals(); + getBarGeneralInformation(); }, ); @@ -162,7 +131,7 @@ class EnteringTheWarehouseLogic extends GetxController { eLog(error); }, onSuccess: (result) { - getWaitingArrivals(); + getBarGeneralInformation(); }, ); diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart index 83ede6a..6cd140f 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart @@ -21,7 +21,7 @@ class EnteringTheWarehousePage extends GetView { ObxValue((data) { return generalBarInformation(data.value); }, controller.barInformation), - waitingForArrival(), + importedLoads(), ], ), @@ -251,7 +251,7 @@ class EnteringTheWarehousePage extends GetView { ); } - Widget waitingForArrival() { +/* Widget waitingForArrival() { return Column( children: [ const SizedBox(height: 8), @@ -398,7 +398,7 @@ class EnteringTheWarehousePage extends GetView { }, controller.waitingForArrival), ], ); - } + }*/ Widget importedLoads() { return Column( @@ -546,7 +546,7 @@ class EnteringTheWarehousePage extends GetView { ); } - Widget acceptBottomSheet(ResultModel resultModel) { +/* Widget acceptBottomSheet(ResultModel resultModel) { return BaseBottomSheet( height: 500, child: Column( @@ -625,5 +625,5 @@ class EnteringTheWarehousePage extends GetView { ], ), ); - } + }*/ } diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index f9b5cfa..d988b67 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -3,6 +3,8 @@ import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_all/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_waiting/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; @@ -124,7 +126,10 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => SearchLogic()); Get.lazyPut(() => BuyInProvinceLogic()); + Get.lazyPut(() => BuyInProvinceWaitingLogic()); + Get.lazyPut(() => BuyInProvinceAllLogic()); Get.lazyPut(() => RootLogic()); }), ), diff --git a/packages/chicken/lib/presentation/widget/base_page/view.dart b/packages/chicken/lib/presentation/widget/base_page/view.dart index fd2fb40..f0423df 100644 --- a/packages/chicken/lib/presentation/widget/base_page/view.dart +++ b/packages/chicken/lib/presentation/widget/base_page/view.dart @@ -9,8 +9,9 @@ import 'package:rasadyar_core/core.dart'; class BasePage extends StatefulWidget { const BasePage({ super.key, - required this.routes, + this.routes, required this.widgets, + this.routesWidget, this.floatingActionButtonLocation, this.floatingActionButton, this.onSearchChanged, @@ -22,9 +23,14 @@ class BasePage extends StatefulWidget { this.onFilterTap, this.onSearchTap, this.filteringWidget, - }); + }):assert( + (routes != null ) || routesWidget != null, + 'Either routes or routesWidget must be provided.', + ); - final List routes; + + final List? routes; + final Widget? routesWidget; final List widgets; final FloatingActionButtonLocation? floatingActionButtonLocation; final Widget? floatingActionButton; @@ -85,7 +91,7 @@ class _BasePageState extends State { body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - buildPageRoute(widget.routes), + widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!), const SizedBox(height: 8), if (!widget.isBase && widget.hasSearch) ...{ SearchWidget(onSearchChanged: widget.onSearchChanged), diff --git a/packages/core/lib/presentation/widget/tabs/new_tab.dart b/packages/core/lib/presentation/widget/tabs/new_tab.dart index c6e73c4..308ebb2 100644 --- a/packages/core/lib/presentation/widget/tabs/new_tab.dart +++ b/packages/core/lib/presentation/widget/tabs/new_tab.dart @@ -14,9 +14,7 @@ import 'package:flutter/rendering.dart'; // Minimum padding from edges of the segmented control to edges of // encompassing widget. -const EdgeInsetsGeometry _kHorizontalItemPadding = EdgeInsets.symmetric( - horizontal: 16.0, -); +const EdgeInsetsGeometry _kHorizontalItemPadding = EdgeInsets.symmetric(horizontal: 16.0); // Minimum height of the segmented control. const double _kMinSegmentedControlHeight = 28.0; @@ -52,15 +50,17 @@ class NewCupertinoSegmentedControl extends StatefulWidget { this.unselectedColor, this.selectedColor, this.borderColor, + this.selectedBorderColor, this.pressedColor, this.disabledColor, this.disabledTextColor, this.padding, + this.unselectedItemStyle, + this.selectedItemStyle, this.disabledChildren = const {}, }) : assert(children.length >= 2), assert( - groupValue == null || - children.keys.any((T child) => child == groupValue), + groupValue == null || children.keys.any((T child) => child == groupValue), 'The groupValue must be either null or one of the keys in the children map.', ); @@ -101,6 +101,11 @@ class NewCupertinoSegmentedControl extends StatefulWidget { /// Defaults to [CupertinoTheme]'s `primaryColor` if null. final Color? borderColor; + /// The color used as the border around selected widget. + /// + /// Defaults to [CupertinoTheme]'s `primaryColor` if null. + final Color? selectedBorderColor; + /// The color used to fill the background of the widget the user is /// temporarily interacting with through a long press or drag. /// @@ -127,18 +132,25 @@ class NewCupertinoSegmentedControl extends StatefulWidget { /// All segments are enabled by default. final Set disabledChildren; + /// The text style for unselected items. + /// + /// Defaults to null, which means it will use the default text style. + final TextStyle? unselectedItemStyle; + + /// The text style for selected items. + /// + /// Defaults to null, which means it will use the default text style. + final TextStyle? selectedItemStyle; + @override - State> createState() => - _SegmentedControlState(); + State> createState() => _SegmentedControlState(); } -class _SegmentedControlState - extends State> +class _SegmentedControlState extends State> with TickerProviderStateMixin> { T? _pressedKey; - final List _selectionControllers = - []; + final List _selectionControllers = []; final List _childTweens = []; late ColorTween _forwardBackgroundColorTween; @@ -148,74 +160,66 @@ class _SegmentedControlState Color? _selectedColor; Color? _unselectedColor; Color? _borderColor; + Color? _selectedBorderColor; Color? _pressedColor; Color? _selectedDisabledColor; Color? _unselectedDisabledColor; Color? _disabledTextColor; AnimationController createAnimationController() { - return AnimationController(duration: _kFadeDuration, vsync: this) - ..addListener(() { - setState(() { - // State of background/text colors has changed - }); + return AnimationController(duration: _kFadeDuration, vsync: this)..addListener(() { + setState(() { + // State of background/text colors has changed }); + }); } bool _updateColors() { assert(mounted, 'This should only be called after didUpdateDependencies'); bool changed = false; - final Color disabledTextColor = - widget.disabledTextColor ?? _kDisableTextColor; + final Color disabledTextColor = widget.disabledTextColor ?? _kDisableTextColor; if (_disabledTextColor != disabledTextColor) { changed = true; _disabledTextColor = disabledTextColor; } - final Color selectedColor = - widget.selectedColor ?? CupertinoTheme.of(context).primaryColor; + final Color selectedColor = widget.selectedColor ?? CupertinoTheme.of(context).primaryColor; if (_selectedColor != selectedColor) { changed = true; _selectedColor = selectedColor; } final Color unselectedColor = - widget.unselectedColor ?? - CupertinoTheme.of(context).primaryContrastingColor; + widget.unselectedColor ?? CupertinoTheme.of(context).primaryContrastingColor; if (_unselectedColor != unselectedColor) { changed = true; _unselectedColor = unselectedColor; } - final Color selectedDisabledColor = - widget.disabledColor ?? selectedColor.withOpacity(0.5); - final Color unselectedDisabledColor = - widget.disabledColor ?? unselectedColor; + final Color selectedDisabledColor = widget.disabledColor ?? selectedColor.withOpacity(0.5); + final Color unselectedDisabledColor = widget.disabledColor ?? unselectedColor; if (_selectedDisabledColor != selectedDisabledColor || _unselectedDisabledColor != unselectedDisabledColor) { changed = true; _selectedDisabledColor = selectedDisabledColor; _unselectedDisabledColor = unselectedDisabledColor; } - final Color borderColor = - widget.borderColor ?? CupertinoTheme.of(context).primaryColor; + final Color borderColor = widget.borderColor ?? CupertinoTheme.of(context).primaryColor; + final Color selectedBorderColor = widget.selectedBorderColor ?? CupertinoTheme.of(context).primaryColor; if (_borderColor != borderColor) { changed = true; _borderColor = borderColor; } + if (_selectedBorderColor != selectedBorderColor) { + changed = true; + _selectedBorderColor = selectedBorderColor; + } final Color pressedColor = - widget.pressedColor ?? - CupertinoTheme.of(context).primaryColor.withOpacity(0.2); + widget.pressedColor ?? CupertinoTheme.of(context).primaryColor.withOpacity(0.2); if (_pressedColor != pressedColor) { changed = true; _pressedColor = pressedColor; } - _forwardBackgroundColorTween = ColorTween( - begin: _pressedColor, - end: _selectedColor, - ); - _reverseBackgroundColorTween = ColorTween( - begin: _unselectedColor, - end: _selectedColor, - ); + _forwardBackgroundColorTween = ColorTween(begin: _pressedColor, end: _selectedColor); + _reverseBackgroundColorTween = ColorTween(begin: _unselectedColor, end: _selectedColor); _textColorTween = ColorTween(begin: _selectedColor, end: _unselectedColor); return changed; } @@ -229,8 +233,7 @@ class _SegmentedControlState _childTweens.clear(); for (final T key in widget.children.keys) { - final AnimationController animationController = - createAnimationController(); + final AnimationController animationController = createAnimationController(); if (widget.groupValue == key) { _childTweens.add(_reverseBackgroundColorTween); animationController.value = 1.0; @@ -254,8 +257,7 @@ class _SegmentedControlState void didUpdateWidget(NewCupertinoSegmentedControl oldWidget) { super.didUpdateWidget(oldWidget); - if (_updateColors() || - oldWidget.children.length != widget.children.length) { + if (_updateColors() || oldWidget.children.length != widget.children.length) { _updateAnimationControllers(); } @@ -276,8 +278,7 @@ class _SegmentedControlState @override void dispose() { - for (final AnimationController animationController - in _selectionControllers) { + for (final AnimationController animationController in _selectionControllers) { animationController.dispose(); } super.dispose(); @@ -324,9 +325,7 @@ class _SegmentedControlState Color? getBackgroundColor(int index, T currentKey) { if (widget.disabledChildren.contains(currentKey)) { - return widget.groupValue == currentKey - ? _selectedDisabledColor - : _unselectedDisabledColor; + return widget.groupValue == currentKey ? _selectedDisabledColor : _unselectedDisabledColor; } if (_selectionControllers[index].isAnimating) { return _childTweens[index].evaluate(_selectionControllers[index]); @@ -350,13 +349,12 @@ class _SegmentedControlState for (final T currentKey in widget.children.keys) { selectedIndex = (widget.groupValue == currentKey) ? index : selectedIndex; pressedIndex = (_pressedKey == currentKey) ? index : pressedIndex; + final isSelected = widget.groupValue == currentKey; - final TextStyle textStyle = DefaultTextStyle.of( - context, - ).style.copyWith(color: getTextColor(index, currentKey)); - final IconThemeData iconTheme = IconThemeData( - color: getTextColor(index, currentKey), - ); + final textStyle = + (isSelected ? widget.selectedItemStyle : widget.unselectedItemStyle) ?? + DefaultTextStyle.of(context).style.copyWith(color: getTextColor(index, currentKey)); + final IconThemeData iconTheme = IconThemeData(color: getTextColor(index, currentKey)); Widget child = Center(child: widget.children[currentKey]); @@ -364,16 +362,12 @@ class _SegmentedControlState cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer, child: GestureDetector( behavior: HitTestBehavior.opaque, - onTapDown: - widget.disabledChildren.contains(currentKey) - ? null - : (TapDownDetails event) { - _onTapDown(currentKey); - }, - onTapCancel: - widget.disabledChildren.contains(currentKey) - ? null - : _onTapCancel, + onTapDown: widget.disabledChildren.contains(currentKey) + ? null + : (TapDownDetails event) { + _onTapDown(currentKey); + }, + onTapCancel: widget.disabledChildren.contains(currentKey) ? null : _onTapCancel, onTap: () { _onTap(currentKey); }, @@ -402,6 +396,7 @@ class _SegmentedControlState pressedIndex: pressedIndex, backgroundColors: backgroundColors, borderColor: _borderColor!, + selectBorderColor: _selectedBorderColor ?? _borderColor!, children: gestureChildren, ); @@ -420,12 +415,14 @@ class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { required this.pressedIndex, required this.backgroundColors, required this.borderColor, + required this.selectBorderColor, }); final int? selectedIndex; final int? pressedIndex; final List backgroundColors; final Color borderColor; + final Color selectBorderColor; @override RenderObject createRenderObject(BuildContext context) { @@ -435,25 +432,23 @@ class _SegmentedControlRenderWidget extends MultiChildRenderObjectWidget { pressedIndex: pressedIndex, backgroundColors: backgroundColors, borderColor: borderColor, + selectBorderColor: selectBorderColor, ); } @override - void updateRenderObject( - BuildContext context, - _RenderSegmentedControl renderObject, - ) { + void updateRenderObject(BuildContext context, _RenderSegmentedControl renderObject) { renderObject ..textDirection = Directionality.of(context) ..selectedIndex = selectedIndex ..pressedIndex = pressedIndex ..backgroundColors = backgroundColors - ..borderColor = borderColor; + ..borderColor = borderColor + ..selectedItemBorderColor = selectBorderColor; } } -class _SegmentedControlContainerBoxParentData - extends ContainerBoxParentData { +class _SegmentedControlContainerBoxParentData extends ContainerBoxParentData { RRect? surroundingRect; } @@ -461,24 +456,20 @@ typedef _NextChild = RenderBox? Function(RenderBox child); class _RenderSegmentedControl extends RenderBox with - ContainerRenderObjectMixin< - RenderBox, - ContainerBoxParentData - >, - RenderBoxContainerDefaultsMixin< - RenderBox, - ContainerBoxParentData - > { + ContainerRenderObjectMixin>, + RenderBoxContainerDefaultsMixin> { _RenderSegmentedControl({ required int? selectedIndex, required int? pressedIndex, required TextDirection textDirection, required List backgroundColors, required Color borderColor, + required Color selectBorderColor, }) : _textDirection = textDirection, _selectedIndex = selectedIndex, _pressedIndex = pressedIndex, _backgroundColors = backgroundColors, + _selectedBorderColor = selectBorderColor, _borderColor = borderColor; int? get selectedIndex => _selectedIndex; @@ -536,6 +527,16 @@ class _RenderSegmentedControl extends RenderBox markNeedsPaint(); } + Color? _selectedBorderColor; + + Color? get selectedItemBorderColor => _selectedBorderColor; + + set selectedItemBorderColor(Color? value) { + if (_selectedBorderColor == value) return; + _selectedBorderColor = value; + markNeedsPaint(); + } + @override double computeMinIntrinsicWidth(double height) { RenderBox? child = firstChild; @@ -604,11 +605,7 @@ class _RenderSegmentedControl extends RenderBox } } - void _layoutRects( - _NextChild nextChild, - RenderBox? leftChild, - RenderBox? rightChild, - ) { + void _layoutRects(_NextChild nextChild, RenderBox? leftChild, RenderBox? rightChild) { RenderBox? child = leftChild; double start = 0.0; while (child != null) { @@ -616,12 +613,7 @@ class _RenderSegmentedControl extends RenderBox child.parentData! as _SegmentedControlContainerBoxParentData; final Offset childOffset = Offset(start, 0.0); childParentData.offset = childOffset; - final Rect childRect = Rect.fromLTWH( - start, - 0.0, - child.size.width, - child.size.height, - ); + final Rect childRect = Rect.fromLTWH(start, 0.0, child.size.width, child.size.height); final RRect rChildRect; if (child == leftChild) { rChildRect = RRect.fromRectAndCorners( @@ -649,10 +641,7 @@ class _RenderSegmentedControl extends RenderBox double childWidth = constraints.minWidth / childCount; RenderBox? child = firstChild; while (child != null) { - childWidth = math.max( - childWidth, - child.getMaxIntrinsicWidth(double.infinity), - ); + childWidth = math.max(childWidth, child.getMaxIntrinsicWidth(double.infinity)); child = childAfter(child); } childWidth = math.min(childWidth, constraints.maxWidth / childCount); @@ -666,25 +655,16 @@ class _RenderSegmentedControl extends RenderBox } Size _computeOverallSizeFromChildSize(Size childSize) { - return constraints.constrain( - Size(childSize.width * childCount, childSize.height), - ); + return constraints.constrain(Size(childSize.width * childCount, childSize.height)); } @override - double? computeDryBaseline( - covariant BoxConstraints constraints, - TextBaseline baseline, - ) { + double? computeDryBaseline(covariant BoxConstraints constraints, TextBaseline baseline) { final Size childSize = _calculateChildSize(constraints); final BoxConstraints childConstraints = BoxConstraints.tight(childSize); BaselineOffset baselineOffset = BaselineOffset.noBaseline; - for ( - RenderBox? child = firstChild; - child != null; - child = childAfter(child) - ) { + for (RenderBox? child = firstChild; child != null; child = childAfter(child)) { baselineOffset = baselineOffset.minOf( BaselineOffset(child.getDryBaseline(childConstraints, baseline)), ); @@ -735,28 +715,29 @@ class _RenderSegmentedControl extends RenderBox } } - void _paintChild( - PaintingContext context, - Offset offset, - RenderBox child, - int childIndex, - ) { + void _paintChild(PaintingContext context, Offset offset, RenderBox child, int childIndex) { final _SegmentedControlContainerBoxParentData childParentData = child.parentData! as _SegmentedControlContainerBoxParentData; + final RRect rect = childParentData.surroundingRect!.shift(offset); context.canvas.drawRRect( - childParentData.surroundingRect!.shift(offset), + rect, Paint() ..color = backgroundColors[childIndex] ..style = PaintingStyle.fill, ); - context.canvas.drawRRect( - childParentData.surroundingRect!.shift(offset), - Paint() - ..color = borderColor - ..strokeWidth = 1.0 - ..style = PaintingStyle.stroke, - ); + + + final isSelected = selectedIndex == childIndex; + final borderPaint = Paint() + ..color = isSelected && selectedItemBorderColor != null + ? selectedItemBorderColor! + : borderColor + ..strokeWidth = 1.0 + ..style = PaintingStyle.stroke; + + context.canvas.drawRRect(rect, borderPaint); + context.paintChild(child, childParentData.offset + offset); } diff --git a/packages/core/lib/presentation/widget/tabs/r_segment.dart b/packages/core/lib/presentation/widget/tabs/r_segment.dart new file mode 100644 index 0000000..bdca712 --- /dev/null +++ b/packages/core/lib/presentation/widget/tabs/r_segment.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +const Duration _kFadeDuration = Duration(milliseconds: 165); + +class RSegment extends StatefulWidget { + const RSegment({ + super.key, + required this.children, + required this.selectedIndex, + required this.onSegmentSelected, + required this.backgroundColor, + required this.selectedBackgroundColor, + required this.borderColor, + required this.selectedBorderColor, + this.padding, + }); + + final List children; + final int selectedIndex; + final Function(int index)? onSegmentSelected; + final EdgeInsetsGeometry? padding; + final Color backgroundColor; + final Color borderColor; + final Color selectedBackgroundColor; + final Color selectedBorderColor; + + @override + State createState() => _RSegmentState(); +} + +class _RSegmentState extends State { + late int selectedIndex; + + @override + void initState() { + super.initState(); + selectedIndex = widget.selectedIndex; + } + + @override + void didUpdateWidget(covariant RSegment oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.selectedIndex != widget.selectedIndex) { + widget.onSegmentSelected?.call(widget.selectedIndex); + } + } + + @override + Widget build(BuildContext context) { + return Row( + children: List.generate( + widget.children.length, + (index) => Expanded( + child: _generateChild( + index: index, + hasNext: widget.children.length > index + 1, + hasPrevious: index > 0, + ), + ), + ), + ); + } + + Widget _generateChild({required int index, required bool hasNext, required bool hasPrevious}) { + final bool isSelected = selectedIndex == index; + + return GestureDetector( + onTap: () { + setState(() { + selectedIndex = index; + }); + widget.onSegmentSelected?.call(index); + }, + child: AnimatedContainer( + duration: _kFadeDuration, + padding: widget.padding??EdgeInsets.symmetric(vertical: 8), + margin: EdgeInsets.zero, + decoration: BoxDecoration( + color: isSelected ? widget.selectedBackgroundColor : widget.backgroundColor, + borderRadius: BorderRadius.only( + topRight: !hasPrevious && hasNext ? Radius.circular(8) : Radius.zero, + bottomRight: !hasPrevious && hasNext ? Radius.circular(8) : Radius.zero, + bottomLeft: hasPrevious && !hasNext ? Radius.circular(8) : Radius.zero, + topLeft: hasPrevious && !hasNext ? Radius.circular(8) : Radius.zero, + ), + border: Border.all( + width: 1, + color: isSelected ? widget.selectedBorderColor : widget.borderColor, + ), + ), + child: Center( + child: Text( + widget.children[index], + textAlign: TextAlign.center, + style: isSelected + ? AppFonts.yekan16Bold.copyWith(color: widget.selectedBorderColor) + : AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), + ), + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 1ea7bfa..89df63c 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -24,5 +24,6 @@ export 'overlay_dropdown_widget/view.dart'; export 'pagination/pagination_from_until.dart'; export 'pagination/show_more.dart'; export 'tabs/new_tab.dart'; +export 'tabs/r_segment.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; From 1c732efc2f6250c84dcae9573839b641f2e78f20 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 6 Jul 2025 20:44:11 +0330 Subject: [PATCH 172/256] fix : text filed error in auth page --- .../presentation/widget/captcha/logic.dart | 3 +- .../lib/presentation/widget/captcha/view.dart | 54 +++++++++---------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart index 4644ca8..2628483 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -7,7 +7,7 @@ import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; class CaptchaWidgetLogic extends GetxController with StateMixin { - Rx textController = TextEditingController().obs; + TextEditingController textController = TextEditingController(); RxnString captchaKey = RxnString(); GlobalKey formKey = GlobalKey(); AuthRepositoryImpl authRepository = diAuth.get(); @@ -23,6 +23,7 @@ class CaptchaWidgetLogic extends GetxController with StateMixin { ), onLoading: const Center(child: CupertinoActivityIndicator(color: AppColor.blueNormal)), onError: (error) { - return const Center(child: Text('خطا در بارگذاری کد امنیتی', style: AppFonts.yekan13)); + return Center(child: Text('خطا ', style: AppFonts.yekan13.copyWith(color: Colors.red))); }, ), ), @@ -50,36 +50,34 @@ class CaptchaWidget extends GetView { child: Form( key: controller.formKey, autovalidateMode: AutovalidateMode.disabled, - child: ObxValue((data) { - return RTextField( - label: 'کد امنیتی', - controller: data.value, - keyboardType: TextInputType.numberWithOptions(decimal: false, signed: false), - maxLines: 1, - maxLength: 6, - suffixIcon: (data.value.text.trim().isNotEmpty ?? false) - ? clearButton(() => controller.textController.value.clear()) - : null, + child: RTextField( + label: 'کد امنیتی', + controller: controller.textController, + keyboardType: TextInputType.numberWithOptions(decimal: false, signed: false), + maxLines: 1, + maxLength: 6, + suffixIcon: (controller.textController.text.trim().isNotEmpty ?? false) + ? clearButton(() => controller.textController.clear()) + : null, - validator: (value) { - if (value == null || value.isEmpty) { - return 'کد امنیتی را وارد کنید'; - } else if (controller.captchaKey.value != null && controller.captchaKey.value != value) { - return 'کد امنیتی اشتباه است'; - } - return null; - }, - onChanged: (pass) { - if(pass.length== 6) { - if(controller.formKey.currentState?.validate()??false) { - Get.find().isDisabled.value = false; + validator: (value) { + if (value == null || value.isEmpty) { + return 'کد امنیتی را وارد کنید'; + } else if (controller.captchaKey.value != null && controller.captchaKey.value != value) { + return 'کد امنیتی اشتباه است'; + } + return null; + }, + onChanged: (pass) { + if(pass.length== 6) { + if(controller.formKey.currentState?.validate()??false) { + Get.find().isDisabled.value = false; - } } - }, - style: AppFonts.yekan13, - ); - }, controller.textController), + } + }, + style: AppFonts.yekan13, + ) ), ), ], From 21d3490d0c4d5976fb7bbb2968f23126428e7b27 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 7 Jul 2025 08:36:26 +0330 Subject: [PATCH 173/256] fix : margin and padding --- packages/auth/lib/presentation/widget/captcha/logic.dart | 6 +++--- .../chicken/lib/presentation/widget/base_page/view.dart | 1 - packages/chicken/lib/presentation/widget/page_route.dart | 2 +- packages/chicken/lib/presentation/widget/search/view.dart | 1 + 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/auth/lib/presentation/widget/captcha/logic.dart b/packages/auth/lib/presentation/widget/captcha/logic.dart index 2628483..7a5ebcf 100644 --- a/packages/auth/lib/presentation/widget/captcha/logic.dart +++ b/packages/auth/lib/presentation/widget/captcha/logic.dart @@ -22,14 +22,14 @@ class CaptchaWidgetLogic extends GetxController with StateMixin getCaptcha() async { change(null, status: RxStatus.loading()); - textController.value.clear(); + textController.clear(); await Future.delayed(Duration(milliseconds: 800)); captchaKey.value = (random.nextInt(900000)+100000).toString(); change(value, status: RxStatus.success()); diff --git a/packages/chicken/lib/presentation/widget/base_page/view.dart b/packages/chicken/lib/presentation/widget/base_page/view.dart index f0423df..64eb9ac 100644 --- a/packages/chicken/lib/presentation/widget/base_page/view.dart +++ b/packages/chicken/lib/presentation/widget/base_page/view.dart @@ -92,7 +92,6 @@ class _BasePageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!), - const SizedBox(height: 8), if (!widget.isBase && widget.hasSearch) ...{ SearchWidget(onSearchChanged: widget.onSearchChanged), }, diff --git a/packages/chicken/lib/presentation/widget/page_route.dart b/packages/chicken/lib/presentation/widget/page_route.dart index 16f77be..badde4e 100644 --- a/packages/chicken/lib/presentation/widget/page_route.dart +++ b/packages/chicken/lib/presentation/widget/page_route.dart @@ -3,7 +3,7 @@ import 'package:rasadyar_core/core.dart'; Widget buildPageRoute(List route) { return Padding( - padding: const EdgeInsets.fromLTRB(0, 4, 7, 8), + padding: const EdgeInsets.fromLTRB(0, 4, 7, 4), child: Text(route.isEmpty ? 'خانه' : route.join("/"), style: AppFonts.yekan14.copyWith(color: AppColor.bgDark)), ); } diff --git a/packages/chicken/lib/presentation/widget/search/view.dart b/packages/chicken/lib/presentation/widget/search/view.dart index e0f088e..14562b0 100644 --- a/packages/chicken/lib/presentation/widget/search/view.dart +++ b/packages/chicken/lib/presentation/widget/search/view.dart @@ -26,6 +26,7 @@ class _SearchWidgetState extends State { Widget build(BuildContext context) { return ObxValue((data) { return AnimatedContainer( + margin: EdgeInsets.symmetric(vertical: 4), duration: const Duration(milliseconds: 300), padding: const EdgeInsets.only(top: 5), curve: Curves.easeInOut, From 80dabe991d07b6c9331c20f9d272ae8255eda7d8 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 7 Jul 2025 11:38:37 +0330 Subject: [PATCH 174/256] feat : buy in province --- assets/icons/clock.svg | 4 + .../imported_loads_model.dart | 19 +- .../imported_loads_model.freezed.dart | 208 ++------------- .../imported_loads_model.g.dart | 26 +- .../data/repositories/chicken_repository.dart | 4 +- .../repositories/chicken_repository_imp.dart | 12 +- .../pages/buy_in_province/logic.dart | 56 +++- .../pages/buy_in_province/view.dart | 42 ++- .../pages/buy_in_province_all/logic.dart | 41 ++- .../pages/buy_in_province_waiting/logic.dart | 103 ++++++- .../pages/buy_in_province_waiting/view.dart | 173 ++++++------ .../pages/entering_the_warehouse/logic.dart | 85 +----- .../pages/entering_the_warehouse/view.dart | 252 +++++------------- .../pages/sales_in_province/view.dart | 2 +- .../string_utils.dart | 2 +- .../chicken/lib/presentation/utils/utils.dart | 5 + .../lib/presentation/common/app_color.dart | 1 + .../lib/presentation/common/assets.gen.dart | 8 + .../widget/buttons/animated_fab.dart | 80 ++++++ .../presentation/widget/buttons/buttons.dart | 7 + .../presentation/widget/dialog/dialog.dart | 2 + .../widget/dialog/warning_dialog.dart | 33 +++ .../core/lib/presentation/widget/widget.dart | 8 +- 23 files changed, 568 insertions(+), 605 deletions(-) create mode 100644 assets/icons/clock.svg rename packages/chicken/lib/presentation/{pages/entering_the_warehouse => utils}/string_utils.dart (95%) create mode 100644 packages/core/lib/presentation/widget/buttons/animated_fab.dart create mode 100644 packages/core/lib/presentation/widget/buttons/buttons.dart create mode 100644 packages/core/lib/presentation/widget/dialog/dialog.dart create mode 100644 packages/core/lib/presentation/widget/dialog/warning_dialog.dart diff --git a/assets/icons/clock.svg b/assets/icons/clock.svg new file mode 100644 index 0000000..fd5588b --- /dev/null +++ b/assets/icons/clock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart index 4df10b9..17c6f77 100644 --- a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart +++ b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.dart @@ -6,19 +6,6 @@ part 'imported_loads_model.g.dart'; @freezed abstract class ImportedLoadsModel with _$ImportedLoadsModel { const factory ImportedLoadsModel({ - int? count, - String? next, - String? previous, - List? results, - }) = _ImportedLoadsModel; - - factory ImportedLoadsModel.fromJson(Map json) => - _$ImportedLoadsModelFromJson(json); -} - -@freezed -abstract class ImportedLoad with _$ImportedLoad { - const factory ImportedLoad({ int? id, Product? product, KillHouse? killHouse, @@ -74,10 +61,10 @@ abstract class ImportedLoad with _$ImportedLoad { dynamic stewardWareHouse, dynamic car, dynamic dispenser, - }) = _ImportedLoad; + }) = _ImportedLoadsModel; - factory ImportedLoad.fromJson(Map json) => - _$ImportedLoadFromJson(json); + factory ImportedLoadsModel.fromJson(Map json) => + _$ImportedLoadsModelFromJson(json); } @freezed diff --git a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart index 16c065c..10eda4f 100644 --- a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$ImportedLoadsModel { - int? get count; String? get next; String? get previous; List? get results; + int? get id; Product? get product; KillHouse? get killHouse; dynamic get toKillHouse; dynamic get steward; ToSteward? get toSteward; dynamic get guilds; dynamic get toGuilds; dynamic get toColdHouse; int? get indexWeight; int? get dateTimestamp; int? get newState; int? get newReceiverState; int? get newAllocationState; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get numberOfCarcasses; int? get realNumberOfCarcasses; int? get receiverRealNumberOfCarcasses; double? get weightOfCarcasses; double? get realWeightOfCarcasses; double? get receiverRealWeightOfCarcasses; double? get weightLossOfCarcasses; bool? get finalRegistration; String? get sellType; String? get productName; String? get sellerType; String? get type; String? get saleType; String? get allocationType; bool? get systemRegistrationCode; int? get registrationCode; int? get amount; int? get totalAmount; int? get totalAmountPaid; int? get totalAmountRemain; dynamic get loggedRegistrationCode; String? get state; String? get receiverState; String? get allocationState; String? get date; dynamic get role; dynamic get stewardTempKey; bool? get approvedPriceStatus; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get createdBy; dynamic get modifiedBy; dynamic get wareHouse; dynamic get stewardWareHouse; dynamic get car; dynamic get dispenser; /// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $ImportedLoadsModelCopyWith get copyWith => _$ImportedLoadsM @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is ImportedLoadsModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other.results, results)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is ImportedLoadsModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(results)); +int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); @override String toString() { - return 'ImportedLoadsModel(count: $count, next: $next, previous: $previous, results: $results)'; + return 'ImportedLoadsModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; } @@ -49,11 +49,11 @@ abstract mixin class $ImportedLoadsModelCopyWith<$Res> { factory $ImportedLoadsModelCopyWith(ImportedLoadsModel value, $Res Function(ImportedLoadsModel) _then) = _$ImportedLoadsModelCopyWithImpl; @useResult $Res call({ - int? count, String? next, String? previous, List? results + int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser }); - +$ProductCopyWith<$Res>? get product;$KillHouseCopyWith<$Res>? get killHouse;$ToStewardCopyWith<$Res>? get toSteward; } /// @nodoc @@ -66,156 +66,6 @@ class _$ImportedLoadsModelCopyWithImpl<$Res> /// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { - return _then(_self.copyWith( -count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: freezed == results ? _self.results : results // ignore: cast_nullable_to_non_nullable -as List?, - )); -} - -} - - -/// @nodoc -@JsonSerializable() - -class _ImportedLoadsModel implements ImportedLoadsModel { - const _ImportedLoadsModel({this.count, this.next, this.previous, final List? results}): _results = results; - factory _ImportedLoadsModel.fromJson(Map json) => _$ImportedLoadsModelFromJson(json); - -@override final int? count; -@override final String? next; -@override final String? previous; - final List? _results; -@override List? get results { - final value = _results; - if (value == null) return null; - if (_results is EqualUnmodifiableListView) return _results; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); -} - - -/// Create a copy of ImportedLoadsModel -/// with the given fields replaced by the non-null parameter values. -@override @JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -_$ImportedLoadsModelCopyWith<_ImportedLoadsModel> get copyWith => __$ImportedLoadsModelCopyWithImpl<_ImportedLoadsModel>(this, _$identity); - -@override -Map toJson() { - return _$ImportedLoadsModelToJson(this, ); -} - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ImportedLoadsModel&&(identical(other.count, count) || other.count == count)&&(identical(other.next, next) || other.next == next)&&(identical(other.previous, previous) || other.previous == previous)&&const DeepCollectionEquality().equals(other._results, _results)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hash(runtimeType,count,next,previous,const DeepCollectionEquality().hash(_results)); - -@override -String toString() { - return 'ImportedLoadsModel(count: $count, next: $next, previous: $previous, results: $results)'; -} - - -} - -/// @nodoc -abstract mixin class _$ImportedLoadsModelCopyWith<$Res> implements $ImportedLoadsModelCopyWith<$Res> { - factory _$ImportedLoadsModelCopyWith(_ImportedLoadsModel value, $Res Function(_ImportedLoadsModel) _then) = __$ImportedLoadsModelCopyWithImpl; -@override @useResult -$Res call({ - int? count, String? next, String? previous, List? results -}); - - - - -} -/// @nodoc -class __$ImportedLoadsModelCopyWithImpl<$Res> - implements _$ImportedLoadsModelCopyWith<$Res> { - __$ImportedLoadsModelCopyWithImpl(this._self, this._then); - - final _ImportedLoadsModel _self; - final $Res Function(_ImportedLoadsModel) _then; - -/// Create a copy of ImportedLoadsModel -/// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? count = freezed,Object? next = freezed,Object? previous = freezed,Object? results = freezed,}) { - return _then(_ImportedLoadsModel( -count: freezed == count ? _self.count : count // ignore: cast_nullable_to_non_nullable -as int?,next: freezed == next ? _self.next : next // ignore: cast_nullable_to_non_nullable -as String?,previous: freezed == previous ? _self.previous : previous // ignore: cast_nullable_to_non_nullable -as String?,results: freezed == results ? _self._results : results // ignore: cast_nullable_to_non_nullable -as List?, - )); -} - - -} - - -/// @nodoc -mixin _$ImportedLoad { - - int? get id; Product? get product; KillHouse? get killHouse; dynamic get toKillHouse; dynamic get steward; ToSteward? get toSteward; dynamic get guilds; dynamic get toGuilds; dynamic get toColdHouse; int? get indexWeight; int? get dateTimestamp; int? get newState; int? get newReceiverState; int? get newAllocationState; String? get key; String? get createDate; String? get modifyDate; bool? get trash; int? get numberOfCarcasses; int? get realNumberOfCarcasses; int? get receiverRealNumberOfCarcasses; double? get weightOfCarcasses; double? get realWeightOfCarcasses; double? get receiverRealWeightOfCarcasses; double? get weightLossOfCarcasses; bool? get finalRegistration; String? get sellType; String? get productName; String? get sellerType; String? get type; String? get saleType; String? get allocationType; bool? get systemRegistrationCode; int? get registrationCode; int? get amount; int? get totalAmount; int? get totalAmountPaid; int? get totalAmountRemain; dynamic get loggedRegistrationCode; String? get state; String? get receiverState; String? get allocationState; String? get date; dynamic get role; dynamic get stewardTempKey; bool? get approvedPriceStatus; bool? get calculateStatus; bool? get temporaryTrash; bool? get temporaryDeleted; dynamic get createdBy; dynamic get modifiedBy; dynamic get wareHouse; dynamic get stewardWareHouse; dynamic get car; dynamic get dispenser; -/// Create a copy of ImportedLoad -/// with the given fields replaced by the non-null parameter values. -@JsonKey(includeFromJson: false, includeToJson: false) -@pragma('vm:prefer-inline') -$ImportedLoadCopyWith get copyWith => _$ImportedLoadCopyWithImpl(this as ImportedLoad, _$identity); - - /// Serializes this ImportedLoad to a JSON map. - Map toJson(); - - -@override -bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is ImportedLoad&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); -} - -@JsonKey(includeFromJson: false, includeToJson: false) -@override -int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepCollectionEquality().hash(toKillHouse),const DeepCollectionEquality().hash(steward),toSteward,const DeepCollectionEquality().hash(guilds),const DeepCollectionEquality().hash(toGuilds),const DeepCollectionEquality().hash(toColdHouse),indexWeight,dateTimestamp,newState,newReceiverState,newAllocationState,key,createDate,modifyDate,trash,numberOfCarcasses,realNumberOfCarcasses,receiverRealNumberOfCarcasses,weightOfCarcasses,realWeightOfCarcasses,receiverRealWeightOfCarcasses,weightLossOfCarcasses,finalRegistration,sellType,productName,sellerType,type,saleType,allocationType,systemRegistrationCode,registrationCode,amount,totalAmount,totalAmountPaid,totalAmountRemain,const DeepCollectionEquality().hash(loggedRegistrationCode),state,receiverState,allocationState,date,const DeepCollectionEquality().hash(role),const DeepCollectionEquality().hash(stewardTempKey),approvedPriceStatus,calculateStatus,temporaryTrash,temporaryDeleted,const DeepCollectionEquality().hash(createdBy),const DeepCollectionEquality().hash(modifiedBy),const DeepCollectionEquality().hash(wareHouse),const DeepCollectionEquality().hash(stewardWareHouse),const DeepCollectionEquality().hash(car),const DeepCollectionEquality().hash(dispenser)]); - -@override -String toString() { - return 'ImportedLoad(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; -} - - -} - -/// @nodoc -abstract mixin class $ImportedLoadCopyWith<$Res> { - factory $ImportedLoadCopyWith(ImportedLoad value, $Res Function(ImportedLoad) _then) = _$ImportedLoadCopyWithImpl; -@useResult -$Res call({ - int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser -}); - - -$ProductCopyWith<$Res>? get product;$KillHouseCopyWith<$Res>? get killHouse;$ToStewardCopyWith<$Res>? get toSteward; - -} -/// @nodoc -class _$ImportedLoadCopyWithImpl<$Res> - implements $ImportedLoadCopyWith<$Res> { - _$ImportedLoadCopyWithImpl(this._self, this._then); - - final ImportedLoad _self; - final $Res Function(ImportedLoad) _then; - -/// Create a copy of ImportedLoad -/// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { return _then(_self.copyWith( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable @@ -276,7 +126,7 @@ as dynamic,dispenser: freezed == dispenser ? _self.dispenser : dispenser // igno as dynamic, )); } -/// Create a copy of ImportedLoad +/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -288,7 +138,7 @@ $ProductCopyWith<$Res>? get product { return $ProductCopyWith<$Res>(_self.product!, (value) { return _then(_self.copyWith(product: value)); }); -}/// Create a copy of ImportedLoad +}/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -300,7 +150,7 @@ $KillHouseCopyWith<$Res>? get killHouse { return $KillHouseCopyWith<$Res>(_self.killHouse!, (value) { return _then(_self.copyWith(killHouse: value)); }); -}/// Create a copy of ImportedLoad +}/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -319,9 +169,9 @@ $ToStewardCopyWith<$Res>? get toSteward { /// @nodoc @JsonSerializable() -class _ImportedLoad implements ImportedLoad { - const _ImportedLoad({this.id, this.product, this.killHouse, this.toKillHouse, this.steward, this.toSteward, this.guilds, this.toGuilds, this.toColdHouse, this.indexWeight, this.dateTimestamp, this.newState, this.newReceiverState, this.newAllocationState, this.key, this.createDate, this.modifyDate, this.trash, this.numberOfCarcasses, this.realNumberOfCarcasses, this.receiverRealNumberOfCarcasses, this.weightOfCarcasses, this.realWeightOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses, this.finalRegistration, this.sellType, this.productName, this.sellerType, this.type, this.saleType, this.allocationType, this.systemRegistrationCode, this.registrationCode, this.amount, this.totalAmount, this.totalAmountPaid, this.totalAmountRemain, this.loggedRegistrationCode, this.state, this.receiverState, this.allocationState, this.date, this.role, this.stewardTempKey, this.approvedPriceStatus, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy, this.wareHouse, this.stewardWareHouse, this.car, this.dispenser}); - factory _ImportedLoad.fromJson(Map json) => _$ImportedLoadFromJson(json); +class _ImportedLoadsModel implements ImportedLoadsModel { + const _ImportedLoadsModel({this.id, this.product, this.killHouse, this.toKillHouse, this.steward, this.toSteward, this.guilds, this.toGuilds, this.toColdHouse, this.indexWeight, this.dateTimestamp, this.newState, this.newReceiverState, this.newAllocationState, this.key, this.createDate, this.modifyDate, this.trash, this.numberOfCarcasses, this.realNumberOfCarcasses, this.receiverRealNumberOfCarcasses, this.weightOfCarcasses, this.realWeightOfCarcasses, this.receiverRealWeightOfCarcasses, this.weightLossOfCarcasses, this.finalRegistration, this.sellType, this.productName, this.sellerType, this.type, this.saleType, this.allocationType, this.systemRegistrationCode, this.registrationCode, this.amount, this.totalAmount, this.totalAmountPaid, this.totalAmountRemain, this.loggedRegistrationCode, this.state, this.receiverState, this.allocationState, this.date, this.role, this.stewardTempKey, this.approvedPriceStatus, this.calculateStatus, this.temporaryTrash, this.temporaryDeleted, this.createdBy, this.modifiedBy, this.wareHouse, this.stewardWareHouse, this.car, this.dispenser}); + factory _ImportedLoadsModel.fromJson(Map json) => _$ImportedLoadsModelFromJson(json); @override final int? id; @override final Product? product; @@ -379,20 +229,20 @@ class _ImportedLoad implements ImportedLoad { @override final dynamic car; @override final dynamic dispenser; -/// Create a copy of ImportedLoad +/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') -_$ImportedLoadCopyWith<_ImportedLoad> get copyWith => __$ImportedLoadCopyWithImpl<_ImportedLoad>(this, _$identity); +_$ImportedLoadsModelCopyWith<_ImportedLoadsModel> get copyWith => __$ImportedLoadsModelCopyWithImpl<_ImportedLoadsModel>(this, _$identity); @override Map toJson() { - return _$ImportedLoadToJson(this, ); + return _$ImportedLoadsModelToJson(this, ); } @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ImportedLoad&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ImportedLoadsModel&&(identical(other.id, id) || other.id == id)&&(identical(other.product, product) || other.product == product)&&(identical(other.killHouse, killHouse) || other.killHouse == killHouse)&&const DeepCollectionEquality().equals(other.toKillHouse, toKillHouse)&&const DeepCollectionEquality().equals(other.steward, steward)&&(identical(other.toSteward, toSteward) || other.toSteward == toSteward)&&const DeepCollectionEquality().equals(other.guilds, guilds)&&const DeepCollectionEquality().equals(other.toGuilds, toGuilds)&&const DeepCollectionEquality().equals(other.toColdHouse, toColdHouse)&&(identical(other.indexWeight, indexWeight) || other.indexWeight == indexWeight)&&(identical(other.dateTimestamp, dateTimestamp) || other.dateTimestamp == dateTimestamp)&&(identical(other.newState, newState) || other.newState == newState)&&(identical(other.newReceiverState, newReceiverState) || other.newReceiverState == newReceiverState)&&(identical(other.newAllocationState, newAllocationState) || other.newAllocationState == newAllocationState)&&(identical(other.key, key) || other.key == key)&&(identical(other.createDate, createDate) || other.createDate == createDate)&&(identical(other.modifyDate, modifyDate) || other.modifyDate == modifyDate)&&(identical(other.trash, trash) || other.trash == trash)&&(identical(other.numberOfCarcasses, numberOfCarcasses) || other.numberOfCarcasses == numberOfCarcasses)&&(identical(other.realNumberOfCarcasses, realNumberOfCarcasses) || other.realNumberOfCarcasses == realNumberOfCarcasses)&&(identical(other.receiverRealNumberOfCarcasses, receiverRealNumberOfCarcasses) || other.receiverRealNumberOfCarcasses == receiverRealNumberOfCarcasses)&&(identical(other.weightOfCarcasses, weightOfCarcasses) || other.weightOfCarcasses == weightOfCarcasses)&&(identical(other.realWeightOfCarcasses, realWeightOfCarcasses) || other.realWeightOfCarcasses == realWeightOfCarcasses)&&(identical(other.receiverRealWeightOfCarcasses, receiverRealWeightOfCarcasses) || other.receiverRealWeightOfCarcasses == receiverRealWeightOfCarcasses)&&(identical(other.weightLossOfCarcasses, weightLossOfCarcasses) || other.weightLossOfCarcasses == weightLossOfCarcasses)&&(identical(other.finalRegistration, finalRegistration) || other.finalRegistration == finalRegistration)&&(identical(other.sellType, sellType) || other.sellType == sellType)&&(identical(other.productName, productName) || other.productName == productName)&&(identical(other.sellerType, sellerType) || other.sellerType == sellerType)&&(identical(other.type, type) || other.type == type)&&(identical(other.saleType, saleType) || other.saleType == saleType)&&(identical(other.allocationType, allocationType) || other.allocationType == allocationType)&&(identical(other.systemRegistrationCode, systemRegistrationCode) || other.systemRegistrationCode == systemRegistrationCode)&&(identical(other.registrationCode, registrationCode) || other.registrationCode == registrationCode)&&(identical(other.amount, amount) || other.amount == amount)&&(identical(other.totalAmount, totalAmount) || other.totalAmount == totalAmount)&&(identical(other.totalAmountPaid, totalAmountPaid) || other.totalAmountPaid == totalAmountPaid)&&(identical(other.totalAmountRemain, totalAmountRemain) || other.totalAmountRemain == totalAmountRemain)&&const DeepCollectionEquality().equals(other.loggedRegistrationCode, loggedRegistrationCode)&&(identical(other.state, state) || other.state == state)&&(identical(other.receiverState, receiverState) || other.receiverState == receiverState)&&(identical(other.allocationState, allocationState) || other.allocationState == allocationState)&&(identical(other.date, date) || other.date == date)&&const DeepCollectionEquality().equals(other.role, role)&&const DeepCollectionEquality().equals(other.stewardTempKey, stewardTempKey)&&(identical(other.approvedPriceStatus, approvedPriceStatus) || other.approvedPriceStatus == approvedPriceStatus)&&(identical(other.calculateStatus, calculateStatus) || other.calculateStatus == calculateStatus)&&(identical(other.temporaryTrash, temporaryTrash) || other.temporaryTrash == temporaryTrash)&&(identical(other.temporaryDeleted, temporaryDeleted) || other.temporaryDeleted == temporaryDeleted)&&const DeepCollectionEquality().equals(other.createdBy, createdBy)&&const DeepCollectionEquality().equals(other.modifiedBy, modifiedBy)&&const DeepCollectionEquality().equals(other.wareHouse, wareHouse)&&const DeepCollectionEquality().equals(other.stewardWareHouse, stewardWareHouse)&&const DeepCollectionEquality().equals(other.car, car)&&const DeepCollectionEquality().equals(other.dispenser, dispenser)); } @JsonKey(includeFromJson: false, includeToJson: false) @@ -401,15 +251,15 @@ int get hashCode => Object.hashAll([runtimeType,id,product,killHouse,const DeepC @override String toString() { - return 'ImportedLoad(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; + return 'ImportedLoadsModel(id: $id, product: $product, killHouse: $killHouse, toKillHouse: $toKillHouse, steward: $steward, toSteward: $toSteward, guilds: $guilds, toGuilds: $toGuilds, toColdHouse: $toColdHouse, indexWeight: $indexWeight, dateTimestamp: $dateTimestamp, newState: $newState, newReceiverState: $newReceiverState, newAllocationState: $newAllocationState, key: $key, createDate: $createDate, modifyDate: $modifyDate, trash: $trash, numberOfCarcasses: $numberOfCarcasses, realNumberOfCarcasses: $realNumberOfCarcasses, receiverRealNumberOfCarcasses: $receiverRealNumberOfCarcasses, weightOfCarcasses: $weightOfCarcasses, realWeightOfCarcasses: $realWeightOfCarcasses, receiverRealWeightOfCarcasses: $receiverRealWeightOfCarcasses, weightLossOfCarcasses: $weightLossOfCarcasses, finalRegistration: $finalRegistration, sellType: $sellType, productName: $productName, sellerType: $sellerType, type: $type, saleType: $saleType, allocationType: $allocationType, systemRegistrationCode: $systemRegistrationCode, registrationCode: $registrationCode, amount: $amount, totalAmount: $totalAmount, totalAmountPaid: $totalAmountPaid, totalAmountRemain: $totalAmountRemain, loggedRegistrationCode: $loggedRegistrationCode, state: $state, receiverState: $receiverState, allocationState: $allocationState, date: $date, role: $role, stewardTempKey: $stewardTempKey, approvedPriceStatus: $approvedPriceStatus, calculateStatus: $calculateStatus, temporaryTrash: $temporaryTrash, temporaryDeleted: $temporaryDeleted, createdBy: $createdBy, modifiedBy: $modifiedBy, wareHouse: $wareHouse, stewardWareHouse: $stewardWareHouse, car: $car, dispenser: $dispenser)'; } } /// @nodoc -abstract mixin class _$ImportedLoadCopyWith<$Res> implements $ImportedLoadCopyWith<$Res> { - factory _$ImportedLoadCopyWith(_ImportedLoad value, $Res Function(_ImportedLoad) _then) = __$ImportedLoadCopyWithImpl; +abstract mixin class _$ImportedLoadsModelCopyWith<$Res> implements $ImportedLoadsModelCopyWith<$Res> { + factory _$ImportedLoadsModelCopyWith(_ImportedLoadsModel value, $Res Function(_ImportedLoadsModel) _then) = __$ImportedLoadsModelCopyWithImpl; @override @useResult $Res call({ int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser @@ -420,17 +270,17 @@ $Res call({ } /// @nodoc -class __$ImportedLoadCopyWithImpl<$Res> - implements _$ImportedLoadCopyWith<$Res> { - __$ImportedLoadCopyWithImpl(this._self, this._then); +class __$ImportedLoadsModelCopyWithImpl<$Res> + implements _$ImportedLoadsModelCopyWith<$Res> { + __$ImportedLoadsModelCopyWithImpl(this._self, this._then); - final _ImportedLoad _self; - final $Res Function(_ImportedLoad) _then; + final _ImportedLoadsModel _self; + final $Res Function(_ImportedLoadsModel) _then; -/// Create a copy of ImportedLoad +/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $Res call({Object? id = freezed,Object? product = freezed,Object? killHouse = freezed,Object? toKillHouse = freezed,Object? steward = freezed,Object? toSteward = freezed,Object? guilds = freezed,Object? toGuilds = freezed,Object? toColdHouse = freezed,Object? indexWeight = freezed,Object? dateTimestamp = freezed,Object? newState = freezed,Object? newReceiverState = freezed,Object? newAllocationState = freezed,Object? key = freezed,Object? createDate = freezed,Object? modifyDate = freezed,Object? trash = freezed,Object? numberOfCarcasses = freezed,Object? realNumberOfCarcasses = freezed,Object? receiverRealNumberOfCarcasses = freezed,Object? weightOfCarcasses = freezed,Object? realWeightOfCarcasses = freezed,Object? receiverRealWeightOfCarcasses = freezed,Object? weightLossOfCarcasses = freezed,Object? finalRegistration = freezed,Object? sellType = freezed,Object? productName = freezed,Object? sellerType = freezed,Object? type = freezed,Object? saleType = freezed,Object? allocationType = freezed,Object? systemRegistrationCode = freezed,Object? registrationCode = freezed,Object? amount = freezed,Object? totalAmount = freezed,Object? totalAmountPaid = freezed,Object? totalAmountRemain = freezed,Object? loggedRegistrationCode = freezed,Object? state = freezed,Object? receiverState = freezed,Object? allocationState = freezed,Object? date = freezed,Object? role = freezed,Object? stewardTempKey = freezed,Object? approvedPriceStatus = freezed,Object? calculateStatus = freezed,Object? temporaryTrash = freezed,Object? temporaryDeleted = freezed,Object? createdBy = freezed,Object? modifiedBy = freezed,Object? wareHouse = freezed,Object? stewardWareHouse = freezed,Object? car = freezed,Object? dispenser = freezed,}) { - return _then(_ImportedLoad( + return _then(_ImportedLoadsModel( id: freezed == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as int?,product: freezed == product ? _self.product : product // ignore: cast_nullable_to_non_nullable as Product?,killHouse: freezed == killHouse ? _self.killHouse : killHouse // ignore: cast_nullable_to_non_nullable @@ -490,7 +340,7 @@ as dynamic, )); } -/// Create a copy of ImportedLoad +/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -502,7 +352,7 @@ $ProductCopyWith<$Res>? get product { return $ProductCopyWith<$Res>(_self.product!, (value) { return _then(_self.copyWith(product: value)); }); -}/// Create a copy of ImportedLoad +}/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') @@ -514,7 +364,7 @@ $KillHouseCopyWith<$Res>? get killHouse { return $KillHouseCopyWith<$Res>(_self.killHouse!, (value) { return _then(_self.copyWith(killHouse: value)); }); -}/// Create a copy of ImportedLoad +}/// Create a copy of ImportedLoadsModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') diff --git a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart index 99edf28..30d28f0 100644 --- a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart +++ b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.g.dart @@ -6,27 +6,9 @@ part of 'imported_loads_model.dart'; // JsonSerializableGenerator // ************************************************************************** -_ImportedLoadsModel _$ImportedLoadsModelFromJson(Map json) => - _ImportedLoadsModel( - count: (json['count'] as num?)?.toInt(), - next: json['next'] as String?, - previous: json['previous'] as String?, - results: (json['results'] as List?) - ?.map((e) => ImportedLoad.fromJson(e as Map)) - .toList(), - ); - -Map _$ImportedLoadsModelToJson(_ImportedLoadsModel instance) => - { - 'count': instance.count, - 'next': instance.next, - 'previous': instance.previous, - 'results': instance.results, - }; - -_ImportedLoad _$ImportedLoadFromJson( +_ImportedLoadsModel _$ImportedLoadsModelFromJson( Map json, -) => _ImportedLoad( +) => _ImportedLoadsModel( id: (json['id'] as num?)?.toInt(), product: json['product'] == null ? null @@ -92,8 +74,8 @@ _ImportedLoad _$ImportedLoadFromJson( dispenser: json['dispenser'], ); -Map _$ImportedLoadToJson( - _ImportedLoad instance, +Map _$ImportedLoadsModelToJson( + _ImportedLoadsModel instance, ) => { 'id': instance.id, 'product': instance.product, diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 654dbca..6692f5f 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -43,9 +43,9 @@ abstract class ChickenRepository { required Map request, }); - Future getImportedLoadsModel({ + Future?> getImportedLoadsModel({ required String token, - required int page, + Map? queryParameters, }); Future?> getAllocatedMade({ diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 3e948d4..9fe9fae 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -95,14 +95,18 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future getImportedLoadsModel({ + Future?> getImportedLoadsModel({ required String token, - required int page, + Map? queryParameters, }) async { var res = await _httpClient.get( - '/steward-allocation/?role=Steward&search=filter&page=$page&page_size=10&value=&type=entered', + '/steward-allocation/', + queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, - fromJson: ImportedLoadsModel.fromJson, + fromJson: (json) => PaginationModel.fromJson( + json, + (data) => ImportedLoadsModel.fromJson(data as Map), + ), ); return res.data; } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart index 65a11bc..6bc5f5b 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart @@ -1,31 +1,39 @@ - - -import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_all/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_waiting/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class BuyInProvinceLogic extends GetxController { - RxList routesName = RxList(); + RxList routesName = RxList(); RxList isExpandedList = [].obs; RxnString searchedValue = RxnString(); Rx fromDateFilter = Jalali.now().obs; Rx toDateFilter = Jalali.now().obs; + RootLogic get rootLogic => Get.find(); + BuyLogic get buyLogic => Get.find(); RxInt selectedSegmentIndex = 0.obs; + BuyInProvinceAllLogic buyAllLogic = Get.find(); + BuyInProvinceWaitingLogic buyWaitingLogic = Get.find(); + @override void onInit() { super.onInit(); routesName.value = [...buyLogic.routesName, 'داخل استان'].toList(); - routesName.add(selectedSegmentIndex.value ==0 ? 'در انتظار':'همه'); + routesName.add(selectedSegmentIndex.value == 0 ? 'در انتظار' : 'همه'); ever(selectedSegmentIndex, (callback) { routesName.removeLast(); - routesName.add(callback ==0 ? 'در انتظار':'همه'); - },); + routesName.add(callback == 0 ? 'در انتظار' : 'همه'); + }); + + ever(fromDateFilter, (callback) => _setFromDateFilter(callback)); + ever(toDateFilter, (callback) => _setToDateFilter(callback)); } + @override void onReady() { // TODO: implement onReady @@ -38,8 +46,40 @@ class BuyInProvinceLogic extends GetxController { super.onClose(); } + void _setFromDateFilter(Jalali jalali) { + final isWaiting = selectedSegmentIndex.value == 0; + if (isWaiting) { + buyWaitingLogic.fromDateFilter.value = fromDateFilter.value; + } else { + buyAllLogic.fromDateFilter.value = fromDateFilter.value; + } + } + + void _setToDateFilter(Jalali jalali) { + final isWaiting = selectedSegmentIndex.value == 0; + if (isWaiting) { + buyWaitingLogic.toDateFilter.value = fromDateFilter.value; + } else { + buyAllLogic.toDateFilter.value = fromDateFilter.value; + } + } + + Future submitFilter() async { + final isWaiting = selectedSegmentIndex.value == 0; + if (isWaiting) { + buyWaitingLogic.getWaitingArrivals(); + } else { + buyAllLogic.getImportedEntries(); + } + } + void setSearchValue(String? data) { searchedValue.value = data?.trim(); - //TODO + final isWaiting = selectedSegmentIndex.value == 0; + if (isWaiting) { + buyWaitingLogic.searchedValue.value = searchedValue.value; + } else { + buyAllLogic.searchedValue.value = searchedValue.value; + } } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart index 2ca51d6..9c19ef3 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart @@ -16,7 +16,7 @@ class BuyInProvincePage extends GetView { routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName), onBackPressed: () => Get.back(id: 0), onSearchChanged: (data) => controller.setSearchValue(data), - filteringWidget: Container(color: Colors.redAccent), + filteringWidget: filterBottomSheet(), widgets: [ segmentWidget(), ObxValue((index) { @@ -48,4 +48,44 @@ class BuyInProvincePage extends GetView { ), ); } + + Widget filterBottomSheet() { + return BaseBottomSheet( + height: 250, + child: Column( + spacing: 16, + children: [ + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Row( + spacing: 8, + children: [ + Expanded( + child: dateFilterWidget( + date: controller.fromDateFilter, + onChanged: (jalali) => controller.fromDateFilter.value = jalali, + ), + ), + Expanded( + child: dateFilterWidget( + isFrom: false, + date: controller.toDateFilter, + onChanged: (jalali) => controller.toDateFilter.value = jalali, + ), + ), + ], + ), + SizedBox(height: 2), + RElevated( + text: 'اعمال فیلتر', + onPressed: () { + controller.submitFilter(); + Get.back(); + }, + height: 40, + ), + SizedBox(height: 16), + ], + ), + ); + } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart index dea5e83..f02fe03 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart @@ -1,9 +1,24 @@ +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class BuyInProvinceAllLogic extends GetxController { + RxList isExpandedList = [].obs; + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); + + RootLogic rootLogic = Get.find(); + Rx>> importedLoads = + Resource>.loading().obs; + + + + @override void onReady() { - // TODO: implement onReady + debounce(searchedValue, (callback) => getImportedEntries(), time: Duration(milliseconds: 2000)); super.onReady(); } @@ -12,4 +27,28 @@ class BuyInProvinceAllLogic extends GetxController { // TODO: implement onClose super.onClose(); } + + Future getImportedEntries() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getImportedLoadsModel( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + queryParams: {'type': 'entered'}, + role: 'Steward', + search: 'filter', + page: 1, + pageSize: 10, + value: searchedValue.value + ), + ), + onSuccess: (res) async { + await Future.delayed(Duration(milliseconds: 200)); + if ((res?.count ?? 0) == 0) { + importedLoads.value = Resource>.empty(); + } else { + importedLoads.value = Resource>.success(res!.results!); + } + }, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart index 0d5e1f4..4fd6a93 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -1,18 +1,39 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_allocation/steward_allocation_request.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class BuyInProvinceWaitingLogic extends GetxController { RxList isExpandedList = [].obs; - Rx fromDateFilter = Jalali.now().obs; - Rx toDateFilter = Jalali.now().obs; + Rx fromDateFilter = Jalali + .now() + .obs; + Rx toDateFilter = Jalali + .now() + .obs; RxnString searchedValue = RxnString(); + RxMap isLoadingConfirmMap = RxMap(); + Rx bgConfirmAllColor = AppColor.blueNormal.obs; RootLogic rootLogic = Get.find(); Rx>> waitingProduct = Resource>.loading().obs; + @override + void onInit() { + super.onInit(); + debounce( + searchedValue, + (callback) => getWaitingArrivals(), + time: Duration(milliseconds: timeDebounce), + ); + } + @override void onReady() { super.onReady(); @@ -24,14 +45,17 @@ class BuyInProvinceWaitingLogic extends GetxController { super.onClose(); } + void setSearchValue(String? data) { + searchedValue.value = data?.trim(); + } + Future getWaitingArrivals() async { safeCall( - call: () async => await rootLogic.chickenRepository.getWaitingArrivals( + call: () async => + await rootLogic.chickenRepository.getWaitingArrivals( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( - queryParams: { - 'type':'not_entered' - }, + queryParams: {'type': 'not_entered'}, pageSize: 10, page: 1, search: 'filter', @@ -42,17 +66,78 @@ class BuyInProvinceWaitingLogic extends GetxController { ), ), onSuccess: (res) async { - await Future.delayed(Duration(milliseconds: 500)); + await Future.delayed(Duration(milliseconds: 200)); if ((res?.count ?? 0) == 0) { waitingProduct.value = Resource>.empty(); } else { waitingProduct.value = Resource>.success(res!.results!); + flashingFabBgColor(); } }, ); } - void setSearchValue(String? data) { - searchedValue.value = data?.trim(); + Future acceptEntries(WaitingArrivalModel model) async { + var request = StewardAllocationRequest( + allocationKey: model.key, + checkAllocation: true, + state: 'accepted', + receiverRealNumberOfCarcasses: model.realNumberOfCarcasses ?? 0, + receiverRealWeightOfCarcasses: model.realWeightOfCarcasses?.toInt() ?? 0, + registrationCode: model.registrationCode ?? 0, + weightLossOfCarcasses: model.weightLossOfCarcasses?.toInt() ?? 0, + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => + await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + getWaitingArrivals(); + // getBarGeneralInformation(); + }, + ); + } + + Future denyEntries(WaitingArrivalModel model) async { + var request = StewardAllocationRequest( + allocationKey: model.key, + checkAllocation: true, + state: 'rejected', + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => + await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + getWaitingArrivals(); + //TODO + // getBarGeneralInformation(); + }, + ); + } + + void flashingFabBgColor() { + Timer.periodic(Duration(seconds: 2), (timer) { + if (bgConfirmAllColor.value == AppColor.blueNormal) { + bgConfirmAllColor.value = AppColor.blueDarkActive; + } else { + bgConfirmAllColor.value = AppColor.blueNormal; + } + }); } } + diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 4d49bf3..9a1ddb4 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; @@ -12,36 +11,50 @@ class BuyInProvinceWaitingPage extends GetView { @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: ObxValue((data) { - return RPaginatedListView( - listType: ListType.separated, - resource: data.value, - padding: EdgeInsets.fromLTRB(8, 8, 8, 80), - itemBuilder: (context, index) { - var item = data.value.data![index]; - return ObxValue((val) { - return ListItem2( - selected: val.contains(index), - onTap: () => controller.isExpandedList.toggle(index), - index: index, - child: itemListWidget(item), - secondChild: itemListExpandedWidget(item), - labelColor: AppColor.blueLight, - labelIcon: Assets.vec.truckFastOutlinedSvg.path, - ); - }, controller.isExpandedList); - }, - itemCount: data.value.data?.length ?? 0, - separatorBuilder: (context, index) => SizedBox(height: 8.h), - onLoadMore: () async {}, - ); + return Scaffold( + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.timerSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + onLoadMore: () async {}, + ); + }, controller.waitingProduct), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, + floatingActionButton: ObxValue((data) { + if ((data.value.data?.length ?? 0) > 1) { + return AnimatedFab( + onPressed: () {}, + message: 'تایید یکجا', + icon: Assets.vec.clipboardTaskSvg.svg(), + backgroundColor: controller.bgConfirmAllColor.value, + ); + } else { + return SizedBox.shrink(); + } }, controller.waitingProduct), ); } - Row itemListWidget(WaitingArrivalModel item) { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, @@ -76,7 +89,7 @@ class BuyInProvinceWaitingPage extends GetView { Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - spacing: 3, + spacing: 6, children: [ Visibility( visible: item.product?.name?.contains('مرغ گرم') ?? false, @@ -95,8 +108,6 @@ class BuyInProvinceWaitingPage extends GetView { ), SizedBox(height: 2), - - ], ), ), @@ -127,6 +138,14 @@ class BuyInProvinceWaitingPage extends GetView { textAlign: TextAlign.center, style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), + Spacer(), + Text( + 'در انتظار', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), + ), + SizedBox(width: 7), + Assets.vec.clockSvg.svg(width: 16.w, height: 16.h), ], ), Container( @@ -170,95 +189,61 @@ class BuyInProvinceWaitingPage extends GetView { ), ), - // buildRow(title: 'مشخصات فروشنده', value: item.killHouseName ?? 'N/A'), - + // buildRow(title: 'مشخصات فروشنده', value: item.killHouseName ?? 'N/A'), + buildRow( + title: 'نام و نام خانوادگی فروشنده', + value: item.steward?.user?.fullname ?? 'N/A', + ), buildRow( title: 'تلفن فروشنده', value: item.steward?.user?.mobile ?? 'N/A', valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), + buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), buildRow( title: 'وزن خریداری شده', value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', ), - buildRowOnTapped( - title: 'مشاهده بارنامه', - titleStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - valueWidget: Assets.vec.clipboardEyeSvg.svg( - width: 20, - height: 24, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - onTap: () { - Get.bottomSheet( - BaseBottomSheet( - height: 400, - child: Column( - spacing: 16, - children: [ - Text( - 'بارنامه', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), - ), - - /* Image.network( - item.barImage ?? '', - fit: BoxFit.cover, - height: 300, - errorBuilder: (context, error, stackTrace) { - eLog(error.toString()); - return Center(child: Text('خطایی پیش آمده!')); - }, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - return CupertinoActivityIndicator(); - }, - ),*/ - ], - ), - ), - ); - }, - ), - /* Row( + buildRow(title: 'قیمت کل', value: '${item.totalAmount?.separatedByComma} ریال'), + Row( mainAxisAlignment: MainAxisAlignment.center, spacing: 16.w, children: [ - RElevated( - text: 'ویرایش', - width: 150.w, - height: 40.h, - onPressed: () { - controller.setEditData(item); - Get.bottomSheet( - addPurchasedInformationBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - textStyle: AppFonts.yekan20.copyWith(color: Colors.white), - backgroundColor: AppColor.greenNormal, - ), + ObxValue((data) { + return RElevated( + text: 'تایید', + width: 150.w, + height: 40.h, + isLoading: data[item.key!] ?? false, + onPressed: () async { + data[item.key!] = !(data[item.key!] ?? false); + await controller.acceptEntries(item); + data.remove(item.key!); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ); + }, controller.isLoadingConfirmMap), ROutlinedElevated( - text: 'حذف', + text: 'رد', textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), width: 150.w, height: 40.h, onPressed: () { - buildDeleteDialog( - onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!), - onRefresh: () => controller.getStewardPurchaseOutOfProvince(), + buildWarningDialog( + title: 'اخطار', + middleText: 'آیا از رد شدن این مورد اطمینان دارید؟', + onConfirm: () => controller.denyEntries(item), + onRefresh: () => controller.getWaitingArrivals(), ); }, borderColor: AppColor.redNormal, ), ], - ),*/ + ), ], ), ); } - } diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart index 9fb4a42..ab10e19 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart @@ -33,26 +33,7 @@ class EnteringTheWarehouseLogic extends GetxController { @override void onReady() { super.onReady(); - getBarGeneralInformation(); - - getImportedEntried(); - - scrollControllerImportedLoad.addListener(() { - if (scrollControllerImportedLoad.position.pixels >= - scrollControllerImportedLoad.position.maxScrollExtent - 100) { - addPageImportedLoad.value = true; - getImportedEntried(); - } - }); - - scrollControllerWaitingForArrival.addListener(() { - if (scrollControllerWaitingForArrival.position.pixels >= - scrollControllerWaitingForArrival.position.maxScrollExtent - 100) { - addPageWaitingForArrival.value = true; - - } - }); } Future getBarGeneralInformation() async { @@ -74,68 +55,6 @@ class EnteringTheWarehouseLogic extends GetxController { - Future acceptEntried(String key) async { - var request = StewardAllocationRequest( - allocationKey: key, - checkAllocation: true, - state: 'accepted', - receiverRealNumberOfCarcasses: int.parse( - volumeController.text.isNotEmpty ? volumeController.text : '0', - ), - receiverRealWeightOfCarcasses: int.parse( - weightController.text.isNotEmpty ? weightController.text : '0', - ), - registrationCode: acceptType.value == 1 - ? int.parse( - authenticationCodeController.text.isNotEmpty - ? authenticationCodeController.text - : '0', - ) - : null, - weightLossOfCarcasses: int.parse( - weightLossController.text.isNotEmpty ? weightLossController.text : '0', - ), - ).toJson(); - request.removeWhere((key, value) => value == null); - - safeCall( - call: () async => await rootLogic.chickenRepository.setSateForArrivals( - token: rootLogic.tokenService.accessToken.value!, - request: request, - ), - onError: (error, stackTrace) { - eLog(error); - }, - onSuccess: (result) { - clearControllers(); - - getBarGeneralInformation(); - }, - ); - } - - Future denyEntried(String key) async { - var request = StewardAllocationRequest( - allocationKey: key, - checkAllocation: true, - state: 'rejected', - ).toJson(); - request.removeWhere((key, value) => value == null); - - safeCall( - call: () async => await rootLogic.chickenRepository.setSateForArrivals( - token: rootLogic.tokenService.accessToken.value!, - request: request, - ), - onError: (error, stackTrace) { - eLog(error); - }, - onSuccess: (result) { - - getBarGeneralInformation(); - }, - ); - } Future getImportedEntried() async { if (isLoadingMoreImportedLoad.value || !hasMoreDataImportedLoad.value) { @@ -146,7 +65,7 @@ class EnteringTheWarehouseLogic extends GetxController { currentPageImportedLoad.value++; } - safeCall( +/* safeCall( call: () async => await rootLogic.chickenRepository.getImportedLoadsModel( token: rootLogic.tokenService.accessToken.value!, page: currentPageImportedLoad.value, @@ -164,7 +83,7 @@ class EnteringTheWarehouseLogic extends GetxController { isLoadingMoreImportedLoad.value = false; } }, - ); + );*/ } clearControllers() { diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart index 6cd140f..aa99608 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart +++ b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; -import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; -import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -22,7 +20,7 @@ class EnteringTheWarehousePage extends GetView { return generalBarInformation(data.value); }, controller.barInformation), - importedLoads(), + // importedLoads(), ], ), ), @@ -43,7 +41,7 @@ class EnteringTheWarehousePage extends GetView { ), ), SizedBox(height: 4), - /* ObxValue( + /* ObxValue( (data) => data.isEmpty ? Container( margin: const EdgeInsets.symmetric(vertical: 2), @@ -135,14 +133,8 @@ class EnteringTheWarehousePage extends GetView { 'کل ورودی به انبار (کیلوگرم)', model.totalFreeBarsCarcassesWeight.toString(), ), - buildRow( - 'کل فروش (کیلوگرم)', - model.realAllocatedWeight.toString(), - ), - buildRow( - 'مانده انبار (کیلوگرم)', - model.totalRemainWeight.toString(), - ), + buildRow('کل فروش (کیلوگرم)', model.realAllocatedWeight.toString()), + buildRow('مانده انبار (کیلوگرم)', model.totalRemainWeight.toString()), ], ), ), @@ -161,9 +153,7 @@ class EnteringTheWarehousePage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -172,9 +162,7 @@ class EnteringTheWarehousePage extends GetView { value, textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), ], @@ -209,14 +197,8 @@ class EnteringTheWarehousePage extends GetView { crossAxisAlignment: CrossAxisAlignment.start, spacing: 8, children: [ - buildRow( - 'تعداد کل بارها', - model.totalBars!.toInt().toString(), - ), - buildRow( - 'وزن کل بارها (کیلوگرم)', - model.totalBarsWeight!.toInt().toString(), - ), + buildRow('تعداد کل بارها', model.totalBars!.toInt().toString()), + buildRow('وزن کل بارها (کیلوگرم)', model.totalBarsWeight!.toInt().toString()), buildRow( 'تعداد کل بارهای وارد شده', model.totalEnteredBars!.toInt().toString(), @@ -231,14 +213,9 @@ class EnteringTheWarehousePage extends GetView { ), buildRow( 'وزن کل بار وارد نشده (کیلوگرم)', - model.totalNotEnteredKillHouseRequestsWeight! - .toInt() - .toString(), - ), - buildRow( - 'تعداد کل بارهای رد شده', - model.totalRejectedBars!.toInt().toString(), + model.totalNotEnteredKillHouseRequestsWeight!.toInt().toString(), ), + buildRow('تعداد کل بارهای رد شده', model.totalRejectedBars!.toInt().toString()), buildRow( ' وزن کل بارهای رد شده', model.totalRejectedBarsWeight!.toInt().toString(), @@ -251,7 +228,7 @@ class EnteringTheWarehousePage extends GetView { ); } -/* Widget waitingForArrival() { + /* Widget waitingForArrival() { return Column( children: [ const SizedBox(height: 8), @@ -400,153 +377,72 @@ class EnteringTheWarehousePage extends GetView { ); }*/ - Widget importedLoads() { - return Column( - children: [ - const SizedBox(height: 8), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Align( - alignment: Alignment.centerRight, - child: Text( - 'بارهای وارد شده', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), + /* Widget importedLoads() { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildRow('ردیف', '${index + 1}'), + buildRow( + 'تاریخ ثبت', + result.date!.formattedJalaliDate ?? 'N/A', ), - ), - ObxValue((data) { - if (data.value == null) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ); - } else if (data.value?.results?.isEmpty ?? true) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: Text('هیچ بار وارد شده‌ای وجود ندارد')), - ); - } else { - return Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 700, - padding: const EdgeInsets.all(6), - child: ListView.separated( - controller: controller.scrollControllerImportedLoad, - padding: const EdgeInsets.all(8.0), - itemCount: data.value!.results!.length + 1, - itemBuilder: (BuildContext context, int index) { - if (index == data.value!.results!.length) { - return Obx( - () => controller.isLoadingMoreImportedLoad.value - ? const Padding( - padding: EdgeInsets.symmetric(vertical: 16), - child: Center(child: CircularProgressIndicator()), - ) - : const SizedBox(), - ); - } - - final result = data.value!.results![index]; - - return Card( - color: Colors.white, - margin: const EdgeInsets.symmetric(vertical: 4.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: const BorderSide( - color: AppColor.blueNormal, - width: 1, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildRow('ردیف', '${index + 1}'), - buildRow( - 'تاریخ ثبت', - result.date!.formattedJalaliDate ?? 'N/A', - ), - buildRow( - 'نوع تخصیص', - result.allocationType?.faAllocationType ?? 'N/A', - ), - buildRow( - 'مشخصات خریدار', - '${result.toSteward?.user?.fullname} - ${result.toSteward?.guildsName}' ?? - 'N/A', - ), - buildRow( - 'مشخصات فروشنده', - result.killHouse?.name ?? 'N/A', - ), - buildRow( - 'نوع فروش', - result.sellType?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${result.amount ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${result.totalAmount ?? 0} ریال', - ), - buildRow( - 'وزن تخصیصی', - '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', - ), - buildRow( - 'کداحراز', - result.registrationCode?.toString() ?? 'N/A', - ), - buildRow( - 'وضعیت کد احراز', - result.systemRegistrationCode == true - ? "ارسال شده" - : "ارسال نشده" ?? 'N/A', - ), - buildRow( - 'افت وزن(کیلوگرم)', - result.weightLossOfCarcasses?.toInt().toString() ?? - 'N/A', - ), - buildRow( - 'وضعیت', - result.receiverState?.faItem ?? 'N/A', - ), - ], - ), - ), - ); - }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), - ), - ); - } - }, controller.importedLoads), - ], + buildRow( + 'نوع تخصیص', + result.allocationType?.faAllocationType ?? 'N/A', + ), + buildRow( + 'مشخصات خریدار', + '${result.toSteward?.user?.fullname} - ${result.toSteward?.guildsName}' ?? + 'N/A', + ), + buildRow( + 'مشخصات فروشنده', + result.killHouse?.name ?? 'N/A', + ), + buildRow( + 'نوع فروش', + result.sellType?.faItem ?? 'N/A', + ), + buildRow( + 'قیمت هر کیلو', + '${result.amount ?? 0} ریال ', + ), + buildRow( + 'قیمت کل', + '${result.totalAmount ?? 0} ریال', + ), + buildRow( + 'وزن تخصیصی', + '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', + ), + buildRow( + 'کداحراز', + result.registrationCode?.toString() ?? 'N/A', + ), + buildRow( + 'وضعیت کد احراز', + result.systemRegistrationCode == true + ? "ارسال شده" + : "ارسال نشده" ?? 'N/A', + ), + buildRow( + 'افت وزن(کیلوگرم)', + result.weightLossOfCarcasses?.toInt().toString() ?? + 'N/A', + ), + buildRow( + 'وضعیت', + result.receiverState?.faItem ?? 'N/A', + ), + ], + ), ); - } + }*/ -/* Widget acceptBottomSheet(ResultModel resultModel) { + /* Widget acceptBottomSheet(ResultModel resultModel) { return BaseBottomSheet( height: 500, child: Column( diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index f0b2aeb..acad986 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -4,8 +4,8 @@ import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_ import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/presentation/pages/entering_the_warehouse/string_utils.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart b/packages/chicken/lib/presentation/utils/string_utils.dart similarity index 95% rename from packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart rename to packages/chicken/lib/presentation/utils/string_utils.dart index b7f8473..9145793 100644 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/string_utils.dart +++ b/packages/chicken/lib/presentation/utils/string_utils.dart @@ -1,4 +1,4 @@ -extension xStringUtils on String { +extension XStringUtils on String { get faAllocationType { final tmp = split('_'); tmp.insert(1, '_'); diff --git a/packages/chicken/lib/presentation/utils/utils.dart b/packages/chicken/lib/presentation/utils/utils.dart index 13b968a..e3fd48d 100644 --- a/packages/chicken/lib/presentation/utils/utils.dart +++ b/packages/chicken/lib/presentation/utils/utils.dart @@ -3,6 +3,11 @@ import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_core/core.dart'; + + +const int timeDebounce = 1200; + + void handleGeneric(DioException error,[void Function()? onError]) { Get.showSnackbar(_errorSnackBar('اعتبار توکن شما منقضی شده است لطفا دوباره وارد شوید')); diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index c69ee77..c309e7e 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -28,6 +28,7 @@ class AppColor { 0xFF142b73, ); // #142b73 rgb(20, 43, 115) static const Color blueDarker = Color(0xFF102159); // #102159 rgb(16, 33, 89) + static const Color blueFlashing = Color(0xFF6F91FF); // #6F91FF rgb(111, 145, 255) //endregion //region --- Green Colors --- diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index ea84c81..2a56bb5 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -71,6 +71,9 @@ class $AssetsIconsGen { /// File path: assets/icons/clipboard_task.svg SvgGenImage get clipboardTask => const SvgGenImage('assets/icons/clipboard_task.svg'); + /// File path: assets/icons/clock.svg + SvgGenImage get clock => const SvgGenImage('assets/icons/clock.svg'); + /// File path: assets/icons/close_square.svg SvgGenImage get closeSquare => const SvgGenImage('assets/icons/close_square.svg'); @@ -252,6 +255,7 @@ class $AssetsIconsGen { chicken, clipboardEye, clipboardTask, + clock, closeSquare, convertCube, cube, @@ -384,6 +388,9 @@ class $AssetsVecGen { /// File path: assets/vec/clipboard_task.svg.vec SvgGenImage get clipboardTaskSvg => const SvgGenImage.vec('assets/vec/clipboard_task.svg.vec'); + /// File path: assets/vec/clock.svg.vec + SvgGenImage get clockSvg => const SvgGenImage.vec('assets/vec/clock.svg.vec'); + /// File path: assets/vec/close_square.svg.vec SvgGenImage get closeSquareSvg => const SvgGenImage.vec('assets/vec/close_square.svg.vec'); @@ -565,6 +572,7 @@ class $AssetsVecGen { chickenSvg, clipboardEyeSvg, clipboardTaskSvg, + clockSvg, closeSquareSvg, convertCubeSvg, cubeSvg, diff --git a/packages/core/lib/presentation/widget/buttons/animated_fab.dart b/packages/core/lib/presentation/widget/buttons/animated_fab.dart new file mode 100644 index 0000000..f9693cf --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/animated_fab.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +class AnimatedFab extends StatelessWidget { + final VoidCallback? onPressed; + final Color backgroundColor; + final Color foregroundColor; + final Widget icon; + final double radius; + final bool isLoading; + final String? message; + + const AnimatedFab({ + super.key, + required this.onPressed, + required this.icon, + required this.backgroundColor, + this.foregroundColor = Colors.white, + this.radius = 56.0, + this.isLoading = false, + this.message, + }); + + @override + Widget build(BuildContext context) { + return message != null + ? Tooltip( + message: message ?? '', + child: AnimatedContainer( + duration: const Duration(milliseconds: 1300), + width: radius, + height: radius, + decoration: BoxDecoration(color: backgroundColor, shape: BoxShape.circle), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(radius), + onTap: isLoading ? null : onPressed, + child: Center( + child: isLoading + ? SizedBox( + height: radius / 2, + width: radius / 2, + child: CircularProgressIndicator( + strokeWidth: 2.5, + valueColor: AlwaysStoppedAnimation(foregroundColor), + ), + ) + : icon, + ), + ), + ), + ), + ) + : AnimatedContainer( + duration: const Duration(milliseconds: 1300), + width: radius, + height: radius, + decoration: BoxDecoration(color: backgroundColor, shape: BoxShape.circle), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(radius), + onTap: isLoading ? null : onPressed, + child: Center( + child: isLoading + ? SizedBox( + height: radius / 2, + width: radius / 2, + child: CircularProgressIndicator( + strokeWidth: 2.5, + valueColor: AlwaysStoppedAnimation(foregroundColor), + ), + ) + : icon, + ), + ), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/buttons/buttons.dart b/packages/core/lib/presentation/widget/buttons/buttons.dart new file mode 100644 index 0000000..bbb8a45 --- /dev/null +++ b/packages/core/lib/presentation/widget/buttons/buttons.dart @@ -0,0 +1,7 @@ +export 'animated_fab.dart'; +export 'elevated.dart'; +export 'fab.dart'; +export 'fab_outlined.dart'; +export 'outline_elevated.dart'; +export 'outline_elevated_icon.dart'; +export 'text_button.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/dialog/dialog.dart b/packages/core/lib/presentation/widget/dialog/dialog.dart new file mode 100644 index 0000000..788ecce --- /dev/null +++ b/packages/core/lib/presentation/widget/dialog/dialog.dart @@ -0,0 +1,2 @@ +export 'delete_dialog.dart'; +export 'warning_dialog.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/dialog/warning_dialog.dart b/packages/core/lib/presentation/widget/dialog/warning_dialog.dart new file mode 100644 index 0000000..112c9f3 --- /dev/null +++ b/packages/core/lib/presentation/widget/dialog/warning_dialog.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +import '../../../core.dart'; + +Future buildWarningDialog({ + required String title, + required String middleText, + required Future Function() onConfirm, + required Future Function() onRefresh, +}) async { + await Get.defaultDialog( + title: title, + middleText: middleText, + confirm: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.error, + foregroundColor: Colors.white, + ), + onPressed: () async { + await onConfirm(); + onRefresh(); + Get.back(); + }, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ); +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 89df63c..8a1cbf7 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -3,14 +3,10 @@ export 'bottom_navigation/r_bottom_navigation.dart'; export 'bottom_navigation/wave_bottom_navigation.dart'; export 'bottom_sheet/base_bottom_sheet.dart'; export 'bottom_sheet/date_picker_bottom_sheet.dart'; -export 'buttons/elevated.dart'; -export 'buttons/fab.dart'; -export 'buttons/outline_elevated.dart'; -export 'buttons/outline_elevated_icon.dart'; -export 'buttons/text_button.dart'; +export 'buttons/buttons.dart'; export 'card/card_with_icon_with_border.dart'; export 'chips/r_chips.dart'; -export 'dialog/delete_dialog.dart'; +export 'dialog/dialog.dart'; export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart'; From eede1f4b29ad3191672a4cf48548fb984f8425f5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 7 Jul 2025 11:38:52 +0330 Subject: [PATCH 175/256] feat : buy in province --- assets/vec/clock.svg.vec | Bin 0 -> 507 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/vec/clock.svg.vec diff --git a/assets/vec/clock.svg.vec b/assets/vec/clock.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..a78d0a5d06ddb01b19fa669243b60202ac84ef35 GIT binary patch literal 507 zcmXw$&nrYx6vywI_oj)Elm#=Uj9)WjFbj=I>fP_2vKbbVdL;|1VKb5t#Viz2N@21x z&BCvp!qUQO7Hs?hG$|W}#B;xwIlX&7efyqs?mh21UF*V#2(bjNKsudvO(9&@ZwOH( zRCrXFe|xWzKNBf?@Y|K-f^Fkyaal(5GdLCkWEQq&qA&ycB=gCG`DIDplqs9}BvAPsM<%BdAQJ@#^vS<-9KZ)fSxHgwZhTL4#EfH}fW~KrJeU zpQSb8)tozdm(&%>oaTLIS3YdMD!r-nhvv?j0JS%4fj-H6lJ(@qxGR%mKCtgazEb^P zA8s!@)vS#uZuQ`*zX>(haTG%#>@RiW@v{xqQw)9CFb)Tz`rhR^;z3U3x Date: Mon, 7 Jul 2025 16:07:52 +0330 Subject: [PATCH 176/256] feat : sale in provence --- .../allocated_made/allocated_made.dart | 1 + .../allocated_made.freezed.dart | 31 +- .../allocated_made/allocated_made.g.dart | 7 +- .../data/repositories/chicken_repository.dart | 4 +- .../repositories/chicken_repository_imp.dart | 1 - .../pages/buy_in_province_all/logic.dart | 1 + .../pages/buy_in_province_waiting/logic.dart | 37 +- .../pages/buy_in_province_waiting/view.dart | 6 +- .../pages/buy_out_of_province/logic.dart | 21 +- .../pages/buy_out_of_province/view.dart | 4 +- .../lib/presentation/pages/sale/logic.dart | 23 +- .../lib/presentation/pages/sale/view.dart | 77 +- .../pages/sales_in_province/logic.dart | 132 ++- .../pages/sales_in_province/view.dart | 843 +++++++----------- .../pages/buyers_page.dart | 2 - .../pages/sales_page.dart | 1 + .../lib/presentation/routes/pages.dart | 2 + packages/core/lib/core.dart | 8 +- .../pagination_model/pagination_model.dart | 0 .../pagination_model.freezed.dart | 0 .../pagination_model/pagination_model.g.dart | 0 .../list_view/r_paginated_list_view.dart | 23 +- packages/core/lib/utils/network/resource.dart | 18 +- 23 files changed, 529 insertions(+), 713 deletions(-) rename packages/{chicken/lib/data/models/response => core/lib/data/model}/pagination_model/pagination_model.dart (100%) rename packages/{chicken/lib/data/models/response => core/lib/data/model}/pagination_model/pagination_model.freezed.dart (100%) rename packages/{chicken/lib/data/models/response => core/lib/data/model}/pagination_model/pagination_model.g.dart (100%) diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart index a01d1ed..2bb9431 100644 --- a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.dart @@ -71,6 +71,7 @@ abstract class AllocatedMadeModel with _$AllocatedMadeModel { abstract class Product with _$Product { factory Product({ int? weightAverage, + String? name, }) = _Product; factory Product.fromJson(Map json) => diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart index 2a19a6d..5ba358f 100644 --- a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart @@ -383,7 +383,7 @@ $StewardCopyWith<$Res>? get toGuilds { /// @nodoc mixin _$Product { - int? get weightAverage; + int? get weightAverage; String? get name; /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -396,16 +396,16 @@ $ProductCopyWith get copyWith => _$ProductCopyWithImpl(this as @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)&&(identical(other.name, name) || other.name == name)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,weightAverage); +int get hashCode => Object.hash(runtimeType,weightAverage,name); @override String toString() { - return 'Product(weightAverage: $weightAverage)'; + return 'Product(weightAverage: $weightAverage, name: $name)'; } @@ -416,7 +416,7 @@ abstract mixin class $ProductCopyWith<$Res> { factory $ProductCopyWith(Product value, $Res Function(Product) _then) = _$ProductCopyWithImpl; @useResult $Res call({ - int? weightAverage + int? weightAverage, String? name }); @@ -433,10 +433,11 @@ class _$ProductCopyWithImpl<$Res> /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? weightAverage = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? weightAverage = freezed,Object? name = freezed,}) { return _then(_self.copyWith( weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable -as int?, +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, )); } @@ -447,10 +448,11 @@ as int?, @JsonSerializable() class _Product implements Product { - _Product({this.weightAverage}); + _Product({this.weightAverage, this.name}); factory _Product.fromJson(Map json) => _$ProductFromJson(json); @override final int? weightAverage; +@override final String? name; /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. @@ -465,16 +467,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Product&&(identical(other.weightAverage, weightAverage) || other.weightAverage == weightAverage)&&(identical(other.name, name) || other.name == name)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,weightAverage); +int get hashCode => Object.hash(runtimeType,weightAverage,name); @override String toString() { - return 'Product(weightAverage: $weightAverage)'; + return 'Product(weightAverage: $weightAverage, name: $name)'; } @@ -485,7 +487,7 @@ abstract mixin class _$ProductCopyWith<$Res> implements $ProductCopyWith<$Res> { factory _$ProductCopyWith(_Product value, $Res Function(_Product) _then) = __$ProductCopyWithImpl; @override @useResult $Res call({ - int? weightAverage + int? weightAverage, String? name }); @@ -502,10 +504,11 @@ class __$ProductCopyWithImpl<$Res> /// Create a copy of Product /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? weightAverage = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? weightAverage = freezed,Object? name = freezed,}) { return _then(_Product( weightAverage: freezed == weightAverage ? _self.weightAverage : weightAverage // ignore: cast_nullable_to_non_nullable -as int?, +as int?,name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable +as String?, )); } diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart index eee0fe3..e123cf2 100644 --- a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.g.dart @@ -134,11 +134,14 @@ Map _$AllocatedMadeModelToJson( 'dispenser': instance.dispenser, }; -_Product _$ProductFromJson(Map json) => - _Product(weightAverage: (json['weight_average'] as num?)?.toInt()); +_Product _$ProductFromJson(Map json) => _Product( + weightAverage: (json['weight_average'] as num?)?.toInt(), + name: json['name'] as String?, +); Map _$ProductToJson(_Product instance) => { 'weight_average': instance.weightAverage, + 'name': instance.name, }; _Steward _$StewardFromJson(Map json) => _Steward( diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 6692f5f..14bdec0 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -11,16 +11,16 @@ import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model. import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; -import 'package:rasadyar_chicken/data/models/response/pagination_model/pagination_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; - +import 'package:rasadyar_core/core.dart'; import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; + abstract class ChickenRepository { Future?> getInventory({required String token}); diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 9fe9fae..2ff84fc 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -12,7 +12,6 @@ import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model. import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; -import 'package:rasadyar_chicken/data/models/response/pagination_model/pagination_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart index f02fe03..eb08e10 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart @@ -10,6 +10,7 @@ class BuyInProvinceAllLogic extends GetxController { RxnString searchedValue = RxnString(); RootLogic rootLogic = Get.find(); + Rx>> importedLoads = Resource>.loading().obs; diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart index 4fd6a93..f4c0fbd 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -10,26 +10,22 @@ import 'package:rasadyar_core/core.dart'; class BuyInProvinceWaitingLogic extends GetxController { RxList isExpandedList = [].obs; - Rx fromDateFilter = Jalali - .now() - .obs; - Rx toDateFilter = Jalali - .now() - .obs; + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; RxnString searchedValue = RxnString(); RxMap isLoadingConfirmMap = RxMap(); Rx bgConfirmAllColor = AppColor.blueNormal.obs; RootLogic rootLogic = Get.find(); - Rx>> waitingProduct = - Resource>.loading().obs; + Rx>> waitingProduct = + Resource>.loading().obs; @override void onInit() { super.onInit(); debounce( searchedValue, - (callback) => getWaitingArrivals(), + (callback) => getWaitingArrivals(), time: Duration(milliseconds: timeDebounce), ); } @@ -51,8 +47,7 @@ class BuyInProvinceWaitingLogic extends GetxController { Future getWaitingArrivals() async { safeCall( - call: () async => - await rootLogic.chickenRepository.getWaitingArrivals( + call: () async => await rootLogic.chickenRepository.getWaitingArrivals( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( queryParams: {'type': 'not_entered'}, @@ -68,9 +63,16 @@ class BuyInProvinceWaitingLogic extends GetxController { onSuccess: (res) async { await Future.delayed(Duration(milliseconds: 200)); if ((res?.count ?? 0) == 0) { - waitingProduct.value = Resource>.empty(); + waitingProduct.value = Resource>.empty(); } else { - waitingProduct.value = Resource>.success(res!.results!); + waitingProduct.value = Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [...(waitingProduct.value.data?.results ?? []), ...(res?.results ?? [])], + ), + ); flashingFabBgColor(); } }, @@ -90,8 +92,7 @@ class BuyInProvinceWaitingLogic extends GetxController { request.removeWhere((key, value) => value == null); safeCall( - call: () async => - await rootLogic.chickenRepository.setSateForArrivals( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( token: rootLogic.tokenService.accessToken.value!, request: request, ), @@ -114,8 +115,7 @@ class BuyInProvinceWaitingLogic extends GetxController { request.removeWhere((key, value) => value == null); safeCall( - call: () async => - await rootLogic.chickenRepository.setSateForArrivals( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( token: rootLogic.tokenService.accessToken.value!, request: request, ), @@ -133,11 +133,10 @@ class BuyInProvinceWaitingLogic extends GetxController { void flashingFabBgColor() { Timer.periodic(Duration(seconds: 2), (timer) { if (bgConfirmAllColor.value == AppColor.blueNormal) { - bgConfirmAllColor.value = AppColor.blueDarkActive; + bgConfirmAllColor.value = AppColor.blueLightHover; } else { bgConfirmAllColor.value = AppColor.blueNormal; } }); } } - diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 9a1ddb4..d5657fb 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -20,7 +20,7 @@ class BuyInProvinceWaitingPage extends GetView { resource: data.value, padding: EdgeInsets.fromLTRB(8, 8, 8, 80), itemBuilder: (context, index) { - var item = data.value.data![index]; + var item = data.value.data!.results![index]; return ObxValue((val) { return ListItem2( selected: val.contains(index), @@ -33,7 +33,7 @@ class BuyInProvinceWaitingPage extends GetView { ); }, controller.isExpandedList); }, - itemCount: data.value.data?.length ?? 0, + itemCount: data.value.data?.results?.length ?? 0, separatorBuilder: (context, index) => SizedBox(height: 8.h), onLoadMore: () async {}, ); @@ -41,7 +41,7 @@ class BuyInProvinceWaitingPage extends GetView { ), floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, floatingActionButton: ObxValue((data) { - if ((data.value.data?.length ?? 0) > 1) { + if ((data.value.data?.results?.length ?? 0) > 1) { return AnimatedFab( onPressed: () {}, message: 'تایید یکجا', diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index fee137e..c8ad281 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -19,8 +19,8 @@ class BuyOutOfProvinceLogic extends GetxController { //TODO add this to Di ImagePicker imagePicker = ImagePicker(); - Rx>> purchaseOutOfProvinceList = - Resource>.loading().obs; + Rx>> purchaseOutOfProvinceList = + Resource>.loading().obs; Rxn selectedProduct = Rxn(); RxList cites = [].obs; @@ -31,6 +31,7 @@ class BuyOutOfProvinceLogic extends GetxController { RxnString editImageUrl = RxnString(); RootLogic get rootLogic => Get.find(); + BuyLogic get buyLogic => Get.find(); SaleLogic get outOfTheProvinceLogic => Get.find(); @@ -78,7 +79,7 @@ class BuyOutOfProvinceLogic extends GetxController { } Future getStewardPurchaseOutOfProvince() async { - purchaseOutOfProvinceList.value = Resource>.loading(); + purchaseOutOfProvinceList.value = Resource>.loading(); await safeCall( call: () => rootLogic.chickenRepository.getStewardPurchasesOutSideOfTheProvince( token: rootLogic.tokenService.accessToken.value!, @@ -95,9 +96,19 @@ class BuyOutOfProvinceLogic extends GetxController { onSuccess: (res) async { await Future.delayed(Duration(milliseconds: 500)); if ((res?.count ?? 0) == 0) { - purchaseOutOfProvinceList.value = Resource>.empty(); + purchaseOutOfProvinceList.value = Resource>.empty(); } else { - purchaseOutOfProvinceList.value = Resource>.success(res!.results!); + purchaseOutOfProvinceList.value = Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [ + ...(purchaseOutOfProvinceList.value.data?.results ?? []), + ...(res?.results ?? []), + ], + ), + ); } }, ); diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 776360a..05b6253 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -31,7 +31,7 @@ class BuyOutOfProvincePage extends GetView { resource: data.value, padding: EdgeInsets.fromLTRB(8, 8, 8, 80), itemBuilder: (context, index) { - var item = data.value.data![index]; + var item = data.value.data!.results![index]; return ObxValue((val) { return ListItem2( selected: val.contains(index), @@ -44,7 +44,7 @@ class BuyOutOfProvincePage extends GetView { ); }, controller.isExpandedList); }, - itemCount: data.value.data?.length ?? 0, + itemCount: data.value.data?.results?.length ?? 0, separatorBuilder: (context, index) => SizedBox(height: 8.h), onLoadMore: () async {}, ); diff --git a/packages/chicken/lib/presentation/pages/sale/logic.dart b/packages/chicken/lib/presentation/pages/sale/logic.dart index b57d7c3..68267a6 100644 --- a/packages/chicken/lib/presentation/pages/sale/logic.dart +++ b/packages/chicken/lib/presentation/pages/sale/logic.dart @@ -1,7 +1,6 @@ import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; -import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; @@ -9,19 +8,21 @@ import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class SaleLogic extends GetxController { - var rootLogic = Get.find(); - Rxn?> allocatedMadeModel = - Rxn?>(); + Rxn?> allocatedMadeModel = Rxn?>(); RxList rolesProductsModel = RxList(); RxList guildsModel = [].obs; - Rxn stewardFreeDashboard = - Rxn(); + Rxn stewardFreeDashboard = Rxn(); + + RootLogic rootLogic = Get.find(); + + late List routesName; @override void onInit() { super.onInit(); + routesName = [...rootLogic.routesName, 'فروش'].toList(); getStewardDashBord(); getRolesProducts(); } @@ -30,12 +31,7 @@ class SaleLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - page: 1, - pageSize: 20, - search: 'filter', - role: 'Steward', - ), + queryParameters: buildQueryParams(page: 1, pageSize: 20, search: 'filter', role: 'Steward'), ), onSuccess: (result) { if (result != null) { @@ -78,8 +74,7 @@ class SaleLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, - allocationTokens: - allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], + allocationTokens: allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); diff --git a/packages/chicken/lib/presentation/pages/sale/view.dart b/packages/chicken/lib/presentation/pages/sale/view.dart index 4a599b3..703dfaf 100644 --- a/packages/chicken/lib/presentation/pages/sale/view.dart +++ b/packages/chicken/lib/presentation/pages/sale/view.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/sale_buy_card_item.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -10,64 +12,41 @@ class SalePage extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColor.bgLight, - appBar: RAppBar( - title: 'رصدطیور', - iconTitle: Assets.vec.chickenSvg.path, - titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: false, - leadingWidth: 130, - leading: Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, + return BasePage( + routes: controller.routesName, + isBase: true, + widgets: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - Assets.vec.cubeSearchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - Text('خارج استان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), - ], - ), - ), - body: Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - spacing: 8, + Wrap( + alignment: WrapAlignment.center, + spacing: 14.w, children: [ - Expanded( - child: _typeOuterInfoCard( - title: 'خرید', - iconPath: Assets.vec.cubeBottomRotationSvg.path, - foregroundColor: AppColor.blueNormal, - onTap: () { - Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 1); - }, - ), + saleOrBuyItemCard( + title: 'داخل استان', + iconPath: Assets.vec.cubeSvg.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesInProvince, id: 1); + }, ), - Expanded( - child: _typeOuterInfoCard( - title: 'فروش', - iconPath: Assets.vec.cubeTopRotationSvg.path, - foregroundColor: AppColor.greenDark, - onTap: () { - iLog('فروش'); - Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); - }, - ), + saleOrBuyItemCard( + title: 'خارج استان', + iconPath: Assets.vec.truckFastSvg.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); + }, ), ], ), - ), - ], - ), + ], + ), + ], ); } + + Widget addSaleOutOfTheProvinceBottomSheet() { return BaseBottomSheet( child: Column( diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 7c43a7c..3deaad8 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; @@ -7,16 +9,26 @@ import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; +import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class SalesInProvinceLogic extends GetxController { - var rootLogic = Get.find(); - Rxn?> allocatedMadeModel = Rxn?>(); + RootLogic rootLogic = Get.find(); + SaleLogic saleLogic = Get.find(); + RxnString searchedValue = RxnString(); RxList isExpandedList = [].obs; + RxList routesName = RxList(); + Rx bgConfirmAllColor = AppColor.blueNormal.obs; + final RxBool isLoadingMoreAllocationsMade = false.obs; + Timer? _flashingTimer; + + Rx>> allocatedList = + Resource>.loading().obs; RxList rolesProductsModel = RxList(); - RxBool searchIsSelected = false.obs; - RxnString searchedValue = RxnString(); + RxList guildsModel = [].obs; GlobalKey formKey = GlobalKey(); @@ -36,8 +48,7 @@ class SalesInProvinceLogic extends GetxController { final totalCostController = TextEditingController(); final ScrollController scrollControllerAllocationsMade = ScrollController(); - final RxInt currentPageAllocationsMade = 1.obs; - final RxBool isLoadingMoreAllocationsMade = false.obs; + final RxInt currentPage = 1.obs; final RxBool addPageAllocationsMade = false.obs; final RxBool hasMoreDataAllocationsMade = true.obs; @@ -47,7 +58,7 @@ class SalesInProvinceLogic extends GetxController { @override void onInit() { super.onInit(); - + routesName.value = [...saleLogic.routesName, 'داخل استان'].toList(); getAllocatedMade(); getRolesProducts(); getGuilds(); @@ -82,47 +93,57 @@ class SalesInProvinceLogic extends GetxController { } }); - debounce(searchedValue, (callback) => getAllocatedMade(), time: Duration(milliseconds: 2000)); - ever(searchIsSelected, (data) { - if (data == false) { - searchedValue.value = null; - } - }); + debounce( + searchedValue, + (callback) => getAllocatedMade(), + time: Duration(milliseconds: timeDebounce), + ); } - Future getAllocatedMade() async { - if (isLoadingMoreAllocationsMade.value || !hasMoreDataAllocationsMade.value) { - return; + Future getAllocatedMade([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + allocatedList.value = Resource>.loading(); } - if (searchIsSelected.value) { - currentPageAllocationsMade.value = 1; - } else if (addPageAllocationsMade.value) { - currentPageAllocationsMade.value++; + if (searchedValue.value != null && + searchedValue.value!.trim().isNotEmpty && + currentPage.value > 1) { + currentPage.value = 1; // Reset to first page if search value is set } + safeCall( call: () async => await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( - page: currentPageAllocationsMade.value, + page: currentPage.value, pageSize: 20, search: 'filter', role: 'Steward', value: searchedValue.value, ), ), - onSuccess: (result) { - if (result != null) { - if (isLoadingMoreAllocationsMade.value && - allocatedMadeModel.value != null && - (allocatedMadeModel.value?.isNotEmpty ?? false)) { - allocatedMadeModel.value?.addAll(result.results!); - } else { - allocatedMadeModel.value = result.results; + onSuccess: (res) async { + await Future.delayed(Duration(milliseconds: 200)); + if ((res?.count ?? 0) == 0) { + allocatedList.value = Resource>.empty(); + } else { + allocatedList.value = Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: isLoadingMore + ? [...(allocatedList.value.data?.results ?? []), ...(res?.results ?? [])] + : res?.results ?? [], + ), + ); + isLoadingMoreAllocationsMade.value = false; + if ((allocatedList.value.data?.results?.length ?? 0) > 1) { + flashingFabBgColor(); } } - - isLoadingMoreAllocationsMade.value = false; }, onError: (error, stacktrace) { isLoadingMoreAllocationsMade.value = false; @@ -130,7 +151,7 @@ class SalesInProvinceLogic extends GetxController { ); } - void checkVerfication() { + void checkVerification() { isValid.value = weight.value > 0 && pricePerKilo.value > 0 && @@ -169,7 +190,7 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, - allocationTokens: allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], + allocationTokens: allocatedList.value.data?.results?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); @@ -180,8 +201,9 @@ class SalesInProvinceLogic extends GetxController { Future getRolesProducts() async { safeCall( - call: () async => - await rootLogic.chickenRepository.getRolesProducts(token: rootLogic.tokenService.accessToken.value!), + call: () async => await rootLogic.chickenRepository.getRolesProducts( + token: rootLogic.tokenService.accessToken.value!, + ), onSuccess: (result) { if (result != null) { rolesProductsModel.value = result; @@ -196,7 +218,10 @@ class SalesInProvinceLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getGuilds( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams(queryParams: {'free': saleType.value == 2 ? true : false}, role: 'Steward'), + queryParameters: buildQueryParams( + queryParams: {'free': saleType.value == 2 ? true : false}, + role: 'Steward', + ), ), onSuccess: (result) { if (result != null) { @@ -222,7 +247,9 @@ class SalesInProvinceLogic extends GetxController { Future getGuildProfile() async { await safeCall( - call: () async => await rootLogic.chickenRepository.getProfile(token: rootLogic.tokenService.accessToken.value!), + call: () async => await rootLogic.chickenRepository.getProfile( + token: rootLogic.tokenService.accessToken.value!, + ), onError: (error, stackTrace) {}, onSuccess: (result) { guildProfile.value = result; @@ -280,6 +307,7 @@ class SalesInProvinceLogic extends GetxController { @override void dispose() { rootLogic.inventoryExpandedList.clear(); + stopFlashing(); super.dispose(); } @@ -328,4 +356,34 @@ class SalesInProvinceLogic extends GetxController { onError: (error, stackTrace) {}, ); } + + void setSearchValue(String? data) { + searchedValue.value = data?.trim(); + } + + void flashingFabBgColor() { + _flashingTimer?.cancel(); + + _flashingTimer = Timer.periodic(Duration(seconds: 2), (timer) { + if (bgConfirmAllColor.value == AppColor.blueNormal) { + bgConfirmAllColor.value = AppColor.blueLightHover; + } else { + bgConfirmAllColor.value = AppColor.blueNormal; + } + }); + } + + void stopFlashing() { + _flashingTimer?.cancel(); + _flashingTimer = null; + bgConfirmAllColor.value = AppColor.blueNormal; // بازگرداندن به رنگ پیش‌فرض + } + + Steward? getBuyerInformation(AllocatedMadeModel model) { + if (model.allocationType?.buyerIsGuild) { + return model.toGuilds; + } else { + return model.steward; + } + } } diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index acad986..a51938f 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -16,63 +18,79 @@ class SalesInProvincePage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar( - titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - hasBack: false, - leadingWidth: 155, - leading: Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, - children: [ - Assets.vec.chickenSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), - ], - ), - additionalActions: [ - GestureDetector( - onTap: () { - controller.searchIsSelected.value = !controller.searchIsSelected.value; - }, - child: Assets.vec.searchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), + body: BasePage( + routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName), + onBackPressed: () => Get.back(id: 1), + onSearchChanged: (data) => controller.setSearchValue(data), + filteringWidget: filterBottomSheet(), + widgets: [ + inventoryWidget(), + Expanded( + child: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + hasMore: data.value.data?.next != null, + isPaginating: controller.isLoadingMoreAllocationsMade.value, + onRefresh: () async => await controller.getAllocatedMade(), + onLoadMore: () async { + controller.currentPage.value++; + iLog(controller.currentPage.value); + await controller.getAllocatedMade(true); + }, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item, index), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.timerSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.allocatedList), ), - SizedBox(width: 8), - GestureDetector( - onTap: () { - Get.bottomSheet(filterBottomSheet()); - }, - child: Assets.vec.filterOutlineSvg.svg( - width: 20, - height: 20, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - SizedBox(width: 8), ], ), - body: SingleChildScrollView( - child: Column( + floatingActionButton: SizedBox( + width: Get.width - 30, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - routePageWidget(), - buildSearchWidget(), - inventoryWidget(), - allocationsMade(), - SizedBox(height: 40), + RFab.add( + onPressed: () { + Get.bottomSheet( + addOrEditBottomSheet(), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); + }, + ), + + ObxValue((data) { + return Visibility( + visible: (data.value.data?.results?.length ?? 0) > 1, + child: AnimatedFab( + onPressed: () async { + await controller.confirmAllAllocations(); + }, + message: 'تایید یکجا', + icon: Assets.vec.clipboardTaskSvg.svg(width: 40.w, height: 40.h), + backgroundColor: controller.bgConfirmAllColor.value, + ), + ); + }, controller.allocatedList), ], ), ), - floatingActionButton: RFab.add( - onPressed: () { - Get.bottomSheet(showAddBottomSheet(), isScrollControlled: true, backgroundColor: Colors.transparent); - }, - ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } @@ -81,7 +99,7 @@ class SalesInProvincePage extends GetView { return Container( width: Get.width, height: 39, - margin: EdgeInsets.all(4), + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), alignment: Alignment.center, child: ObxValue((data) { @@ -93,112 +111,220 @@ class SalesInProvincePage extends GetView { ); } - Widget buildRow(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + itemListWidget(AllocatedMadeModel item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 20), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + item.steward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2), + Text( + item.createDate?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 6, + children: [ + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + SizedBox(height: 2), + Text( + '${item.amount.separatedByComma} ریال', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDark), + ), + ], + ), + ), + + SizedBox(width: 8), + + Expanded( + flex: 1, + child: Assets.vec.scanSvg.svg( + width: 32.w, + height: 32.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ], + ); + } + + itemListExpandedWidget(AllocatedMadeModel item, int index) { + return Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + item.steward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + Spacer(), + Text( + 'در انتظار', + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), + ), + SizedBox(width: 7), + Assets.vec.clockSvg.svg(width: 16.w, height: 16.h), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + item.date?.toJalali.formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${item.date?.toJalali.formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], ), ), - Flexible( - flex: 2, - child: Text( - value, - textAlign: TextAlign.left, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), + + buildRow( + title: 'نام و نام خانوادگی فروشنده', + value: controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', + ), + + buildRow( + title: 'تلفن فروشنده', + value: controller.getBuyerInformation(item)?.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + buildRow(title: 'نوع فروش', value: item.sellType?.faItem ?? 'N/A'), + buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), + buildRow( + title: 'وزن خریداری شده', + value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', + ), + buildRow( + title: 'افت وزن(کیلوگرم)', + value: item.weightLossOfCarcasses?.toInt().toString() ?? 'N/A', + ), + buildRow(title: 'قیمت کل', value: '${item.totalAmount?.separatedByComma} ریال'), + + buildRow(title: 'کداحراز', value: item.registrationCode?.toString() ?? 'ندارد'), + buildRow( + title: 'وضعیت کد احراز', + value: item.systemRegistrationCode == true ? "ارسال شده" : "ارسال نشده", + ), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + controller.isExpandedList.remove(index); + // controller.denyAllocation(item.key ?? ''); + //await controller.deleteAllocation(item); + }, + onRefresh: () => controller.getAllocatedMade(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], ), ], ), ); } - Widget allocationsMade() { - return Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 6), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('تخصیصات صورت گرفته', style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), - RElevated( - text: 'تایید یکجا', - height: 30, - textStyle: AppFonts.yekan12.copyWith(color: Colors.white), - onPressed: () { - controller.confirmAllAllocations(); - }, - ), - ], - ), - ), - ObxValue((data) { - if (data.value == null) { - return Container( - height: 80, - margin: const EdgeInsets.all(4), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ); - } else if (data.value?.isEmpty ?? true) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: Text('هیچ تخصیصات صورت نگرفته است ')), - ); - } else { - return Container( - margin: const EdgeInsets.symmetric(vertical: 2), - child: ListView.separated( - padding: const EdgeInsets.all(8.0), - shrinkWrap: true, - controller: controller.scrollControllerAllocationsMade, - itemCount: data.value?.length ?? 0, - itemBuilder: (BuildContext context, int index) { - if (index == data.value!.length) { - return Obx( - () => controller.isLoadingMoreAllocationsMade.value - ? const Padding( - padding: EdgeInsets.symmetric(vertical: 8), - child: Center(child: CircularProgressIndicator()), - ) - : const SizedBox(), - ); - } - final result = data.value![index]; - return ObxValue((data) { - return allocationsMadeListItem(expandList: controller.isExpandedList, index: index, item: result); - }, controller.isExpandedList); - }, - separatorBuilder: (BuildContext context, int index) => SizedBox(height: 8), - ), - ); - } - }, controller.allocatedMadeModel), - ], - ); - } - - Widget showAddBottomSheet([bool isEditMode = false]) { + Widget addOrEditBottomSheet([bool isEditMode = false]) { return BaseBottomSheet( height: Get.height * (isEditMode ? 0.45 : 0.75), child: Padding( @@ -271,10 +397,14 @@ class SalesInProvincePage extends GetView { controller: controller.weightController, keyboardType: TextInputType.number, borderColor: AppColor.darkGreyLight, - inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], validator: (value) { - - if (int.parse(value!.clearComma) > (controller.rootLogic.inventoryModel.value?.totalRemainWeight?.toInt() ?? 100) ){ + if (int.parse(value!.clearComma) > + (controller.rootLogic.inventoryModel.value?.totalRemainWeight?.toInt() ?? + 100)) { return 'وزن تخصیصی بیشتر از موجودی انبار است'; } return null; @@ -288,7 +418,10 @@ class SalesInProvincePage extends GetView { RTextField( controller: controller.pricePerKiloController, borderColor: AppColor.darkGreyLight, - inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], onChanged: (p0) { controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; @@ -300,7 +433,10 @@ class SalesInProvincePage extends GetView { RTextField( enabled: false, keyboardType: TextInputType.number, - inputFormatters: [FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter()], + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], borderColor: AppColor.darkGreyLight, controller: controller.totalCostController, label: 'هزینه کل', @@ -309,17 +445,18 @@ class SalesInProvincePage extends GetView { ObxValue((data) { return RElevated( text: isEditMode ? 'ویرایش' : 'ثبت', + isFullWidth: true, textStyle: AppFonts.yekan16.copyWith(color: Colors.white), height: 40, onPressed: data.value ? () async { - if (controller.formKey.currentState?.validate() ?? false) { - iLog("s2"); - controller.setSubmitData(); - iLog("s3"); - Get.bottomSheet(show2StepAddBottomSheet()); - } - /* isEditMode + if (controller.formKey.currentState?.validate() ?? false) { + iLog("s2"); + controller.setSubmitData(); + iLog("s3"); + // Get.bottomSheet(show2StepAddBottomSheet()); + } + /* isEditMode ? await controller.updateAllocation() : () { iLog("s1"); @@ -384,379 +521,6 @@ class SalesInProvincePage extends GetView { }); } - Padding routePageWidget() { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - children: [ - SizedBox(width: 8), - RichText( - text: TextSpan( - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - children: [ - WidgetSpan( - child: Row( - children: [ - Assets.vec.cubeSearchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - SizedBox(width: 6), - ], - ), - ), - - TextSpan(text: 'داخل استان'), - TextSpan(text: '/'), - TextSpan(text: 'فروش'), - ], - ), - ), - ], - ), - ); - } - - Widget allocationsMadeListItem({ - required RxList expandList, - required int index, - required AllocatedMadeModel item, - }) { - return GestureDetector( - onTap: () { - if (expandList.contains(index)) { - controller.isExpandedList.remove(index); - } else { - controller.isExpandedList.add(index); - } - }, - child: Container( - width: Get.width, - margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), - decoration: BoxDecoration(color: getTintColor(item), borderRadius: BorderRadius.circular(8)), - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - AnimatedSize( - duration: Duration(milliseconds: 300), - child: Container( - width: Get.width - 30, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 2, color: getTintColor(item)), - ), - child: Row( - children: [ - Expanded( - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Container( - height: 75, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - bottomLeft: Radius.zero, - bottomRight: Radius.circular(8), - topLeft: Radius.zero, - topRight: Radius.circular(8), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - - children: [ - SizedBox(width: 12), - - Expanded( - flex: 2, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - item.steward?.user?.fullname ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - - SizedBox(height: 2), - Text( - item.createDate?.formattedJalaliDate ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), - ), - ], - ), - ), - - SizedBox(width: 8), - Expanded( - flex: 2, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - '${item.weightOfCarcasses.separatedByComma} Kg', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), - ), - Text( - '${item.amount.separatedByComma} ریال', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDark), - ), - ], - ), - ), - Expanded( - flex: 1, - child: Text( - '${item.allocationType?.faAllocationType}', - textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), - ), - ), - - SizedBox(width: 8), - ], - ), - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - controller.setEditData(item); - Get.bottomSheet( - showAddBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.clearForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - - Text( - item.allocationType?.faAllocationType, - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), - ), - - GestureDetector( - onTap: () { - buildDeleteDialog( - onConfirm: () { - expandList.remove(index); - return controller.deleteAllocation(item); - }, - ); - }, - child: Assets.vec.trashSvg.svg( - width: 16, - height: 16, - colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn), - ), - ), - ], - ), - - buildRow('تاریخ ثبت', item.date!.formattedJalaliDate ?? 'N/A'), - buildRow( - 'نام و نام خانوادگی خریدار', - getBuyerInformation(item)?.user?.fullname ?? 'N/A', - ), - buildRow('شماره خریدار', getBuyerInformation(item)?.user?.mobile ?? 'N/A'), - buildRow('نوع فروش', item.sellType?.faItem ?? 'N/A'), - buildRow('قیمت هر کیلو', '${item.amount.separatedByComma ?? 0} ریال '), - buildRow('قیمت کل', '${item.totalAmount.separatedByComma ?? 0} ریال'), - buildRow( - 'وزن تخصیصی', - '${item.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', - ), - buildRow('کداحراز', item.registrationCode?.toString() ?? 'N/A'), - buildRow( - 'وضعیت کد احراز', - item.systemRegistrationCode == true ? "ارسال شده" : "ارسال نشده" ?? 'N/A', - ), - buildRow('افت وزن(کیلوگرم)', item.weightLossOfCarcasses?.toInt().toString() ?? 'N/A'), - - Row( - spacing: 10, - children: [ - Expanded( - child: RElevated( - backgroundColor: AppColor.greenNormal, - height: 40, - text: 'تایید', - textStyle: AppFonts.yekan18.copyWith(color: Colors.white), - onPressed: () { - ConformAllocation confromation = ConformAllocation( - allocation_key: item.key, - number_of_carcasses: item.numberOfCarcasses, - weight_of_carcasses: item.weightOfCarcasses?.toInt(), - amount: item.amount, - total_amount: item.totalAmount, - ); - - controller.confirmAllocation(confromation); - }, - ), - ), - Expanded( - child: ROutlinedElevated( - height: 40, - borderColor: AppColor.error, - text: 'رد', - textStyle: AppFonts.yekan18.copyWith(color: AppColor.error), - onPressed: () { - controller.denyAllocation(item.key ?? ''); - }, - ), - ), - ], - ), - ], - ), - ), - crossFadeState: expandList.contains(index) - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - ), - Container( - width: 20, - child: Center( - child: RotatedBox( - quarterTurns: 3, - child: Text(item.state?.faItem, style: AppFonts.yekan8, textAlign: TextAlign.center), - ), - ), - ), - ], - ), - ), - ), - - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all(width: 0.50, color: AppColor.greenDarkActive), - ), - alignment: Alignment.center, - child: Text((index + 1).toString(), style: AppFonts.yekan12.copyWith(color: Colors.black)), - ), - ), - ], - ), - ), - ), - ); - } - - Color getTintColor(AllocatedMadeModel model) { - Color res; - - if (model.receiverState == 'pending') { - res = AppColor.yellowNormal; - } else if (model.receiverState == 'approved') { - res = AppColor.greenLightActive; - } else if (model.receiverState == 'rejected') { - res = AppColor.redLight; - } else { - res = AppColor.blueLight; - } - - return res; - } - - Steward? getBuyerInformation(AllocatedMadeModel model) { - if (model.allocationType?.buyerIsGuild) { - return model.toGuilds; - } else { - return model.steward; - } - } - - Future buildDeleteDialog({required Future Function() onConfirm}) async { - await Get.defaultDialog( - title: 'حذف ', - middleText: 'آیا از حذف این مورد مطمئن هستید؟', - confirm: ElevatedButton( - style: ElevatedButton.styleFrom(backgroundColor: AppColor.error, foregroundColor: Colors.white), - onPressed: () async { - await onConfirm(); - Get.back(); - }, - child: Text('بله'), - ), - cancel: ElevatedButton( - onPressed: () { - Get.back(); - }, - child: Text('خیر'), - ), - ).whenComplete(() => controller.getAllocatedMade()); - } - - ObxValue buildSearchWidget() { - return ObxValue((data) { - return AnimatedContainer( - duration: Duration(milliseconds: 300), - padding: EdgeInsets.only(top: 5), - curve: Curves.easeInOut, - height: data.value ? 50 : 0, - child: Visibility( - visible: data.value, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: RTextField( - suffixIcon: Padding( - padding: const EdgeInsets.all(12.0), - child: Assets.vec.searchSvg.svg( - width: 10, - height: 10, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - hintText: 'جستجو', - onChanged: (value) { - controller.searchedValue.value = value; - }, - controller: TextEditingController(), - ), - ), - ), - ); - }, controller.searchIsSelected); - } - Widget filterBottomSheet() { return BaseBottomSheet( height: 250, @@ -821,7 +585,10 @@ class SalesInProvincePage extends GetView { height: 24, colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), - Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), + Text( + isFrom ? 'از' : 'تا', + style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + ), Expanded( child: ObxValue((data) { return Text( @@ -892,7 +659,7 @@ class SalesInProvincePage extends GetView { ); } - Widget show2StepAddBottomSheet() { + /* Widget show2StepAddBottomSheet() { return BaseBottomSheet( height: Get.height*.35, child: Column( @@ -951,5 +718,5 @@ class SalesInProvincePage extends GetView { ], ), ); - } + }*/ } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart index 7d3207d..409d67f 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart @@ -16,8 +16,6 @@ class BuyersPage extends GetView { return Scaffold( body: Column( children: [ - - buyerListWidget(), ], ), diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart index 8f4046b..17ef768 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart @@ -45,6 +45,7 @@ class SalesPage extends GetView { case Status.loading: return Center(child: CupertinoActivityIndicator()); case Status.success: + return ListView.separated( shrinkWrap: true, physics: BouncingScrollPhysics(), diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index d988b67..0e384b0 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -83,6 +83,7 @@ sealed class ChickenPages { Get.lazyPut(() => SalesOutOfProvinceLogic()); Get.lazyPut(() => RootLogic()); Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => SearchLogic()); }), ), GetPage( @@ -93,6 +94,7 @@ sealed class ChickenPages { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SalesInProvinceLogic()); Get.lazyPut(() => RootLogic()); + Get.lazyPut(() => SearchLogic()); }), ), diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index b7aa9ac..ce8d522 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -1,5 +1,8 @@ library; +//models +export 'data/model/pagination_model/pagination_model.dart'; + //other packages export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_map/flutter_map.dart'; @@ -9,7 +12,7 @@ export 'package:flutter_secure_storage/flutter_secure_storage.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; export 'package:device_info_plus/device_info_plus.dart'; -export 'package:dio/dio.dart' ; +export 'package:dio/dio.dart'; export 'package:pretty_dio_logger/pretty_dio_logger.dart'; export 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -17,6 +20,7 @@ export 'package:flutter_screenutil/flutter_screenutil.dart'; export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; export 'package:get/get.dart' hide FormData, MultipartFile, Response; + //di export 'package:get_it/get_it.dart'; export 'injection/di.dart'; @@ -29,7 +33,7 @@ export 'infrastructure/local/hive_local_storage.dart'; //export 'package:encrypt/encrypt.dart' show Encrypted; //Map and location -export 'package:latlong2/latlong.dart' ; +export 'package:latlong2/latlong.dart'; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; diff --git a/packages/chicken/lib/data/models/response/pagination_model/pagination_model.dart b/packages/core/lib/data/model/pagination_model/pagination_model.dart similarity index 100% rename from packages/chicken/lib/data/models/response/pagination_model/pagination_model.dart rename to packages/core/lib/data/model/pagination_model/pagination_model.dart diff --git a/packages/chicken/lib/data/models/response/pagination_model/pagination_model.freezed.dart b/packages/core/lib/data/model/pagination_model/pagination_model.freezed.dart similarity index 100% rename from packages/chicken/lib/data/models/response/pagination_model/pagination_model.freezed.dart rename to packages/core/lib/data/model/pagination_model/pagination_model.freezed.dart diff --git a/packages/chicken/lib/data/models/response/pagination_model/pagination_model.g.dart b/packages/core/lib/data/model/pagination_model/pagination_model.g.dart similarity index 100% rename from packages/chicken/lib/data/models/response/pagination_model/pagination_model.g.dart rename to packages/core/lib/data/model/pagination_model/pagination_model.g.dart diff --git a/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart b/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart index b5fd4e5..4876689 100644 --- a/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart +++ b/packages/core/lib/presentation/widget/list_view/r_paginated_list_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/data/model/pagination_model/pagination_model.dart'; enum ListType { builder, separated } @@ -24,7 +25,7 @@ class RPaginatedListView extends StatelessWidget { this.physics = const BouncingScrollPhysics(), }); - final Resource> resource; + final Resource> resource; final NullableIndexedWidgetBuilder itemBuilder; final IndexedWidgetBuilder? separatorBuilder; final Future Function()? onRefresh; @@ -54,7 +55,7 @@ class RPaginatedListView extends StatelessWidget { return errorWidget ?? Center(child: Text(resource.message ?? 'خطا')); } - if (resource.isEmpty || resource.data?.isEmpty == true) { + if (resource.isEmpty || resource.data?.results?.isEmpty == true) { return emptyWidget ?? const EmptyWidget(); } @@ -80,9 +81,12 @@ class RPaginatedListView extends StatelessWidget { itemCount: itemCount + (isPaginating ? 1 : 0), itemBuilder: (context, index) { if (isPaginating && index == itemCount) { - return const Padding( - padding: EdgeInsets.all(16), - child: Center(child: CupertinoActivityIndicator()), + return SizedBox( + height: 50, + child: const Padding( + padding: EdgeInsets.all(16), + child: Center(child: CupertinoActivityIndicator()), + ), ); } return itemBuilder(context, index); @@ -96,9 +100,12 @@ class RPaginatedListView extends StatelessWidget { itemCount: itemCount + (isPaginating ? 1 : 0), itemBuilder: (context, index) { if (isPaginating && index == itemCount) { - return const Padding( - padding: EdgeInsets.all(16), - child: Center(child: CupertinoActivityIndicator()), + return SizedBox( + height: 50, + child: const Padding( + padding: EdgeInsets.all(16), + child: Center(child: CupertinoActivityIndicator()), + ), ); } return itemBuilder(context, index); diff --git a/packages/core/lib/utils/network/resource.dart b/packages/core/lib/utils/network/resource.dart index 3d44df0..94d2c4c 100644 --- a/packages/core/lib/utils/network/resource.dart +++ b/packages/core/lib/utils/network/resource.dart @@ -1,22 +1,11 @@ -enum Status { - initial, - loading, - success, - error, - empty, -} - +enum Status { initial, loading, success, error, empty } class Resource { final Status status; final T? data; final String? message; - const Resource._({ - required this.status, - this.data, - this.message, - }); + const Resource._({required this.status, this.data, this.message}); const Resource.initial() : this._(status: Status.initial); @@ -28,7 +17,6 @@ class Resource { const Resource.empty() : this._(status: Status.empty); - bool get isInitial => status == Status.initial; bool get isLoading => status == Status.loading; @@ -43,4 +31,4 @@ class Resource { String toString() { return 'Resource{status: $status, data: $data, message: $message}'; } -} \ No newline at end of file +} From 84e3f16f1d70ef04a019c36d40587e00dac1e9be Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 7 Jul 2025 16:46:32 +0330 Subject: [PATCH 177/256] feat : sale out of province --- .../logic.dart | 15 + .../view.dart | 15 + .../pages/sales_out_of_province/logic.dart | 188 ++++++------- .../pages/sales_page.dart | 6 +- .../pages/sales_out_of_province/view.dart | 260 ++---------------- .../sales_out_of_province_buyers/logic.dart | 15 + .../sales_out_of_province_buyers/view.dart | 15 + 7 files changed, 165 insertions(+), 349 deletions(-) create mode 100644 packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart new file mode 100644 index 0000000..b3526a0 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class SalesOutOfProvinceSalesListLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart new file mode 100644 index 0000000..b34e56f --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class SalesOutOfProvinceSalesListPage extends StatelessWidget { + const SalesOutOfProvinceSalesListPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final SalesOutOfProvinceSalesListLogic logic = Get.put(SalesOutOfProvinceSalesListLogic()); + + return Container(); + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 2961438..91c25d8 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -11,13 +11,17 @@ import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { - RxInt currentIndex = 0.obs; - + RootLogic get rootLogic => Get.find(); + SaleLogic get saleLogic => Get.find(); + RxInt selectedSegmentIndex = 0.obs; RxBool isExpanded = false.obs; RxBool isBuyerSubmitButtonEnabled = false.obs; RxBool isSaleSubmitButtonEnabled = false.obs; RxList isExpandedList = [].obs; - RxBool searchIsSelected = false.obs; + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); + RxList routesName = RxList(); //TODO add this to Di ImagePicker imagePicker = ImagePicker(); @@ -34,11 +38,6 @@ class SalesOutOfProvinceLogic extends GetxController { Rxn selectedProvince = Rxn(); Rxn selectedCity = Rxn(); - RootLogic get rootLogic => Get.find(); - - SaleLogic get outOfTheProvinceLogic => - Get.find(); - GlobalKey formKey = GlobalKey(); TextEditingController buyerNameController = TextEditingController(); TextEditingController buyerLastNameController = TextEditingController(); @@ -48,41 +47,27 @@ class SalesOutOfProvinceLogic extends GetxController { //Sale TextEditingController quarantineCodeController = TextEditingController(); TextEditingController saleWeightController = TextEditingController(); - Rx saleDate = Jalali - .now() - .obs; + Rx saleDate = Jalali.now().obs; String? key; - Rx fromDateFilter = Jalali - .now() - .obs; - Rx toDateFilter = Jalali - .now() - .obs; - RxnString searchedValue = RxnString(); - @override void onReady() { super.onReady(); getOutProvinceCarcassesBuyer(); getOutProvinceSales(); - + routesName.value = [...saleLogic.routesName, 'داخل استان'].toList(); selectedProvince.listen((p0) => getCites()); tLog(selectedProduct.value); - outOfTheProvinceLogic.rolesProductsModel.listen((lists) { + saleLogic.rolesProductsModel.listen((lists) { selectedProduct.value = lists.first; }); setupListeners(); debounce( searchedValue, - (callback) => getOutProvinceCarcassesBuyer(), + (callback) => getOutProvinceCarcassesBuyer(), time: Duration(milliseconds: 2000), ); - ever(searchIsSelected, (data) { - if (data == false) { - searchedValue.value = null; - } - }); + } @override @@ -100,25 +85,22 @@ class SalesOutOfProvinceLogic extends GetxController { Future getOutProvinceCarcassesBuyer() async { await safeCall( - call: () => - rootLogic.chickenRepository.getOutProvinceCarcassesBuyer( - token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - pageSize: 10, - page: 1, - state: 'buyer-list', - search: 'filter', - role: 'Steward', - value: searchedValue.value ?? '', - ), - ), + call: () => rootLogic.chickenRepository.getOutProvinceCarcassesBuyer( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 10, + page: 1, + state: 'buyer-list', + search: 'filter', + role: 'Steward', + value: searchedValue.value ?? '', + ), + ), onSuccess: (res) { if ((res?.count ?? 0) == 0) { buyerList.value = Resource>.empty(); } else { - buyerList.value = Resource>.success( - res!.results!, - ); + buyerList.value = Resource>.success(res!.results!); } }, ); @@ -126,27 +108,24 @@ class SalesOutOfProvinceLogic extends GetxController { Future getOutProvinceSales() async { await safeCall( - call: () => - rootLogic.chickenRepository.getStewardFreeSaleBar( - token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - pageSize: 10, - page: 1, - state: 'buyer-list', - search: 'filter', - role: 'Steward', - value: searchedValue.value ?? '', - fromDate: fromDateFilter.value.toDateTime(), - toDate: toDateFilter.value.toDateTime(), - ), - ), + call: () => rootLogic.chickenRepository.getStewardFreeSaleBar( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 10, + page: 1, + state: 'buyer-list', + search: 'filter', + role: 'Steward', + value: searchedValue.value ?? '', + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), onSuccess: (res) { if ((res?.count ?? 0) == 0) { salesList.value = Resource>.empty(); } else { - salesList.value = Resource>.success( - res!.results!, - ); + salesList.value = Resource>.success(res!.results!); } }, ); @@ -155,9 +134,7 @@ class SalesOutOfProvinceLogic extends GetxController { Future getCites() async { await safeCall( call: () => - rootLogic.chickenRepository.getCity( - provinceName: selectedProvince.value?.name ?? '', - ), + rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), onSuccess: (result) { if (result != null && result.isNotEmpty) { cites.value = result; @@ -188,23 +165,21 @@ class SalesOutOfProvinceLogic extends GetxController { void checkBuyerFormValid() { isBuyerSubmitButtonEnabled.value = buyerNameController.text.isNotEmpty && - buyerLastNameController.text.isNotEmpty && - buyerPhoneController.text.isNotEmpty && - buyerUnitNameController.text.isNotEmpty && - selectedProvince.value != null && - selectedCity.value != null && - selectedProduct.value != null; + buyerLastNameController.text.isNotEmpty && + buyerPhoneController.text.isNotEmpty && + buyerUnitNameController.text.isNotEmpty && + selectedProvince.value != null && + selectedCity.value != null && + selectedProduct.value != null; } void checkSalesFormValid() { isSaleSubmitButtonEnabled.value = - saleDate.value - .toString() - .isNotEmpty && - selectedProduct.value != null && - selectedBuyer.value != null && - saleWeightController.text.isNotEmpty && - quarantineCodeController.text.isNotEmpty; + saleDate.value.toString().isNotEmpty && + selectedProduct.value != null && + selectedBuyer.value != null && + saleWeightController.text.isNotEmpty && + quarantineCodeController.text.isNotEmpty; } Future createBuyer() async { @@ -223,8 +198,7 @@ class SalesOutOfProvinceLogic extends GetxController { mobile: buyerPhoneController.text, role: 'Steward', ); - final res = await rootLogic.chickenRepository - .createOutProvinceCarcassesBuyer( + final res = await rootLogic.chickenRepository.createOutProvinceCarcassesBuyer( token: rootLogic.tokenService.accessToken.value!, body: buyer, ); @@ -262,27 +236,23 @@ class SalesOutOfProvinceLogic extends GetxController { void setEditDataSales(StewardFreeSaleBar item) { quarantineCodeController.text = item.clearanceCode ?? ''; - saleWeightController.text = - item.weightOfCarcasses?.toInt().toString() ?? ''; + saleWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? ''; saleDate.value = Jalali.fromDateTime(DateTime.parse(item.date!)); selectedCity.value = IranProvinceCityModel(name: item.city); selectedBuyer.value = buyerList.value.data?.firstWhere( - (element) => element.key == item.buyer?.key, + (element) => element.key == item.buyer?.key, ); - selectedProduct.value = - outOfTheProvinceLogic.rolesProductsModel.value.first; + selectedProduct.value = saleLogic.rolesProductsModel.value.first; key = item.key; isSaleSubmitButtonEnabled.value = true; } Future deleteStewardPurchaseOutOfProvince(String key) async { await safeCall( - call: () => - rootLogic.chickenRepository - .deleteStewardPurchasesOutSideOfTheProvince( - token: rootLogic.tokenService.accessToken.value!, - stewardFreeBarKey: key, - ), + call: () => rootLogic.chickenRepository.deleteStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + stewardFreeBarKey: key, + ), ); } @@ -292,18 +262,15 @@ class SalesOutOfProvinceLogic extends GetxController { buyerKey: selectedBuyer.value?.key, numberOfCarcasses: 0, weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), - date: saleDate.value - .toDateTime() - .formattedDashedGregorian, + date: saleDate.value.toDateTime().formattedDashedGregorian, clearanceCode: quarantineCodeController.text, productKey: selectedProduct.value?.key, ); await safeCall( - call: () => - rootLogic.chickenRepository.createOutProvinceStewardFreeBar( - token: rootLogic.tokenService.accessToken.value!, - body: requestBody, - ), + call: () => rootLogic.chickenRepository.createOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), onSuccess: (_) { res = true; }, @@ -323,24 +290,29 @@ class SalesOutOfProvinceLogic extends GetxController { Future editSale() async { bool res = false; StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( - numberOfCarcasses: 0, - weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), - date: saleDate.value - .toDateTime() - .formattedDashedGregorian, - clearanceCode: quarantineCodeController.text, - key:key + numberOfCarcasses: 0, + weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), + date: saleDate.value.toDateTime().formattedDashedGregorian, + clearanceCode: quarantineCodeController.text, + key: key, ); await safeCall( - call: () => - rootLogic.chickenRepository.updateOutProvinceStewardFreeBar( - token: rootLogic.tokenService.accessToken.value!, - body: requestBody, - ), + call: () => rootLogic.chickenRepository.updateOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), onSuccess: (_) { res = true; }, ); return res; } + + void setSearchValue(String value) { + searchedValue.value = value.trim(); + } + + void submitFilter() { + //TODO: Implement filter logic + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart index 17ef768..7072bcb 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart @@ -19,12 +19,12 @@ class SalesPage extends GetView { return Scaffold( body: Column( children: [ - searchWidget(controller.searchIsSelected, (data) { + /* searchWidget(controller.searchIsSelected, (data) { controller.searchedValue.value = data; //TODO: Implement search functionality controller.getOutProvinceSales(); - }), + }),*/ salesListWidget(), ], @@ -454,7 +454,7 @@ class SalesPage extends GetView { Widget _productWidget() { return ObxValue((data) { return OverlayDropdownWidget( - items: controller.outOfTheProvinceLogic.rolesProductsModel, + items: controller.saleLogic.rolesProductsModel, onChanged: (value) { controller.selectedProduct.value = value; }, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 1459091..565c964 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -7,6 +7,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/pages/buyers_page.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/pages/sales_page.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -16,153 +17,31 @@ class SalesOutOfProvincePage extends GetView { @override Widget build(BuildContext context) { - return ObxValue((index) { - return DefaultTabController( - length: 2, - initialIndex: index.value, - child: Scaffold( - appBar: RAppBar( - titleTextStyle: AppFonts.yekan16Bold.copyWith(color: Colors.white), - centerTitle: true, - hasBack: true, - onBackPressed: () { - Get.back(id: 1); - }, - leadingWidth: 155, - leading: Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, - children: [ - Assets.vec.chickenSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - Text('رصدطیور', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), - ], - ), - additionalActions: [ - GestureDetector( - onTap: () { - controller.searchIsSelected.value = !controller.searchIsSelected.value; - }, - child: Assets.vec.searchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - SizedBox(width: 8), - Visibility( - visible: controller.currentIndex.value==0, - child: GestureDetector( - onTap: () { - Get.bottomSheet(filterBottomSheet()); - }, - child: Assets.vec.filterOutlineSvg.svg( - width: 20, - height: 20, - colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - ), - SizedBox(width: 8), - ], - ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - routePageWidget(), - Container( - child: TabBar( - tabs: [ - Tab(text: 'فروش' ), - Tab(text: 'خریداران'), - ], - onTap: (value) { - controller.currentIndex.value= value; - }, - labelColor: AppColor.blueNormal, - unselectedLabelColor: AppColor.mediumGreyDarkHover, - indicatorColor: AppColor.blueNormal, - indicatorSize: TabBarIndicatorSize.tab, - indicator: BoxDecoration( - color: AppColor.blueLight, - border: Border( - bottom: BorderSide( - color:AppColor.blueNormal, - ), - ), - ), - ), - ), - Expanded( - child: TabBarView( - children: [ - SalesPage(), - BuyersPage() - ], - ), - ), - ], - ), - ), - ); - }, controller.currentIndex); - } - - Row routePageWidget() { - return Row( - children: [ - SizedBox(width: 8), - RichText( - text: TextSpan( - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - children: [ - WidgetSpan( - child: Row( - children: [ - Assets.vec.cubeSearchSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - SizedBox(width: 6), - ], - ), - ), - - TextSpan(text: 'خارج استان'), - TextSpan(text: '/'), - TextSpan(text: 'فروش'), - ], - ), - ), + return BasePage( + routes: controller.routesName, + onBackPressed: () => Get.back(id: 1), + onSearchChanged: (data) => controller.setSearchValue(data), + filteringWidget: filterBottomSheet(), + widgets: [ + segmentWidget() ], ); } - Widget buildRow(String title, String value) { + Padding segmentWidget() { return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), + padding: const EdgeInsets.fromLTRB(8, 0, 8, 8), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - Flexible( - flex: 2, - child: Text( - value, - textAlign: TextAlign.left, - - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + Expanded( + child: RSegment( + children: ['در انتظار', 'همه'], + selectedIndex: 0, + borderColor: const Color(0xFFB4B4B4), + selectedBorderColor: AppColor.blueNormal, + selectedBackgroundColor: AppColor.blueLight, + onSegmentSelected: (index) => controller.selectedSegmentIndex.value = index, + backgroundColor: AppColor.whiteGreyNormal, ), ), ], @@ -181,13 +60,13 @@ class SalesOutOfProvincePage extends GetView { spacing: 8, children: [ Expanded( - child: timeFilterWidget( + child: dateFilterWidget( date: controller.fromDateFilter, onChanged: (jalali) => controller.fromDateFilter.value = jalali, ), ), Expanded( - child: timeFilterWidget( + child: dateFilterWidget( isFrom: false, date: controller.toDateFilter, onChanged: (jalali) => controller.toDateFilter.value = jalali, @@ -199,7 +78,7 @@ class SalesOutOfProvincePage extends GetView { RElevated( text: 'اعمال فیلتر', onPressed: () { - controller.getOutProvinceSales(); + controller.submitFilter(); Get.back(); }, height: 40, @@ -210,99 +89,4 @@ class SalesOutOfProvincePage extends GetView { ); } - GestureDetector timeFilterWidget({ - isFrom = true, - required Rx date, - required Function(Jalali jalali) onChanged, - }) { - return GestureDetector( - onTap: () { - Get.bottomSheet(modalDatePicker((value) => onChanged(value))); - }, - child: Container( - height: 35, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blueNormal), - ), - padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), - child: Row( - spacing: 8, - children: [ - Assets.vec.calendarSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - Text(isFrom ? 'از' : 'تا', style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal)), - Expanded( - child: ObxValue((data) { - return Text( - date.value.formatCompactDate(), - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), - ); - }, date), - ), - ], - ), - ), - ); - } - - Container modalDatePicker(ValueChanged onDateSelected) { - Jalali? tempPickedDate; - return Container( - height: 250, - color: Colors.white, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - child: Row( - children: [ - SizedBox(width: 20), - RElevated( - height: 35, - width: 70, - textStyle: AppFonts.yekan14.copyWith(color: Colors.white), - onPressed: () { - onDateSelected(tempPickedDate ?? Jalali.now()); - Get.back(); - }, - text: 'تایید', - ), - Spacer(), - RElevated( - height: 35, - width: 70, - backgroundColor: AppColor.error, - textStyle: AppFonts.yekan14.copyWith(color: Colors.white), - onPressed: () { - onDateSelected(tempPickedDate ?? Jalali.now()); - Get.back(); - }, - text: 'لغو', - ), - SizedBox(width: 20), - ], - ), - ), - Divider(height: 0, thickness: 1), - Expanded( - child: Container( - child: PersianCupertinoDatePicker( - initialDateTime: Jalali.now(), - mode: PersianCupertinoDatePickerMode.date, - onDateTimeChanged: (dateTime) { - tempPickedDate = dateTime; - }, - ), - ), - ), - ], - ), - ); - } - } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart new file mode 100644 index 0000000..0afd06b --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class SalesOutOfProvinceBuyersLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart new file mode 100644 index 0000000..74e9a24 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'logic.dart'; + +class SalesOutOfProvinceBuyersPage extends StatelessWidget { + const SalesOutOfProvinceBuyersPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final SalesOutOfProvinceBuyersLogic logic = Get.put(SalesOutOfProvinceBuyersLogic()); + + return Container(); + } +} From 3b5d1665d67ae2a8945391d8e8dd2ace4442c340 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 7 Jul 2025 22:50:06 +0330 Subject: [PATCH 178/256] feat : sale out of province --- .../lib/presentation/pages/sale/logic.dart | 16 +- .../logic.dart | 15 - .../view.dart | 15 - .../pages/sales_in_province/view.dart | 103 ++- .../pages/sales_out_of_province/logic.dart | 322 +--------- .../pages/buyers_page.dart | 398 ------------ .../pages/sales_page.dart | 597 ------------------ .../pages/sales_out_of_province/view.dart | 43 +- .../widgets/empty_widget.dart | 10 - .../widgets/search_widget.dart | 38 -- .../sales_out_of_province_buyers/logic.dart | 199 +++++- .../sales_out_of_province_buyers/view.dart | 267 +++++++- .../logic.dart | 213 +++++++ .../view.dart | 429 +++++++++++++ .../lib/presentation/routes/pages.dart | 8 +- .../pagination_model/pagination_model.dart | 2 + 16 files changed, 1263 insertions(+), 1412 deletions(-) delete mode 100644 packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart delete mode 100644 packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart delete mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart delete mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart delete mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart delete mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart diff --git a/packages/chicken/lib/presentation/pages/sale/logic.dart b/packages/chicken/lib/presentation/pages/sale/logic.dart index 68267a6..458c1ee 100644 --- a/packages/chicken/lib/presentation/pages/sale/logic.dart +++ b/packages/chicken/lib/presentation/pages/sale/logic.dart @@ -8,12 +8,14 @@ import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class SaleLogic extends GetxController { - Rxn?> allocatedMadeModel = Rxn?>(); + Rxn?> allocatedMadeModel = + Rxn?>(); RxList rolesProductsModel = RxList(); RxList guildsModel = [].obs; - Rxn stewardFreeDashboard = Rxn(); + Rxn stewardFreeDashboard = + Rxn(); RootLogic rootLogic = Get.find(); @@ -31,7 +33,12 @@ class SaleLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams(page: 1, pageSize: 20, search: 'filter', role: 'Steward'), + queryParameters: buildQueryParams( + page: 1, + pageSize: 20, + search: 'filter', + role: 'Steward', + ), ), onSuccess: (result) { if (result != null) { @@ -74,7 +81,8 @@ class SaleLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, - allocationTokens: allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], + allocationTokens: + allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart deleted file mode 100644 index b3526a0..0000000 --- a/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/logic.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:get/get.dart'; - -class SalesOutOfProvinceSalesListLogic extends GetxController { - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - } -} diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart deleted file mode 100644 index b34e56f..0000000 --- a/packages/chicken/lib/presentation/pages/sales_in_province/sales_out_of_province_sales_list/view.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -import 'logic.dart'; - -class SalesOutOfProvinceSalesListPage extends StatelessWidget { - const SalesOutOfProvinceSalesListPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final SalesOutOfProvinceSalesListLogic logic = Get.put(SalesOutOfProvinceSalesListLogic()); - - return Container(); - } -} diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index a51938f..dd3a02a 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -19,7 +19,10 @@ class SalesInProvincePage extends GetView { Widget build(BuildContext context) { return Scaffold( body: BasePage( - routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName), + routesWidget: ObxValue( + (route) => buildPageRoute(route), + controller.routesName, + ), onBackPressed: () => Get.back(id: 1), onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), @@ -32,7 +35,10 @@ class SalesInProvincePage extends GetView { resource: data.value, hasMore: data.value.data?.next != null, isPaginating: controller.isLoadingMoreAllocationsMade.value, - onRefresh: () async => await controller.getAllocatedMade(), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getAllocatedMade(); + }, onLoadMore: () async { controller.currentPage.value++; iLog(controller.currentPage.value); @@ -83,7 +89,10 @@ class SalesInProvincePage extends GetView { await controller.confirmAllAllocations(); }, message: 'تایید یکجا', - icon: Assets.vec.clipboardTaskSvg.svg(width: 40.w, height: 40.h), + icon: Assets.vec.clipboardTaskSvg.svg( + width: 40.w, + height: 40.h, + ), backgroundColor: controller.bgConfirmAllColor.value, ), ); @@ -100,7 +109,10 @@ class SalesInProvincePage extends GetView { width: Get.width, height: 39, margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: AppColor.greenLight, + borderRadius: BorderRadius.circular(8), + ), alignment: Alignment.center, child: ObxValue((data) { return Text( @@ -153,13 +165,18 @@ class SalesInProvincePage extends GetView { child: Assets.vec.hotChickenSvg.svg( width: 24, height: 24, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), ), ), Text( '${item.weightOfCarcasses?.separatedByComma}kg', textAlign: TextAlign.left, - style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan12.copyWith( + color: AppColor.blueNormal, + ), ), ], ), @@ -190,7 +207,10 @@ class SalesInProvincePage extends GetView { itemListExpandedWidget(AllocatedMadeModel item, int index) { return Container( padding: EdgeInsets.all(8), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), child: Column( spacing: 8, children: [ @@ -230,12 +250,16 @@ class SalesInProvincePage extends GetView { children: [ Text( item.date?.toJalali.formatter.wN ?? 'N/A', - style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + style: AppFonts.yekan14.copyWith( + color: AppColor.textColor, + ), ), Text( '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), ), ], ), @@ -255,7 +279,8 @@ class SalesInProvincePage extends GetView { buildRow( title: 'نام و نام خانوادگی فروشنده', - value: controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', + value: + controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', ), buildRow( @@ -273,12 +298,20 @@ class SalesInProvincePage extends GetView { title: 'افت وزن(کیلوگرم)', value: item.weightLossOfCarcasses?.toInt().toString() ?? 'N/A', ), - buildRow(title: 'قیمت کل', value: '${item.totalAmount?.separatedByComma} ریال'), + buildRow( + title: 'قیمت کل', + value: '${item.totalAmount?.separatedByComma} ریال', + ), - buildRow(title: 'کداحراز', value: item.registrationCode?.toString() ?? 'ندارد'), + buildRow( + title: 'کداحراز', + value: item.registrationCode?.toString() ?? 'ندارد', + ), buildRow( title: 'وضعیت کد احراز', - value: item.systemRegistrationCode == true ? "ارسال شده" : "ارسال نشده", + value: item.systemRegistrationCode == true + ? "ارسال شده" + : "ارسال نشده", ), Row( @@ -341,7 +374,9 @@ class SalesInProvincePage extends GetView { children: [ Text( '${isEditMode ? 'ویرایش' : 'ثبت'} توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.blueNormal, + ), ), Visibility( visible: isEditMode == false, @@ -355,7 +390,10 @@ class SalesInProvincePage extends GetView { initText: Jalali.now().formatCompactDate(), ), const SizedBox(height: 12), - Material(type: MaterialType.transparency, child: productDropDown()), + Material( + type: MaterialType.transparency, + child: productDropDown(), + ), const SizedBox(height: 12), SizedBox( height: 40, @@ -403,7 +441,12 @@ class SalesInProvincePage extends GetView { ], validator: (value) { if (int.parse(value!.clearComma) > - (controller.rootLogic.inventoryModel.value?.totalRemainWeight?.toInt() ?? + (controller + .rootLogic + .inventoryModel + .value + ?.totalRemainWeight + ?.toInt() ?? 100)) { return 'وزن تخصیصی بیشتر از موجودی انبار است'; } @@ -424,7 +467,8 @@ class SalesInProvincePage extends GetView { ], onChanged: (p0) { - controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; + controller.pricePerKilo.value = + int.tryParse(p0.clearComma) ?? 0; }, keyboardType: TextInputType.number, label: 'قیمت هر کیلو', @@ -450,7 +494,8 @@ class SalesInProvincePage extends GetView { height: 40, onPressed: data.value ? () async { - if (controller.formKey.currentState?.validate() ?? false) { + if (controller.formKey.currentState?.validate() ?? + false) { iLog("s2"); controller.setSubmitData(); iLog("s3"); @@ -527,14 +572,20 @@ class SalesInProvincePage extends GetView { child: Column( spacing: 16, children: [ - Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Text( + 'فیلترها', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), Row( spacing: 8, children: [ Expanded( child: timeFilterWidget( date: controller.fromDateFilter, - onChanged: (jalali) => controller.fromDateFilter.value = jalali, + onChanged: (jalali) => + controller.fromDateFilter.value = jalali, ), ), Expanded( @@ -583,7 +634,10 @@ class SalesInProvincePage extends GetView { Assets.vec.calendarSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + colorFilter: const ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), ), Text( isFrom ? 'از' : 'تا', @@ -592,9 +646,12 @@ class SalesInProvincePage extends GetView { Expanded( child: ObxValue((data) { return Text( - date.value?.formatCompactDate() ?? Jalali.now().formatCompactDate(), + date.value?.formatCompactDate() ?? + Jalali.now().formatCompactDate(), textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), + style: AppFonts.yekan16.copyWith( + color: AppColor.lightGreyNormalActive, + ), ); }, date), ), diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 91c25d8..d3e9353 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,318 +1,66 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; -import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; -import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; -import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/logic.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { RootLogic get rootLogic => Get.find(); + SaleLogic get saleLogic => Get.find(); + + SalesOutOfProvinceBuyersLogic get buyersLogic => + Get.find(); + + SalesOutOfProvinceSalesListLogic get saleListLogic => + Get.find(); + RxInt selectedSegmentIndex = 0.obs; RxBool isExpanded = false.obs; - RxBool isBuyerSubmitButtonEnabled = false.obs; - RxBool isSaleSubmitButtonEnabled = false.obs; + RxList isExpandedList = [].obs; Rx fromDateFilter = Jalali.now().obs; Rx toDateFilter = Jalali.now().obs; RxnString searchedValue = RxnString(); RxList routesName = RxList(); - //TODO add this to Di - ImagePicker imagePicker = ImagePicker(); + @override + void onInit() { + super.onInit(); + routesName.value = [...saleLogic.routesName, 'خارج استان'].toList(); - Rx>> buyerList = - Resource>.loading().obs; - Rx>> salesList = - Resource>.loading().obs; - - Rxn selectedProduct = Rxn(); - Rxn selectedBuyer = Rxn(); - - RxList cites = [].obs; - Rxn selectedProvince = Rxn(); - Rxn selectedCity = Rxn(); - - GlobalKey formKey = GlobalKey(); - TextEditingController buyerNameController = TextEditingController(); - TextEditingController buyerLastNameController = TextEditingController(); - TextEditingController buyerPhoneController = TextEditingController(); - TextEditingController buyerUnitNameController = TextEditingController(); - - //Sale - TextEditingController quarantineCodeController = TextEditingController(); - TextEditingController saleWeightController = TextEditingController(); - Rx saleDate = Jalali.now().obs; - String? key; + routesName.add(selectedSegmentIndex.value == 0 ? 'فروش' : 'خریداران'); + ever(selectedSegmentIndex, (callback) { + routesName.removeLast(); + routesName.add(callback == 0 ? 'فروش' : 'خریداران'); + }); + } @override void onReady() { super.onReady(); - getOutProvinceCarcassesBuyer(); - getOutProvinceSales(); - routesName.value = [...saleLogic.routesName, 'داخل استان'].toList(); - selectedProvince.listen((p0) => getCites()); - tLog(selectedProduct.value); - saleLogic.rolesProductsModel.listen((lists) { - selectedProduct.value = lists.first; - }); - setupListeners(); - debounce( - searchedValue, - (callback) => getOutProvinceCarcassesBuyer(), - time: Duration(milliseconds: 2000), - ); - } - @override - void onClose() { - buyerNameController.dispose(); - buyerLastNameController.dispose(); - buyerPhoneController.dispose(); - buyerUnitNameController.dispose(); - selectedCity.value = null; - selectedProvince.value = null; - isExpandedList.clear(); - - super.onClose(); - } - - Future getOutProvinceCarcassesBuyer() async { - await safeCall( - call: () => rootLogic.chickenRepository.getOutProvinceCarcassesBuyer( - token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - pageSize: 10, - page: 1, - state: 'buyer-list', - search: 'filter', - role: 'Steward', - value: searchedValue.value ?? '', - ), - ), - onSuccess: (res) { - if ((res?.count ?? 0) == 0) { - buyerList.value = Resource>.empty(); - } else { - buyerList.value = Resource>.success(res!.results!); - } - }, - ); - } - - Future getOutProvinceSales() async { - await safeCall( - call: () => rootLogic.chickenRepository.getStewardFreeSaleBar( - token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - pageSize: 10, - page: 1, - state: 'buyer-list', - search: 'filter', - role: 'Steward', - value: searchedValue.value ?? '', - fromDate: fromDateFilter.value.toDateTime(), - toDate: toDateFilter.value.toDateTime(), - ), - ), - onSuccess: (res) { - if ((res?.count ?? 0) == 0) { - salesList.value = Resource>.empty(); - } else { - salesList.value = Resource>.success(res!.results!); - } - }, - ); - } - - Future getCites() async { - await safeCall( - call: () => - rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), - onSuccess: (result) { - if (result != null && result.isNotEmpty) { - cites.value = result; - } - }, - ); - } - - void setupListeners() { - //buyer form listeners - buyerNameController.addListener(checkBuyerFormValid); - buyerLastNameController.addListener(checkBuyerFormValid); - buyerPhoneController.addListener(checkBuyerFormValid); - buyerUnitNameController.addListener(checkBuyerFormValid); - - ever(selectedProvince, (_) => checkBuyerFormValid()); - ever(selectedCity, (_) => checkBuyerFormValid()); - ever(selectedProduct, (_) => checkBuyerFormValid()); - - //sales form listeners - saleWeightController.addListener(checkSalesFormValid); - quarantineCodeController.addListener(checkSalesFormValid); - ever(selectedBuyer, (_) => checkSalesFormValid); - ever(selectedProduct, (_) => checkSalesFormValid); - ever(saleDate, (_) => checkSalesFormValid()); - } - - void checkBuyerFormValid() { - isBuyerSubmitButtonEnabled.value = - buyerNameController.text.isNotEmpty && - buyerLastNameController.text.isNotEmpty && - buyerPhoneController.text.isNotEmpty && - buyerUnitNameController.text.isNotEmpty && - selectedProvince.value != null && - selectedCity.value != null && - selectedProduct.value != null; - } - - void checkSalesFormValid() { - isSaleSubmitButtonEnabled.value = - saleDate.value.toString().isNotEmpty && - selectedProduct.value != null && - selectedBuyer.value != null && - saleWeightController.text.isNotEmpty && - quarantineCodeController.text.isNotEmpty; - } - - Future createBuyer() async { - bool res = false; - if (!(formKey.currentState?.validate() ?? false)) { - return res; - } - await safeCall( - call: () async { - OutProvinceCarcassesBuyer buyer = OutProvinceCarcassesBuyer( - province: selectedProvince.value!.name, - city: selectedCity.value!.name, - firstName: buyerNameController.text, - lastName: buyerLastNameController.text, - unitName: buyerUnitNameController.text, - mobile: buyerPhoneController.text, - role: 'Steward', - ); - final res = await rootLogic.chickenRepository.createOutProvinceCarcassesBuyer( - token: rootLogic.tokenService.accessToken.value!, - body: buyer, - ); - }, - onSuccess: (result) { - getOutProvinceCarcassesBuyer(); - resetSubmitForm(); - res = true; - }, - ); - return res; - } - - void resetSubmitForm() { - buyerNameController.clear(); - buyerLastNameController.clear(); - buyerPhoneController.clear(); - buyerUnitNameController.clear(); - selectedProvince.value = null; - selectedCity.value = null; - selectedProduct.value = null; - key = null; - isBuyerSubmitButtonEnabled.value = false; - } - - void setEditDataBuyer(OutProvinceCarcassesBuyer item) { - buyerNameController.text = item.firstName ?? ''; - buyerLastNameController.text = item.lastName ?? ''; - buyerUnitNameController.text = item.unitName ?? ''; - buyerPhoneController.text = item.mobile ?? ''; - selectedProvince.value = IranProvinceCityModel(name: item.province); - selectedCity.value = IranProvinceCityModel(name: item.city); - isBuyerSubmitButtonEnabled.value = true; - } - - void setEditDataSales(StewardFreeSaleBar item) { - quarantineCodeController.text = item.clearanceCode ?? ''; - saleWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? ''; - saleDate.value = Jalali.fromDateTime(DateTime.parse(item.date!)); - selectedCity.value = IranProvinceCityModel(name: item.city); - selectedBuyer.value = buyerList.value.data?.firstWhere( - (element) => element.key == item.buyer?.key, - ); - selectedProduct.value = saleLogic.rolesProductsModel.value.first; - key = item.key; - isSaleSubmitButtonEnabled.value = true; - } - - Future deleteStewardPurchaseOutOfProvince(String key) async { - await safeCall( - call: () => rootLogic.chickenRepository.deleteStewardPurchasesOutSideOfTheProvince( - token: rootLogic.tokenService.accessToken.value!, - stewardFreeBarKey: key, - ), - ); - } - - Future createSale() async { - bool res = false; - StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( - buyerKey: selectedBuyer.value?.key, - numberOfCarcasses: 0, - weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), - date: saleDate.value.toDateTime().formattedDashedGregorian, - clearanceCode: quarantineCodeController.text, - productKey: selectedProduct.value?.key, - ); - await safeCall( - call: () => rootLogic.chickenRepository.createOutProvinceStewardFreeBar( - token: rootLogic.tokenService.accessToken.value!, - body: requestBody, - ), - onSuccess: (_) { - res = true; - }, - ); - return res; - } - - void clearSaleForm() { - quarantineCodeController.clear(); - saleWeightController.clear(); - saleDate.value = Jalali.now(); - selectedBuyer.value = null; - selectedProduct.value = null; - isBuyerSubmitButtonEnabled.value = false; - } - - Future editSale() async { - bool res = false; - StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( - numberOfCarcasses: 0, - weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), - date: saleDate.value.toDateTime().formattedDashedGregorian, - clearanceCode: quarantineCodeController.text, - key: key, - ); - await safeCall( - call: () => rootLogic.chickenRepository.updateOutProvinceStewardFreeBar( - token: rootLogic.tokenService.accessToken.value!, - body: requestBody, - ), - onSuccess: (_) { - res = true; - }, - ); - return res; } void setSearchValue(String value) { searchedValue.value = value.trim(); + if (selectedSegmentIndex.value == 0) { + saleListLogic.searchedValue.value = value.trim(); + } else { + buyersLogic.searchedValue.value = value.trim(); + } } void submitFilter() { - //TODO: Implement filter logic + if (selectedSegmentIndex.value == 0) { + saleListLogic.fromDateFilter.value = fromDateFilter.value; + saleListLogic.toDateFilter.value = toDateFilter.value; + saleListLogic.getOutProvinceSales(); + } else { + buyersLogic.fromDateFilter.value = fromDateFilter.value; + buyersLogic.toDateFilter.value = toDateFilter.value; + buyersLogic.getOutProvinceCarcassesBuyer(); + } } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart deleted file mode 100644 index 409d67f..0000000 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/buyers_page.dart +++ /dev/null @@ -1,398 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; -import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/widgets/search_widget.dart'; -import 'package:rasadyar_core/core.dart'; - -import '../widgets/empty_widget.dart'; - -class BuyersPage extends GetView { - const BuyersPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - buyerListWidget(), - ], - ), - floatingActionButton: RFab.add( - onPressed: () { - Get.bottomSheet( - addOrEditBuyerBottomSheet(), - isScrollControlled: true, - ); - }, - ), - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, - ); - } - - Widget buyerListWidget() { - return ObxValue((data) { - switch (data.value.status) { - case Status.initial: - case Status.loading: - return Center(child: CupertinoActivityIndicator()); - case Status.success: - return ListView.separated( - shrinkWrap: true, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) { - return ObxValue( - (expandList) => buyerListItem( - expandList: expandList, - index: index, - item: data.value.data![index], - ), - controller.isExpandedList, - ); - }, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemCount: data.value.data?.length ?? 0, - ); - case Status.error: - return Center( - child: Text( - data.value.message ?? 'خطا در دریافت اطلاعات', - style: AppFonts.yekan16.copyWith(color: AppColor.error), - ), - ); - case Status.empty: - return emptyWidget(); - } - }, controller.buyerList); - } - - GestureDetector buyerListItem({ - required RxList expandList, - required int index, - required OutProvinceCarcassesBuyer item, - }) { - return GestureDetector( - onTap: () { - if (expandList.contains(index)) { - controller.isExpandedList.remove(index); - } else { - controller.isExpandedList.add(index); - } - }, - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - AnimatedSize( - duration: Duration(milliseconds: 300), - child: Container( - width: Get.width - 30, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: Border.all( - width: 0.5, - color: AppColor.darkGreyNormal, - ), - ), - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox(width: 12), - - Expanded( - flex: 2, - child: Column( - children: [ - Text( - item.buyer?.fullname ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - - SizedBox(height: 2), - Text( - item.buyer?.mobile ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), - ), - ], - ), - ), - - SizedBox(width: 8), - Expanded( - flex: 2, - child: Text( - '${item.unitName}', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.bgDark, - ), - ), - ), - Expanded( - flex: 1, - child: Text( - '${item.buyer?.province}\n${item.buyer?.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.darkGreyDark, - ), - ), - ), - - Icon(CupertinoIcons.chevron_down, size: 12), - SizedBox(width: 8), - ], - ), - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - controller.setEditDataBuyer(item); - Get.bottomSheet( - addOrEditBuyerBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - ), - - Text( - '${item.province}-${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), - ), - - SizedBox(), - ], - ), - - buildRow('مشخصات خریدار', item.fullname ?? 'N/A'), - buildRow('نام واحد', item.unitName ?? 'N/A'), - buildRow( - 'تعداد درخواست ها', - '${item.requestsInfo?.numberOfRequests.separatedByComma}', - ), - buildRow( - 'وزن', - '${item.requestsInfo?.totalWeight.separatedByComma}', - ), - ], - ), - ), - crossFadeState: expandList.contains(index) - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - ), - ), - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all( - width: 0.50, - color: AppColor.greenDarkActive, - ), - ), - alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), - ), - ), - ], - ), - ), - ); - } - - Widget buildRow(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ), - Flexible( - flex: 2, - child: Text( - value, - textAlign: TextAlign.left, - - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ), - ], - ), - ); - } - - Widget addOrEditBuyerBottomSheet([bool isOnEdit = false]) { - return BaseBottomSheet( - height: 600, - child: SingleChildScrollView( - child: Form( - key: controller.formKey, - child: Column( - spacing: 16, - children: [ - Text( - isOnEdit ? 'ویرایش خریدار' : 'افزودن خریدار', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - - RTextField( - controller: controller.buyerPhoneController, - label: 'تلفن خریدار', - keyboardType: TextInputType.phone, - borderColor: AppColor.darkGreyLight, - maxLength: 11, - validator: (value) { - if (value == null || value.isEmpty) { - return 'لطفاً شماره موبایل را وارد کنید'; - } - // حذف کاماها برای اعتبارسنجی - String cleaned = value.replaceAll(',', ''); - if (cleaned.length != 11) { - return 'شماره موبایل باید ۱۱ رقم باشد'; - } - if (!cleaned.startsWith('09')) { - return 'شماره موبایل باید با 09 شروع شود'; - } - return null; - }, - ), - RTextField( - controller: controller.buyerNameController, - label: 'نام خریدار', - borderColor: AppColor.darkGreyLight, - ), - RTextField( - controller: controller.buyerLastNameController, - label: 'نام خانوادگی خریدار', - borderColor: AppColor.darkGreyLight, - ), - - RTextField( - controller: controller.buyerUnitNameController, - label: 'نام واحد', - borderColor: AppColor.darkGreyLight, - ), - _provinceWidget(), - _cityWidget(), - submitButtonWidget(isOnEdit), - SizedBox(), - ], - ), - ), - ), - ); - } - - Widget submitButtonWidget(bool isOnEdit) { - return ObxValue((data) { - return RElevated( - text: isOnEdit ? 'ویرایش' : 'ثبت', - onPressed: data.value - ? () async { - var res = await controller.createBuyer(); - if (res) { - Get.back(); - } - } - : null, - height: 40, - ); - }, controller.isBuyerSubmitButtonEnabled); - } - - Widget _provinceWidget() { - return Obx(() { - return OverlayDropdownWidget( - items: controller.rootLogic.provinces, - onChanged: (value) { - controller.selectedProvince.value = value; - print('Selected Product: ${value.name}'); - }, - selectedItem: controller.selectedProvince.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), - ); - }); - } - - Widget _cityWidget() { - return ObxValue((data) { - return OverlayDropdownWidget( - items: data, - onChanged: (value) { - controller.selectedCity.value = value; - print('Selected Product: ${value.name}'); - }, - selectedItem: controller.selectedCity.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), - ); - }, controller.cites); - } -} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart deleted file mode 100644 index 7072bcb..0000000 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/pages/sales_page.dart +++ /dev/null @@ -1,597 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; -import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; -import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/widgets/empty_widget.dart'; -import 'package:rasadyar_core/core.dart'; - -import '../widgets/search_widget.dart'; - -class SalesPage extends GetView { - const SalesPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Column( - children: [ - /* searchWidget(controller.searchIsSelected, (data) { - controller.searchedValue.value = data; - - //TODO: Implement search functionality - controller.getOutProvinceSales(); - }),*/ - - salesListWidget(), - ], - ), - floatingActionButton: RFab.add( - onPressed: () { - Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); - }, - ), - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, - ); - } - - Widget salesListWidget() { - return ObxValue((data) { - switch (data.value.status) { - case Status.initial: - case Status.loading: - return Center(child: CupertinoActivityIndicator()); - case Status.success: - - return ListView.separated( - shrinkWrap: true, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.fromLTRB(8, 8, 18, 80), - itemBuilder: (context, index) { - return ObxValue( - (expandList) => salesListItem( - expandList: expandList, - index: index, - item: data.value.data![index], - ), - controller.isExpandedList, - ); - }, - separatorBuilder: (context, index) => SizedBox(height: 8), - itemCount: data.value.data?.length ?? 0, - ); - case Status.error: - return Center( - child: Text( - data.value.message ?? 'خطا در دریافت اطلاعات', - style: AppFonts.yekan16.copyWith(color: AppColor.error), - ), - ); - case Status.empty: - return emptyWidget(); - } - }, controller.salesList); - } - - GestureDetector salesListItem({ - required RxList expandList, - required int index, - required StewardFreeSaleBar item, - }) { - return GestureDetector( - onTap: () { - if (expandList.contains(index)) { - controller.isExpandedList.remove(index); - } else { - controller.isExpandedList.add(index); - } - }, - child: AnimatedSize( - duration: Duration(milliseconds: 400), - alignment: Alignment.center, - child: Stack( - clipBehavior: Clip.none, - alignment: Alignment.centerRight, - children: [ - AnimatedSize( - duration: Duration(milliseconds: 300), - child: Container( - width: Get.width - 30, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: Border.all( - width: 0.5, - color: AppColor.darkGreyNormal, - ), - ), - child: AnimatedCrossFade( - alignment: Alignment.center, - firstChild: Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - SizedBox(width: 12), - Expanded( - flex: 3, - child: Text( - item.date?.formattedJalaliDate ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.bgDark, - ), - ), - ), - SizedBox(width: 4), - Expanded( - flex: 5, - child: Column( - children: [ - Text( - item.buyer?.fullname ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), - ), - - SizedBox(height: 2), - Text( - item.buyer?.mobile ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - ), - ), - ], - ), - ), - SizedBox(width: 4), - Expanded( - flex: 4, - child: Column( - spacing: 8, - children: [ - Text( - item.buyer?.unitName ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.bgDark, - ), - ), - Text( - '${item.weightOfCarcasses?.separatedByComma ?? 0}KG', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.bgDark, - ), - ), - ], - ), - ), - Expanded( - flex: 2, - child: Text( - '${item.buyer?.province}\n${item.buyer?.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith( - color: AppColor.bgDark, - ), - ), - ), - SizedBox(width: 8), - Icon(CupertinoIcons.chevron_down, size: 12), - SizedBox(width: 8), - ], - ), - ), - secondChild: Container( - padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: Column( - spacing: 8, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - controller.setEditDataSales(item); - Get.bottomSheet( - addOrEditSaleBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - ), - - Text( - '${item.province}-${item.city}', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.greenDark, - ), - ), - - GestureDetector( - onTap: () { - buildDeleteDialog( - onConfirm: () => controller - .deleteStewardPurchaseOutOfProvince( - item.key!, - ), - ); - }, - child: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.error, - BlendMode.srcIn, - ), - ), - ), - ], - ), - Container( - height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), - decoration: ShapeDecoration( - color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide( - width: 1, - color: AppColor.blueLightHover, - ), - borderRadius: BorderRadius.circular(8), - ), - ), - child: buildRow( - 'تاریخ', - item.date?.formattedJalaliDateYHMS ?? 'N/A', - ), - ), - buildRow( - 'مشخصات خریدار', - item.buyer?.fullname ?? 'N/A', - ), - buildRow('تلفن خریدار', item.buyer?.mobile ?? 'N/A'), - buildRow('نام واحد', item.buyer?.unitName ?? 'N/A'), - buildRow( - 'وزن لاشه', - '${item.weightOfCarcasses?.separatedByComma}', - ), - ], - ), - ), - crossFadeState: expandList.contains(index) - ? CrossFadeState.showSecond - : CrossFadeState.showFirst, - duration: Duration(milliseconds: 300), - ), - ), - ), - Positioned( - right: -12, - child: Container( - width: index < 999 ? 24 : null, - height: index < 999 ? 24 : null, - padding: EdgeInsets.all(2), - decoration: BoxDecoration( - color: AppColor.greenLightHover, - borderRadius: BorderRadius.circular(4), - border: Border.all( - width: 0.50, - color: AppColor.greenDarkActive, - ), - ), - alignment: Alignment.center, - child: Text( - (index + 1).toString(), - style: AppFonts.yekan12.copyWith(color: Colors.black), - ), - ), - ), - ], - ), - ), - ); - } - - Widget buildRow(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ), - Flexible( - flex: 2, - child: Text( - value, - textAlign: TextAlign.left, - - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - ), - ], - ), - ); - } - - Widget addOrEditSaleBottomSheet([bool isOnEdit = false]) { - return BaseBottomSheet( - height: 600, - child: SingleChildScrollView( - child: Form( - key: controller.formKey, - child: Column( - spacing: 16, - children: [ - Text( - isOnEdit ? 'ویرایش فروش' : 'افزودن فروش', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - _productWidget(), - _buyerWidget(), - RTextField( - controller: controller.saleWeightController, - label: 'وزن لاشه', - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], - - validator: (value) { - if (value == null) { - return 'لطفاً وزن لاشه را وارد کنید'; - } - return null; - }, - ), - RTextField( - controller: controller.quarantineCodeController, - label: 'کد قرنطینه', - borderColor: AppColor.darkGreyLight, - validator: (value) { - if (value == null) { - return 'لطفاً کد قرنطینه را وارد کنید'; - } - return null; - }, - ), - - Row( - spacing: 8, - children: [ - Expanded( - child: timeFilterWidget( - date: controller.saleDate, - onChanged: (jalali) => controller.saleDate.value = jalali, - ), - ), - ], - ), - - submitButtonWidget(isOnEdit), - SizedBox(), - ], - ), - ), - ), - ); - } - - Widget submitButtonWidget(bool isOnEdit) { - return ObxValue((data) { - return RElevated( - text: isOnEdit ? 'ویرایش' : 'ثبت', - onPressed: data.value - ? () async { - var res = isOnEdit - ? await controller.editSale() - : await controller.createSale(); - if (res) { - controller.getOutProvinceSales(); - controller.clearSaleForm(); - Get.back(); - } - } - : null, - height: 40, - ); - }, controller.isSaleSubmitButtonEnabled); - } - - Widget _buyerWidget() { - return Obx(() { - return OverlayDropdownWidget( - items: controller.buyerList.value.data ?? [], - onChanged: (value) { - controller.selectedBuyer.value = value; - }, - selectedItem: controller.selectedBuyer.value, - itemBuilder: (item) => Text(item.buyer?.fullname ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.buyer?.fullname ?? 'انتخاب خریدار'), - ); - }); - } - - Widget _productWidget() { - return ObxValue((data) { - return OverlayDropdownWidget( - items: controller.saleLogic.rolesProductsModel, - onChanged: (value) { - controller.selectedProduct.value = value; - }, - selectedItem: controller.selectedProduct.value, - initialValue: controller.selectedProduct.value, - itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), - ); - }, controller.selectedProduct); - } - - GestureDetector timeFilterWidget({ - isFrom = true, - required Rx date, - required Function(Jalali jalali) onChanged, - }) { - return GestureDetector( - onTap: () { - Get.bottomSheet(modalDatePicker((value) => onChanged(value))); - }, - child: Container( - height: 35, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.bgDark), - ), - padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), - child: Row( - spacing: 8, - children: [ - Assets.vec.calendarSvg.svg( - width: 24, - height: 24, - colorFilter: const ColorFilter.mode( - AppColor.bgDark, - BlendMode.srcIn, - ), - ), - Text( - 'تاریخ', - style: AppFonts.yekan16.copyWith(color: AppColor.bgDark), - ), - Expanded( - child: ObxValue((data) { - return Text( - date.value.formatCompactDate(), - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDark, - ), - ); - }, date), - ), - ], - ), - ), - ); - } - - Container modalDatePicker(ValueChanged onDateSelected) { - Jalali? tempPickedDate; - return Container( - height: 250, - color: Colors.white, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - child: Row( - children: [ - SizedBox(width: 20), - RElevated( - height: 35, - width: 70, - textStyle: AppFonts.yekan14.copyWith(color: Colors.white), - onPressed: () { - onDateSelected(tempPickedDate ?? Jalali.now()); - Get.back(); - }, - text: 'تایید', - ), - Spacer(), - RElevated( - height: 35, - width: 70, - backgroundColor: AppColor.error, - textStyle: AppFonts.yekan14.copyWith(color: Colors.white), - onPressed: () { - onDateSelected(tempPickedDate ?? Jalali.now()); - Get.back(); - }, - text: 'لغو', - ), - SizedBox(width: 20), - ], - ), - ), - Divider(height: 0, thickness: 1), - Expanded( - child: Container( - child: PersianCupertinoDatePicker( - initialDateTime: controller.saleDate.value, - mode: PersianCupertinoDatePickerMode.date, - onDateTimeChanged: (dateTime) { - tempPickedDate = dateTime; - }, - ), - ), - ), - ], - ), - ); - } - - Future buildDeleteDialog({ - required Future Function() onConfirm, - }) async { - await Get.defaultDialog( - title: 'حذف', - middleText: 'آیا از حذف این مورد مطمئن هستید؟', - confirm: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: AppColor.error, - foregroundColor: Colors.white, - ), - onPressed: () async { - await onConfirm(); - Get.back(); - }, - child: Text('بله'), - ), - cancel: ElevatedButton( - onPressed: () { - Get.back(); - }, - child: Text('خیر'), - ), - ).whenComplete(() => controller.getOutProvinceSales()); - } -} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index 565c964..ac3f977 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -1,13 +1,8 @@ -import 'dart:io'; - - import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; -import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/pages/buyers_page.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/pages/sales_page.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/view.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -18,12 +13,22 @@ class SalesOutOfProvincePage extends GetView { @override Widget build(BuildContext context) { return BasePage( - routes: controller.routesName, + routesWidget: ObxValue( + (route) => buildPageRoute(route), + controller.routesName, + ), onBackPressed: () => Get.back(id: 1), onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ - segmentWidget() + segmentWidget(), + Expanded( + child: ObxValue((index) { + return index.value == 0 + ? SalesOutOfProvinceSalesListPage() + : SalesOutOfProvinceBuyersPage(); + }, controller.selectedSegmentIndex), + ), ], ); } @@ -35,12 +40,13 @@ class SalesOutOfProvincePage extends GetView { children: [ Expanded( child: RSegment( - children: ['در انتظار', 'همه'], - selectedIndex: 0, + children: ['فروش', 'خریداران'], + selectedIndex: controller.selectedSegmentIndex.value, borderColor: const Color(0xFFB4B4B4), selectedBorderColor: AppColor.blueNormal, selectedBackgroundColor: AppColor.blueLight, - onSegmentSelected: (index) => controller.selectedSegmentIndex.value = index, + onSegmentSelected: (index) => + controller.selectedSegmentIndex.value = index, backgroundColor: AppColor.whiteGreyNormal, ), ), @@ -55,14 +61,20 @@ class SalesOutOfProvincePage extends GetView { child: Column( spacing: 16, children: [ - Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Text( + 'فیلترها', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), Row( spacing: 8, children: [ Expanded( child: dateFilterWidget( date: controller.fromDateFilter, - onChanged: (jalali) => controller.fromDateFilter.value = jalali, + onChanged: (jalali) => + controller.fromDateFilter.value = jalali, ), ), Expanded( @@ -88,5 +100,4 @@ class SalesOutOfProvincePage extends GetView { ), ); } - } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart deleted file mode 100644 index d02076d..0000000 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/empty_widget.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -Widget emptyWidget() { - return Expanded( - child: Center( - child: Text('داده ای دریافت نشد!', style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover)), - ), - ); -} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart deleted file mode 100644 index ca5518d..0000000 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/widgets/search_widget.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; - -ObxValue searchWidget( - RxBool searchIsSelected, - void Function(String) onChanged, -) { - return ObxValue((data) { - return AnimatedContainer( - duration: Duration(milliseconds: 300), - padding: EdgeInsets.only(top: 5), - curve: Curves.easeInOut, - height: data.value ? 50 : 0, - child: Visibility( - visible: data.value, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: RTextField( - suffixIcon: Padding( - padding: const EdgeInsets.all(12.0), - child: Assets.vec.searchSvg.svg( - width: 10, - height: 10, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - ), - hintText: 'جستجو', - onChanged: onChanged, - controller: TextEditingController(), - ), - ), - ), - ); - }, searchIsSelected); -} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart index 0afd06b..79c2df0 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart @@ -1,15 +1,208 @@ -import 'package:get/get.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; +import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceBuyersLogic extends GetxController { + RootLogic get rootLogic => Get.find(); + + SaleLogic get saleLogic => Get.find(); + + SalesOutOfProvinceLogic get saleOutOfProvince => + Get.find(); + + RxInt currentPage = 1.obs; + RxList isExpandedList = [].obs; + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); + + RxBool isLoadingMoreAllocationsMade = false.obs; + RxBool isBuyerSubmitButtonEnabled = false.obs; + + RxList cites = [].obs; + Rxn selectedProvince = Rxn(); + Rxn selectedCity = Rxn(); + + GlobalKey formKey = GlobalKey(); + TextEditingController buyerNameController = TextEditingController(); + TextEditingController buyerLastNameController = TextEditingController(); + TextEditingController buyerPhoneController = TextEditingController(); + TextEditingController buyerUnitNameController = TextEditingController(); + String? key; + + Rx>> buyerList = + Resource>.loading().obs; + + @override + void onInit() { + super.onInit(); + getOutProvinceCarcassesBuyer(); + } + @override void onReady() { - // TODO: implement onReady super.onReady(); + + selectedProvince.listen((p0) => getCites()); + + debounce( + searchedValue, + (callback) => getOutProvinceCarcassesBuyer(), + time: Duration(milliseconds: timeDebounce), + ); } @override void onClose() { - // TODO: implement onClose + buyerNameController.dispose(); + buyerLastNameController.dispose(); + buyerPhoneController.dispose(); + buyerUnitNameController.dispose(); + selectedCity.value = null; + selectedProvince.value = null; + isExpandedList.clear(); super.onClose(); } + + Future getOutProvinceCarcassesBuyer([ + bool isLoadingMore = false, + ]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + buyerList.value = + Resource>.loading(); + } + + if (searchedValue.value != null && + searchedValue.value!.trim().isNotEmpty && + currentPage.value > 1) { + currentPage.value = 1; // Reset to first page if search value is set + } + + await safeCall( + call: () => rootLogic.chickenRepository.getOutProvinceCarcassesBuyer( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 20, + page: currentPage.value, + state: 'buyer-list', + search: 'filter', + role: 'Steward', + value: searchedValue.value ?? '', + ), + ), + onError: (error, stackTrace) => + isLoadingMoreAllocationsMade.value = false, + onSuccess: (res) { + if ((res?.count ?? 0) == 0) { + buyerList.value = + Resource>.empty(); + } else { + buyerList.value = + Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [ + ...(buyerList.value.data?.results ?? []), + ...(res?.results ?? []), + ], + ), + ); + + isLoadingMoreAllocationsMade.value = false; + } + }, + ); + } + + void resetSubmitForm() { + buyerNameController.clear(); + buyerLastNameController.clear(); + buyerPhoneController.clear(); + buyerUnitNameController.clear(); + selectedProvince.value = null; + selectedCity.value = null; + } + + Future getCites() async { + await safeCall( + call: () => rootLogic.chickenRepository.getCity( + provinceName: selectedProvince.value?.name ?? '', + ), + onSuccess: (result) { + if (result != null && result.isNotEmpty) { + cites.value = result; + } + }, + ); + } + + void setupListeners() { + buyerNameController.addListener(checkBuyerFormValid); + buyerLastNameController.addListener(checkBuyerFormValid); + buyerPhoneController.addListener(checkBuyerFormValid); + buyerUnitNameController.addListener(checkBuyerFormValid); + ever(selectedProvince, (_) => checkBuyerFormValid()); + ever(selectedCity, (_) => checkBuyerFormValid()); + } + + void checkBuyerFormValid() { + isBuyerSubmitButtonEnabled.value = + buyerNameController.text.isNotEmpty && + buyerLastNameController.text.isNotEmpty && + buyerPhoneController.text.isNotEmpty && + buyerUnitNameController.text.isNotEmpty && + selectedProvince.value != null && + selectedCity.value != null; + } + + Future createBuyer() async { + bool res = false; + if (!(formKey.currentState?.validate() ?? false)) { + return res; + } + await safeCall( + call: () async { + OutProvinceCarcassesBuyer buyer = OutProvinceCarcassesBuyer( + province: selectedProvince.value!.name, + city: selectedCity.value!.name, + firstName: buyerNameController.text, + lastName: buyerLastNameController.text, + unitName: buyerUnitNameController.text, + mobile: buyerPhoneController.text, + role: 'Steward', + ); + final res = await rootLogic.chickenRepository + .createOutProvinceCarcassesBuyer( + token: rootLogic.tokenService.accessToken.value!, + body: buyer, + ); + }, + onSuccess: (result) { + getOutProvinceCarcassesBuyer(); + resetSubmitForm(); + res = true; + }, + ); + return res; + } + + void setEditDataBuyer(OutProvinceCarcassesBuyer item) { + buyerNameController.text = item.firstName ?? ''; + buyerLastNameController.text = item.lastName ?? ''; + buyerUnitNameController.text = item.unitName ?? ''; + buyerPhoneController.text = item.mobile ?? ''; + selectedProvince.value = IranProvinceCityModel(name: item.province); + selectedCity.value = IranProvinceCityModel(name: item.city); + isBuyerSubmitButtonEnabled.value = true; + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index 74e9a24..1ff77c3 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -1,15 +1,272 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; +import 'package:rasadyar_core/core.dart'; import 'logic.dart'; -class SalesOutOfProvinceBuyersPage extends StatelessWidget { - const SalesOutOfProvinceBuyersPage({Key? key}) : super(key: key); +class SalesOutOfProvinceBuyersPage + extends GetView { + const SalesOutOfProvinceBuyersPage({super.key}); @override Widget build(BuildContext context) { - final SalesOutOfProvinceBuyersLogic logic = Get.put(SalesOutOfProvinceBuyersLogic()); + return Scaffold( + body: ObxValue((data) { + return RPaginatedListView( + onLoadMore: () async => controller.getOutProvinceCarcassesBuyer(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getOutProvinceCarcassesBuyer(); + }, + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.timerSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.buyerList), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet( + addOrEditBuyerBottomSheet(), + isScrollControlled: true, + ); + }, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } - return Container(); + Widget addOrEditBuyerBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + height: 600, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش خریدار' : 'افزودن خریدار', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + + RTextField( + controller: controller.buyerPhoneController, + label: 'تلفن خریدار', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + maxLength: 11, + validator: (value) { + if (value == null || value.isEmpty) { + return 'لطفاً شماره موبایل را وارد کنید'; + } + // حذف کاماها برای اعتبارسنجی + String cleaned = value.replaceAll(',', ''); + if (cleaned.length != 11) { + return 'شماره موبایل باید ۱۱ رقم باشد'; + } + if (!cleaned.startsWith('09')) { + return 'شماره موبایل باید با 09 شروع شود'; + } + return null; + }, + ), + RTextField( + controller: controller.buyerNameController, + label: 'نام خریدار', + borderColor: AppColor.darkGreyLight, + ), + RTextField( + controller: controller.buyerLastNameController, + label: 'نام خانوادگی خریدار', + borderColor: AppColor.darkGreyLight, + ), + + RTextField( + controller: controller.buyerUnitNameController, + label: 'نام واحد', + borderColor: AppColor.darkGreyLight, + ), + _provinceWidget(), + _cityWidget(), + submitButtonWidget(isOnEdit), + SizedBox(), + ], + ), + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + text: isOnEdit ? 'ویرایش' : 'ثبت', + onPressed: data.value + ? () async { + var res = await controller.createBuyer(); + if (res) { + Get.back(); + } + } + : null, + height: 40, + ); + }, controller.isBuyerSubmitButtonEnabled); + } + + Widget _provinceWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rootLogic.provinces, + onChanged: (value) { + controller.selectedProvince.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedProvince.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), + ); + }); + } + + Widget _cityWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: data, + onChanged: (value) { + controller.selectedCity.value = value; + print('Selected Product: ${value.name}'); + }, + selectedItem: controller.selectedCity.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), + ); + }, controller.cites); + } + + itemListWidget(OutProvinceCarcassesBuyer item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + + Expanded( + flex: 2, + child: Column( + children: [ + Text( + item.buyer?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2), + Text( + item.buyer?.mobile ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + + Expanded( + flex: 2, + child: Text( + '${item.unitName}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + Expanded( + flex: 2, + child: Text( + '${item.buyer?.province}\n${item.buyer?.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDark), + ), + ), + ], + ); + } + + itemListExpandedWidget(OutProvinceCarcassesBuyer item) { + return Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + controller.setEditDataBuyer(item); + Get.bottomSheet( + addOrEditBuyerBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), + + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + SizedBox(), + ], + ), + + buildRow(title: 'مشخصات خریدار', value: item.fullname ?? 'N/A'), + buildRow(title: 'نام واحد', value: item.unitName ?? 'N/A'), + buildRow( + title: 'تعداد درخواست ها', + value: '${item.requestsInfo?.numberOfRequests.separatedByComma}', + ), + buildRow( + title: 'وزن', + value: '${item.requestsInfo?.totalWeight.separatedByComma}', + ), + ], + ), + ); } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart new file mode 100644 index 0000000..b3d2716 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart @@ -0,0 +1,213 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/logic.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; +import 'package:rasadyar_core/core.dart'; + +class SalesOutOfProvinceSalesListLogic extends GetxController { + RootLogic get rootLogic => Get.find(); + + SaleLogic get saleLogic => Get.find(); + + SalesOutOfProvinceBuyersLogic get buyerLogic => + Get.find(); + + RxInt selectedSegmentIndex = 0.obs; + RxBool isExpanded = false.obs; + RxInt currentPage = 1.obs; + RxBool isSaleSubmitButtonEnabled = false.obs; + RxList isExpandedList = [].obs; + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); + RxList routesName = RxList(); + RxBool isLoadingMoreAllocationsMade = false.obs; + Rxn selectedCity = Rxn(); + + //TODO add this to Di + ImagePicker imagePicker = ImagePicker(); + + GlobalKey formKey = GlobalKey(); + TextEditingController quarantineCodeController = TextEditingController(); + TextEditingController saleWeightController = TextEditingController(); + Rx saleDate = Jalali.now().obs; + String? key; + + Rx>> salesList = + Resource>.loading().obs; + + Rxn selectedProduct = Rxn(); + Rxn selectedBuyer = Rxn(); + + @override + void onInit() { + super.onInit(); + getOutProvinceSales(); + } + + @override + void onReady() { + super.onReady(); + + debounce( + searchedValue, + (callback) => getOutProvinceSales(), + time: Duration(milliseconds: timeDebounce), + ); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } + + Future getOutProvinceSales([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + salesList.value = Resource>.loading(); + } + await safeCall( + call: () => rootLogic.chickenRepository.getStewardFreeSaleBar( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 20, + page: currentPage.value, + state: 'buyer-list', + search: 'filter', + role: 'Steward', + value: searchedValue.value ?? '', + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), + onSuccess: (res) { + if ((res?.count ?? 0) == 0) { + salesList.value = + Resource>.empty(); + } else { + salesList.value = + Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [ + ...(salesList.value.data?.results ?? []), + ...(res?.results ?? []), + ], + ), + ); + + isLoadingMoreAllocationsMade.value = false; + } + }, + ); + } + + void setupListeners() { + saleWeightController.addListener(checkSalesFormValid); + quarantineCodeController.addListener(checkSalesFormValid); + ever(selectedBuyer, (_) => checkSalesFormValid); + ever(selectedProduct, (_) => checkSalesFormValid); + ever(saleDate, (_) => checkSalesFormValid()); + } + + void checkSalesFormValid() { + isSaleSubmitButtonEnabled.value = + saleDate.value.toString().isNotEmpty && + selectedProduct.value != null && + selectedBuyer.value != null && + saleWeightController.text.isNotEmpty && + quarantineCodeController.text.isNotEmpty; + } + + void setEditDataSales(StewardFreeSaleBar item) { + quarantineCodeController.text = item.clearanceCode ?? ''; + saleWeightController.text = + item.weightOfCarcasses?.toInt().toString() ?? ''; + saleDate.value = Jalali.fromDateTime(DateTime.parse(item.date!)); + selectedCity.value = IranProvinceCityModel(name: item.city); + selectedBuyer.value = buyerLogic.buyerList.value.data?.results?.firstWhere( + (element) => element.key == item.buyer?.key, + ); + selectedProduct.value = saleLogic.rolesProductsModel.first; + key = item.key; + isSaleSubmitButtonEnabled.value = true; + } + + Future deleteStewardPurchaseOutOfProvince(String key) async { + await safeCall( + call: () => rootLogic.chickenRepository + .deleteStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + stewardFreeBarKey: key, + ), + ); + } + + Future createSale() async { + bool res = false; + StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( + buyerKey: selectedBuyer.value?.key, + numberOfCarcasses: 0, + weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), + date: saleDate.value.toDateTime().formattedDashedGregorian, + clearanceCode: quarantineCodeController.text, + productKey: selectedProduct.value?.key, + ); + await safeCall( + call: () => rootLogic.chickenRepository.createOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), + onSuccess: (_) { + res = true; + }, + ); + return res; + } + + void clearSaleForm() { + quarantineCodeController.clear(); + saleWeightController.clear(); + saleDate.value = Jalali.now(); + selectedBuyer.value = null; + selectedProduct.value = null; + } + + Future editSale() async { + bool res = false; + StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( + numberOfCarcasses: 0, + weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), + date: saleDate.value.toDateTime().formattedDashedGregorian, + clearanceCode: quarantineCodeController.text, + key: key, + ); + await safeCall( + call: () => rootLogic.chickenRepository.updateOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), + onSuccess: (_) { + res = true; + }, + ); + return res; + } + + void resetSubmitForm() { + selectedCity.value = null; + selectedProduct.value = null; + key = null; + } +} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart new file mode 100644 index 0000000..14bfa20 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -0,0 +1,429 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class SalesOutOfProvinceSalesListPage + extends GetView { + const SalesOutOfProvinceSalesListPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: ObxValue((data) { + return RPaginatedListView( + onLoadMore: () async => controller.getOutProvinceSales(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getOutProvinceSales(); + }, + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.timerSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.salesList), + floatingActionButton: RFab.add( + onPressed: () { + Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); + }, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, + ); + } + + itemListWidget(StewardFreeSaleBar item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + Expanded( + flex: 3, + child: Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + SizedBox(width: 4), + Expanded( + flex: 5, + child: Column( + children: [ + Text( + item.buyer?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2), + Text( + item.buyer?.mobile ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + SizedBox(width: 4), + Expanded( + flex: 4, + child: Column( + spacing: 8, + children: [ + Text( + item.buyer?.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma ?? 0}KG', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 2, + child: Text( + '${item.buyer?.province}\n${item.buyer?.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + ], + ); + } + + itemListExpandedWidget(StewardFreeSaleBar item) { + return Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + controller.setEditDataSales(item); + Get.bottomSheet( + addOrEditSaleBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + child: Assets.vec.editSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + ), + + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + + GestureDetector( + onTap: () { + buildDeleteDialog( + onConfirm: () => controller + .deleteStewardPurchaseOutOfProvince(item.key!), + onRefresh: () => controller.getOutProvinceSales(), + ); + }, + child: Assets.vec.trashSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), + ), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: buildRow( + title: 'تاریخ', + value: item.date?.formattedJalaliDateYHMS ?? 'N/A', + ), + ), + buildRow( + title: 'مشخصات خریدار', + value: item.buyer?.fullname ?? 'N/A', + ), + buildRow(title: 'تلفن خریدار', value: item.buyer?.mobile ?? 'N/A'), + buildRow(title: 'نام واحد', value: item.buyer?.unitName ?? 'N/A'), + buildRow( + title: 'وزن لاشه', + value: '${item.weightOfCarcasses?.separatedByComma}', + ), + ], + ), + ); + } + + Widget addOrEditSaleBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + height: 600, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش فروش' : 'افزودن فروش', + style: AppFonts.yekan16Bold.copyWith( + color: AppColor.darkGreyDarkHover, + ), + ), + _productWidget(), + _buyerWidget(), + RTextField( + controller: controller.saleWeightController, + label: 'وزن لاشه', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + + validator: (value) { + if (value == null) { + return 'لطفاً وزن لاشه را وارد کنید'; + } + return null; + }, + ), + RTextField( + controller: controller.quarantineCodeController, + label: 'کد قرنطینه', + borderColor: AppColor.darkGreyLight, + validator: (value) { + if (value == null) { + return 'لطفاً کد قرنطینه را وارد کنید'; + } + return null; + }, + ), + + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.saleDate, + onChanged: (jalali) => controller.saleDate.value = jalali, + ), + ), + ], + ), + + submitButtonWidget(isOnEdit), + SizedBox(), + ], + ), + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + text: isOnEdit ? 'ویرایش' : 'ثبت', + onPressed: data.value + ? () async { + var res = isOnEdit + ? await controller.editSale() + : await controller.createSale(); + if (res) { + controller.getOutProvinceSales(); + controller.clearSaleForm(); + Get.back(); + } + } + : null, + height: 40, + ); + }, controller.isSaleSubmitButtonEnabled); + } + + Widget _buyerWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.buyerLogic.buyerList.value.data?.results ?? [], + onChanged: (value) { + controller.selectedBuyer.value = value; + }, + selectedItem: controller.selectedBuyer.value, + itemBuilder: (item) => Text(item.buyer?.fullname ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.buyer?.fullname ?? 'انتخاب خریدار'), + ); + }); + } + + Widget _productWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: controller.saleLogic.rolesProductsModel, + onChanged: (value) { + controller.selectedProduct.value = value; + }, + selectedItem: controller.selectedProduct.value, + initialValue: controller.selectedProduct.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + ); + }, controller.selectedProduct); + } + + GestureDetector timeFilterWidget({ + isFrom = true, + required Rx date, + required Function(Jalali jalali) onChanged, + }) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.bgDark), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode( + AppColor.bgDark, + BlendMode.srcIn, + ), + ), + Text( + 'تاریخ', + style: AppFonts.yekan16.copyWith(color: AppColor.bgDark), + ), + Expanded( + child: ObxValue((data) { + return Text( + date.value.formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDark, + ), + ); + }, date), + ), + ], + ), + ), + ); + } + + Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'تایید', + ), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', + ), + SizedBox(width: 20), + ], + ), + ), + Divider(height: 0, thickness: 1), + Expanded( + child: Container( + child: PersianCupertinoDatePicker( + initialDateTime: controller.saleDate.value, + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, + ), + ), + ), + ], + ), + ); + } +} diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 0e384b0..b31b7c6 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -22,6 +22,9 @@ import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/search/logic.dart'; import 'package:rasadyar_core/core.dart'; +import '../pages/sales_out_of_province_buyers/logic.dart'; +import '../pages/sales_out_of_province_sales_list/logic.dart'; + sealed class ChickenPages { ChickenPages._(); @@ -80,10 +83,13 @@ sealed class ChickenPages { page: () => SalesOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(() => SalesOutOfProvinceLogic()); Get.lazyPut(() => RootLogic()); Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => SalesOutOfProvinceBuyersLogic()); + Get.lazyPut(() => SalesOutOfProvinceSalesListLogic()); + }), ), GetPage( diff --git a/packages/core/lib/data/model/pagination_model/pagination_model.dart b/packages/core/lib/data/model/pagination_model/pagination_model.dart index 61edb74..1f8cb2b 100644 --- a/packages/core/lib/data/model/pagination_model/pagination_model.dart +++ b/packages/core/lib/data/model/pagination_model/pagination_model.dart @@ -1,4 +1,5 @@ import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; part 'pagination_model.freezed.dart'; part 'pagination_model.g.dart'; @@ -16,4 +17,5 @@ abstract class PaginationModel with _$PaginationModel { Map json, T Function(Object?) fromJsonT, ) => _$PaginationModelFromJson(json, fromJsonT); + } \ No newline at end of file From 639a8dd585a0903edd167212a7fe9a4564fe20e7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 8 Jul 2025 07:14:56 +0330 Subject: [PATCH 179/256] fix : list items --- .../sales_out_of_province_buyers/view.dart | 50 ++--- .../view.dart | 87 +++++---- .../widget/overlay_dropdown_widget/view.dart | 182 ++++++++++++++++++ 3 files changed, 256 insertions(+), 63 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index 1ff77c3..f6bc1de 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -34,7 +34,7 @@ class SalesOutOfProvinceBuyersPage child: itemListWidget(item), secondChild: itemListExpandedWidget(item), labelColor: AppColor.blueLight, - labelIcon: Assets.vec.timerSvg.path, + labelIcon: Assets.vec.userRaduisSvg.path, ); }, controller.isExpandedList); }, @@ -121,6 +121,8 @@ class SalesOutOfProvinceBuyersPage Widget submitButtonWidget(bool isOnEdit) { return ObxValue((data) { return RElevated( + isFullWidth: true, + backgroundColor: AppColor.greenNormal, text: isOnEdit ? 'ویرایش' : 'ثبت', onPressed: data.value ? () async { @@ -137,7 +139,7 @@ class SalesOutOfProvinceBuyersPage Widget _provinceWidget() { return Obx(() { - return OverlayDropdownWidget( + return OverlayDropdownWidget2( items: controller.rootLogic.provinces, onChanged: (value) { controller.selectedProvince.value = value; @@ -223,27 +225,8 @@ class SalesOutOfProvinceBuyersPage spacing: 8, children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.start, children: [ - GestureDetector( - onTap: () { - controller.setEditDataBuyer(item); - Get.bottomSheet( - addOrEditBuyerBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - ), Text( '${item.province}-${item.city}', @@ -265,6 +248,29 @@ class SalesOutOfProvinceBuyersPage title: 'وزن', value: '${item.requestsInfo?.totalWeight.separatedByComma}', ), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditDataBuyer(item); + Get.bottomSheet( + addOrEditBuyerBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ], + ), ], ), ); diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index 14bfa20..8bcfeaa 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -34,7 +34,7 @@ class SalesOutOfProvinceSalesListPage onTap: () => controller.isExpandedList.toggle(index), index: index, child: itemListWidget(item), - secondChild: itemListExpandedWidget(item), + secondChild: itemListExpandedWidget(item, index), labelColor: AppColor.blueLight, labelIcon: Assets.vec.timerSvg.path, ); @@ -70,6 +70,7 @@ class SalesOutOfProvinceSalesListPage Expanded( flex: 5, child: Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ Text( item.buyer?.fullname ?? 'N/A', @@ -90,6 +91,7 @@ class SalesOutOfProvinceSalesListPage Expanded( flex: 4, child: Column( + mainAxisAlignment: MainAxisAlignment.center, spacing: 8, children: [ Text( @@ -117,7 +119,7 @@ class SalesOutOfProvinceSalesListPage ); } - itemListExpandedWidget(StewardFreeSaleBar item) { + itemListExpandedWidget(StewardFreeSaleBar item, int index) { return Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), @@ -129,51 +131,13 @@ class SalesOutOfProvinceSalesListPage spacing: 8, children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.start, children: [ - GestureDetector( - onTap: () { - controller.setEditDataSales(item); - Get.bottomSheet( - addOrEditSaleBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - }); - }, - child: Assets.vec.editSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), - ), - ), - Text( '${item.province}-${item.city}', textAlign: TextAlign.center, style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), - - GestureDetector( - onTap: () { - buildDeleteDialog( - onConfirm: () => controller - .deleteStewardPurchaseOutOfProvince(item.key!), - onRefresh: () => controller.getOutProvinceSales(), - ); - }, - child: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode( - AppColor.error, - BlendMode.srcIn, - ), - ), - ), ], ), Container( @@ -201,6 +165,45 @@ class SalesOutOfProvinceSalesListPage title: 'وزن لاشه', value: '${item.weightOfCarcasses?.separatedByComma}', ), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditDataSales(item); + Get.bottomSheet( + addOrEditSaleBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + controller.isExpandedList.remove(index); + controller.deleteStewardPurchaseOutOfProvince(item.key!); + }, + onRefresh: () => controller.getOutProvinceSales(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), ], ), ); @@ -277,6 +280,8 @@ class SalesOutOfProvinceSalesListPage Widget submitButtonWidget(bool isOnEdit) { return ObxValue((data) { return RElevated( + isFullWidth: true, + backgroundColor: AppColor.greenNormal, text: isOnEdit ? 'ویرایش' : 'ثبت', onPressed: data.value ? () async { diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index 1973c9f..a8c8a5f 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -139,3 +139,185 @@ class _OverlayDropdownState extends State> { ); } } + + +class OverlayDropdownWidget2 extends StatefulWidget { + final List items; + final T? selectedItem; + final T? initialValue; + final Widget Function(T item) itemBuilder; + final Widget Function(T? selected) labelBuilder; + final void Function(T selected)? onChanged; + final EdgeInsets? contentPadding; + final String Function(T item)? itemToString; + + const OverlayDropdownWidget2({ + super.key, + required this.items, + required this.itemBuilder, + required this.labelBuilder, + this.initialValue, + this.onChanged, + this.selectedItem, + this.contentPadding, + this.itemToString, + }); + + @override + State> createState() => _OverlayDropdownState2(); +} + +class _OverlayDropdownState2 extends State> { + final GlobalKey _key = GlobalKey(); + OverlayEntry? _overlayEntry; + final RxBool _isOpen = false.obs; + T? selectedItem; + + late TextEditingController _searchController; + late RxList _filteredItems; + + @override + void initState() { + super.initState(); + selectedItem = widget.selectedItem ?? widget.initialValue; + _searchController = TextEditingController(); + _filteredItems = RxList(widget.items); + } + + void _showOverlay() { + final renderBox = _key.currentContext!.findRenderObject() as RenderBox; + final size = renderBox.size; + final offset = renderBox.localToGlobal(Offset.zero); + final screenHeight = MediaQuery.of(context).size.height; + + final bool openUp = offset.dy + size.height + 300 > screenHeight; + + _searchController.clear(); + _filteredItems.value = widget.items; + + _overlayEntry = OverlayEntry( + builder: (_) => GestureDetector( + onTap: _removeOverlay, + behavior: HitTestBehavior.translucent, + child: Stack( + children: [ + Positioned( + left: offset.dx, + top: openUp ? offset.dy - 300 - 4 : offset.dy + size.height + 4, + width: size.width, + child: Material( + elevation: 4, + borderRadius: BorderRadius.circular(8), + child: Obx(() => Container( + decoration: BoxDecoration( + color: AppColor.bgLight, + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + constraints: BoxConstraints(maxHeight: 300), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: TextField( + controller: _searchController, + decoration: const InputDecoration( + hintText: 'جستجو...', + isDense: true, + contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + border: OutlineInputBorder(), + ), + onChanged: (query) { + _filteredItems.value = widget.items + .where((item) => + widget.itemToString?.call(item).toLowerCase().contains(query.toLowerCase()) ?? + false) + .toList(); + }, + ), + ), + if (_filteredItems.isEmpty) + const Padding( + padding: EdgeInsets.all(16.0), + child: Text("نتیجه‌ای یافت نشد."), + ), + if (_filteredItems.isNotEmpty) + Expanded( + child: ListView( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + children: _filteredItems.map((item) { + return InkWell( + onTap: () { + widget.onChanged?.call(item); + setState(() { + selectedItem = item; + }); + _removeOverlay(); + }, + child: Padding( + padding: widget.contentPadding ?? + const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: widget.itemBuilder(item), + ), + ); + }).toList(), + ), + ), + ], + ), + )), + ), + ), + ], + ), + ), + ); + + Overlay.of(context).insert(_overlayEntry!); + _isOpen.value = true; + } + + void _removeOverlay() { + _overlayEntry?.remove(); + _overlayEntry = null; + _isOpen.value = false; + } + + @override + void dispose() { + _removeOverlay(); + _searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return IgnorePointer( + ignoring: widget.items.isEmpty, + child: GestureDetector( + key: _key, + onTap: () { + _isOpen.value ? _removeOverlay() : _showOverlay(); + }, + child: Container( + height: 40, + width: Get.width, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + color: widget.items.isEmpty ? Colors.grey.shade200 : AppColor.bgLight, + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + child: Obx(() => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + widget.labelBuilder(selectedItem), + Icon(_isOpen.value ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, size: 14), + ], + )), + ), + ), + ); + } +} From bbaeb6c2a59fac19fc1b9d487f03739eea79f36d Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 8 Jul 2025 11:10:31 +0330 Subject: [PATCH 180/256] feat : new bottom sheet --- .../pages/buy_in_province/view.dart | 20 + .../pages/buy_out_of_province/view.dart | 20 + .../pages/sales_in_province/logic.dart | 80 ++-- .../pages/sales_in_province/view.dart | 405 +++++++++--------- .../pages/sales_out_of_province/view.dart | 20 + .../pagination_model/pagination_model.dart | 1 - .../bottom_sheet/base_bottom_sheet.dart | 2 +- .../presentation/widget/inputs/r_input.dart | 15 +- .../widget/overlay_dropdown_widget/view.dart | 165 ++++--- 9 files changed, 429 insertions(+), 299 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart index 9c19ef3..533c4c7 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart @@ -18,6 +18,7 @@ class BuyInProvincePage extends GetView { onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ + inventoryWidget(), segmentWidget(), ObxValue((index) { return Expanded( @@ -88,4 +89,23 @@ class BuyInProvincePage extends GetView { ), ); } + + Widget inventoryWidget() { + return Container( + width: Get.width, + height: 39, + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: AppColor.greenLight, + borderRadius: BorderRadius.circular(8), + ), + alignment: Alignment.center, + child: ObxValue((data) { + return Text( + ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), + ); + }, controller.rootLogic.inventoryModel), + ); + } } diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 05b6253..c2b6c11 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -24,6 +24,7 @@ class BuyOutOfProvincePage extends GetView { onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ + inventoryWidget(), Expanded( child: ObxValue((data) { return RPaginatedListView( @@ -554,4 +555,23 @@ class BuyOutOfProvincePage extends GetView { ), ); } + + Widget inventoryWidget() { + return Container( + width: Get.width, + height: 39, + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: AppColor.greenLight, + borderRadius: BorderRadius.circular(8), + ), + alignment: Alignment.center, + child: ObxValue((data) { + return Text( + ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), + ); + }, controller.rootLogic.inventoryModel), + ); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 3deaad8..27f86a7 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -74,16 +74,27 @@ class SalesInProvinceLogic extends GetxController { totalCost.value = callback * weight.value; }); + totalCost.listen((data) { - totalCostController.text = data.toString().separatedByComma; + totalCostController.text = data + .toString() + .separatedByComma; isValid.value = weight.value > 0 && - pricePerKilo.value > 0 && - totalCost.value > 0 && - selectedProductModel.value != null && - selectedGuildModel.value != null; + pricePerKilo.value > 0 && + totalCost.value > 0 && + selectedProductModel.value != null && + selectedGuildModel.value != null; }); + everAll([ + totalCost, + weight, + pricePerKilo, + totalCost, + selectedProductModel, + selectedGuildModel + ], (callback) => checkVerification(),); scrollControllerAllocationsMade.addListener(() { if (scrollControllerAllocationsMade.position.pixels >= @@ -95,7 +106,7 @@ class SalesInProvinceLogic extends GetxController { debounce( searchedValue, - (callback) => getAllocatedMade(), + (callback) => getAllocatedMade(), time: Duration(milliseconds: timeDebounce), ); } @@ -114,7 +125,8 @@ class SalesInProvinceLogic extends GetxController { } safeCall( - call: () async => await rootLogic.chickenRepository.getAllocatedMade( + call: () async => + await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( page: currentPage.value, @@ -154,15 +166,16 @@ class SalesInProvinceLogic extends GetxController { void checkVerification() { isValid.value = weight.value > 0 && - pricePerKilo.value > 0 && - totalCost.value > 0 && - selectedProductModel.value != null && - selectedGuildModel.value != null; + pricePerKilo.value > 0 && + totalCost.value > 0 && + selectedProductModel.value != null && + selectedGuildModel.value != null; } void confirmAllocation(ConformAllocation allocation) { safeCall( - call: () async => await rootLogic.chickenRepository.confirmAllocation( + call: () async => + await rootLogic.chickenRepository.confirmAllocation( token: rootLogic.tokenService.accessToken.value!, allocation: allocation.toJson(), ), @@ -175,7 +188,8 @@ class SalesInProvinceLogic extends GetxController { void denyAllocation(String token) { safeCall( - call: () async => await rootLogic.chickenRepository.denyAllocation( + call: () async => + await rootLogic.chickenRepository.denyAllocation( token: rootLogic.tokenService.accessToken.value!, allocationToken: token, ), @@ -188,7 +202,8 @@ class SalesInProvinceLogic extends GetxController { Future confirmAllAllocations() async { safeCall( - call: () async => await rootLogic.chickenRepository.confirmAllAllocation( + call: () async => + await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, allocationTokens: allocatedList.value.data?.results?.map((e) => e.key!).toList() ?? [], ), @@ -201,7 +216,8 @@ class SalesInProvinceLogic extends GetxController { Future getRolesProducts() async { safeCall( - call: () async => await rootLogic.chickenRepository.getRolesProducts( + call: () async => + await rootLogic.chickenRepository.getRolesProducts( token: rootLogic.tokenService.accessToken.value!, ), onSuccess: (result) { @@ -216,7 +232,8 @@ class SalesInProvinceLogic extends GetxController { Future getGuilds() async { safeCall( - call: () async => await rootLogic.chickenRepository.getGuilds( + call: () async => + await rootLogic.chickenRepository.getGuilds( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( queryParams: {'free': saleType.value == 2 ? true : false}, @@ -247,7 +264,8 @@ class SalesInProvinceLogic extends GetxController { Future getGuildProfile() async { await safeCall( - call: () async => await rootLogic.chickenRepository.getProfile( + call: () async => + await rootLogic.chickenRepository.getProfile( token: rootLogic.tokenService.accessToken.value!, ), onError: (error, stackTrace) {}, @@ -261,7 +279,8 @@ class SalesInProvinceLogic extends GetxController { tmpStewardAllocation = SubmitStewardAllocation( approvedPriceStatus: false, allocationType: - '${guildProfile.value?.steward == true ? "steward" : "guild"}_${selectedGuildModel.value?.steward == true ? "steward" : "guild"}', + '${guildProfile.value?.steward == true ? "steward" : "guild"}_${selectedGuildModel.value + ?.steward == true ? "steward" : "guild"}', sellerType: guildProfile.value?.steward == true ? "Steward" : "Guild", buyerType: selectedGuildModel.value?.steward == true ? "Steward" : "Guild", amount: pricePerKilo.value, @@ -271,14 +290,17 @@ class SalesInProvinceLogic extends GetxController { numberOfCarcasses: 0, guildKey: selectedGuildModel.value?.key, productKey: selectedProductModel.value?.key, - date: DateTime.now().formattedDashedGregorian, + date: DateTime + .now() + .formattedDashedGregorian, type: "manual", ); } Future submitAllocation() async { safeCall( - call: () async => await rootLogic.chickenRepository.postSubmitStewardAllocation( + call: () async => + await rootLogic.chickenRepository.postSubmitStewardAllocation( token: rootLogic.tokenService.accessToken.value!, request: tmpStewardAllocation!, ), @@ -292,7 +314,8 @@ class SalesInProvinceLogic extends GetxController { Future deleteAllocation(AllocatedMadeModel model) async { safeCall( - call: () async => await rootLogic.chickenRepository.deleteStewardAllocation( + call: () async => + await rootLogic.chickenRepository.deleteStewardAllocation( token: rootLogic.tokenService.accessToken.value!, queryParameters: {'steward_allocation_key': model.key}, ), @@ -318,9 +341,15 @@ class SalesInProvinceLogic extends GetxController { weight.value = item.weightOfCarcasses ?? 0; pricePerKilo.value = item.amount ?? 0; totalCost.value = item.totalAmount ?? 0; - weightController.text = weight.value.toString().separatedByComma; - pricePerKiloController.text = pricePerKilo.value.toString().separatedByComma; - totalCostController.text = totalCost.value.toString().separatedByComma; + weightController.text = weight.value + .toString() + .separatedByComma; + pricePerKiloController.text = pricePerKilo.value + .toString() + .separatedByComma; + totalCostController.text = totalCost.value + .toString() + .separatedByComma; isValid.value = true; } @@ -345,7 +374,8 @@ class SalesInProvinceLogic extends GetxController { ); safeCall( - call: () async => await rootLogic.chickenRepository.updateStewardAllocation( + call: () async => + await rootLogic.chickenRepository.updateStewardAllocation( token: rootLogic.tokenService.accessToken.value!, request: updatedAllocationModel, ), diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index dd3a02a..965a3f8 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; @@ -19,10 +20,7 @@ class SalesInProvincePage extends GetView { Widget build(BuildContext context) { return Scaffold( body: BasePage( - routesWidget: ObxValue( - (route) => buildPageRoute(route), - controller.routesName, - ), + routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName), onBackPressed: () => Get.back(id: 1), onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), @@ -89,10 +87,7 @@ class SalesInProvincePage extends GetView { await controller.confirmAllAllocations(); }, message: 'تایید یکجا', - icon: Assets.vec.clipboardTaskSvg.svg( - width: 40.w, - height: 40.h, - ), + icon: Assets.vec.clipboardTaskSvg.svg(width: 40.w, height: 40.h), backgroundColor: controller.bgConfirmAllColor.value, ), ); @@ -109,10 +104,7 @@ class SalesInProvincePage extends GetView { width: Get.width, height: 39, margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration( - color: AppColor.greenLight, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), alignment: Alignment.center, child: ObxValue((data) { return Text( @@ -165,18 +157,13 @@ class SalesInProvincePage extends GetView { child: Assets.vec.hotChickenSvg.svg( width: 24, height: 24, - colorFilter: ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ), Text( '${item.weightOfCarcasses?.separatedByComma}kg', textAlign: TextAlign.left, - style: AppFonts.yekan12.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), ], ), @@ -207,10 +194,7 @@ class SalesInProvincePage extends GetView { itemListExpandedWidget(AllocatedMadeModel item, int index) { return Container( padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, children: [ @@ -250,16 +234,12 @@ class SalesInProvincePage extends GetView { children: [ Text( item.date?.toJalali.formatter.wN ?? 'N/A', - style: AppFonts.yekan14.copyWith( - color: AppColor.textColor, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), ), Text( '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), ], ), @@ -279,8 +259,7 @@ class SalesInProvincePage extends GetView { buildRow( title: 'نام و نام خانوادگی فروشنده', - value: - controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', + value: controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', ), buildRow( @@ -298,20 +277,12 @@ class SalesInProvincePage extends GetView { title: 'افت وزن(کیلوگرم)', value: item.weightLossOfCarcasses?.toInt().toString() ?? 'N/A', ), - buildRow( - title: 'قیمت کل', - value: '${item.totalAmount?.separatedByComma} ریال', - ), + buildRow(title: 'قیمت کل', value: '${item.totalAmount?.separatedByComma} ریال'), - buildRow( - title: 'کداحراز', - value: item.registrationCode?.toString() ?? 'ندارد', - ), + buildRow(title: 'کداحراز', value: item.registrationCode?.toString() ?? 'ندارد'), buildRow( title: 'وضعیت کد احراز', - value: item.systemRegistrationCode == true - ? "ارسال شده" - : "ارسال نشده", + value: item.systemRegistrationCode == true ? "ارسال شده" : "ارسال نشده", ), Row( @@ -360,45 +331,36 @@ class SalesInProvincePage extends GetView { Widget addOrEditBottomSheet([bool isEditMode = false]) { return BaseBottomSheet( height: Get.height * (isEditMode ? 0.45 : 0.75), - child: Padding( - padding: EdgeInsets.only( - left: 16, - right: 16, - top: 16, - bottom: MediaQuery.of(Get.context!).viewInsets.bottom + 16, - ), - child: Form( - key: controller.formKey, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - '${isEditMode ? 'ویرایش' : 'ثبت'} توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, + child: Form( + key: controller.formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '${isEditMode ? 'ویرایش' : 'ثبت'} توزیع/ فروش', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.textColor), + ), + const SizedBox(height: 12), + productDropDown(), + const SizedBox(height: 12), + Visibility( + visible: isEditMode == false, + child: Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), ), - ), - Visibility( - visible: isEditMode == false, + child: Column( children: [ - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), - ), - const SizedBox(height: 12), - Material( - type: MaterialType.transparency, - child: productDropDown(), - ), - const SizedBox(height: 12), + const SizedBox(height: 8), SizedBox( height: 40, child: ObxValue((data) { return Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ Radio( value: 1, @@ -430,99 +392,129 @@ class SalesInProvincePage extends GetView { ], ), ), - const SizedBox(height: 12), - RTextField( - controller: controller.weightController, - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], - validator: (value) { - if (int.parse(value!.clearComma) > - (controller - .rootLogic - .inventoryModel - .value - ?.totalRemainWeight - ?.toInt() ?? - 100)) { - return 'وزن تخصیصی بیشتر از موجودی انبار است'; - } - return null; - }, - onChanged: (p0) { - controller.weight.value = int.tryParse(p0.clearComma) ?? 0; - }, - label: 'وزن لاشه', + ), + const SizedBox(height: 12), + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), ), - const SizedBox(height: 12), - RTextField( - controller: controller.pricePerKiloController, - borderColor: AppColor.darkGreyLight, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], + child: Column( + spacing: 12, + children: [ + Visibility( + visible: isEditMode == false, + child: Column( + children: [ + const SizedBox(height: 8), + ObxValue((data) { + return RTextField( + controller: TextEditingController(), + filledColor: AppColor.bgLight, + filled: true, + label: 'تاریخ', + onTap: () { + Get.bottomSheet( + modalDatePicker((value) { + controller.fromDateFilter.value = value; + controller.fromDateFilter.refresh(); + }), + ); + }, + borderColor: AppColor.darkGreyLight, + initText: (data.value ?? Jalali.now()).formatCompactDate(), + ); + }, controller.fromDateFilter), + ], + ), + ), - onChanged: (p0) { - controller.pricePerKilo.value = - int.tryParse(p0.clearComma) ?? 0; - }, - keyboardType: TextInputType.number, - label: 'قیمت هر کیلو', - ), - const SizedBox(height: 12), - RTextField( - enabled: false, - keyboardType: TextInputType.number, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], - borderColor: AppColor.darkGreyLight, - controller: controller.totalCostController, - label: 'هزینه کل', - ), - const SizedBox(height: 20), - ObxValue((data) { - return RElevated( - text: isEditMode ? 'ویرایش' : 'ثبت', - isFullWidth: true, - textStyle: AppFonts.yekan16.copyWith(color: Colors.white), - height: 40, - onPressed: data.value - ? () async { - if (controller.formKey.currentState?.validate() ?? - false) { - iLog("s2"); - controller.setSubmitData(); - iLog("s3"); - // Get.bottomSheet(show2StepAddBottomSheet()); - } - /* isEditMode - ? await controller.updateAllocation() - : () { - iLog("s1"); - if (controller.formKey.currentState?.validate() ?? false) { - iLog("s2"); - controller.setSubmitData(); - iLog("s3"); - Get.bottomSheet(show2StepAddBottomSheet()); - } - }; + RTextField( + controller: controller.weightController, + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + validator: (value) { + if (int.parse(value!.clearComma) > + (controller.rootLogic.inventoryModel.value?.totalRemainWeight?.toInt() ?? + 100)) { + return 'وزن تخصیصی بیشتر از موجودی انبار است'; + } + return null; + }, + onChanged: (p0) { + controller.weight.value = int.tryParse(p0.clearComma) ?? 0; + }, + label: 'وزن لاشه', + ), - controller.clearForm(); - controller.getAllocatedMade(); - Get.back();*/ - } - : null, - ); - }, controller.isValid), - const SizedBox(height: 20), - ], - ), + RTextField( + controller: controller.pricePerKiloController, + borderColor: AppColor.darkGreyLight, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + filledColor: AppColor.bgLight, + filled: true, + onChanged: (p0) { + controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; + }, + keyboardType: TextInputType.number, + label: 'قیمت هر کیلو', + ), + + RTextField( + variant: RTextFieldVariant.noBorder, + enabled: false, + keyboardType: TextInputType.number, + filledColor: AppColor.bgLight, + filled: true, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + controller: controller.totalCostController, + label: 'هزینه کل', + ), + + ObxValue((data) { + return RElevated( + text: isEditMode ? 'ویرایش' : 'ثبت', + isFullWidth: true, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + height: 40, + onPressed: data.value + ? () async { + if (isEditMode) { + await controller.updateAllocation(); + controller.clearForm(); + controller.getAllocatedMade(); + controller.rootLogic.getInventory(); + Get.back(); + } else { + if (controller.formKey.currentState?.validate() ?? false) { + controller.setSubmitData(); + await Get.bottomSheet(show2StepAddBottomSheet()); + } + } + } + : null, + ); + }, controller.isValid), + ], + ), + ), + const SizedBox(height: 20), + ], ), ), ); @@ -556,12 +548,28 @@ class SalesInProvincePage extends GetView { return Obx(() { return OverlayDropdownWidget( items: controller.rolesProductsModel, + height: 56, + hasDropIcon: false, + background: Colors.white, onChanged: (value) { controller.selectedProductModel.value = value; }, selectedItem: controller.selectedProductModel.value, itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + labelBuilder: (item) => Row( + spacing: 8, + children: [ + (item?.name?.contains('مرغ گرم') ?? false) + ? Assets.images.chicken.image(width: 40, height: 40) + : Assets.vec.placeHolderSvg.svg(width: 40, height: 40), + + Text(item?.name ?? 'انتخاب محصول'), + Spacer(), + Text( + 'موجودی:${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0}', + ), + ], + ), ); }); } @@ -572,20 +580,14 @@ class SalesInProvincePage extends GetView { child: Column( spacing: 16, children: [ - Text( - 'فیلترها', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), Row( spacing: 8, children: [ Expanded( child: timeFilterWidget( date: controller.fromDateFilter, - onChanged: (jalali) => - controller.fromDateFilter.value = jalali, + onChanged: (jalali) => controller.fromDateFilter.value = jalali, ), ), Expanded( @@ -634,10 +636,7 @@ class SalesInProvincePage extends GetView { Assets.vec.calendarSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - AppColor.blueNormal, - BlendMode.srcIn, - ), + colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), Text( isFrom ? 'از' : 'تا', @@ -646,12 +645,9 @@ class SalesInProvincePage extends GetView { Expanded( child: ObxValue((data) { return Text( - date.value?.formatCompactDate() ?? - Jalali.now().formatCompactDate(), + date.value?.formatCompactDate() ?? Jalali.now().formatCompactDate(), textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.lightGreyNormalActive, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.lightGreyNormalActive), ); }, date), ), @@ -716,33 +712,48 @@ class SalesInProvincePage extends GetView { ); } - /* Widget show2StepAddBottomSheet() { + Widget show2StepAddBottomSheet() { return BaseBottomSheet( - height: Get.height*.35, + height: Get.height * .35, child: Column( spacing: 8, children: [ - buildRow('تاریخ ثبت', controller.tmpStewardAllocation?.date?.formattedJalaliDate ?? 'N/A'), buildRow( - 'نام و نام خانوادگی خریدار', - controller.guildsModel + title: 'تاریخ ثبت', + value: controller.tmpStewardAllocation?.date?.formattedJalaliDate ?? 'N/A', + ), + buildRow( + title: 'نام و نام خانوادگی خریدار', + value: + controller.guildsModel .firstWhere((p0) => p0.key == controller.tmpStewardAllocation?.guildKey) .user ?.fullname ?? 'N/A', ), buildRow( - 'شماره خریدار', - controller.guildsModel.firstWhere((p0) => p0.key == controller.tmpStewardAllocation?.guildKey).user?.mobile ?? + title: 'شماره خریدار', + value: + controller.guildsModel + .firstWhere((p0) => p0.key == controller.tmpStewardAllocation?.guildKey) + .user + ?.mobile ?? 'N/A', ), - buildRow('قیمت هر کیلو', '${controller.tmpStewardAllocation?.amount.separatedByComma ?? 0} ریال '), buildRow( - 'وزن تخصیصی', - '${controller.tmpStewardAllocation?.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', + title: 'قیمت هر کیلو', + value: '${controller.tmpStewardAllocation?.amount.separatedByComma ?? 0} ریال ', + ), + buildRow( + title: 'وزن تخصیصی', + value: + '${controller.tmpStewardAllocation?.weightOfCarcasses?.toInt().separatedByComma ?? 0} کیلوگرم', + ), + buildRow( + title: 'قیمت کل', + value: '${controller.tmpStewardAllocation?.totalAmount.separatedByComma ?? 0} ریال', ), - buildRow('قیمت کل', '${controller.tmpStewardAllocation?.totalAmount.separatedByComma ?? 0} ریال'), Row( spacing: 10, @@ -754,8 +765,10 @@ class SalesInProvincePage extends GetView { text: 'ثبت', textStyle: AppFonts.yekan18.copyWith(color: Colors.white), onPressed: () async { - await controller.submitAllocation(); - Get..back()..back(); + await controller.submitAllocation(); + Get + ..back() + ..back(); }, ), ), @@ -775,5 +788,5 @@ class SalesInProvincePage extends GetView { ], ), ); - }*/ + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index ac3f977..f03e7b6 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -21,6 +21,7 @@ class SalesOutOfProvincePage extends GetView { onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ + inventoryWidget(), segmentWidget(), Expanded( child: ObxValue((index) { @@ -100,4 +101,23 @@ class SalesOutOfProvincePage extends GetView { ), ); } + + Widget inventoryWidget() { + return Container( + width: Get.width, + height: 39, + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: AppColor.greenLight, + borderRadius: BorderRadius.circular(8), + ), + alignment: Alignment.center, + child: ObxValue((data) { + return Text( + ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), + ); + }, controller.rootLogic.inventoryModel), + ); + } } diff --git a/packages/core/lib/data/model/pagination_model/pagination_model.dart b/packages/core/lib/data/model/pagination_model/pagination_model.dart index 1f8cb2b..67a30bd 100644 --- a/packages/core/lib/data/model/pagination_model/pagination_model.dart +++ b/packages/core/lib/data/model/pagination_model/pagination_model.dart @@ -1,5 +1,4 @@ import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; part 'pagination_model.freezed.dart'; part 'pagination_model.g.dart'; diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart index f32398b..71cbaff 100644 --- a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -13,7 +13,7 @@ class BaseBottomSheet extends StatelessWidget { Widget build(BuildContext context) { return Container( height: height ?? MediaQuery.of(context).size.height * 0.85, - padding: EdgeInsets.symmetric(vertical: 15, horizontal: 20), + padding: EdgeInsets.symmetric(vertical: 15, horizontal: 10), decoration: BoxDecoration( color: bgColor ?? Colors.white, borderRadius: BorderRadius.only( diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index acb3711..932e915 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -34,6 +34,7 @@ class RTextField extends StatefulWidget { final FormFieldValidator? validator; final void Function(String)? onChanged; final void Function(String)? onSubmitted; + final VoidCallback? onTap; final List? inputFormatters; final Widget? suffix; @@ -68,6 +69,7 @@ class RTextField extends StatefulWidget { this.onSubmitted, this.borderColor, this.inputFormatters, + this.onTap, this.suffix, }); @@ -80,12 +82,12 @@ class RTextField extends StatefulWidget { bool get _passwordNoBorder => variant == RTextFieldVariant.passwordNoBorder; - InputBorder get _inputBorder => _noBorder || _passwordNoBorder - ? InputBorder.none - : OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: borderColor ?? AppColor.lightGreyDarkActive, width: 1), - ); + InputBorder get _inputBorder => OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + borderSide: _noBorder || _passwordNoBorder + ? BorderSide.none + : BorderSide(color: borderColor ?? AppColor.darkGreyLight, width: 1), + ); } class _RTextFieldState extends State { @@ -142,6 +144,7 @@ class _RTextFieldState extends State { inputFormatters: widget.inputFormatters, enabled: widget.enabled, obscureText: obscure, + onTap: widget.onTap, onTapOutside: (_) => FocusScope.of(context).unfocus(), onFieldSubmitted: widget.onSubmitted, maxLength: widget.maxLength, diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index a8c8a5f..345e21a 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -7,6 +7,9 @@ class OverlayDropdownWidget extends StatefulWidget { final List items; final T? selectedItem; final T? initialValue; + final int? height; + final Color? background; + final bool? hasDropIcon; final Widget Function(T item) itemBuilder; final Widget Function(T? selected) labelBuilder; final void Function(T selected)? onChanged; @@ -21,6 +24,9 @@ class OverlayDropdownWidget extends StatefulWidget { this.onChanged, this.selectedItem, this.contentPadding, + this.height, + this.background, + this.hasDropIcon = true, }); @override @@ -58,7 +64,6 @@ class _OverlayDropdownState extends State> { elevation: 4, borderRadius: BorderRadius.circular(8), child: Container( - decoration: BoxDecoration( color: AppColor.bgLight, border: Border.all(color: AppColor.darkGreyLight), @@ -81,7 +86,9 @@ class _OverlayDropdownState extends State> { _removeOverlay(); }, child: Padding( - padding: widget.contentPadding ?? const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + padding: + widget.contentPadding ?? + const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: widget.itemBuilder(item), ), ); @@ -120,19 +127,25 @@ class _OverlayDropdownState extends State> { _isOpen.value ? _removeOverlay() : _showOverlay(); }, child: Container( - height: 40, + height: widget.height?.toDouble() ?? 40, width: Get.width, padding: const EdgeInsets.symmetric(horizontal: 12), decoration: BoxDecoration( - color: AppColor.bgLight, + color: widget.background ?? AppColor.bgLight, border: Border.all(color: AppColor.darkGreyLight), borderRadius: BorderRadius.circular(8), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - widget.labelBuilder(selectedItem), - Icon(_isOpen.value ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, size: 14), + Expanded(child: widget.labelBuilder(selectedItem)), + Visibility( + visible: widget.hasDropIcon!, + child: Icon( + _isOpen.value ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, + size: 14, + ), + ), ], ), ), @@ -140,7 +153,6 @@ class _OverlayDropdownState extends State> { } } - class OverlayDropdownWidget2 extends StatefulWidget { final List items; final T? selectedItem; @@ -208,65 +220,73 @@ class _OverlayDropdownState2 extends State> { child: Material( elevation: 4, borderRadius: BorderRadius.circular(8), - child: Obx(() => Container( - decoration: BoxDecoration( - color: AppColor.bgLight, - border: Border.all(color: AppColor.darkGreyLight), - borderRadius: BorderRadius.circular(8), - ), - constraints: BoxConstraints(maxHeight: 300), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(8), - child: TextField( - controller: _searchController, - decoration: const InputDecoration( - hintText: 'جستجو...', - isDense: true, - contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), - border: OutlineInputBorder(), - ), - onChanged: (query) { - _filteredItems.value = widget.items - .where((item) => - widget.itemToString?.call(item).toLowerCase().contains(query.toLowerCase()) ?? - false) - .toList(); - }, - ), - ), - if (_filteredItems.isEmpty) - const Padding( - padding: EdgeInsets.all(16.0), - child: Text("نتیجه‌ای یافت نشد."), - ), - if (_filteredItems.isNotEmpty) - Expanded( - child: ListView( - shrinkWrap: true, - physics: const BouncingScrollPhysics(), - children: _filteredItems.map((item) { - return InkWell( - onTap: () { - widget.onChanged?.call(item); - setState(() { - selectedItem = item; - }); - _removeOverlay(); - }, - child: Padding( - padding: widget.contentPadding ?? - const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: widget.itemBuilder(item), - ), - ); - }).toList(), + child: Obx( + () => Container( + decoration: BoxDecoration( + color: AppColor.bgLight, + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + constraints: BoxConstraints(maxHeight: 300), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8), + child: TextField( + controller: _searchController, + decoration: const InputDecoration( + hintText: 'جستجو...', + isDense: true, + contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), + border: OutlineInputBorder(), + ), + onChanged: (query) { + _filteredItems.value = widget.items + .where( + (item) => + widget.itemToString + ?.call(item) + .toLowerCase() + .contains(query.toLowerCase()) ?? + false, + ) + .toList(); + }, ), ), - ], + if (_filteredItems.isEmpty) + const Padding( + padding: EdgeInsets.all(16.0), + child: Text("نتیجه‌ای یافت نشد."), + ), + if (_filteredItems.isNotEmpty) + Expanded( + child: ListView( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + children: _filteredItems.map((item) { + return InkWell( + onTap: () { + widget.onChanged?.call(item); + setState(() { + selectedItem = item; + }); + _removeOverlay(); + }, + child: Padding( + padding: + widget.contentPadding ?? + const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: widget.itemBuilder(item), + ), + ); + }).toList(), + ), + ), + ], + ), ), - )), + ), ), ), ], @@ -309,13 +329,18 @@ class _OverlayDropdownState2 extends State> { border: Border.all(color: AppColor.darkGreyLight), borderRadius: BorderRadius.circular(8), ), - child: Obx(() => Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - widget.labelBuilder(selectedItem), - Icon(_isOpen.value ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, size: 14), - ], - )), + child: Obx( + () => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(child: widget.labelBuilder(selectedItem)), + Icon( + _isOpen.value ? CupertinoIcons.chevron_up : CupertinoIcons.chevron_down, + size: 14, + ), + ], + ), + ), ), ), ); From 8b656d491571d295550ed27efd3c407f4cdffc26 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 8 Jul 2025 11:56:38 +0330 Subject: [PATCH 181/256] fix : pagination list and load more and refresh --- .../pages/buy_in_province_waiting/logic.dart | 21 ++- .../pages/buy_in_province_waiting/view.dart | 6 +- .../pages/buy_out_of_province/logic.dart | 29 +++- .../pages/buy_out_of_province/view.dart | 12 +- .../sales_out_of_province_buyers/view.dart | 136 ++++++++++-------- .../logic.dart | 1 + .../view.dart | 131 ++++++++++------- 7 files changed, 212 insertions(+), 124 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart index f4c0fbd..9be6f7b 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -15,7 +15,8 @@ class BuyInProvinceWaitingLogic extends GetxController { RxnString searchedValue = RxnString(); RxMap isLoadingConfirmMap = RxMap(); Rx bgConfirmAllColor = AppColor.blueNormal.obs; - + RxInt currentPage = 1.obs; + final RxBool isLoadingMoreAllocationsMade = false.obs; RootLogic rootLogic = Get.find(); Rx>> waitingProduct = Resource>.loading().obs; @@ -45,14 +46,26 @@ class BuyInProvinceWaitingLogic extends GetxController { searchedValue.value = data?.trim(); } - Future getWaitingArrivals() async { + Future getWaitingArrivals([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + waitingProduct.value = Resource>.loading(); + } + + if (searchedValue.value != null && + searchedValue.value!.trim().isNotEmpty && + currentPage.value > 1) { + currentPage.value = 1; // Reset to first page if search value is set + } + safeCall( call: () async => await rootLogic.chickenRepository.getWaitingArrivals( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( queryParams: {'type': 'not_entered'}, - pageSize: 10, - page: 1, + pageSize: 20, + page: currentPage.value, search: 'filter', role: 'Steward', value: searchedValue.value, diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index d5657fb..8e94937 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -35,7 +35,11 @@ class BuyInProvinceWaitingPage extends GetView { }, itemCount: data.value.data?.results?.length ?? 0, separatorBuilder: (context, index) => SizedBox(height: 8.h), - onLoadMore: () async {}, + onLoadMore: () async => controller.getWaitingArrivals(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getWaitingArrivals(); + }, ); }, controller.waitingProduct), ), diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index c8ad281..2b29ed0 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -7,14 +7,16 @@ import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_f import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class BuyOutOfProvinceLogic extends GetxController { + late List routesName; RxBool isExpanded = false.obs; RxBool isSubmitButtonEnabled = false.obs; RxList isExpandedList = [].obs; - - late List routesName; + final RxInt currentPage = 1.obs; + final RxBool isLoadingMoreAllocationsMade = false.obs; //TODO add this to Di ImagePicker imagePicker = ImagePicker(); @@ -61,6 +63,12 @@ class BuyOutOfProvinceLogic extends GetxController { }); setupListeners(); + + debounce( + searchedValue, + (callback) => getStewardPurchaseOutOfProvince(), + time: Duration(milliseconds: timeDebounce), + ); } @override @@ -75,17 +83,26 @@ class BuyOutOfProvinceLogic extends GetxController { void setSearchValue(String? data) { searchedValue.value = data?.trim(); - getStewardPurchaseOutOfProvince(); } - Future getStewardPurchaseOutOfProvince() async { - purchaseOutOfProvinceList.value = Resource>.loading(); + Future getStewardPurchaseOutOfProvince([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + purchaseOutOfProvinceList.value = Resource>.loading(); + } + + if (searchedValue.value != null && + searchedValue.value!.trim().isNotEmpty && + currentPage.value > 1) { + currentPage.value = 1; // Reset to first page if search value is set + } await safeCall( call: () => rootLogic.chickenRepository.getStewardPurchasesOutSideOfTheProvince( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( pageSize: 10, - page: 1, + page: currentPage.value, search: 'filter', role: 'Steward', value: searchedValue.value, diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index c2b6c11..329dc27 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -47,7 +47,11 @@ class BuyOutOfProvincePage extends GetView { }, itemCount: data.value.data?.results?.length ?? 0, separatorBuilder: (context, index) => SizedBox(height: 8.h), - onLoadMore: () async {}, + onLoadMore: () async => controller.getStewardPurchaseOutOfProvince(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getStewardPurchaseOutOfProvince(); + }, ); }, controller.purchaseOutOfProvinceList), ), @@ -561,10 +565,7 @@ class BuyOutOfProvincePage extends GetView { width: Get.width, height: 39, margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration( - color: AppColor.greenLight, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), alignment: Alignment.center, child: ObxValue((data) { return Text( @@ -574,4 +575,5 @@ class BuyOutOfProvincePage extends GetView { }, controller.rootLogic.inventoryModel), ); } + } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index f6bc1de..47ab8cd 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -7,8 +7,7 @@ import 'package:rasadyar_core/core.dart'; import 'logic.dart'; -class SalesOutOfProvinceBuyersPage - extends GetView { +class SalesOutOfProvinceBuyersPage extends GetView { const SalesOutOfProvinceBuyersPage({super.key}); @override @@ -44,10 +43,7 @@ class SalesOutOfProvinceBuyersPage }, controller.buyerList), floatingActionButton: RFab.add( onPressed: () { - Get.bottomSheet( - addOrEditBuyerBottomSheet(), - isScrollControlled: true, - ); + Get.bottomSheet(addOrEditBuyerBottomSheet(), isScrollControlled: true); }, ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, @@ -61,55 +57,82 @@ class SalesOutOfProvinceBuyersPage child: Form( key: controller.formKey, child: Column( - spacing: 16, + spacing: 8, children: [ Text( isOnEdit ? 'ویرایش خریدار' : 'افزودن خریدار', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column(spacing: 12, children: [_provinceWidget(), _cityWidget()]), + ), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 12, + children: [ + RTextField( + controller: controller.buyerNameController, + label: 'نام خریدار', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.buyerLastNameController, + label: 'نام خانوادگی خریدار', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.buyerPhoneController, + label: 'تلفن خریدار', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + maxLength: 11, + validator: (value) { + if (value == null || value.isEmpty) { + return 'لطفاً شماره موبایل را وارد کنید'; + } + // حذف کاماها برای اعتبارسنجی + String cleaned = value.replaceAll(',', ''); + if (cleaned.length != 11) { + return 'شماره موبایل باید ۱۱ رقم باشد'; + } + if (!cleaned.startsWith('09')) { + return 'شماره موبایل باید با 09 شروع شود'; + } + return null; + }, + ), + RTextField( + controller: controller.buyerUnitNameController, + label: 'نام واحد', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + + submitButtonWidget(isOnEdit), + ], ), ), - - RTextField( - controller: controller.buyerPhoneController, - label: 'تلفن خریدار', - keyboardType: TextInputType.phone, - borderColor: AppColor.darkGreyLight, - maxLength: 11, - validator: (value) { - if (value == null || value.isEmpty) { - return 'لطفاً شماره موبایل را وارد کنید'; - } - // حذف کاماها برای اعتبارسنجی - String cleaned = value.replaceAll(',', ''); - if (cleaned.length != 11) { - return 'شماره موبایل باید ۱۱ رقم باشد'; - } - if (!cleaned.startsWith('09')) { - return 'شماره موبایل باید با 09 شروع شود'; - } - return null; - }, - ), - RTextField( - controller: controller.buyerNameController, - label: 'نام خریدار', - borderColor: AppColor.darkGreyLight, - ), - RTextField( - controller: controller.buyerLastNameController, - label: 'نام خانوادگی خریدار', - borderColor: AppColor.darkGreyLight, - ), - - RTextField( - controller: controller.buyerUnitNameController, - label: 'نام واحد', - borderColor: AppColor.darkGreyLight, - ), - _provinceWidget(), - _cityWidget(), - submitButtonWidget(isOnEdit), SizedBox(), ], ), @@ -139,7 +162,7 @@ class SalesOutOfProvinceBuyersPage Widget _provinceWidget() { return Obx(() { - return OverlayDropdownWidget2( + return OverlayDropdownWidget( items: controller.rootLogic.provinces, onChanged: (value) { controller.selectedProvince.value = value; @@ -217,17 +240,13 @@ class SalesOutOfProvinceBuyersPage return Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Text( '${item.province}-${item.city}', textAlign: TextAlign.center, @@ -244,10 +263,7 @@ class SalesOutOfProvinceBuyersPage title: 'تعداد درخواست ها', value: '${item.requestsInfo?.numberOfRequests.separatedByComma}', ), - buildRow( - title: 'وزن', - value: '${item.requestsInfo?.totalWeight.separatedByComma}', - ), + buildRow(title: 'وزن', value: '${item.requestsInfo?.totalWeight.separatedByComma}'), Row( mainAxisAlignment: MainAxisAlignment.center, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart index b3d2716..ea1223b 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart @@ -56,6 +56,7 @@ class SalesOutOfProvinceSalesListLogic extends GetxController { void onReady() { super.onReady(); + selectedProduct.value = saleLogic.rolesProductsModel.first; debounce( searchedValue, (callback) => getOutProvinceSales(), diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index 8bcfeaa..f86edb3 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -211,7 +211,7 @@ class SalesOutOfProvinceSalesListPage Widget addOrEditSaleBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( - height: 600, + height: 500.h, child: SingleChildScrollView( child: Form( key: controller.formKey, @@ -224,51 +224,67 @@ class SalesOutOfProvinceSalesListPage color: AppColor.darkGreyDarkHover, ), ), - _productWidget(), - _buyerWidget(), - RTextField( - controller: controller.saleWeightController, - label: 'وزن لاشه', - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, + _productDropDown(), - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], - validator: (value) { - if (value == null) { - return 'لطفاً وزن لاشه را وارد کنید'; - } - return null; - }, - ), - RTextField( - controller: controller.quarantineCodeController, - label: 'کد قرنطینه', - borderColor: AppColor.darkGreyLight, - validator: (value) { - if (value == null) { - return 'لطفاً کد قرنطینه را وارد کنید'; - } - return null; - }, - ), - - Row( - spacing: 8, - children: [ - Expanded( - child: timeFilterWidget( - date: controller.saleDate, - onChanged: (jalali) => controller.saleDate.value = jalali, + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 12, + children: [ + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.saleDate, + onChanged: (jalali) => controller.saleDate.value = jalali, + ), + ), + ], ), - ), - ], - ), + _buyerWidget(), + RTextField( + controller: controller.saleWeightController, + label: 'وزن لاشه', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], - submitButtonWidget(isOnEdit), + validator: (value) { + if (value == null) { + return 'لطفاً وزن لاشه را وارد کنید'; + } + return null; + }, + ), + RTextField( + controller: controller.quarantineCodeController, + label: 'کد قرنطینه', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null) { + return 'لطفاً کد قرنطینه را وارد کنید'; + } + return null; + }, + ), + submitButtonWidget(isOnEdit), + ], + ), + ), SizedBox(), ], ), @@ -314,21 +330,39 @@ class SalesOutOfProvinceSalesListPage }); } - Widget _productWidget() { - return ObxValue((data) { + + Widget _productDropDown() { + return Obx(() { return OverlayDropdownWidget( items: controller.saleLogic.rolesProductsModel, + height: 56, + hasDropIcon: false, + background: Colors.white, onChanged: (value) { controller.selectedProduct.value = value; }, selectedItem: controller.selectedProduct.value, initialValue: controller.selectedProduct.value, itemBuilder: (item) => Text(item.name ?? 'بدون نام'), - labelBuilder: (item) => Text(item?.name ?? 'انتخاب محصول'), + labelBuilder: (item) => Row( + spacing: 8, + children: [ + (item?.name?.contains('مرغ گرم') ?? false) + ? Assets.images.chicken.image(width: 40, height: 40) + : Assets.vec.placeHolderSvg.svg(width: 40, height: 40), + + Text(item?.name ?? 'انتخاب محصول'), + Spacer(), + Text( + 'موجودی:${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0}', + ), + ], + ), ); - }, controller.selectedProduct); + }); } + GestureDetector timeFilterWidget({ isFrom = true, required Rx date, @@ -339,10 +373,11 @@ class SalesOutOfProvinceSalesListPage Get.bottomSheet(modalDatePicker((value) => onChanged(value))); }, child: Container( - height: 35, + height: 40, decoration: BoxDecoration( + color:AppColor.bgLight, borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.bgDark), + border: Border.all(width: 1, color: AppColor.darkGreyLight), ), padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), child: Row( From a9b012b016dbe7879540bd708d030a10762c148e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 8 Jul 2025 12:17:39 +0330 Subject: [PATCH 182/256] fix : has more in list --- .../pages/buy_in_province_waiting/view.dart | 1 + .../pages/buy_out_of_province/logic.dart | 6 +- .../pages/buy_out_of_province/view.dart | 151 +++++++++++------- .../sales_out_of_province_buyers/view.dart | 1 + .../view.dart | 51 ++---- 5 files changed, 108 insertions(+), 102 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 8e94937..d68a287 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -18,6 +18,7 @@ class BuyInProvinceWaitingPage extends GetView { return RPaginatedListView( listType: ListType.separated, resource: data.value, + hasMore: data.value.data?.next!= null, padding: EdgeInsets.fromLTRB(8, 8, 8, 80), itemBuilder: (context, index) { var item = data.value.data!.results![index]; diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index 2b29ed0..3a71c4e 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -58,10 +58,8 @@ class BuyOutOfProvinceLogic extends GetxController { super.onReady(); getStewardPurchaseOutOfProvince(); selectedProvince.listen((p0) => getCites()); - outOfTheProvinceLogic.rolesProductsModel.listen((lists) { - selectedProduct.value = lists.first; - }); + selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.first; setupListeners(); debounce( @@ -101,7 +99,7 @@ class BuyOutOfProvinceLogic extends GetxController { call: () => rootLogic.chickenRepository.getStewardPurchasesOutSideOfTheProvince( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( - pageSize: 10, + pageSize: 20, page: currentPage.value, search: 'filter', role: 'Steward', diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 329dc27..17dc226 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -30,6 +30,7 @@ class BuyOutOfProvincePage extends GetView { return RPaginatedListView( listType: ListType.separated, resource: data.value, + hasMore:data.value.data?.next!=null , padding: EdgeInsets.fromLTRB(8, 8, 8, 80), itemBuilder: (context, index) { var item = data.value.data!.results![index]; @@ -295,59 +296,84 @@ class BuyOutOfProvincePage extends GetView { child: Form( key: controller.formKey, child: Column( - spacing: 16, + spacing: 8, children: [ Text( isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), ), - _productTypeWidget(), - RTextField( - controller: controller.sellerNameController, - label: 'نام فروشنده', - borderColor: AppColor.darkGreyLight, - filled: true, - filledColor: AppColor.bgLight, - ), - RTextField( - controller: controller.sellerPhoneController, - label: 'تلفن فروشنده', - keyboardType: TextInputType.phone, - borderColor: AppColor.darkGreyLight, - maxLength: 11, - filled: true, - filledColor: AppColor.bgLight, - validator: (value) { - if (value == null || value.isEmpty) { - return 'لطفاً شماره موبایل را وارد کنید'; - } - String cleaned = value.replaceAll(',', ''); - if (cleaned.length != 11) { - return 'شماره موبایل باید ۱۱ رقم باشد'; - } - if (!cleaned.startsWith('09')) { - return 'شماره موبایل باید با 09 شروع شود'; - } - return null; - }, - ), - _provinceWidget(), - _cityWidget(), - RTextField( - controller: controller.carcassWeightController, - label: 'وزن', - filled: true, - suffixIcon: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Assets.vec.killogramSvg.svg(), + _productDropDown(), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + + child: Column(spacing: 12, children: [_provinceWidget(), _cityWidget()]), + ), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + + child: Column( + spacing: 12, + children: [ + RTextField( + controller: controller.sellerNameController, + label: 'نام فروشنده', + borderColor: AppColor.darkGreyLight, + filled: true, + filledColor: AppColor.bgLight, + ), + RTextField( + controller: controller.sellerPhoneController, + label: 'تلفن فروشنده', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + maxLength: 11, + filled: true, + filledColor: AppColor.bgLight, + validator: (value) { + if (value == null || value.isEmpty) { + return 'لطفاً شماره موبایل را وارد کنید'; + } + String cleaned = value.replaceAll(',', ''); + if (cleaned.length != 11) { + return 'شماره موبایل باید ۱۱ رقم باشد'; + } + if (!cleaned.startsWith('09')) { + return 'شماره موبایل باید با 09 شروع شود'; + } + return null; + }, + ), + + RTextField( + controller: controller.carcassWeightController, + label: 'وزن', + filled: true, + suffixIcon: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Assets.vec.killogramSvg.svg(), + ), + filledColor: AppColor.bgLight, + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + ), + ], ), - filledColor: AppColor.bgLight, - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], ), _imageCarcasesWidget(isOnEdit), submitButtonWidget(isOnEdit), @@ -362,7 +388,7 @@ class BuyOutOfProvincePage extends GetView { Widget submitButtonWidget(bool isOnEdit) { return ObxValue((data) { return RElevated( - text: isOnEdit ? 'ویرایش' : 'ثبت خرید', + text: isOnEdit ? 'ویرایش' : 'ثبت', width: Get.width, backgroundColor: AppColor.greenNormal, onPressed: data.value @@ -378,25 +404,33 @@ class BuyOutOfProvincePage extends GetView { }, controller.isSubmitButtonEnabled); } - Widget _productTypeWidget() { + Widget _productDropDown() { return Obx(() { return OverlayDropdownWidget( items: controller.outOfTheProvinceLogic.rolesProductsModel, + height: 56, + hasDropIcon: false, + background: Colors.white, onChanged: (value) { controller.selectedProduct.value = value; }, selectedItem: controller.selectedProduct.value, initialValue: controller.selectedProduct.value, - itemBuilder: (item) => Text( - item.name ?? 'بدون نام', - style: AppFonts.yekan14.copyWith(color: AppColor.lightGreyDarker), + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Row( + spacing: 8, + children: [ + (item?.name?.contains('مرغ گرم') ?? false) + ? Assets.images.chicken.image(width: 40, height: 40) + : Assets.vec.placeHolderSvg.svg(width: 40, height: 40), + + Text(item?.name ?? 'انتخاب محصول'), + Spacer(), + Text( + 'موجودی:${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0}', + ), + ], ), - labelBuilder: (item) => item?.name != null - ? Text(item!.name!, style: AppFonts.yekan14.copyWith(color: AppColor.textColor)) - : Text( - 'انتخاب محصول', - style: AppFonts.yekan14.copyWith(color: AppColor.textColorLight), - ), ); }); } @@ -575,5 +609,4 @@ class BuyOutOfProvincePage extends GetView { }, controller.rootLogic.inventoryModel), ); } - } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index 47ab8cd..d391b6e 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -20,6 +20,7 @@ class SalesOutOfProvinceBuyersPage extends GetView { +class SalesOutOfProvinceSalesListPage extends GetView { const SalesOutOfProvinceSalesListPage({super.key}); @override @@ -23,6 +22,7 @@ class SalesOutOfProvinceSalesListPage controller.currentPage.value = 1; await controller.getOutProvinceSales(); }, + hasMore: data.value.data?.next != null, listType: ListType.separated, resource: data.value, padding: EdgeInsets.fromLTRB(8, 8, 8, 80), @@ -123,10 +123,7 @@ class SalesOutOfProvinceSalesListPage return Container( padding: EdgeInsets.fromLTRB(8, 12, 14, 12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, children: [ @@ -150,21 +147,12 @@ class SalesOutOfProvinceSalesListPage borderRadius: BorderRadius.circular(8), ), ), - child: buildRow( - title: 'تاریخ', - value: item.date?.formattedJalaliDateYHMS ?? 'N/A', - ), - ), - buildRow( - title: 'مشخصات خریدار', - value: item.buyer?.fullname ?? 'N/A', + child: buildRow(title: 'تاریخ', value: item.date?.formattedJalaliDateYHMS ?? 'N/A'), ), + buildRow(title: 'مشخصات خریدار', value: item.buyer?.fullname ?? 'N/A'), buildRow(title: 'تلفن خریدار', value: item.buyer?.mobile ?? 'N/A'), buildRow(title: 'نام واحد', value: item.buyer?.unitName ?? 'N/A'), - buildRow( - title: 'وزن لاشه', - value: '${item.weightOfCarcasses?.separatedByComma}', - ), + buildRow(title: 'وزن لاشه', value: '${item.weightOfCarcasses?.separatedByComma}'), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -220,13 +208,10 @@ class SalesOutOfProvinceSalesListPage children: [ Text( isOnEdit ? 'ویرایش فروش' : 'افزودن فروش', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), ), _productDropDown(), - Container( padding: EdgeInsets.all(8), decoration: BoxDecoration( @@ -301,9 +286,7 @@ class SalesOutOfProvinceSalesListPage text: isOnEdit ? 'ویرایش' : 'ثبت', onPressed: data.value ? () async { - var res = isOnEdit - ? await controller.editSale() - : await controller.createSale(); + var res = isOnEdit ? await controller.editSale() : await controller.createSale(); if (res) { controller.getOutProvinceSales(); controller.clearSaleForm(); @@ -330,7 +313,6 @@ class SalesOutOfProvinceSalesListPage }); } - Widget _productDropDown() { return Obx(() { return OverlayDropdownWidget( @@ -362,7 +344,6 @@ class SalesOutOfProvinceSalesListPage }); } - GestureDetector timeFilterWidget({ isFrom = true, required Rx date, @@ -375,7 +356,7 @@ class SalesOutOfProvinceSalesListPage child: Container( height: 40, decoration: BoxDecoration( - color:AppColor.bgLight, + color: AppColor.bgLight, borderRadius: BorderRadius.circular(8), border: Border.all(width: 1, color: AppColor.darkGreyLight), ), @@ -386,23 +367,15 @@ class SalesOutOfProvinceSalesListPage Assets.vec.calendarSvg.svg( width: 24, height: 24, - colorFilter: const ColorFilter.mode( - AppColor.bgDark, - BlendMode.srcIn, - ), - ), - Text( - 'تاریخ', - style: AppFonts.yekan16.copyWith(color: AppColor.bgDark), + colorFilter: const ColorFilter.mode(AppColor.bgDark, BlendMode.srcIn), ), + Text('تاریخ', style: AppFonts.yekan16.copyWith(color: AppColor.bgDark)), Expanded( child: ObxValue((data) { return Text( date.value.formatCompactDate(), textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDark, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDark), ); }, date), ), From 146ea28e77c13bd139a1ebbadfd62e7259da929b Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 8 Jul 2025 16:06:10 +0330 Subject: [PATCH 183/256] feat : profile with logic --- assets/icons/lock.svg | 4 + assets/vec/lock.svg.vec | Bin 0 -> 639 bytes .../change_password_request_model.dart | 18 + ...change_password_request_model.freezed.dart | 151 ++++++ .../change_password_request_model.g.dart | 21 + .../response/user_profile/user_profile.dart | 65 +++ .../user_profile/user_profile.freezed.dart | 442 +++++++++++++++ .../response/user_profile/user_profile.g.dart | 113 ++++ .../data/repositories/chicken_repository.dart | 44 +- .../repositories/chicken_repository_imp.dart | 46 +- .../lib/presentation/pages/profile/logic.dart | 127 +++++ .../lib/presentation/pages/profile/view.dart | 502 ++++++++++++++++++ .../lib/presentation/pages/root/logic.dart | 12 +- .../lib/presentation/routes/pages.dart | 5 +- .../lib/presentation/common/assets.gen.dart | 8 + .../widget/list_view/r_list_view.dart | 10 +- packages/core/lib/utils/network/resource.dart | 24 +- 17 files changed, 1531 insertions(+), 61 deletions(-) create mode 100644 assets/icons/lock.svg create mode 100644 assets/vec/lock.svg.vec create mode 100644 packages/chicken/lib/data/models/request/change_password/change_password_request_model.dart create mode 100644 packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart create mode 100644 packages/chicken/lib/data/models/request/change_password/change_password_request_model.g.dart create mode 100644 packages/chicken/lib/data/models/response/user_profile/user_profile.dart create mode 100644 packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/user_profile/user_profile.g.dart create mode 100644 packages/chicken/lib/presentation/pages/profile/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/profile/view.dart diff --git a/assets/icons/lock.svg b/assets/icons/lock.svg new file mode 100644 index 0000000..4a64667 --- /dev/null +++ b/assets/icons/lock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/vec/lock.svg.vec b/assets/vec/lock.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..f257a4654174ccf53aad0eb3c40735eb6e7147e1 GIT binary patch literal 639 zcmX}qKS%;`6bJBk9t1^1N<;KVq|HH$Aew@Ems?B384XcTL25xm5J3<`OEwmX{ec`a zY^w&XQ78;Shc>U892%QS@%nwA+R5?p-Fv_Hd;IQ}1BayfiF_vRA!jMz=tPb)s1bFL zx?Jkg2k?(xohx1oS2;=*p1Q#j}!FPv#}B**Qi%{B4|wjj1C>9-5YhxZ+gAhSgLAuZ^nvJmci3%WpZ46CFIf3eaa`1QHo2CqGOQ;{;;EJ6aXZeZR$85HN{oy=h?k*f ze%a13L_G{vs>%oH*Y1yb7qhz@vso;Y(TXSk#d*Z+Nw(5GTqcXJXYb|wn!ZUKaeqo4 hq8{cOyK1fvG2(u2#kPojk#Fxm>cv}g9IyJm6n{QA{}liL literal 0 HcmV?d00001 diff --git a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.dart b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.dart new file mode 100644 index 0000000..b5a94a2 --- /dev/null +++ b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.dart @@ -0,0 +1,18 @@ + +import 'package:rasadyar_core/core.dart'; + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'change_password_request_model.freezed.dart'; +part 'change_password_request_model.g.dart'; + +@freezed +abstract class ChangePasswordRequestModel with _$ChangePasswordRequestModel { + const factory ChangePasswordRequestModel({ + String? username, + String? password, + }) = _ChangePasswordRequestModel; + + factory ChangePasswordRequestModel.fromJson(Map json) => + _$ChangePasswordRequestModelFromJson(json); +} diff --git a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart new file mode 100644 index 0000000..54ea8e3 --- /dev/null +++ b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart @@ -0,0 +1,151 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'change_password_request_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$ChangePasswordRequestModel { + + String? get username; String? get password; +/// Create a copy of ChangePasswordRequestModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ChangePasswordRequestModelCopyWith get copyWith => _$ChangePasswordRequestModelCopyWithImpl(this as ChangePasswordRequestModel, _$identity); + + /// Serializes this ChangePasswordRequestModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ChangePasswordRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,username,password); + +@override +String toString() { + return 'ChangePasswordRequestModel(username: $username, password: $password)'; +} + + +} + +/// @nodoc +abstract mixin class $ChangePasswordRequestModelCopyWith<$Res> { + factory $ChangePasswordRequestModelCopyWith(ChangePasswordRequestModel value, $Res Function(ChangePasswordRequestModel) _then) = _$ChangePasswordRequestModelCopyWithImpl; +@useResult +$Res call({ + String? username, String? password +}); + + + + +} +/// @nodoc +class _$ChangePasswordRequestModelCopyWithImpl<$Res> + implements $ChangePasswordRequestModelCopyWith<$Res> { + _$ChangePasswordRequestModelCopyWithImpl(this._self, this._then); + + final ChangePasswordRequestModel _self; + final $Res Function(ChangePasswordRequestModel) _then; + +/// Create a copy of ChangePasswordRequestModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? username = freezed,Object? password = freezed,}) { + return _then(_self.copyWith( +username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _ChangePasswordRequestModel implements ChangePasswordRequestModel { + const _ChangePasswordRequestModel({this.username, this.password}); + factory _ChangePasswordRequestModel.fromJson(Map json) => _$ChangePasswordRequestModelFromJson(json); + +@override final String? username; +@override final String? password; + +/// Create a copy of ChangePasswordRequestModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ChangePasswordRequestModelCopyWith<_ChangePasswordRequestModel> get copyWith => __$ChangePasswordRequestModelCopyWithImpl<_ChangePasswordRequestModel>(this, _$identity); + +@override +Map toJson() { + return _$ChangePasswordRequestModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ChangePasswordRequestModel&&(identical(other.username, username) || other.username == username)&&(identical(other.password, password) || other.password == password)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,username,password); + +@override +String toString() { + return 'ChangePasswordRequestModel(username: $username, password: $password)'; +} + + +} + +/// @nodoc +abstract mixin class _$ChangePasswordRequestModelCopyWith<$Res> implements $ChangePasswordRequestModelCopyWith<$Res> { + factory _$ChangePasswordRequestModelCopyWith(_ChangePasswordRequestModel value, $Res Function(_ChangePasswordRequestModel) _then) = __$ChangePasswordRequestModelCopyWithImpl; +@override @useResult +$Res call({ + String? username, String? password +}); + + + + +} +/// @nodoc +class __$ChangePasswordRequestModelCopyWithImpl<$Res> + implements _$ChangePasswordRequestModelCopyWith<$Res> { + __$ChangePasswordRequestModelCopyWithImpl(this._self, this._then); + + final _ChangePasswordRequestModel _self; + final $Res Function(_ChangePasswordRequestModel) _then; + +/// Create a copy of ChangePasswordRequestModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? username = freezed,Object? password = freezed,}) { + return _then(_ChangePasswordRequestModel( +username: freezed == username ? _self.username : username // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.g.dart b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.g.dart new file mode 100644 index 0000000..ca0cf6b --- /dev/null +++ b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'change_password_request_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_ChangePasswordRequestModel _$ChangePasswordRequestModelFromJson( + Map json, +) => _ChangePasswordRequestModel( + username: json['username'] as String?, + password: json['password'] as String?, +); + +Map _$ChangePasswordRequestModelToJson( + _ChangePasswordRequestModel instance, +) => { + 'username': instance.username, + 'password': instance.password, +}; diff --git a/packages/chicken/lib/data/models/response/user_profile/user_profile.dart b/packages/chicken/lib/data/models/response/user_profile/user_profile.dart new file mode 100644 index 0000000..29c5b39 --- /dev/null +++ b/packages/chicken/lib/data/models/response/user_profile/user_profile.dart @@ -0,0 +1,65 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user_profile.freezed.dart'; +part 'user_profile.g.dart'; + +@freezed +abstract class UserProfile with _$UserProfile { + const factory UserProfile({ + List? role, + String? city, + String? province, + String? key, + String? userGateWayId, + dynamic userDjangoIdForeignKey, + dynamic provinceIdForeignKey, + dynamic cityIdForeignKey, + dynamic systemUserProfileIdKey, + String? fullname, + String? firstName, + String? lastName, + String? nationalCode, + String? nationalCodeImage, + String? nationalId, + String? mobile, + String? birthday, + String? image, + String? password, + bool? active, + UserState? state, + int? baseOrder, + int? cityNumber, + String? cityName, + int? provinceNumber, + String? provinceName, + String? unitName, + String? unitNationalId, + String? unitRegistrationNumber, + String? unitEconomicalNumber, + String? unitProvince, + String? unitCity, + String? unitPostalCode, + String? unitAddress, + String? personType, + String? type, + }) = _UserProfile; + + factory UserProfile.fromJson(Map json) => _$UserProfileFromJson(json); +} + +@freezed +abstract class UserState with _$UserState { + const factory UserState({ + String? city, + String? image, + String? mobile, + String? birthday, + String? province, + String? lastName, + String? firstName, + String? nationalId, + String? nationalCode, + }) = _UserState; + + factory UserState.fromJson(Map json) => _$UserStateFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart b/packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart new file mode 100644 index 0000000..c3b00f0 --- /dev/null +++ b/packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart @@ -0,0 +1,442 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user_profile.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$UserProfile { + + List? get role; String? get city; String? get province; String? get key; String? get userGateWayId; dynamic get userDjangoIdForeignKey; dynamic get provinceIdForeignKey; dynamic get cityIdForeignKey; dynamic get systemUserProfileIdKey; String? get fullname; String? get firstName; String? get lastName; String? get nationalCode; String? get nationalCodeImage; String? get nationalId; String? get mobile; String? get birthday; String? get image; String? get password; bool? get active; UserState? get state; int? get baseOrder; int? get cityNumber; String? get cityName; int? get provinceNumber; String? get provinceName; String? get unitName; String? get unitNationalId; String? get unitRegistrationNumber; String? get unitEconomicalNumber; String? get unitProvince; String? get unitCity; String? get unitPostalCode; String? get unitAddress; String? get personType; String? get type; +/// Create a copy of UserProfile +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserProfileCopyWith get copyWith => _$UserProfileCopyWithImpl(this as UserProfile, _$identity); + + /// Serializes this UserProfile to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UserProfile&&const DeepCollectionEquality().equals(other.role, role)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.key, key) || other.key == key)&&(identical(other.userGateWayId, userGateWayId) || other.userGateWayId == userGateWayId)&&const DeepCollectionEquality().equals(other.userDjangoIdForeignKey, userDjangoIdForeignKey)&&const DeepCollectionEquality().equals(other.provinceIdForeignKey, provinceIdForeignKey)&&const DeepCollectionEquality().equals(other.cityIdForeignKey, cityIdForeignKey)&&const DeepCollectionEquality().equals(other.systemUserProfileIdKey, systemUserProfileIdKey)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.nationalCodeImage, nationalCodeImage) || other.nationalCodeImage == nationalCodeImage)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&(identical(other.image, image) || other.image == image)&&(identical(other.password, password) || other.password == password)&&(identical(other.active, active) || other.active == active)&&(identical(other.state, state) || other.state == state)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)&&(identical(other.personType, personType) || other.personType == personType)&&(identical(other.type, type) || other.type == type)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,const DeepCollectionEquality().hash(role),city,province,key,userGateWayId,const DeepCollectionEquality().hash(userDjangoIdForeignKey),const DeepCollectionEquality().hash(provinceIdForeignKey),const DeepCollectionEquality().hash(cityIdForeignKey),const DeepCollectionEquality().hash(systemUserProfileIdKey),fullname,firstName,lastName,nationalCode,nationalCodeImage,nationalId,mobile,birthday,image,password,active,state,baseOrder,cityNumber,cityName,provinceNumber,provinceName,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress,personType,type]); + +@override +String toString() { + return 'UserProfile(role: $role, city: $city, province: $province, key: $key, userGateWayId: $userGateWayId, userDjangoIdForeignKey: $userDjangoIdForeignKey, provinceIdForeignKey: $provinceIdForeignKey, cityIdForeignKey: $cityIdForeignKey, systemUserProfileIdKey: $systemUserProfileIdKey, fullname: $fullname, firstName: $firstName, lastName: $lastName, nationalCode: $nationalCode, nationalCodeImage: $nationalCodeImage, nationalId: $nationalId, mobile: $mobile, birthday: $birthday, image: $image, password: $password, active: $active, state: $state, baseOrder: $baseOrder, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress, personType: $personType, type: $type)'; +} + + +} + +/// @nodoc +abstract mixin class $UserProfileCopyWith<$Res> { + factory $UserProfileCopyWith(UserProfile value, $Res Function(UserProfile) _then) = _$UserProfileCopyWithImpl; +@useResult +$Res call({ + List? role, String? city, String? province, String? key, String? userGateWayId, dynamic userDjangoIdForeignKey, dynamic provinceIdForeignKey, dynamic cityIdForeignKey, dynamic systemUserProfileIdKey, String? fullname, String? firstName, String? lastName, String? nationalCode, String? nationalCodeImage, String? nationalId, String? mobile, String? birthday, String? image, String? password, bool? active, UserState? state, int? baseOrder, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress, String? personType, String? type +}); + + +$UserStateCopyWith<$Res>? get state; + +} +/// @nodoc +class _$UserProfileCopyWithImpl<$Res> + implements $UserProfileCopyWith<$Res> { + _$UserProfileCopyWithImpl(this._self, this._then); + + final UserProfile _self; + final $Res Function(UserProfile) _then; + +/// Create a copy of UserProfile +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? role = freezed,Object? city = freezed,Object? province = freezed,Object? key = freezed,Object? userGateWayId = freezed,Object? userDjangoIdForeignKey = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdForeignKey = freezed,Object? systemUserProfileIdKey = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? nationalCode = freezed,Object? nationalCodeImage = freezed,Object? nationalId = freezed,Object? mobile = freezed,Object? birthday = freezed,Object? image = freezed,Object? password = freezed,Object? active = freezed,Object? state = freezed,Object? baseOrder = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,Object? personType = freezed,Object? type = freezed,}) { + return _then(_self.copyWith( +role: freezed == role ? _self.role : role // ignore: cast_nullable_to_non_nullable +as List?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,userGateWayId: freezed == userGateWayId ? _self.userGateWayId : userGateWayId // ignore: cast_nullable_to_non_nullable +as String?,userDjangoIdForeignKey: freezed == userDjangoIdForeignKey ? _self.userDjangoIdForeignKey : userDjangoIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,cityIdForeignKey: freezed == cityIdForeignKey ? _self.cityIdForeignKey : cityIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,systemUserProfileIdKey: freezed == systemUserProfileIdKey ? _self.systemUserProfileIdKey : systemUserProfileIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,nationalCodeImage: freezed == nationalCodeImage ? _self.nationalCodeImage : nationalCodeImage // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,birthday: freezed == birthday ? _self.birthday : birthday // ignore: cast_nullable_to_non_nullable +as String?,image: freezed == image ? _self.image : image // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as UserState?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable +as String?,personType: freezed == personType ? _self.personType : personType // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?, + )); +} +/// Create a copy of UserProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserStateCopyWith<$Res>? get state { + if (_self.state == null) { + return null; + } + + return $UserStateCopyWith<$Res>(_self.state!, (value) { + return _then(_self.copyWith(state: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _UserProfile implements UserProfile { + const _UserProfile({final List? role, this.city, this.province, this.key, this.userGateWayId, this.userDjangoIdForeignKey, this.provinceIdForeignKey, this.cityIdForeignKey, this.systemUserProfileIdKey, this.fullname, this.firstName, this.lastName, this.nationalCode, this.nationalCodeImage, this.nationalId, this.mobile, this.birthday, this.image, this.password, this.active, this.state, this.baseOrder, this.cityNumber, this.cityName, this.provinceNumber, this.provinceName, this.unitName, this.unitNationalId, this.unitRegistrationNumber, this.unitEconomicalNumber, this.unitProvince, this.unitCity, this.unitPostalCode, this.unitAddress, this.personType, this.type}): _role = role; + factory _UserProfile.fromJson(Map json) => _$UserProfileFromJson(json); + + final List? _role; +@override List? get role { + final value = _role; + if (value == null) return null; + if (_role is EqualUnmodifiableListView) return _role; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + +@override final String? city; +@override final String? province; +@override final String? key; +@override final String? userGateWayId; +@override final dynamic userDjangoIdForeignKey; +@override final dynamic provinceIdForeignKey; +@override final dynamic cityIdForeignKey; +@override final dynamic systemUserProfileIdKey; +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final String? nationalCode; +@override final String? nationalCodeImage; +@override final String? nationalId; +@override final String? mobile; +@override final String? birthday; +@override final String? image; +@override final String? password; +@override final bool? active; +@override final UserState? state; +@override final int? baseOrder; +@override final int? cityNumber; +@override final String? cityName; +@override final int? provinceNumber; +@override final String? provinceName; +@override final String? unitName; +@override final String? unitNationalId; +@override final String? unitRegistrationNumber; +@override final String? unitEconomicalNumber; +@override final String? unitProvince; +@override final String? unitCity; +@override final String? unitPostalCode; +@override final String? unitAddress; +@override final String? personType; +@override final String? type; + +/// Create a copy of UserProfile +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserProfileCopyWith<_UserProfile> get copyWith => __$UserProfileCopyWithImpl<_UserProfile>(this, _$identity); + +@override +Map toJson() { + return _$UserProfileToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _UserProfile&&const DeepCollectionEquality().equals(other._role, _role)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.key, key) || other.key == key)&&(identical(other.userGateWayId, userGateWayId) || other.userGateWayId == userGateWayId)&&const DeepCollectionEquality().equals(other.userDjangoIdForeignKey, userDjangoIdForeignKey)&&const DeepCollectionEquality().equals(other.provinceIdForeignKey, provinceIdForeignKey)&&const DeepCollectionEquality().equals(other.cityIdForeignKey, cityIdForeignKey)&&const DeepCollectionEquality().equals(other.systemUserProfileIdKey, systemUserProfileIdKey)&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)&&(identical(other.nationalCodeImage, nationalCodeImage) || other.nationalCodeImage == nationalCodeImage)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&(identical(other.image, image) || other.image == image)&&(identical(other.password, password) || other.password == password)&&(identical(other.active, active) || other.active == active)&&(identical(other.state, state) || other.state == state)&&(identical(other.baseOrder, baseOrder) || other.baseOrder == baseOrder)&&(identical(other.cityNumber, cityNumber) || other.cityNumber == cityNumber)&&(identical(other.cityName, cityName) || other.cityName == cityName)&&(identical(other.provinceNumber, provinceNumber) || other.provinceNumber == provinceNumber)&&(identical(other.provinceName, provinceName) || other.provinceName == provinceName)&&(identical(other.unitName, unitName) || other.unitName == unitName)&&(identical(other.unitNationalId, unitNationalId) || other.unitNationalId == unitNationalId)&&(identical(other.unitRegistrationNumber, unitRegistrationNumber) || other.unitRegistrationNumber == unitRegistrationNumber)&&(identical(other.unitEconomicalNumber, unitEconomicalNumber) || other.unitEconomicalNumber == unitEconomicalNumber)&&(identical(other.unitProvince, unitProvince) || other.unitProvince == unitProvince)&&(identical(other.unitCity, unitCity) || other.unitCity == unitCity)&&(identical(other.unitPostalCode, unitPostalCode) || other.unitPostalCode == unitPostalCode)&&(identical(other.unitAddress, unitAddress) || other.unitAddress == unitAddress)&&(identical(other.personType, personType) || other.personType == personType)&&(identical(other.type, type) || other.type == type)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,const DeepCollectionEquality().hash(_role),city,province,key,userGateWayId,const DeepCollectionEquality().hash(userDjangoIdForeignKey),const DeepCollectionEquality().hash(provinceIdForeignKey),const DeepCollectionEquality().hash(cityIdForeignKey),const DeepCollectionEquality().hash(systemUserProfileIdKey),fullname,firstName,lastName,nationalCode,nationalCodeImage,nationalId,mobile,birthday,image,password,active,state,baseOrder,cityNumber,cityName,provinceNumber,provinceName,unitName,unitNationalId,unitRegistrationNumber,unitEconomicalNumber,unitProvince,unitCity,unitPostalCode,unitAddress,personType,type]); + +@override +String toString() { + return 'UserProfile(role: $role, city: $city, province: $province, key: $key, userGateWayId: $userGateWayId, userDjangoIdForeignKey: $userDjangoIdForeignKey, provinceIdForeignKey: $provinceIdForeignKey, cityIdForeignKey: $cityIdForeignKey, systemUserProfileIdKey: $systemUserProfileIdKey, fullname: $fullname, firstName: $firstName, lastName: $lastName, nationalCode: $nationalCode, nationalCodeImage: $nationalCodeImage, nationalId: $nationalId, mobile: $mobile, birthday: $birthday, image: $image, password: $password, active: $active, state: $state, baseOrder: $baseOrder, cityNumber: $cityNumber, cityName: $cityName, provinceNumber: $provinceNumber, provinceName: $provinceName, unitName: $unitName, unitNationalId: $unitNationalId, unitRegistrationNumber: $unitRegistrationNumber, unitEconomicalNumber: $unitEconomicalNumber, unitProvince: $unitProvince, unitCity: $unitCity, unitPostalCode: $unitPostalCode, unitAddress: $unitAddress, personType: $personType, type: $type)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserProfileCopyWith<$Res> implements $UserProfileCopyWith<$Res> { + factory _$UserProfileCopyWith(_UserProfile value, $Res Function(_UserProfile) _then) = __$UserProfileCopyWithImpl; +@override @useResult +$Res call({ + List? role, String? city, String? province, String? key, String? userGateWayId, dynamic userDjangoIdForeignKey, dynamic provinceIdForeignKey, dynamic cityIdForeignKey, dynamic systemUserProfileIdKey, String? fullname, String? firstName, String? lastName, String? nationalCode, String? nationalCodeImage, String? nationalId, String? mobile, String? birthday, String? image, String? password, bool? active, UserState? state, int? baseOrder, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress, String? personType, String? type +}); + + +@override $UserStateCopyWith<$Res>? get state; + +} +/// @nodoc +class __$UserProfileCopyWithImpl<$Res> + implements _$UserProfileCopyWith<$Res> { + __$UserProfileCopyWithImpl(this._self, this._then); + + final _UserProfile _self; + final $Res Function(_UserProfile) _then; + +/// Create a copy of UserProfile +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? role = freezed,Object? city = freezed,Object? province = freezed,Object? key = freezed,Object? userGateWayId = freezed,Object? userDjangoIdForeignKey = freezed,Object? provinceIdForeignKey = freezed,Object? cityIdForeignKey = freezed,Object? systemUserProfileIdKey = freezed,Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? nationalCode = freezed,Object? nationalCodeImage = freezed,Object? nationalId = freezed,Object? mobile = freezed,Object? birthday = freezed,Object? image = freezed,Object? password = freezed,Object? active = freezed,Object? state = freezed,Object? baseOrder = freezed,Object? cityNumber = freezed,Object? cityName = freezed,Object? provinceNumber = freezed,Object? provinceName = freezed,Object? unitName = freezed,Object? unitNationalId = freezed,Object? unitRegistrationNumber = freezed,Object? unitEconomicalNumber = freezed,Object? unitProvince = freezed,Object? unitCity = freezed,Object? unitPostalCode = freezed,Object? unitAddress = freezed,Object? personType = freezed,Object? type = freezed,}) { + return _then(_UserProfile( +role: freezed == role ? _self._role : role // ignore: cast_nullable_to_non_nullable +as List?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,userGateWayId: freezed == userGateWayId ? _self.userGateWayId : userGateWayId // ignore: cast_nullable_to_non_nullable +as String?,userDjangoIdForeignKey: freezed == userDjangoIdForeignKey ? _self.userDjangoIdForeignKey : userDjangoIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,provinceIdForeignKey: freezed == provinceIdForeignKey ? _self.provinceIdForeignKey : provinceIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,cityIdForeignKey: freezed == cityIdForeignKey ? _self.cityIdForeignKey : cityIdForeignKey // ignore: cast_nullable_to_non_nullable +as dynamic,systemUserProfileIdKey: freezed == systemUserProfileIdKey ? _self.systemUserProfileIdKey : systemUserProfileIdKey // ignore: cast_nullable_to_non_nullable +as dynamic,fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?,nationalCodeImage: freezed == nationalCodeImage ? _self.nationalCodeImage : nationalCodeImage // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,birthday: freezed == birthday ? _self.birthday : birthday // ignore: cast_nullable_to_non_nullable +as String?,image: freezed == image ? _self.image : image // ignore: cast_nullable_to_non_nullable +as String?,password: freezed == password ? _self.password : password // ignore: cast_nullable_to_non_nullable +as String?,active: freezed == active ? _self.active : active // ignore: cast_nullable_to_non_nullable +as bool?,state: freezed == state ? _self.state : state // ignore: cast_nullable_to_non_nullable +as UserState?,baseOrder: freezed == baseOrder ? _self.baseOrder : baseOrder // ignore: cast_nullable_to_non_nullable +as int?,cityNumber: freezed == cityNumber ? _self.cityNumber : cityNumber // ignore: cast_nullable_to_non_nullable +as int?,cityName: freezed == cityName ? _self.cityName : cityName // ignore: cast_nullable_to_non_nullable +as String?,provinceNumber: freezed == provinceNumber ? _self.provinceNumber : provinceNumber // ignore: cast_nullable_to_non_nullable +as int?,provinceName: freezed == provinceName ? _self.provinceName : provinceName // ignore: cast_nullable_to_non_nullable +as String?,unitName: freezed == unitName ? _self.unitName : unitName // ignore: cast_nullable_to_non_nullable +as String?,unitNationalId: freezed == unitNationalId ? _self.unitNationalId : unitNationalId // ignore: cast_nullable_to_non_nullable +as String?,unitRegistrationNumber: freezed == unitRegistrationNumber ? _self.unitRegistrationNumber : unitRegistrationNumber // ignore: cast_nullable_to_non_nullable +as String?,unitEconomicalNumber: freezed == unitEconomicalNumber ? _self.unitEconomicalNumber : unitEconomicalNumber // ignore: cast_nullable_to_non_nullable +as String?,unitProvince: freezed == unitProvince ? _self.unitProvince : unitProvince // ignore: cast_nullable_to_non_nullable +as String?,unitCity: freezed == unitCity ? _self.unitCity : unitCity // ignore: cast_nullable_to_non_nullable +as String?,unitPostalCode: freezed == unitPostalCode ? _self.unitPostalCode : unitPostalCode // ignore: cast_nullable_to_non_nullable +as String?,unitAddress: freezed == unitAddress ? _self.unitAddress : unitAddress // ignore: cast_nullable_to_non_nullable +as String?,personType: freezed == personType ? _self.personType : personType // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +/// Create a copy of UserProfile +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserStateCopyWith<$Res>? get state { + if (_self.state == null) { + return null; + } + + return $UserStateCopyWith<$Res>(_self.state!, (value) { + return _then(_self.copyWith(state: value)); + }); +} +} + + +/// @nodoc +mixin _$UserState { + + String? get city; String? get image; String? get mobile; String? get birthday; String? get province; String? get lastName; String? get firstName; String? get nationalId; String? get nationalCode; +/// Create a copy of UserState +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserStateCopyWith get copyWith => _$UserStateCopyWithImpl(this as UserState, _$identity); + + /// Serializes this UserState to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UserState&&(identical(other.city, city) || other.city == city)&&(identical(other.image, image) || other.image == image)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&(identical(other.province, province) || other.province == province)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,city,image,mobile,birthday,province,lastName,firstName,nationalId,nationalCode); + +@override +String toString() { + return 'UserState(city: $city, image: $image, mobile: $mobile, birthday: $birthday, province: $province, lastName: $lastName, firstName: $firstName, nationalId: $nationalId, nationalCode: $nationalCode)'; +} + + +} + +/// @nodoc +abstract mixin class $UserStateCopyWith<$Res> { + factory $UserStateCopyWith(UserState value, $Res Function(UserState) _then) = _$UserStateCopyWithImpl; +@useResult +$Res call({ + String? city, String? image, String? mobile, String? birthday, String? province, String? lastName, String? firstName, String? nationalId, String? nationalCode +}); + + + + +} +/// @nodoc +class _$UserStateCopyWithImpl<$Res> + implements $UserStateCopyWith<$Res> { + _$UserStateCopyWithImpl(this._self, this._then); + + final UserState _self; + final $Res Function(UserState) _then; + +/// Create a copy of UserState +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? city = freezed,Object? image = freezed,Object? mobile = freezed,Object? birthday = freezed,Object? province = freezed,Object? lastName = freezed,Object? firstName = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,}) { + return _then(_self.copyWith( +city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,image: freezed == image ? _self.image : image // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,birthday: freezed == birthday ? _self.birthday : birthday // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _UserState implements UserState { + const _UserState({this.city, this.image, this.mobile, this.birthday, this.province, this.lastName, this.firstName, this.nationalId, this.nationalCode}); + factory _UserState.fromJson(Map json) => _$UserStateFromJson(json); + +@override final String? city; +@override final String? image; +@override final String? mobile; +@override final String? birthday; +@override final String? province; +@override final String? lastName; +@override final String? firstName; +@override final String? nationalId; +@override final String? nationalCode; + +/// Create a copy of UserState +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserStateCopyWith<_UserState> get copyWith => __$UserStateCopyWithImpl<_UserState>(this, _$identity); + +@override +Map toJson() { + return _$UserStateToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _UserState&&(identical(other.city, city) || other.city == city)&&(identical(other.image, image) || other.image == image)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.birthday, birthday) || other.birthday == birthday)&&(identical(other.province, province) || other.province == province)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.nationalCode, nationalCode) || other.nationalCode == nationalCode)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,city,image,mobile,birthday,province,lastName,firstName,nationalId,nationalCode); + +@override +String toString() { + return 'UserState(city: $city, image: $image, mobile: $mobile, birthday: $birthday, province: $province, lastName: $lastName, firstName: $firstName, nationalId: $nationalId, nationalCode: $nationalCode)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserStateCopyWith<$Res> implements $UserStateCopyWith<$Res> { + factory _$UserStateCopyWith(_UserState value, $Res Function(_UserState) _then) = __$UserStateCopyWithImpl; +@override @useResult +$Res call({ + String? city, String? image, String? mobile, String? birthday, String? province, String? lastName, String? firstName, String? nationalId, String? nationalCode +}); + + + + +} +/// @nodoc +class __$UserStateCopyWithImpl<$Res> + implements _$UserStateCopyWith<$Res> { + __$UserStateCopyWithImpl(this._self, this._then); + + final _UserState _self; + final $Res Function(_UserState) _then; + +/// Create a copy of UserState +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? city = freezed,Object? image = freezed,Object? mobile = freezed,Object? birthday = freezed,Object? province = freezed,Object? lastName = freezed,Object? firstName = freezed,Object? nationalId = freezed,Object? nationalCode = freezed,}) { + return _then(_UserState( +city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?,image: freezed == image ? _self.image : image // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,birthday: freezed == birthday ? _self.birthday : birthday // ignore: cast_nullable_to_non_nullable +as String?,province: freezed == province ? _self.province : province // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,nationalCode: freezed == nationalCode ? _self.nationalCode : nationalCode // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/user_profile/user_profile.g.dart b/packages/chicken/lib/data/models/response/user_profile/user_profile.g.dart new file mode 100644 index 0000000..7a3516a --- /dev/null +++ b/packages/chicken/lib/data/models/response/user_profile/user_profile.g.dart @@ -0,0 +1,113 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_profile.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_UserProfile _$UserProfileFromJson(Map json) => _UserProfile( + role: (json['role'] as List?)?.map((e) => e as String).toList(), + city: json['city'] as String?, + province: json['province'] as String?, + key: json['key'] as String?, + userGateWayId: json['user_gate_way_id'] as String?, + userDjangoIdForeignKey: json['user_django_id_foreign_key'], + provinceIdForeignKey: json['province_id_foreign_key'], + cityIdForeignKey: json['city_id_foreign_key'], + systemUserProfileIdKey: json['system_user_profile_id_key'], + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + nationalCode: json['national_code'] as String?, + nationalCodeImage: json['national_code_image'] as String?, + nationalId: json['national_id'] as String?, + mobile: json['mobile'] as String?, + birthday: json['birthday'] as String?, + image: json['image'] as String?, + password: json['password'] as String?, + active: json['active'] as bool?, + state: json['state'] == null + ? null + : UserState.fromJson(json['state'] as Map), + baseOrder: (json['base_order'] as num?)?.toInt(), + cityNumber: (json['city_number'] as num?)?.toInt(), + cityName: json['city_name'] as String?, + provinceNumber: (json['province_number'] as num?)?.toInt(), + provinceName: json['province_name'] as String?, + unitName: json['unit_name'] as String?, + unitNationalId: json['unit_national_id'] as String?, + unitRegistrationNumber: json['unit_registration_number'] as String?, + unitEconomicalNumber: json['unit_economical_number'] as String?, + unitProvince: json['unit_province'] as String?, + unitCity: json['unit_city'] as String?, + unitPostalCode: json['unit_postal_code'] as String?, + unitAddress: json['unit_address'] as String?, + personType: json['person_type'] as String?, + type: json['type'] as String?, +); + +Map _$UserProfileToJson(_UserProfile instance) => + { + 'role': instance.role, + 'city': instance.city, + 'province': instance.province, + 'key': instance.key, + 'user_gate_way_id': instance.userGateWayId, + 'user_django_id_foreign_key': instance.userDjangoIdForeignKey, + 'province_id_foreign_key': instance.provinceIdForeignKey, + 'city_id_foreign_key': instance.cityIdForeignKey, + 'system_user_profile_id_key': instance.systemUserProfileIdKey, + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'national_code': instance.nationalCode, + 'national_code_image': instance.nationalCodeImage, + 'national_id': instance.nationalId, + 'mobile': instance.mobile, + 'birthday': instance.birthday, + 'image': instance.image, + 'password': instance.password, + 'active': instance.active, + 'state': instance.state, + 'base_order': instance.baseOrder, + 'city_number': instance.cityNumber, + 'city_name': instance.cityName, + 'province_number': instance.provinceNumber, + 'province_name': instance.provinceName, + 'unit_name': instance.unitName, + 'unit_national_id': instance.unitNationalId, + 'unit_registration_number': instance.unitRegistrationNumber, + 'unit_economical_number': instance.unitEconomicalNumber, + 'unit_province': instance.unitProvince, + 'unit_city': instance.unitCity, + 'unit_postal_code': instance.unitPostalCode, + 'unit_address': instance.unitAddress, + 'person_type': instance.personType, + 'type': instance.type, + }; + +_UserState _$UserStateFromJson(Map json) => _UserState( + city: json['city'] as String?, + image: json['image'] as String?, + mobile: json['mobile'] as String?, + birthday: json['birthday'] as String?, + province: json['province'] as String?, + lastName: json['last_name'] as String?, + firstName: json['first_name'] as String?, + nationalId: json['national_id'] as String?, + nationalCode: json['national_code'] as String?, +); + +Map _$UserStateToJson(_UserState instance) => + { + 'city': instance.city, + 'image': instance.image, + 'mobile': instance.mobile, + 'birthday': instance.birthday, + 'province': instance.province, + 'last_name': instance.lastName, + 'first_name': instance.firstName, + 'national_id': instance.nationalId, + 'national_code': instance.nationalCode, + }; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 14bdec0..6ab177b 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; @@ -15,33 +16,29 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; import 'package:rasadyar_core/core.dart'; -import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { Future?> getInventory({required String token}); - Future getKillHouseDistributionInfo({ - required String token, - }); + Future getKillHouseDistributionInfo({required String token}); Future getGeneralBarInformation({ required String token, Map? queryParameters, }); - Future?> getWaitingArrivals({ + Future?> getWaitingArrivals({ required String token, Map? queryParameters, }); - Future setSateForArrivals({ - required String token, - required Map request, - }); + Future setSateForArrivals({required String token, required Map request}); Future?> getImportedLoadsModel({ required String token, @@ -53,15 +50,9 @@ abstract class ChickenRepository { Map? queryParameters, }); - Future confirmAllocation({ - required String token, - required Map allocation, - }); + Future confirmAllocation({required String token, required Map allocation}); - Future denyAllocation({ - required String token, - required String allocationToken, - }); + Future denyAllocation({required String token, required String allocationToken}); Future confirmAllAllocation({ required String token, @@ -87,13 +78,7 @@ abstract class ChickenRepository { Map? queryParameters, }); - - Future updateStewardAllocation({ - required String token, - required ConformAllocation request, - }); - - + Future updateStewardAllocation({required String token, required ConformAllocation request}); Future getStewardDashboard({ required String token, @@ -107,8 +92,7 @@ abstract class ChickenRepository { required String endDate, }); - Future?> - getStewardPurchasesOutSideOfTheProvince({ + Future?> getStewardPurchasesOutSideOfTheProvince({ required String token, Map? queryParameters, }); @@ -123,8 +107,7 @@ abstract class ChickenRepository { required String stewardFreeBarKey, }); - Future?> - getOutProvinceCarcassesBuyer({ + Future?> getOutProvinceCarcassesBuyer({ required String token, Map? queryParameters, }); @@ -153,4 +136,9 @@ abstract class ChickenRepository { required StewardFreeSaleBarRequest body, }); + Future getUserProfile({required String token}); + + Future updateUserProfile({required String token, required UserProfile userProfile}); + + Future updatePassword({required String token, required ChangePasswordRequestModel model}); } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 2ff84fc..86eecf1 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; @@ -16,6 +17,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' hide ProductModel; import 'package:rasadyar_core/core.dart'; @@ -176,7 +178,7 @@ class ChickenRepositoryImpl implements ChickenRepository { Map? queryParameters, }) async { var res = await _httpClient.get( - '/guilds/?', + '/guilds/', queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJsonList: (json) => @@ -265,7 +267,7 @@ class ChickenRepositoryImpl implements ChickenRepository { Map? queryParameters, }) async { var res = await _httpClient.get( - '/steward_free_bar/?', + '/steward_free_bar/', queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJson: (json) => PaginationModel.fromJson( @@ -279,7 +281,7 @@ class ChickenRepositoryImpl implements ChickenRepository { @override Future?> getCity({required String provinceName}) async { var res = await _httpClient.get( - '/iran_city/?', + '/iran_city/', queryParameters: {'name': provinceName}, fromJsonList: (json) => json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), @@ -315,7 +317,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String stewardFreeBarKey, }) async { await _httpClient.delete( - '/steward_free_bar/0/?', + '/steward_free_bar/0/', headers: {'Authorization': 'Bearer $token'}, queryParameters: {'key': stewardFreeBarKey}, ); @@ -327,7 +329,7 @@ class ChickenRepositoryImpl implements ChickenRepository { Map? queryParameters, }) async { var res = await _httpClient.get( - '/out-province-carcasses-buyer/?', + '/out-province-carcasses-buyer/', queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJson: (json) => PaginationModel.fromJson( @@ -356,7 +358,7 @@ class ChickenRepositoryImpl implements ChickenRepository { Map? queryParameters, }) async { var res = await _httpClient.get( - '/steward_free_sale_bar/?', + '/steward_free_sale_bar/', queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJson: (json) => PaginationModel.fromJson( @@ -392,4 +394,36 @@ class ChickenRepositoryImpl implements ChickenRepository { headers: {'Authorization': 'Bearer $token'}, ); } + + @override + Future getUserProfile({required String token}) async { + var res = await _httpClient.get( + '/system_user_profile/?self-profile', + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => UserProfile.fromJson(json), + ); + + return res.data; + } + + @override + Future updateUserProfile({required String token, required UserProfile userProfile}) async { + await _httpClient.put( + '/system_user_profile/?self-profile/0/', + headers: {'Authorization': 'Bearer $token'}, + data: userProfile.toJson()..removeWhere((key, value) => value == null), + ); + } + + @override + Future updatePassword({ + required String token, + required ChangePasswordRequestModel model, + }) async { + await _httpClient.post( + '/api/change_password/', + headers: {'Authorization': 'Bearer $token'}, + data: model.toJson()..removeWhere((key, value) => value == null), + ); + } } diff --git a/packages/chicken/lib/presentation/pages/profile/logic.dart b/packages/chicken/lib/presentation/pages/profile/logic.dart new file mode 100644 index 0000000..629cd6c --- /dev/null +++ b/packages/chicken/lib/presentation/pages/profile/logic.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +class ProfileLogic extends GetxController { + RootLogic rootLogic = Get.find(); + RxInt selectedInformationType = 0.obs; + Rxn birthDate = Rxn(); + + Rx> userProfile = Rx>(Resource.loading()); + + TextEditingController nameController = TextEditingController(); + TextEditingController lastNameController = TextEditingController(); + TextEditingController nationalCodeController = TextEditingController(); + TextEditingController nationalIdController = TextEditingController(); + TextEditingController birthdayController = TextEditingController(); + + TextEditingController oldPasswordController = TextEditingController(); + TextEditingController newPasswordController = TextEditingController(); + TextEditingController retryNewPasswordController = TextEditingController(); + + RxList cites = [].obs; + Rxn selectedProvince = Rxn(); + Rxn selectedCity = Rxn(); + + GlobalKey formKey = GlobalKey(); + + @override + void onReady() { + super.onReady(); + getUserProfile(); + selectedProvince.listen((p0) => getCites()); + userProfile.listen((data) { + nameController.text = data.data?.firstName ?? ''; + lastNameController.text = data.data?.lastName ?? ''; + nationalCodeController.text = data.data?.nationalCode ?? ''; + nationalIdController.text = data.data?.nationalId ?? ''; + birthdayController.text = data.data?.birthday?.toJalali.formatCompactDate() ?? ''; + birthDate.value = data.data?.birthday?.toJalali; + selectedProvince.value = IranProvinceCityModel( + name: data.data?.province ?? '', + id: data.data?.provinceNumber ?? 0, + ); + + selectedCity.value = IranProvinceCityModel( + name: data.data?.city ?? '', + id: data.data?.cityNumber ?? 0, + ); + }); + } + + @override + void onClose() { + super.onClose(); + } + + Future getUserProfile() async { + userProfile.value = Resource.loading(); + await safeCall( + call: () async => await rootLogic.chickenRepository.getUserProfile( + token: rootLogic.tokenService.accessToken.value!, + ), + onSuccess: (result) { + if (result != null) { + userProfile.value = Resource.success(result); + } + }, + onError: (error, stackTrace) {}, + ); + } + + Future getCites() async { + await safeCall( + call: () => + rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), + onSuccess: (result) { + if (result != null && result.isNotEmpty) { + cites.value = result; + } + }, + ); + } + + Future updateUserProfile() async { + UserProfile userProfile = UserProfile( + firstName: nameController.text, + lastName: lastNameController.text, + nationalCode: nationalCodeController.text, + nationalId: nationalIdController.text, + birthday: birthDate.value?.toGregorian().toString(), + personType: 'self', + type: 'self_profile', + ); + await safeCall( + call: () async => await rootLogic.chickenRepository.updateUserProfile( + token: rootLogic.tokenService.accessToken.value!, + userProfile: userProfile, + ), + ); + } + + Future updatePassword() async { + if (formKey.currentState?.validate() ?? false) { + ChangePasswordRequestModel model = ChangePasswordRequestModel( + username: userProfile.value.data?.mobile, + password: newPasswordController.text, + ); + + await safeCall( + call: () async => await rootLogic.chickenRepository.updatePassword( + token: rootLogic.tokenService.accessToken.value!, + model: model, + ), + ); + } + } + + void clearPasswordForm() { + oldPasswordController.clear(); + newPasswordController.clear(); + retryNewPasswordController.clear(); + } +} diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart new file mode 100644 index 0000000..0ef195a --- /dev/null +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -0,0 +1,502 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class ProfilePage extends GetView { + const ProfilePage({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + spacing: 30, + children: [ + Expanded( + flex: 1, + child: Container( + color: AppColor.blueNormal, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row(), + Container( + width: 128.w, + height: 128.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.blueLightActive, + ), + child: Center( + child: Assets.vec.userSvg.svg( + width: 64.w, + height: 64.h, + colorFilter: ColorFilter.mode(AppColor.whiteLight, BlendMode.srcIn), + ), + ), + ), + ], + ), + ), + ), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 16, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 10), + child: userProfileInformation(), + ), + ), + + ObxValue((data) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Wrap( + spacing: 20, + runSpacing: 10, + children: [ + cardActionWidget( + title: 'اطلاعات کاربری', + onPressed: () { + data.value = 0; + }, + icon: Assets.vec.profileUserSvg.path, + selected: data.value == 0, + ), + + cardActionWidget( + title: 'تغییر رمز عبور', + selected: true, + onPressed: () { + Get.bottomSheet(changePasswordBottomSheet(), isScrollControlled: true); + }, + icon: Assets.vec.lockSvg.path, + ), + /*cardActionWidget( + title: 'اطلاعات بانکی', + onPressed: () { + data.value = 1; + }, + icon: Assets.vec.informationSvg.path, + selected: data.value == 1, + ), + cardActionWidget( + title: 'اطلاعات \nصدور فاکتور', + onPressed: () { + data.value = 2; + }, + icon: Assets.vec.receiptDiscountSvg.path, + selected: data.value == 2, + ),*/ + ], + ), + ); + }, controller.selectedInformationType), + + SizedBox(height: 100), + ], + ), + ), + ], + ); + } + + Container invoiceIssuanceInformation() => Container(); + + Widget bankInformationWidget() => Column( + spacing: 16, + children: [ + itemList(title: 'نام بانک', content: 'سامان'), + itemList(title: 'نام صاحب حساب', content: 'رضا رضایی'), + itemList(title: 'شماره کارت ', content: '54154545415'), + itemList(title: 'شماره حساب', content: '62565263263652'), + itemList(title: 'شماره شبا', content: '62565263263652'), + ], + ); + + Widget userProfileInformation() { + return ObxValue((data) { + if (data.value.status == ResourceStatus.loading) { + return LoadingWidget(); + } else if (data.value.status == ResourceStatus.error) { + return ErrorWidget('خطا در دریافت اطلاعات کاربر'); + } else if (data.value.status == ResourceStatus.success) { + UserProfile item = data.value.data!; + return Column( + spacing: 6, + children: [ + buildRowOnTapped( + onTap: () { + Get.bottomSheet(userInformationBottomSheet(), isScrollControlled: true); + }, + titleWidget: Column( + spacing: 3, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'اطلاعات هویتی', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Container(width: 37.w, height: 1.h, color: AppColor.greenNormal), + ], + ), + valueWidget: Assets.vec.editSvg.svg( + width: 24.w, + height: 24.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + itemList( + title: 'نام و نام خانوادگی', + content: item.fullname ?? 'نامشخص', + icon: Assets.vec.userSvg.path, + hasColoredBox: true, + ), + itemList( + title: 'موبایل', + content: item.mobile ?? 'نامشخص', + icon: Assets.vec.callSvg.path, + ), + itemList( + title: 'کدملی', + content: item.nationalId ?? 'نامشخص', + icon: Assets.vec.tagUserSvg.path, + ), + itemList( + title: 'شماره شناسنامه', + content: item.nationalCode ?? 'نامشخص', + icon: Assets.vec.userSquareSvg.path, + ), + itemList( + title: 'تاریخ تولد', + content: item.birthday?.toJalali.formatCompactDate() ?? 'نامشخص', + icon: Assets.vec.calendarSvg.path, + ), + itemList( + title: 'استان', + content: item.province ?? 'نامشخص', + icon: Assets.vec.pictureFrameSvg.path, + ), + itemList(title: 'شهر', content: item.city ?? 'نامشخص', icon: Assets.vec.mapSvg.path), + ], + ); + } else { + return SizedBox.shrink(); + } + }, controller.userProfile); + } + + Widget itemList({ + required String title, + required String content, + String? icon, + bool hasColoredBox = false, + }) => Container( + padding: EdgeInsets.symmetric(horizontal: 12.h, vertical: 6.h), + decoration: BoxDecoration( + color: hasColoredBox ? AppColor.blueLight : Colors.transparent, + border: hasColoredBox + ? Border.all(width: 1, color: AppColor.blueLightHover) + : Border.all(width: 0, color: Colors.transparent), + ), + child: Row( + spacing: 4, + children: [ + if (icon != null) + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: SvgGenImage.vec(icon).svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), + Spacer(), + Text(content, style: AppFonts.yekan13.copyWith(color: AppColor.darkGreyNormalHover)), + ], + ), + ); + + Widget cardActionWidget({ + required String title, + required VoidCallback onPressed, + required String icon, + bool selected = false, + }) { + return GestureDetector( + onTap: onPressed, + child: Column( + spacing: 4, + children: [ + Container( + width: 52, + height: 52, + padding: EdgeInsets.all(8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: SvgGenImage.vec(icon).svg( + width: 40, + height: 40, + colorFilter: ColorFilter.mode( + selected ? AppColor.blueNormal : AppColor.whiteLight, + BlendMode.srcIn, + ), + ), + ), + SizedBox(height: 2), + Text( + title, + style: AppFonts.yekan10.copyWith( + color: selected ? AppColor.blueNormal : AppColor.blueLightActive, + ), + textAlign: TextAlign.center, + ), + ], + ), + ); + } + + Widget userInformationBottomSheet() { + return BaseBottomSheet( + height: 500.h, + child: SingleChildScrollView( + child: Column( + spacing: 8, + children: [ + Text( + 'ویرایش اطلاعات هویتی', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + + /* + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column(spacing: 12, children: [_provinceWidget(), _cityWidget()]), + ),*/ + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 12, + children: [ + RTextField( + controller: controller.nameController, + label: 'نام', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.lastNameController, + label: 'نام خانوادگی', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.nationalCodeController, + label: 'شماره شناسنامه', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + RTextField( + controller: controller.nationalIdController, + label: 'کد ملی', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + ), + + ObxValue((data) { + return RTextField( + controller: controller.birthdayController, + label: 'تاریخ تولد', + initText: data.value?.formatCompactDate() ?? '', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + onTap: () {}, + ); + }, controller.birthDate), + + SizedBox(), + + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + height: 40.h, + text: 'ویرایش', + onPressed: () async { + await controller.updateUserProfile(); + controller.getUserProfile(); + Get.back(); + }, + ), + ROutlinedElevated( + height: 40.h, + text: 'انصراف', + borderColor: AppColor.blueNormal, + onPressed: () { + Get.back(); + }, + ), + ], + ), + ], + ), + ), + SizedBox(), + ], + ), + ), + ); + } + + Widget _provinceWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rootLogic.provinces, + onChanged: (value) { + controller.selectedProvince.value = value; + }, + selectedItem: controller.selectedProvince.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'), + ); + }); + } + + Widget _cityWidget() { + return ObxValue((data) { + return OverlayDropdownWidget( + items: data, + onChanged: (value) { + controller.selectedCity.value = value; + }, + selectedItem: controller.selectedCity.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'), + ); + }, controller.cites); + } + + Widget changePasswordBottomSheet() { + return BaseBottomSheet( + height: 400.h, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 8, + children: [ + Text( + 'تغییر رمز عبور', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + ), + SizedBox(), + RTextField( + controller: controller.oldPasswordController, + hintText: 'رمز عبور قبلی', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null || value.isEmpty) { + return 'رمز عبور را وارد کنید'; + } else if (controller.userProfile.value.data?.password != value) { + return 'رمز عبور صحیح نیست'; + } + return null; + }, + ), + RTextField( + controller: controller.newPasswordController, + hintText: 'رمز عبور جدید', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null || value.isEmpty) { + return 'رمز عبور را وارد کنید'; + } else if (value.length < 6) { + return 'رمز عبور باید بیش از 6 کارکتر باشد.'; + } + return null; + }, + ), + RTextField( + controller: controller.retryNewPasswordController, + hintText: 'تکرار رمز عبور جدید', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null || value.isEmpty) { + return 'رمز عبور را وارد کنید'; + } else if (value.length < 6) { + return 'رمز عبور باید بیش از 6 کارکتر باشد.'; + } else if (controller.newPasswordController.text != value) { + return 'رمز عبور جدید یکسان نیست'; + } + return null; + }, + ), + + SizedBox(), + + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + height: 40.h, + text: 'ویرایش', + onPressed: () async { + if (controller.formKey.currentState?.validate() != true) { + return; + } + await controller.updatePassword(); + controller.getUserProfile(); + controller.clearPasswordForm(); + Get.back(); + }, + ), + ROutlinedElevated( + height: 40.h, + text: 'انصراف', + borderColor: AppColor.blueNormal, + onPressed: () { + Get.back(); + }, + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 1a9caf7..5d89ac1 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -8,6 +8,7 @@ import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/profile/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/view.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart'; @@ -22,14 +23,10 @@ class RootLogic extends GetxController { SalePage(), HomePage(), Container(color: Colors.blue), - Container(color: Colors.amber), + ProfilePage(), ]; - final defaultRoutes = { - 0: ChickenRoutes.buy, - 1: ChickenRoutes.sale, - }; - + final defaultRoutes = {0: ChickenRoutes.buy, 1: ChickenRoutes.sale}; List routesName = ['رصدطیور']; @@ -65,7 +62,8 @@ class RootLogic extends GetxController { Future getInventory() async { await safeCall?>( - call: () async => await chickenRepository.getInventory(token: tokenService.accessToken.value!), + call: () async => + await chickenRepository.getInventory(token: tokenService.accessToken.value!), onSuccess: (result) { if (result != null) { inventoryModel.value = result.first; diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index b31b7c6..15d9d88 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -9,6 +9,7 @@ import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/logic.da import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/profile/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; @@ -38,10 +39,8 @@ sealed class ChickenPages { Get.lazyPut(() => HomeLogic()); Get.lazyPut(() => BuyLogic()); Get.lazyPut(() => SaleLogic()); + Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => BaseLogic()); - /*Get.lazyPut(() => SalesInProvinceLogic()); - - Get.lazyPut(() => SalesOutOfProvinceLogic());*/ }), ), diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 2a56bb5..eb40db8 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -146,6 +146,9 @@ class $AssetsIconsGen { /// File path: assets/icons/liveStock.svg SvgGenImage get liveStock => const SvgGenImage('assets/icons/liveStock.svg'); + /// File path: assets/icons/lock.svg + SvgGenImage get lock => const SvgGenImage('assets/icons/lock.svg'); + /// File path: assets/icons/logout.svg SvgGenImage get logout => const SvgGenImage('assets/icons/logout.svg'); @@ -280,6 +283,7 @@ class $AssetsIconsGen { key, killogram, liveStock, + lock, logout, map, mapMarker, @@ -463,6 +467,9 @@ class $AssetsVecGen { /// File path: assets/vec/liveStock.svg.vec SvgGenImage get liveStockSvg => const SvgGenImage.vec('assets/vec/liveStock.svg.vec'); + /// File path: assets/vec/lock.svg.vec + SvgGenImage get lockSvg => const SvgGenImage.vec('assets/vec/lock.svg.vec'); + /// File path: assets/vec/logout.svg.vec SvgGenImage get logoutSvg => const SvgGenImage.vec('assets/vec/logout.svg.vec'); @@ -597,6 +604,7 @@ class $AssetsVecGen { keySvg, killogramSvg, liveStockSvg, + lockSvg, logoutSvg, mapSvg, mapMarkerSvg, diff --git a/packages/core/lib/presentation/widget/list_view/r_list_view.dart b/packages/core/lib/presentation/widget/list_view/r_list_view.dart index 9cc1a95..1e62589 100644 --- a/packages/core/lib/presentation/widget/list_view/r_list_view.dart +++ b/packages/core/lib/presentation/widget/list_view/r_list_view.dart @@ -114,17 +114,17 @@ class RListView extends StatelessWidget { @override Widget build(BuildContext context) { switch (resource.status) { - case Status.initial: - case Status.loading: + case ResourceStatus.initial: + case ResourceStatus.loading: return loadingWidget; - case Status.error: + case ResourceStatus.error: return errorWidget; - case Status.empty: + case ResourceStatus.empty: return emptyWidget; - case Status.success: + case ResourceStatus.success: if (resource.data?.isEmpty ?? true) { return emptyWidget; } diff --git a/packages/core/lib/utils/network/resource.dart b/packages/core/lib/utils/network/resource.dart index 94d2c4c..cd7ed0f 100644 --- a/packages/core/lib/utils/network/resource.dart +++ b/packages/core/lib/utils/network/resource.dart @@ -1,31 +1,31 @@ -enum Status { initial, loading, success, error, empty } +enum ResourceStatus { initial, loading, success, error, empty } class Resource { - final Status status; + final ResourceStatus status; final T? data; final String? message; const Resource._({required this.status, this.data, this.message}); - const Resource.initial() : this._(status: Status.initial); + const Resource.initial() : this._(status: ResourceStatus.initial); - const Resource.loading() : this._(status: Status.loading); + const Resource.loading() : this._(status: ResourceStatus.loading); - const Resource.success(T data) : this._(status: Status.success, data: data); + const Resource.success(T data) : this._(status: ResourceStatus.success, data: data); - const Resource.error(String message) : this._(status: Status.error, message: message); + const Resource.error(String message) : this._(status: ResourceStatus.error, message: message); - const Resource.empty() : this._(status: Status.empty); + const Resource.empty() : this._(status: ResourceStatus.empty); - bool get isInitial => status == Status.initial; + bool get isInitial => status == ResourceStatus.initial; - bool get isLoading => status == Status.loading; + bool get isLoading => status == ResourceStatus.loading; - bool get isSuccess => status == Status.success; + bool get isSuccess => status == ResourceStatus.success; - bool get isError => status == Status.error; + bool get isError => status == ResourceStatus.error; - bool get isEmpty => status == Status.empty; + bool get isEmpty => status == ResourceStatus.empty; @override String toString() { From d51e0240bba34fb0c4a22caa882f0ee12cd81fa3 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 8 Jul 2025 16:20:55 +0330 Subject: [PATCH 184/256] feat : home page widely usage --- .../lib/presentation/pages/home/view.dart | 139 ++++++++++++++---- 1 file changed, 111 insertions(+), 28 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index cf417a7..11e40f6 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -52,7 +52,10 @@ class HomePage extends GetView { fit: BoxFit.cover, ), shape: RoundedRectangleBorder( - side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + side: BorderSide( + width: 0.25, + color: const Color(0xFFB0B0B0), + ), borderRadius: BorderRadius.circular(4), ), ), @@ -60,7 +63,9 @@ class HomePage extends GetView { Text( 'مرغ گرم', textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDarkActive, + ), ), Spacer(), AnimatedRotation( @@ -76,13 +81,25 @@ class HomePage extends GetView { _inventoryWidget(), Row( - children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + children: [ + Text( + 'اطلاعات بارها', + textAlign: TextAlign.right, + style: AppFonts.yekan16, + ), + ], ), _informationShipment(), Row( - children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], + children: [ + Text( + 'اطلاعات توزیع', + textAlign: TextAlign.right, + style: AppFonts.yekan16, + ), + ], ), distributionInformationWidget(), @@ -107,7 +124,10 @@ class HomePage extends GetView { fit: BoxFit.cover, ), shape: RoundedRectangleBorder( - side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + side: BorderSide( + width: 0.25, + color: const Color(0xFFB0B0B0), + ), borderRadius: BorderRadius.circular(4), ), ), @@ -115,7 +135,9 @@ class HomePage extends GetView { Text( 'مرغ گرم', textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDarkActive, + ), ), Spacer(), Icon(CupertinoIcons.chevron_down, size: 18), @@ -147,9 +169,30 @@ class HomePage extends GetView { children: [ widelyUsed( title: 'خرید خارج استان', - iconPath: Assets.vec.cubeSearchSvg.path, + iconPath: Assets.vec.truckFastSvg.path, + onTap: () async { + controller.rootLogic.currentPage.value = 0; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'خرید داخل استان', + iconPath: Assets.vec.cubeSvg.path, + onTap: () async { + controller.rootLogic.currentPage.value = 0; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.buysInProvince, id: 0); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'فروش خارج استان', + iconPath: Assets.vec.truckFastSvg.path, onTap: () async { - iLog('on tap :خرید خارج استان '); controller.rootLogic.currentPage.value = 1; controller.rootLogic.currentPage.refresh(); await Future.delayed(Duration(milliseconds: 100)); @@ -158,10 +201,13 @@ class HomePage extends GetView { ), SizedBox(width: 15), widelyUsed( - title: 'عمده فروشی', - iconPath: Assets.vec.truckFastSvg.path, - onTap: () { - //Get.toNamed(ChickenRoutes.salesWithinProvince); + title: 'فروش داخل استان', + iconPath: Assets.vec.cubeSvg.path, + onTap: () async{ + controller.rootLogic.currentPage.value = 1; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.salesInProvince, id: 1); }, ), SizedBox(width: 15), @@ -382,15 +428,20 @@ class HomePage extends GetView { height: 82, decoration: BoxDecoration( color: bgLabelColor, - borderRadius: BorderRadius.only(topRight: Radius.circular(8), bottomRight: Radius.circular(8)), + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 4, children: [ - SvgGenImage.vec( - iconPath, - ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), + ), Text( title, textAlign: TextAlign.right, @@ -405,7 +456,10 @@ class HomePage extends GetView { child: Container( decoration: BoxDecoration( color: bgDescriptionColor, - borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), ), child: isLoading ? Center(child: CupertinoActivityIndicator()) @@ -499,9 +553,11 @@ class HomePage extends GetView { ), ), child: Center( - child: SvgGenImage.vec( - iconPath, - ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), + ), ), ), ), @@ -510,7 +566,11 @@ class HomePage extends GetView { ); } - Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { + Widget widelyUsed({ + required String title, + required String iconPath, + required VoidCallback onTap, + }) { return GestureDetector( onTap: onTap, child: Column( @@ -573,7 +633,11 @@ class HomePage extends GetView { ); } - Widget inventoryItem({required bool isExpanded, required int index, required InventoryModel model}) { + Widget inventoryItem({ + required bool isExpanded, + required int index, + required InventoryModel model, + }) { return Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 8, @@ -585,9 +649,18 @@ class HomePage extends GetView { spacing: 8, children: [ buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), - buildRow('وزن خریدهای آزاد داخل استان (کیلوگرم)', model.receiveFreeCarcassesWeight.toString()), - buildRow('وزن خریدهای خارج استان (کیلوگرم)', model.freeBuyingCarcassesWeight.toString()), - buildRow('کل ورودی به انبار (کیلوگرم)', model.totalFreeBarsCarcassesWeight.toString()), + buildRow( + 'وزن خریدهای آزاد داخل استان (کیلوگرم)', + model.receiveFreeCarcassesWeight.toString(), + ), + buildRow( + 'وزن خریدهای خارج استان (کیلوگرم)', + model.freeBuyingCarcassesWeight.toString(), + ), + buildRow( + 'کل ورودی به انبار (کیلوگرم)', + model.totalFreeBarsCarcassesWeight.toString(), + ), buildRow('کل فروش (کیلوگرم)', model.realAllocatedWeight.toString()), buildRow('مانده انبار (کیلوگرم)', model.totalRemainWeight.toString()), ], @@ -645,15 +718,25 @@ class HomePage extends GetView { style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + buildRow( + 'فروش و توزیع داخل استان (کیلوگرم)', + model.stewardAllocationsWeight!.toInt().toString(), + ), + buildRow( + 'فروش و توزیع خارج استان (کیلوگرم)', + model.freeSalesWeight!.toInt().toString(), + ), ], ) : const Center(child: CircularProgressIndicator()), ); } - Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { + Widget cardWidget({ + required String title, + required String iconPath, + required VoidCallback onTap, + }) { return Container( width: Get.width / 4, height: 130, From 0b921fa9177e5d029aa3006ea3625e22a05530e7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 9 Jul 2025 14:54:28 +0330 Subject: [PATCH 185/256] fix : ui change's --- assets/icons/close_circle.svg | 8 + assets/icons/empty.svg | 77 ++- assets/vec/close_circle.svg.vec | Bin 0 -> 658 bytes assets/vec/empty.svg.vec | Bin 14 -> 12776 bytes .../lib/presentation/pages/buy/view.dart | 1 - .../pages/buy_in_province/logic.dart | 5 +- .../pages/buy_in_province/view.dart | 32 +- .../pages/buy_in_province_waiting/view.dart | 7 +- .../pages/buy_out_of_province/view.dart | 36 +- .../pages/entering_the_warehouse/logic.dart | 101 ---- .../pages/entering_the_warehouse/view.dart | 525 ------------------ .../pages/sales_in_province/view.dart | 33 +- .../pages/sales_out_of_province/logic.dart | 8 +- .../pages/sales_out_of_province/view.dart | 82 +-- .../sales_out_of_province_buyers/view.dart | 80 +-- .../view.dart | 37 +- .../lib/presentation/widget/app_bar.dart | 71 ++- .../presentation/widget/base_page/view.dart | 2 +- .../widget/filter_bottom_sheet.dart | 43 ++ .../presentation/widget/inventory_widget.dart | 23 + .../lib/presentation/widget/search/view.dart | 49 +- packages/chicken/pubspec.yaml | 3 +- .../lib/presentation/common/assets.gen.dart | 8 + .../widget/buttons/outline_elevated.dart | 152 ++--- .../lib/presentation/widget/empty_widget.dart | 2 +- .../presentation/widget/inputs/r_input.dart | 228 +++++--- pubspec.yaml | 2 +- 27 files changed, 611 insertions(+), 1004 deletions(-) create mode 100644 assets/icons/close_circle.svg create mode 100644 assets/vec/close_circle.svg.vec delete mode 100644 packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart delete mode 100644 packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart create mode 100644 packages/chicken/lib/presentation/widget/filter_bottom_sheet.dart create mode 100644 packages/chicken/lib/presentation/widget/inventory_widget.dart diff --git a/assets/icons/close_circle.svg b/assets/icons/close_circle.svg new file mode 100644 index 0000000..ed5da34 --- /dev/null +++ b/assets/icons/close_circle.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/assets/icons/empty.svg b/assets/icons/empty.svg index 910b77f..88665f2 100644 --- a/assets/icons/empty.svg +++ b/assets/icons/empty.svg @@ -1,9 +1,68 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/vec/close_circle.svg.vec b/assets/vec/close_circle.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..59e1d5b945a04998376fb83ae7aeb48c5559cdfe GIT binary patch literal 658 zcmXw%Pbh-|2n-{JlAd!Fa_e81l|t8I-`E72MgCAi*pj*G~)O+{2e z&M}zR>$~0q*L*(x2fLz8}01E{xv_&vtXtAKl5z zeCA2<`fxdqRe$L3Qex~`+^prz$Fv?hFon@V$p*Rd zAuCKJGaB{hiBp~3_H#++u@1~P2z#wMsTcQ{WRP1jA&c|#HRD1w?QUfFKQw&8{IAK# zh4=6QpU{O*=z`Ei9lD{eOAXzX*qso0QHL+&gJ0wWkq>q39jR#+9jnSOx48b4A!Q0IM literal 0 HcmV?d00001 diff --git a/assets/vec/empty.svg.vec b/assets/vec/empty.svg.vec index 37f9ed7eddcca19498ee72143e6a9f0cbabaeec3..5fcf9c8644ffc1b01bd2f506b9410f2256fa8abb 100644 GIT binary patch literal 12776 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 _setFromDateFilter(callback)); ever(toDateFilter, (callback) => _setToDateFilter(callback)); - } @override @@ -77,9 +76,9 @@ class BuyInProvinceLogic extends GetxController { searchedValue.value = data?.trim(); final isWaiting = selectedSegmentIndex.value == 0; if (isWaiting) { - buyWaitingLogic.searchedValue.value = searchedValue.value; + buyWaitingLogic.searchedValue.value = searchedValue.value; } else { - buyAllLogic.searchedValue.value = searchedValue.value; + buyAllLogic.searchedValue.value = searchedValue.value; } } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart index 533c4c7..17ad848 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province_all/view.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province_waiting/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; @@ -18,7 +20,7 @@ class BuyInProvincePage extends GetView { onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ - inventoryWidget(), + inventoryWidget(controller.rootLogic), segmentWidget(), ObxValue((index) { return Expanded( @@ -52,11 +54,11 @@ class BuyInProvincePage extends GetView { Widget filterBottomSheet() { return BaseBottomSheet( - height: 250, + height: 200, child: Column( spacing: 16, children: [ - Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), Row( spacing: 8, children: [ @@ -75,9 +77,12 @@ class BuyInProvincePage extends GetView { ), ], ), - SizedBox(height: 2), + RElevated( text: 'اعمال فیلتر', + + isFullWidth: true, + backgroundColor: AppColor.greenNormal, onPressed: () { controller.submitFilter(); Get.back(); @@ -90,22 +95,5 @@ class BuyInProvincePage extends GetView { ); } - Widget inventoryWidget() { - return Container( - width: Get.width, - height: 39, - margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration( - color: AppColor.greenLight, - borderRadius: BorderRadius.circular(8), - ), - alignment: Alignment.center, - child: ObxValue((data) { - return Text( - ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), - ); - }, controller.rootLogic.inventoryModel), - ); - } + } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index d68a287..e29bbba 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -18,7 +18,7 @@ class BuyInProvinceWaitingPage extends GetView { return RPaginatedListView( listType: ListType.separated, resource: data.value, - hasMore: data.value.data?.next!= null, + hasMore: data.value.data?.next != null, padding: EdgeInsets.fromLTRB(8, 8, 8, 80), itemBuilder: (context, index) { var item = data.value.data!.results![index]; @@ -130,7 +130,7 @@ class BuyInProvinceWaitingPage extends GetView { Container itemListExpandedWidget(WaitingArrivalModel item) { return Container( - padding: EdgeInsets.all(8), + padding: EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, @@ -155,7 +155,7 @@ class BuyInProvinceWaitingPage extends GetView { ), Container( height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), + padding: EdgeInsets.symmetric(horizontal: 8), decoration: ShapeDecoration( color: AppColor.blueLight, shape: RoundedRectangleBorder( @@ -194,7 +194,6 @@ class BuyInProvinceWaitingPage extends GetView { ), ), - // buildRow(title: 'مشخصات فروشنده', value: item.killHouseName ?? 'N/A'), buildRow( title: 'نام و نام خانوادگی فروشنده', value: item.steward?.user?.fullname ?? 'N/A', diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 17dc226..ca39b0a 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -7,6 +7,7 @@ import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_pr import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_core/core.dart'; @@ -24,7 +25,7 @@ class BuyOutOfProvincePage extends GetView { onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ - inventoryWidget(), + inventoryWidget(controller.rootLogic), Expanded( child: ObxValue((data) { return RPaginatedListView( @@ -68,7 +69,7 @@ class BuyOutOfProvincePage extends GetView { Container itemListExpandedWidget(StewardFreeBar item) { return Container( - padding: EdgeInsets.all(8), + padding: EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, @@ -85,7 +86,7 @@ class BuyOutOfProvincePage extends GetView { ), Container( height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), + padding: EdgeInsets.symmetric(horizontal: 8), decoration: ShapeDecoration( color: AppColor.blueLight, shape: RoundedRectangleBorder( @@ -153,7 +154,7 @@ class BuyOutOfProvincePage extends GetView { children: [ Text( 'بارنامه', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), Image.network( @@ -166,7 +167,6 @@ class BuyOutOfProvincePage extends GetView { }, loadingBuilder: (context, child, loadingProgress) { if (loadingProgress == null) return child; - print('Loading progress: $loadingProgress'); return CupertinoActivityIndicator(); }, ), @@ -300,7 +300,7 @@ class BuyOutOfProvincePage extends GetView { children: [ Text( isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), _productDropDown(), @@ -556,11 +556,11 @@ class BuyOutOfProvincePage extends GetView { Widget filterBottomSheet() { return BaseBottomSheet( - height: 250, + height: 200, child: Column( spacing: 16, children: [ - Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), Row( spacing: 8, children: [ @@ -579,34 +579,20 @@ class BuyOutOfProvincePage extends GetView { ), ], ), - SizedBox(height: 2), RElevated( text: 'اعمال فیلتر', + isFullWidth: true, + backgroundColor: AppColor.greenNormal, onPressed: () { controller.getStewardPurchaseOutOfProvince(); Get.back(); }, height: 40, ), - SizedBox(height: 16), + ], ), ); } - Widget inventoryWidget() { - return Container( - width: Get.width, - height: 39, - margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), - alignment: Alignment.center, - child: ObxValue((data) { - return Text( - ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), - ); - }, controller.rootLogic.inventoryModel), - ); - } } diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart deleted file mode 100644 index ab10e19..0000000 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/logic.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_chicken/chicken.dart'; -import 'package:rasadyar_chicken/data/models/request/steward_allocation/steward_allocation_request.dart'; -import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; -import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; -import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; -import 'package:rasadyar_core/core.dart'; - -class EnteringTheWarehouseLogic extends GetxController { - RootLogic rootLogic = Get.find(); - Rxn barInformation = Rxn(); - Rxn waitingForArrival = Rxn(); - Rxn importedLoads = Rxn(); - RxInt acceptType = 1.obs; - TextEditingController weightController = TextEditingController(); - TextEditingController volumeController = TextEditingController(); - TextEditingController weightLossController = TextEditingController(); - TextEditingController authenticationCodeController = TextEditingController(); - - final ScrollController scrollControllerImportedLoad = ScrollController(); - final RxInt currentPageImportedLoad = 1.obs; - final RxBool isLoadingMoreImportedLoad = false.obs; - final RxBool addPageImportedLoad = false.obs; - final RxBool hasMoreDataImportedLoad = true.obs; - - final ScrollController scrollControllerWaitingForArrival = ScrollController(); - final RxInt currentPageWaitingForArrival = 1.obs; - final RxBool isLoadingMoreWaitingForArrival = false.obs; - final RxBool addPageWaitingForArrival = false.obs; - final RxBool hasMoreDataWaitingForArrival = true.obs; - - @override - void onReady() { - super.onReady(); - getBarGeneralInformation(); - } - - Future getBarGeneralInformation() async { - safeCall( - call: () async => - await rootLogic.chickenRepository.getGeneralBarInformation( - token: rootLogic.tokenService.accessToken.value!, - ), - onError: (error, stackTrace) { - eLog(error); - }, - onSuccess: (result) { - if (result != null) { - barInformation.value = result; - } - }, - ); - } - - - - - Future getImportedEntried() async { - if (isLoadingMoreImportedLoad.value || !hasMoreDataImportedLoad.value) { - return; - } - - if (addPageImportedLoad.value) { - currentPageImportedLoad.value++; - } - -/* safeCall( - call: () async => await rootLogic.chickenRepository.getImportedLoadsModel( - token: rootLogic.tokenService.accessToken.value!, - page: currentPageImportedLoad.value, - ), - onError: (error, stackTrace) { - isLoadingMoreImportedLoad.value = false; - }, - onSuccess: (result) { - if (result != null) { - if (isLoadingMoreImportedLoad.value && result.results != null) { - importedLoads.value?.results?.addAll(result.results!); - } else { - importedLoads.value = result; - } - isLoadingMoreImportedLoad.value = false; - } - }, - );*/ - } - - clearControllers() { - weightController.clear(); - volumeController.clear(); - weightLossController.clear(); - authenticationCodeController.clear(); - } - @override - void dispose() { - rootLogic.inventoryExpandedList.clear(); - super.dispose(); - } - -} diff --git a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart b/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart deleted file mode 100644 index aa99608..0000000 --- a/packages/chicken/lib/presentation/pages/entering_the_warehouse/view.dart +++ /dev/null @@ -1,525 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; -import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class EnteringTheWarehousePage extends GetView { - EnteringTheWarehousePage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: RAppBar(title: 'ورود به انبار'), - body: SingleChildScrollView( - child: Column( - children: [ - inventoryWidget(), - ObxValue((data) { - return generalBarInformation(data.value); - }, controller.barInformation), - - // importedLoads(), - ], - ), - ), - ); - } - - Widget inventoryWidget() { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - children: [ - const SizedBox(height: 20), - Align( - alignment: Alignment.centerRight, - child: Text( - 'موجودی انبار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ), - SizedBox(height: 4), - /* ObxValue( - (data) => data.isEmpty - ? Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 80, - padding: EdgeInsets.all(6), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ) - : ListView.separated( - shrinkWrap: true, - itemCount: controller.rootLogic.inventoryList.length, - separatorBuilder: (context, index) => - const SizedBox(height: 8), - itemBuilder: (context, index) { - return ObxValue((expand) { - return GestureDetector( - onTap: () { - controller.rootLogic.toggleExpanded(index); - }, - behavior: HitTestBehavior.opaque, - child: AnimatedContainer( - onEnd: () { - controller - .rootLogic - .inventoryExpandedList[index] = !controller - .rootLogic - .inventoryExpandedList[index]!; - }, - margin: const EdgeInsets.symmetric(vertical: 2), - padding: EdgeInsets.all(6), - curve: Curves.easeInOut, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.blueNormal, - width: 1, - ), - ), - duration: const Duration(seconds: 1), - height: expand.keys.contains(index) ? 250 : 80, - child: inventoryItem( - isExpanded: - expand.keys.contains(index) && expand[index]!, - index: index, - model: controller.rootLogic.inventoryList[index], - ), - ), - ); - }, controller.rootLogic.inventoryExpandedList); - }, - ), - controller.rootLogic.inventoryList, - ),*/ - ], - ), - ); - } - - Widget inventoryItem({ - required bool isExpanded, - required int index, - required InventoryModel model, - }) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8, - children: [ - buildRow('نام محصول', model.name ?? ''), - Visibility( - visible: isExpanded, - child: Column( - spacing: 8, - children: [ - buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0'), - buildRow( - 'وزن خریدهای آزاد داخل استان (کیلوگرم)', - model.receiveFreeCarcassesWeight.toString(), - ), - buildRow( - 'وزن خریدهای خارج استان (کیلوگرم)', - model.freeBuyingCarcassesWeight.toString(), - ), - buildRow( - 'کل ورودی به انبار (کیلوگرم)', - model.totalFreeBarsCarcassesWeight.toString(), - ), - buildRow('کل فروش (کیلوگرم)', model.realAllocatedWeight.toString()), - buildRow('مانده انبار (کیلوگرم)', model.totalRemainWeight.toString()), - ], - ), - ), - ], - ); - } - - Widget buildRow(String title, String value) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 2, - child: Text( - title, - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - Flexible( - flex: 1, - child: Text( - value, - textAlign: TextAlign.left, - - style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), - ), - ), - ], - ), - ); - } - - Widget generalBarInformation(BarInformation? model) { - return Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Align( - alignment: Alignment.centerRight, - child: Text( - 'اطلاعات کلی بارها', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ), - ), - Container( - height: 290, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: model != null - ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 8, - children: [ - buildRow('تعداد کل بارها', model.totalBars!.toInt().toString()), - buildRow('وزن کل بارها (کیلوگرم)', model.totalBarsWeight!.toInt().toString()), - buildRow( - 'تعداد کل بارهای وارد شده', - model.totalEnteredBars!.toInt().toString(), - ), - buildRow( - 'وزن کل بار وارد شده (کیلوگرم)', - model.totalEnteredBarsWeight!.toInt().toString(), - ), - buildRow( - 'تعداد کل بارهای وارد نشده', - model.totalNotEnteredBars!.toInt().toString(), - ), - buildRow( - 'وزن کل بار وارد نشده (کیلوگرم)', - model.totalNotEnteredKillHouseRequestsWeight!.toInt().toString(), - ), - buildRow('تعداد کل بارهای رد شده', model.totalRejectedBars!.toInt().toString()), - buildRow( - ' وزن کل بارهای رد شده', - model.totalRejectedBarsWeight!.toInt().toString(), - ), - ], - ) - : const Center(child: CircularProgressIndicator()), - ), - ], - ); - } - - /* Widget waitingForArrival() { - return Column( - children: [ - const SizedBox(height: 8), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Align( - alignment: Alignment.centerRight, - child: Text( - 'موجودی انبار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ), - ), - ObxValue((data) { - if (data.value == null) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: CircularProgressIndicator()), - ); - } else if (data.value?.results.isEmpty ?? true) { - return Container( - height: 80, - margin: const EdgeInsets.all(8), - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.blueNormal, width: 1), - ), - child: Center(child: Text('هیچ ورودی در انتظار نیست')), - ); - } else { - return Container( - margin: const EdgeInsets.symmetric(vertical: 2), - height: 700, - padding: const EdgeInsets.all(6), - child: ListView.separated( - controller: controller.scrollControllerWaitingForArrival, - padding: const EdgeInsets.all(8.0), - itemCount: data.value!.results.length + 1, - itemBuilder: (BuildContext context, int index) { - if (index == data.value!.results!.length) { - return Obx( - () => controller.isLoadingMoreWaitingForArrival.value - ? const Padding( - padding: EdgeInsets.symmetric(vertical: 16), - child: Center(child: CircularProgressIndicator()), - ) - : const SizedBox(), - ); - } - final result = data.value!.results[index]; - return Card( - margin: const EdgeInsets.symmetric(vertical: 4.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: const BorderSide( - color: AppColor.blueNormal, - width: 1, - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildRow('ردیف', '${index + 1}'), - buildRow( - 'تاریخ ثبت', - result.date!.formattedJalaliDate ?? 'N/A', - ), - buildRow( - 'نوع تخصیص', - result.allocationType?.faAllocationType ?? 'N/A', - ), - buildRow( - 'مشخصات خریدار', - result.toSteward?.user?.fullname ?? 'N/A', - ), - buildRow( - 'مشخصات فروشنده', - result.killHouse?.name ?? 'N/A', - ), - buildRow( - 'نوع فروش', - result.sellType?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${result.amount ?? 0} تومان', - ), - buildRow( - 'قیمت کل', - '${result.totalAmount ?? 0} تومان', - ), - buildRow( - 'وزن تخصیصی', - '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', - ), - buildRow('وضعیت', result.state?.faItem ?? 'N/A'), - Row( - children: [ - Expanded( - child: RElevated( - text: 'تایید', - onPressed: () { - Get.bottomSheet(acceptBottomSheet(result)); - }, - height: 40, - ), - ), - SizedBox(width: 20), - Expanded( - child: RElevated( - text: 'رد', - onPressed: () { - controller.denyEntried(result.key!); - Get.back(); - }, - backgroundColor: AppColor.error, - height: 40, - ), - ), - ], - ), - ], - ), - ), - ); - }, - separatorBuilder: (BuildContext context, int index) => - SizedBox(height: 8), - ), - ); - } - }, controller.waitingForArrival), - ], - ); - }*/ - - /* Widget importedLoads() { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildRow('ردیف', '${index + 1}'), - buildRow( - 'تاریخ ثبت', - result.date!.formattedJalaliDate ?? 'N/A', - ), - buildRow( - 'نوع تخصیص', - result.allocationType?.faAllocationType ?? 'N/A', - ), - buildRow( - 'مشخصات خریدار', - '${result.toSteward?.user?.fullname} - ${result.toSteward?.guildsName}' ?? - 'N/A', - ), - buildRow( - 'مشخصات فروشنده', - result.killHouse?.name ?? 'N/A', - ), - buildRow( - 'نوع فروش', - result.sellType?.faItem ?? 'N/A', - ), - buildRow( - 'قیمت هر کیلو', - '${result.amount ?? 0} ریال ', - ), - buildRow( - 'قیمت کل', - '${result.totalAmount ?? 0} ریال', - ), - buildRow( - 'وزن تخصیصی', - '${result.weightOfCarcasses?.toInt() ?? 0} کیلوگرم', - ), - buildRow( - 'کداحراز', - result.registrationCode?.toString() ?? 'N/A', - ), - buildRow( - 'وضعیت کد احراز', - result.systemRegistrationCode == true - ? "ارسال شده" - : "ارسال نشده" ?? 'N/A', - ), - buildRow( - 'افت وزن(کیلوگرم)', - result.weightLossOfCarcasses?.toInt().toString() ?? - 'N/A', - ), - buildRow( - 'وضعیت', - result.receiverState?.faItem ?? 'N/A', - ), - ], - ), - ); - }*/ - - /* Widget acceptBottomSheet(ResultModel resultModel) { - return BaseBottomSheet( - height: 500, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 8, - children: [ - RTextField( - controller: controller.weightController, - initText: resultModel.realWeightOfCarcasses?.toInt().toString(), - label: 'ورزن', - keyboardType: TextInputType.number, - ), - const SizedBox(height: 8), - RTextField( - controller: controller.volumeController, - label: 'حجم', - keyboardType: TextInputType.number, - ), - const SizedBox(height: 8), - RTextField( - controller: controller.weightLossController, - label: 'افت وزن(کیلوگرم)', - keyboardType: TextInputType.number, - ), - const SizedBox(height: 8), - - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.acceptType.value, - onChanged: (value) { - controller.acceptType.value = value!; - }, - ), - Text('با کد احراز', style: AppFonts.yekan14), - - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.acceptType.value, - onChanged: (value) { - controller.acceptType.value = value!; - }, - ), - Text('با کد احراز', style: AppFonts.yekan14), - ], - ); - }, controller.acceptType), - ), - - const SizedBox(height: 8), - ObxValue( - (data) => Visibility( - visible: data.value == 1, - child: RTextField( - controller: controller.authenticationCodeController, - label: 'کد احراز', - keyboardType: TextInputType.number, - ), - ), - controller.acceptType, - ), - - RElevated( - text: 'تایید', - onPressed: () { - controller.acceptEntried(resultModel.key!); - Get.back(); - }, - ), - ], - ), - ); - }*/ -} diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 965a3f8..d5607e9 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -6,6 +6,7 @@ import 'package:rasadyar_chicken/data/models/response/roles_products/roles_produ import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; @@ -25,7 +26,7 @@ class SalesInProvincePage extends GetView { onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ - inventoryWidget(), + inventoryWidget(controller.rootLogic), Expanded( child: ObxValue((data) { return RPaginatedListView( @@ -99,22 +100,6 @@ class SalesInProvincePage extends GetView { ); } - Widget inventoryWidget() { - return Container( - width: Get.width, - height: 39, - margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration(color: AppColor.greenLight, borderRadius: BorderRadius.circular(8)), - alignment: Alignment.center, - child: ObxValue((data) { - return Text( - ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), - ); - }, controller.rootLogic.inventoryModel), - ); - } - itemListWidget(AllocatedMadeModel item) { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, @@ -193,7 +178,7 @@ class SalesInProvincePage extends GetView { itemListExpandedWidget(AllocatedMadeModel item, int index) { return Container( - padding: EdgeInsets.all(8), + padding: EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), child: Column( spacing: 8, @@ -218,7 +203,7 @@ class SalesInProvincePage extends GetView { ), Container( height: 32, - padding: EdgeInsets.symmetric(horizontal: 4), + padding: EdgeInsets.symmetric(horizontal: 8), decoration: ShapeDecoration( color: AppColor.blueLight, shape: RoundedRectangleBorder( @@ -338,7 +323,7 @@ class SalesInProvincePage extends GetView { children: [ Text( '${isEditMode ? 'ویرایش' : 'ثبت'} توزیع/ فروش', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.textColor), + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), const SizedBox(height: 12), productDropDown(), @@ -576,11 +561,11 @@ class SalesInProvincePage extends GetView { Widget filterBottomSheet() { return BaseBottomSheet( - height: 250, + height: 200, child: Column( spacing: 16, children: [ - Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover)), + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), Row( spacing: 8, children: [ @@ -599,16 +584,16 @@ class SalesInProvincePage extends GetView { ), ], ), - SizedBox(height: 2), RElevated( text: 'اعمال فیلتر', + isFullWidth: true, + backgroundColor: AppColor.greenNormal, onPressed: () { controller.getAllocatedMade(); Get.back(); }, height: 40, ), - SizedBox(height: 16), ], ), ); diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index d3e9353..f1df06f 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -43,12 +43,12 @@ class SalesOutOfProvinceLogic extends GetxController { } - void setSearchValue(String value) { - searchedValue.value = value.trim(); + void setSearchValue(String? value) { + searchedValue.value = value?.trim(); if (selectedSegmentIndex.value == 0) { - saleListLogic.searchedValue.value = value.trim(); + saleListLogic.searchedValue.value = value?.trim(); } else { - buyersLogic.searchedValue.value = value.trim(); + buyersLogic.searchedValue.value = value?.trim(); } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index f03e7b6..a2ee38f 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/view.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; +import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; @@ -13,15 +15,12 @@ class SalesOutOfProvincePage extends GetView { @override Widget build(BuildContext context) { return BasePage( - routesWidget: ObxValue( - (route) => buildPageRoute(route), - controller.routesName, - ), + routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName), onBackPressed: () => Get.back(id: 1), onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), widgets: [ - inventoryWidget(), + inventoryWidget(controller.rootLogic), segmentWidget(), Expanded( child: ObxValue((index) { @@ -46,8 +45,7 @@ class SalesOutOfProvincePage extends GetView { borderColor: const Color(0xFFB4B4B4), selectedBorderColor: AppColor.blueNormal, selectedBackgroundColor: AppColor.blueLight, - onSegmentSelected: (index) => - controller.selectedSegmentIndex.value = index, + onSegmentSelected: (index) => controller.selectedSegmentIndex.value = index, backgroundColor: AppColor.whiteGreyNormal, ), ), @@ -56,68 +54,12 @@ class SalesOutOfProvincePage extends GetView { ); } - Widget filterBottomSheet() { - return BaseBottomSheet( - height: 250, - child: Column( - spacing: 16, - children: [ - Text( - 'فیلترها', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.darkGreyDarkHover, - ), - ), - Row( - spacing: 8, - children: [ - Expanded( - child: dateFilterWidget( - date: controller.fromDateFilter, - onChanged: (jalali) => - controller.fromDateFilter.value = jalali, - ), - ), - Expanded( - child: dateFilterWidget( - isFrom: false, - date: controller.toDateFilter, - onChanged: (jalali) => controller.toDateFilter.value = jalali, - ), - ), - ], - ), - SizedBox(height: 2), - RElevated( - text: 'اعمال فیلتر', - onPressed: () { - controller.submitFilter(); - Get.back(); - }, - height: 40, - ), - SizedBox(height: 16), - ], - ), - ); - } + Widget filterBottomSheet() => filterBottomSheetWidget( + fromDate: controller.fromDateFilter, + onChangedFromDate: (jalali) => controller.fromDateFilter.value = jalali, + toDate: controller.toDateFilter, + onChangedToDate: (jalali) => controller.toDateFilter.value = jalali, + onSubmit: () => controller.submitFilter(), + ); - Widget inventoryWidget() { - return Container( - width: Get.width, - height: 39, - margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration( - color: AppColor.greenLight, - borderRadius: BorderRadius.circular(8), - ), - alignment: Alignment.center, - child: ObxValue((data) { - return Text( - ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', - style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), - ); - }, controller.rootLogic.inventoryModel), - ); - } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index d391b6e..0ec6714 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -62,7 +62,7 @@ class SalesOutOfProvinceBuyersPage extends GetView(); + return Visibility( + visible: controller.isFilterSelected.value, + child: Container( + width: 8, + height: 8, + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + ), + ), + ); + }), + ], ), ); } +GestureDetector searchWidget(GestureTapCallback? onSearchTap) { + return GestureDetector( + onTap: onSearchTap, + child: Stack( + alignment: Alignment.topRight, + children: [ + Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Obx(() { + final controller = Get.find(); + return Visibility( + visible: controller.searchValue.value!=null, + child: Container( + width: 8, + height: 8, + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + ), + ), + ); + }), + ], + ), + ); +} \ No newline at end of file diff --git a/packages/chicken/lib/presentation/widget/base_page/view.dart b/packages/chicken/lib/presentation/widget/base_page/view.dart index 64eb9ac..b74db0f 100644 --- a/packages/chicken/lib/presentation/widget/base_page/view.dart +++ b/packages/chicken/lib/presentation/widget/base_page/view.dart @@ -35,7 +35,7 @@ class BasePage extends StatefulWidget { final FloatingActionButtonLocation? floatingActionButtonLocation; final Widget? floatingActionButton; final Widget? filteringWidget; - final void Function(String)? onSearchChanged; + final void Function(String?)? onSearchChanged; final bool hasBack; final bool hasFilter; final bool hasSearch; diff --git a/packages/chicken/lib/presentation/widget/filter_bottom_sheet.dart b/packages/chicken/lib/presentation/widget/filter_bottom_sheet.dart new file mode 100644 index 0000000..a2a2173 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/filter_bottom_sheet.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +Widget filterBottomSheetWidget({ + required Rx fromDate, + required Function(Jalali jalali) onChangedFromDate, + required Rx toDate, + required Function(Jalali jalali) onChangedToDate, + required VoidCallback onSubmit, +}) { + return BaseBottomSheet( + height: 200, + child: Column( + spacing: 16, + children: [ + Text('فیلترها', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + Row( + spacing: 8, + children: [ + Expanded( + child: dateFilterWidget(date: fromDate, onChanged: onChangedFromDate), + ), + Expanded( + child: dateFilterWidget(isFrom: false, date: toDate, onChanged: onChangedToDate), + ), + ], + ), + + RElevated( + height: 40, + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + text: 'اعمال فیلتر', + onPressed: () { + onSubmit(); + Get.back(); + }, + ), + + ], + ), + ); +} diff --git a/packages/chicken/lib/presentation/widget/inventory_widget.dart b/packages/chicken/lib/presentation/widget/inventory_widget.dart new file mode 100644 index 0000000..1d43026 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/inventory_widget.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +Widget inventoryWidget(RootLogic rootLogic) { + return Container( + width: Get.width, + height: 39, + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: AppColor.greenLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.textColor, width: 0.5), + ), + alignment: Alignment.center, + child: ObxValue((data) { + return Text( + ' موجودی انبار: ${data.value?.totalRemainWeight?.toInt().separatedByComma ?? '0'} کیلوگرم', + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkHover), + ); + }, rootLogic.inventoryModel), + ); +} diff --git a/packages/chicken/lib/presentation/widget/search/view.dart b/packages/chicken/lib/presentation/widget/search/view.dart index 14562b0..1e09056 100644 --- a/packages/chicken/lib/presentation/widget/search/view.dart +++ b/packages/chicken/lib/presentation/widget/search/view.dart @@ -6,7 +6,7 @@ import 'logic.dart'; class SearchWidget extends StatefulWidget { const SearchWidget({super.key, this.onSearchChanged}); - final void Function(String)? onSearchChanged; + final void Function(String?)? onSearchChanged; @override State createState() => _SearchWidgetState(); @@ -14,6 +14,7 @@ class SearchWidget extends StatefulWidget { class _SearchWidgetState extends State { late final SearchLogic controller; + final TextEditingController textEditingController = TextEditingController(); @override void initState() { @@ -26,26 +27,50 @@ class _SearchWidgetState extends State { Widget build(BuildContext context) { return ObxValue((data) { return AnimatedContainer( - margin: EdgeInsets.symmetric(vertical: 4), duration: const Duration(milliseconds: 300), - padding: const EdgeInsets.only(top: 5), curve: Curves.easeInOut, - height: data.value ? 50 : 0, + height: data.value ? 40 : 0, child: Visibility( visible: data.value, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: RTextField( - suffixIcon: Padding( - padding: const EdgeInsets.all(12.0), - child: Assets.vec.searchSvg.svg( - width: 10, - height: 10, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + height: 40, + borderColor: AppColor.blackLight, + suffixIcon: ObxValue( + (data) => Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: (data.value == null) + ? Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ) + : IconButton( + onPressed: () { + textEditingController.clear(); + controller.searchValue.value = null; + controller.isSearchSelected.value = false; + widget.onSearchChanged?.call(null); + }, + enableFeedback: true, + padding: EdgeInsets.zero, + iconSize: 24, + splashRadius: 50, + icon: Assets.vec.closeCircleSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), ), + controller.searchValue, ), - hintText: 'جستجو', - controller: TextEditingController(), + hintText: 'جستجو کنید ...', + hintStyle: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + filledColor: Colors.white, + filled: true, + controller: textEditingController, onChanged: (val) => controller.searchValue.value = val, ), ), diff --git a/packages/chicken/pubspec.yaml b/packages/chicken/pubspec.yaml index 17cc275..d53f7e3 100644 --- a/packages/chicken/pubspec.yaml +++ b/packages/chicken/pubspec.yaml @@ -1,7 +1,6 @@ name: rasadyar_chicken description: A starting point for Dart libraries or applications. -version: 1.0.0 -# repository: https://github.com/my_org/my_repo +version: 1.0.1 environment: sdk: ^3.8.1 diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index eb40db8..07d012e 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -74,6 +74,9 @@ class $AssetsIconsGen { /// File path: assets/icons/clock.svg SvgGenImage get clock => const SvgGenImage('assets/icons/clock.svg'); + /// File path: assets/icons/close_circle.svg + SvgGenImage get closeCircle => const SvgGenImage('assets/icons/close_circle.svg'); + /// File path: assets/icons/close_square.svg SvgGenImage get closeSquare => const SvgGenImage('assets/icons/close_square.svg'); @@ -259,6 +262,7 @@ class $AssetsIconsGen { clipboardEye, clipboardTask, clock, + closeCircle, closeSquare, convertCube, cube, @@ -395,6 +399,9 @@ class $AssetsVecGen { /// File path: assets/vec/clock.svg.vec SvgGenImage get clockSvg => const SvgGenImage.vec('assets/vec/clock.svg.vec'); + /// File path: assets/vec/close_circle.svg.vec + SvgGenImage get closeCircleSvg => const SvgGenImage.vec('assets/vec/close_circle.svg.vec'); + /// File path: assets/vec/close_square.svg.vec SvgGenImage get closeSquareSvg => const SvgGenImage.vec('assets/vec/close_square.svg.vec'); @@ -580,6 +587,7 @@ class $AssetsVecGen { clipboardEyeSvg, clipboardTaskSvg, clockSvg, + closeCircleSvg, closeSquareSvg, convertCubeSvg, cubeSvg, diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart index 3663161..92a109d 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_core/presentation/common/app_color.dart'; -import 'package:rasadyar_core/presentation/common/app_fonts.dart'; -import 'package:rasadyar_core/presentation/utils/color_utils.dart'; +import 'package:rasadyar_core/core.dart'; class ROutlinedElevated extends StatefulWidget { ROutlinedElevated({ @@ -16,19 +14,17 @@ class ROutlinedElevated extends StatefulWidget { this.radius, this.textStyle, this.child, - this.width = 150.0, - this.height = 56.0, + this.width, + this.height, }); final String? text; final VoidCallback? onPressed; - final double width; - final double height; + final double? width; + final double? height; Color? foregroundColor; Color? backgroundColor; - Color? borderColor; - Color? disabledBackgroundColor; Color? pressedBackgroundColor; double? radius; @@ -40,64 +36,92 @@ class ROutlinedElevated extends StatefulWidget { } class _ROutlinedElevatedState extends State { + final WidgetStatesController _statesController = WidgetStatesController(); + final GlobalKey _widgetKey = GlobalKey(); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _getWidgetHeight(); + }); + } + + void _getWidgetHeight() { + final RenderBox? renderBox = _widgetKey.currentContext?.findRenderObject() as RenderBox?; + if (renderBox != null) { + final height = renderBox.size.height; + debugPrint('ارتفاع ویجت بعد از رندر شدن: $height'); + } else { + debugPrint('ویجت هنوز رندر نشده است'); + } + } + + @override + void dispose() { + _statesController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return OutlinedButton( - onPressed: widget.onPressed, - style: ButtonStyle( - side: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal, - width: 2, - ); - } else if (states.contains(WidgetState.disabled)) { - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), - width: 2, - ); - } - return BorderSide( - color: widget.borderColor ?? AppColor.blueNormal, - width: 2, - ); - }), - backgroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - if (widget.pressedBackgroundColor != null) { - return widget.pressedBackgroundColor; - } - return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal; - } else if (states.contains(WidgetState.hovered)) { - return widget.backgroundColor?.hoverColor ?? - AppColor.blueNormal.hoverColor; - } else if (states.contains(WidgetState.disabled)) { - return widget.backgroundColor?.disabledColor ?? Colors.transparent; - } - return widget.backgroundColor; - }), - foregroundColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.pressed)) { - return Colors.white; - } else if (states.contains(WidgetState.disabled)) { - return AppColor.blueNormal.withAlpha(38); - } - return AppColor.blueNormal; - }), - - shape: WidgetStatePropertyAll( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(widget.radius ?? 8), - ), - ), - fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)), - padding: WidgetStatePropertyAll(EdgeInsets.zero), - textStyle: WidgetStatePropertyAll( - widget.textStyle ?? - AppFonts.yekan24.copyWith(color: AppColor.blueNormal), - ), + return ConstrainedBox( + constraints: BoxConstraints.tightFor( + width: widget.width ?? 150.w, + height: widget.height ?? 40.h, + ), + child: OutlinedButton( + key: _widgetKey, + statesController: _statesController, + onPressed: widget.onPressed, + style: ButtonStyle( + side: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return BorderSide(color: widget.borderColor ?? AppColor.blueNormal, width: 2); + } else if (states.contains(WidgetState.disabled)) { + return BorderSide( + color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38), + width: 2, + ); + } + return BorderSide(color: widget.borderColor ?? AppColor.blueNormal, width: 2); + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + if (widget.pressedBackgroundColor != null) { + return widget.pressedBackgroundColor; + } + return widget.backgroundColor?.pressedColor ?? widget.borderColor?.pressedColor; + } else if (states.contains(WidgetState.hovered)) { + return widget.backgroundColor?.hoverColor ?? AppColor.blueNormal.hoverColor; + } else if (states.contains(WidgetState.disabled)) { + return widget.backgroundColor?.disabledColor ?? Colors.transparent; + } + return widget.backgroundColor; + }), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return Colors.white; + } else if (states.contains(WidgetState.disabled)) { + return AppColor.blueNormal.withAlpha(38); + } + return widget.foregroundColor ?? widget.borderColor ?? AppColor.blueNormal; + }), + shape: WidgetStatePropertyAll( + RoundedRectangleBorder(borderRadius: BorderRadius.circular(widget.radius ?? 8)), + ), + fixedSize: WidgetStatePropertyAll(Size(widget.width ?? 150.w, widget.height ?? 56.h)), + padding: WidgetStatePropertyAll(EdgeInsets.zero), + textStyle: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.pressed)) { + return widget.textStyle?.copyWith(color: Colors.white) ?? + AppFonts.yekan20.copyWith(color: Colors.white); + } + return widget.textStyle ?? AppFonts.yekan20.copyWith(color: AppColor.blueNormal); + }), + ), + child: Text(widget.text ?? ''), ), - child: widget.child ?? Text(widget.text!, style: widget.textStyle), ); } } diff --git a/packages/core/lib/presentation/widget/empty_widget.dart b/packages/core/lib/presentation/widget/empty_widget.dart index a9d3ad4..f07c421 100644 --- a/packages/core/lib/presentation/widget/empty_widget.dart +++ b/packages/core/lib/presentation/widget/empty_widget.dart @@ -11,7 +11,7 @@ class EmptyWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Row(), - Assets.images.placeHolder.image(width: 170.w,height: 170.h), + Assets.vec.emptySvg.svg(width: 170.w,height: 170.h), Text('داده ای یافت نشد!', style: AppFonts.yekan20.copyWith(color: AppColor.textColor)), ], ); diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 932e915..3ea8ba0 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -37,40 +39,69 @@ class RTextField extends StatefulWidget { final VoidCallback? onTap; final List? inputFormatters; final Widget? suffix; + final FocusNode? focusNode; + final AutovalidateMode? autoValidateMode; + final TextAlign? textAlign; + final TextCapitalization textCapitalization; + final Color? cursorColor; + final bool? autocorrect; + final bool? enableSuggestions; + final TextInputAction? textInputAction; + final double? height; const RTextField({ super.key, + // 🔹 Core required this.controller, this.label, this.hintText, this.initText, + this.onChanged, + this.onSubmitted, + this.onTap, + this.height, + + // 🔸 Behavior this.obscure = false, this.readonly = false, this.enabled = true, this.maxLength, this.minLines, this.maxLines = 1, - this.suffixIcon, - this.prefixIcon, - this.boxConstraints, - this.variant = RTextFieldVariant.normal, - this.filled = false, - this.filledColor, - this.showCounter = false, - this.isDense = false, + this.textInputAction, this.keyboardType, + this.focusNode, + + // ⚙️ Input styling + this.textAlign, + this.textCapitalization = TextCapitalization.none, + this.cursorColor, + this.autocorrect, + this.enableSuggestions, this.style, this.hintStyle, this.labelStyle, this.errorStyle, - this.padding, - this.validator, - this.onChanged, - this.onSubmitted, - this.borderColor, - this.inputFormatters, - this.onTap, + + // 🎨 Decorations + this.suffixIcon, + this.prefixIcon, this.suffix, + this.boxConstraints, + + // 📐 Layout & appearance + this.borderColor, + this.filled = false, + this.filledColor, + this.padding, + this.variant = RTextFieldVariant.normal, + + // 📋 Form validation + this.validator, + this.autoValidateMode, + this.inputFormatters, + this.showCounter = false, + this.isDense = false, }); @override @@ -92,6 +123,27 @@ class RTextField extends StatefulWidget { class _RTextFieldState extends State { late bool obscure; + late TextDirection textDirection; + + Timer? _debounceTimer; + + TextDirection _detectDirection(String text) { + final isPersian = RegExp(r'[\u0600-\u06FF]').hasMatch(text); + return isPersian ? TextDirection.rtl : TextDirection.ltr; + } + + void _debouncedUpdateTextDirection() { + if (_debounceTimer?.isActive ?? false) _debounceTimer!.cancel(); + + _debounceTimer = Timer(const Duration(milliseconds: 300), () { + final newDirection = _detectDirection(widget.controller.text); + if (newDirection != textDirection) { + setState(() { + textDirection = newDirection; + }); + } + }); + } @override void initState() { @@ -100,82 +152,106 @@ class _RTextFieldState extends State { widget.controller.text = widget.initText!; } obscure = widget.obscure; + + textDirection = _detectDirection( + widget.controller.text.isNotEmpty ? widget.controller.text : widget.initText ?? 'سلام', + ); + + widget.controller.addListener(_debouncedUpdateTextDirection); } @override void didUpdateWidget(covariant RTextField oldWidget) { super.didUpdateWidget(oldWidget); - if (widget.initText != null && widget.initText != oldWidget.initText) { + if (widget.initText != null && widget.controller.text != widget.initText) { widget.controller.text = widget.initText!; } } - Widget _buildSuffixIcon() { - if (widget.suffixIcon != null) return widget.suffixIcon!; - if (!widget._isPassword) return const SizedBox.shrink(); + Widget? _buildSuffixIcon() { + if (widget._isPassword || widget._passwordNoBorder) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: GestureDetector( + onTap: () { + setState(() { + obscure = !obscure; + }); + }, + child: Icon( + obscure ? CupertinoIcons.eye : CupertinoIcons.eye_slash, + color: AppColor.darkGreyDarkActive, + ), + ), + ); + } + return widget.suffixIcon; + } - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: GestureDetector( - onTap: () { - setState(() { - obscure = !obscure; - }); - }, - child: Icon( - obscure ? CupertinoIcons.eye : CupertinoIcons.eye_slash, - color: AppColor.darkGreyDarkActive, + @override + Widget build(BuildContext context) { + return SizedBox( + height: widget.height, + child: Padding( + padding: widget.padding ?? EdgeInsets.zero, + child: TextFormField( + controller: widget.controller, + focusNode: widget.focusNode, + textAlign: widget.textAlign ?? TextAlign.start, + readOnly: widget.readonly, + minLines: widget.minLines, + maxLines: widget.maxLines, + onChanged: widget.onChanged, + validator: widget.validator, + inputFormatters: widget.inputFormatters, + enabled: widget.enabled, + obscureText: obscure, + onTap: widget.onTap, + onTapOutside: (_) => FocusScope.of(context).unfocus(), + onFieldSubmitted: widget.onSubmitted, + maxLength: widget.maxLength, + textDirection: textDirection, + style: widget.style, + keyboardType: widget.keyboardType, + autovalidateMode: widget.autoValidateMode ?? AutovalidateMode.disabled, + cursorColor: widget.cursorColor, + textCapitalization: widget.textCapitalization, + autocorrect: widget.autocorrect ?? true, + enableSuggestions: widget.enableSuggestions ?? true, + textInputAction: widget.textInputAction, + decoration: InputDecoration( + contentPadding: const EdgeInsets.symmetric(horizontal: 16), + errorStyle: widget.errorStyle, + errorMaxLines: 1, + isDense: widget.isDense, + suffix: widget.suffix, + suffixIcon: _buildSuffixIcon(), + suffixIconConstraints: widget.boxConstraints, + prefixIcon: widget.prefixIcon, + prefixIconConstraints: widget.boxConstraints, + hintText: widget.hintText, + labelText: widget.label, + alignLabelWithHint: true, + labelStyle: AppFonts.yekan14 + .copyWith(color: AppColor.lightGreyDarkActive) + .merge(widget.labelStyle), + filled: widget.filled || widget._noBorder || widget._passwordNoBorder, + fillColor: widget.filledColor, + counter: widget.showCounter ? null : const SizedBox(), + hintStyle: widget.hintStyle, + enabledBorder: widget._inputBorder, + focusedBorder: widget._inputBorder, + border: widget._inputBorder, + ), ), ), ); } @override - Widget build(BuildContext context) { - return Padding( - padding: widget.padding ?? EdgeInsets.zero, - child: TextFormField( - controller: widget.controller, - readOnly: widget.readonly, - minLines: widget.minLines, - maxLines: widget.maxLines, - onChanged: widget.onChanged, - validator: widget.validator, - inputFormatters: widget.inputFormatters, - enabled: widget.enabled, - obscureText: obscure, - onTap: widget.onTap, - onTapOutside: (_) => FocusScope.of(context).unfocus(), - onFieldSubmitted: widget.onSubmitted, - maxLength: widget.maxLength, - textDirection: TextDirection.rtl, - style: widget.style, - keyboardType: widget.keyboardType, - decoration: InputDecoration( - contentPadding: const EdgeInsets.symmetric(horizontal: 16), - errorStyle: widget.errorStyle, - errorMaxLines: 1, - isDense: widget.isDense, - suffix: widget.suffix, - suffixIcon: _buildSuffixIcon(), - suffixIconConstraints: widget.boxConstraints, - prefixIcon: widget.prefixIcon, - prefixIconConstraints: widget.boxConstraints, - hintText: widget.hintText, - labelText: widget.label, - alignLabelWithHint: true, - labelStyle: AppFonts.yekan14 - .copyWith(color: AppColor.lightGreyDarkActive) - .merge(widget.labelStyle), - filled: widget.filled || widget._noBorder || widget._passwordNoBorder, - fillColor: widget.filledColor, - counter: widget.showCounter ? null : const SizedBox(), - hintStyle: widget.hintStyle, - enabledBorder: widget._inputBorder, - focusedBorder: widget._inputBorder, - border: widget._inputBorder, - ), - ), - ); + void dispose() { + _debounceTimer?.cancel(); + widget.controller.removeListener(_debouncedUpdateTextDirection); + super.dispose(); } } diff --git a/pubspec.yaml b/pubspec.yaml index fc33edc..33a89a4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_app description: "A new Flutter project." publish_to: 'none' -version: 1.2.0+2 +version: 1.3.0+2 environment: sdk: ^3.8.1 From 86891db860a75b617c35f68db0fd12a5f536acd6 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 12 Jul 2025 14:46:52 +0330 Subject: [PATCH 186/256] fix : delete liner in captcha widget --- .../lib/presentation/widget/captcha/view.dart | 45 ++++++++----------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/packages/auth/lib/presentation/widget/captcha/view.dart b/packages/auth/lib/presentation/widget/captcha/view.dart index c94a0db..4b66206 100644 --- a/packages/auth/lib/presentation/widget/captcha/view.dart +++ b/packages/auth/lib/presentation/widget/captcha/view.dart @@ -29,17 +29,18 @@ class CaptchaWidget extends GetView { ), child: controller.obx( (state) => Center( - child: Stack( - alignment: Alignment.center, - children: [ - CustomPaint(size: const Size(135, 50), painter: _CaptchaLinePainter()), - Text(controller.captchaKey.value ?? 'دوباره سعی کنید', style: AppFonts.yekan24Bold), - ], + child: Text( + controller.captchaKey.value ?? 'دوباره سعی کنید', + style: AppFonts.yekan24Bold, ), ), - onLoading: const Center(child: CupertinoActivityIndicator(color: AppColor.blueNormal)), + onLoading: const Center( + child: CupertinoActivityIndicator(color: AppColor.blueNormal), + ), onError: (error) { - return Center(child: Text('خطا ', style: AppFonts.yekan13.copyWith(color: Colors.red))); + return Center( + child: Text('خطا ', style: AppFonts.yekan13.copyWith(color: Colors.red)), + ); }, ), ), @@ -63,21 +64,21 @@ class CaptchaWidget extends GetView { validator: (value) { if (value == null || value.isEmpty) { return 'کد امنیتی را وارد کنید'; - } else if (controller.captchaKey.value != null && controller.captchaKey.value != value) { + } else if (controller.captchaKey.value != null && + controller.captchaKey.value != value) { return 'کد امنیتی اشتباه است'; } return null; }, onChanged: (pass) { - if(pass.length== 6) { - if(controller.formKey.currentState?.validate()??false) { + if (pass.length == 6) { + if (controller.formKey.currentState?.validate() ?? false) { Get.find().isDisabled.value = false; - } } }, style: AppFonts.yekan13, - ) + ), ), ), ], @@ -93,22 +94,14 @@ class _CaptchaLinePainter extends CustomPainter { ..color = Colors.deepOrange ..strokeWidth = 2; final paint2 = Paint() - ..color =Colors.blue + ..color = Colors.blue ..strokeWidth = 2; -// First line: top-left to bottom-right - canvas.drawLine( - Offset(0, 0), - Offset(size.width, size.height), - paint1, - ); + // First line: top-left to bottom-right + canvas.drawLine(Offset(0, 0), Offset(size.width, size.height), paint1); -// Second line: bottom-left to top-right - canvas.drawLine( - Offset(0, size.height), - Offset(size.width, 0), - paint2, - ); + // Second line: bottom-left to top-right + canvas.drawLine(Offset(0, size.height), Offset(size.width, 0), paint2); } @override From e52674de3712cfd80e893edf19a50f9ad71f81dd Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 12 Jul 2025 14:49:02 +0330 Subject: [PATCH 187/256] chore : change empty.svg --- assets/icons/empty.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/icons/empty.svg b/assets/icons/empty.svg index 88665f2..ffff199 100644 --- a/assets/icons/empty.svg +++ b/assets/icons/empty.svg @@ -1,6 +1,6 @@ - + From 0fc16569a613114409d74ff3c12500a6d3411b1a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 12 Jul 2025 17:06:29 +0330 Subject: [PATCH 188/256] feat : change app inspector and exception handling --- lib/infrastructure/di/di.dart | 12 +- .../service/app_navigation_observer.dart | 40 ++++ lib/main.dart | 7 +- lib/presentation/routes/app_pages.dart | 1 - .../auth/lib/data/common/dio_manager.dart | 19 +- packages/auth/lib/data/di/auth_di.dart | 23 ++- .../data/services/token_storage_service.dart | 40 ++-- packages/auth/lib/data/utils/safe_call.dart | 13 +- .../lib/presentation/pages/auth/logic.dart | 31 +-- .../chicken/lib/data/common/dio_manager.dart | 4 +- packages/chicken/lib/data/di/chicken_di.dart | 27 ++- .../data/repositories/chicken_repository.dart | 4 +- .../repositories/chicken_repository_imp.dart | 7 +- .../lib/presentation/pages/home/logic.dart | 58 +----- .../lib/presentation/pages/home/view.dart | 4 +- .../lib/presentation/pages/root/logic.dart | 71 ++++--- .../lib/presentation/pages/sale/logic.dart | 21 +-- .../lib/presentation/routes/pages.dart | 47 ++--- .../lib/presentation/routes/routes.dart | 4 +- .../remote/app_interceptor.dart | 125 ++++++++----- .../lib/infrastructure/remote/dio_remote.dart | 56 +++--- packages/core/lib/injection/di.dart | 1 + .../lib/utils/network/safe_call_utils.dart | 177 +++++++++++++----- pubspec.lock | 2 +- 24 files changed, 472 insertions(+), 322 deletions(-) create mode 100644 lib/infrastructure/service/app_navigation_observer.dart diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index 1058c46..8ef306c 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -5,9 +5,17 @@ import 'package:rasadyar_core/core.dart'; final di = GetIt.instance; -Future setupInjection() async{ - await setupAuthDI(); +Future setupPreInjection() async{ await setupAllCoreProvider(); + await setupAuthDI(); + + + +} + +Future setupInjection() async{ + + await setupChickenDI(); } diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart new file mode 100644 index 0000000..5d4a8dc --- /dev/null +++ b/lib/infrastructure/service/app_navigation_observer.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/infrastructure/di/di.dart'; +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_core/core.dart'; + +class CustomNavigationObserver extends NavigatorObserver { + bool _isWorkDone = false; + + void setInjectionDone() { + _isWorkDone = true; + } + + @override + void didPush(Route route, Route? previousRoute) async { + super.didPush(route, previousRoute); + final routeName = route.settings.name; + if (!_isWorkDone && routeName == ChickenRoutes.init) { + _isWorkDone = true; + await setupInjection(); + } + } + + + @override + void didReplace({Route? newRoute, Route? oldRoute}) { + super.didReplace(newRoute: newRoute, oldRoute: oldRoute); + + } + + @override + void didPop(Route route, Route? previousRoute) { + super.didPop(route, previousRoute); + + } + + @override + void didRemove(Route route, Route? previousRoute) { + super.didRemove(route, previousRoute); + } +} diff --git a/lib/main.dart b/lib/main.dart index 543d9ad..b693b95 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; @@ -9,14 +10,15 @@ import 'infrastructure/service/auth_service.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - await setupInjection(); + await setupPreInjection(); + Get.put(TokenStorageService()); var tokenService = Get.find(); await tokenService.init(); Get.put(AuthMiddleware()); Get.put(AuthService()); - runApp(MyApp()); + // runApp(DevicePreview(builder: (context) => ForDevicePreview(),)); } @@ -59,6 +61,7 @@ class MyApp extends StatelessWidget { getPages: AppPages.pages, locale: const Locale("fa", "IR"), supportedLocales: const [Locale("fa", "IR")], + navigatorObservers: [CustomNavigationObserver()], localizationsDelegates: [ PersianMaterialLocalizations.delegate, PersianCupertinoLocalizations.delegate, diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 2800452..049b90d 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -34,7 +34,6 @@ sealed class AppPages { } String getTargetPage(Module? value) { - eLog('getTargetPage: $value'); switch (value) { case Module.inspection: return InspectionRoutes.inspection; diff --git a/packages/auth/lib/data/common/dio_manager.dart b/packages/auth/lib/data/common/dio_manager.dart index 2c920a0..bbc17b5 100644 --- a/packages/auth/lib/data/common/dio_manager.dart +++ b/packages/auth/lib/data/common/dio_manager.dart @@ -4,15 +4,21 @@ import 'package:rasadyar_core/core.dart'; import '../di/auth_di.dart'; import 'constant.dart'; +/* class DioRemoteManager { DioRemote? _currentClient; ApiEnvironment? _currentEnv; - Future setEnvironment([ - ApiEnvironment env = ApiEnvironment.dam, - ]) async { + Future setEnvironment([ApiEnvironment env = ApiEnvironment.dam]) async { if (_currentEnv != env) { - _currentClient = DioRemote(baseUrl: env.baseUrl); + _currentClient = DioRemote( + baseUrl: env.baseUrl, + interceptors: AppInterceptor( + refreshTokenCallback: () async{ + return null; + }, + ), + ); await _currentClient?.init(); _currentEnv = env; } @@ -39,7 +45,6 @@ Future switchAuthEnvironment(ApiEnvironment env) async { await diAuth.unregister(); } - diAuth.registerLazySingleton( - () => AuthRepositoryImpl(dioRemote), - ); + diAuth.registerLazySingleton(() => AuthRepositoryImpl(dioRemote)); } +*/ diff --git a/packages/auth/lib/data/di/auth_di.dart b/packages/auth/lib/data/di/auth_di.dart index 48554de..3cb2747 100644 --- a/packages/auth/lib/data/di/auth_di.dart +++ b/packages/auth/lib/data/di/auth_di.dart @@ -9,7 +9,7 @@ import '../common/dio_manager.dart'; GetIt diAuth = GetIt.instance; Future setupAuthDI() async { - diAuth.registerLazySingleton(() => DioRemoteManager()); + diAuth.registerLazySingleton( () => AppInterceptor( refreshTokenCallback: () async { @@ -19,7 +19,9 @@ Future setupAuthDI() async { final refreshToken = tokenService.refreshToken.value; if (refreshToken == null) return null; - final result = await authRepo.loginWithRefreshToken(authRequest: {"refresh_token": refreshToken}); + final result = await authRepo.loginWithRefreshToken( + authRequest: {"refresh_token": refreshToken}, + ); if (result is AuthResponseModel) { await tokenService.saveAccessToken(result.access!); @@ -27,10 +29,18 @@ Future setupAuthDI() async { } return null; }, + saveTokenCallback: (String newToken) async { + // + }, + clearTokenCallback: () async { + //await tokenService.clearTokens(); // حذف همه توکن‌ها + }, ), ); - diAuth.registerLazySingleton(() => DioRemote(interceptors: [diAuth.get()])); + diAuth.registerLazySingleton( + () => DioRemote(interceptors: diAuth.get()), + ); final dioRemote = diAuth.get(); await dioRemote.init(); @@ -40,10 +50,13 @@ Future setupAuthDI() async { Future newSetupAuthDI(String newUrl) async { diAuth.registerLazySingleton( - () => DioRemote(baseUrl: newUrl, interceptors: [diAuth.get()]), + () => DioRemote(baseUrl: newUrl, interceptors: diAuth.get()), instanceName: 'newRemote', ); final dioRemote = diAuth.get(instanceName: 'newRemote'); await dioRemote.init(); - diAuth.registerSingleton(AuthRepositoryImpl(dioRemote), instanceName: 'newUrl'); + diAuth.registerSingleton( + AuthRepositoryImpl(dioRemote), + instanceName: 'newUrl', + ); } diff --git a/packages/auth/lib/data/services/token_storage_service.dart b/packages/auth/lib/data/services/token_storage_service.dart index 816a5b6..d81c591 100644 --- a/packages/auth/lib/data/services/token_storage_service.dart +++ b/packages/auth/lib/data/services/token_storage_service.dart @@ -5,7 +5,8 @@ import 'package:rasadyar_auth/hive_registrar.g.dart'; import 'package:rasadyar_core/core.dart'; class TokenStorageService extends GetxService { - static const String _boxName = 'secureBox'; + static const String _tokenBoxName = 'TokenBox'; + static const String _appBoxName = 'AppBox'; static const String _accessTokenKey = 'accessToken'; static const String _refreshTokenKey = 'refreshToken'; static const String _baseUrlKey = 'baseUrl'; @@ -17,7 +18,7 @@ class TokenStorageService extends GetxService { RxnString accessToken = RxnString(); RxnString refreshToken = RxnString(); - RxnString baseurl= RxnString(); + RxnString baseurl = RxnString(); Rxn appModule = Rxn(null); Future init() async { @@ -25,54 +26,61 @@ class TokenStorageService extends GetxService { Hive.registerAdapters(); final String? encryptedKey = await _secureStorage.read(key: 'hive_enc_key'); - final encryptionKey = encryptedKey != null ? base64Url.decode(encryptedKey) : Hive.generateSecureKey(); + final encryptionKey = encryptedKey != null + ? base64Url.decode(encryptedKey) + : Hive.generateSecureKey(); if (encryptedKey == null) { await _secureStorage.write(key: 'hive_enc_key', value: base64UrlEncode(encryptionKey)); } await _localStorage.init(); - await _localStorage.openBox(_boxName, encryptionCipher: HiveAesCipher(encryptionKey)); + await _localStorage.openBox(_tokenBoxName, encryptionCipher: HiveAesCipher(encryptionKey)); + await _localStorage.openBox(_appBoxName); - accessToken.value = _localStorage.read(boxName: _boxName, key: _accessTokenKey); - refreshToken.value = _localStorage.read(boxName: _boxName, key: _refreshTokenKey); - appModule.value = _localStorage.read(boxName: _boxName, key: _moduleKey); - baseurl.value = _localStorage.read(boxName: _boxName, key: _baseUrlKey); + accessToken.value = _localStorage.read(boxName: _tokenBoxName, key: _accessTokenKey); + refreshToken.value = _localStorage.read(boxName: _tokenBoxName, key: _refreshTokenKey); + appModule.value = _localStorage.read(boxName: _appBoxName, key: _moduleKey); + baseurl.value = _localStorage.read(boxName: _appBoxName, key: _baseUrlKey); } Future saveAccessToken(String token) async { - await _localStorage.save(boxName: _boxName, key: _accessTokenKey, value: token); + await _localStorage.save(boxName: _tokenBoxName, key: _accessTokenKey, value: token); accessToken.value = token; accessToken.refresh(); } Future saveRefreshToken(String token) async { - await _localStorage.save(boxName: _boxName, key: _refreshTokenKey, value: token); + await _localStorage.save(boxName: _tokenBoxName, key: _refreshTokenKey, value: token); refreshToken.value = token; refreshToken.refresh(); } Future saveModule(Module input) async { - await _localStorage.save(boxName: _boxName, key: _moduleKey, value: input); + await _localStorage.save(boxName: _tokenBoxName, key: _moduleKey, value: input); appModule.value = input; appModule.refresh(); } Future deleteTokens() async { - await _localStorage.clear(_boxName); + await _localStorage.clear(_tokenBoxName); accessToken.value = null; refreshToken.value = null; } - Future saveBaseUrl(String url) async { - await _localStorage.save(boxName: _boxName, key: _baseUrlKey, value: url); + await _localStorage.save(boxName: _appBoxName, key: _baseUrlKey, value: url); + baseurl.value = url; + baseurl.refresh(); + } + + void getBaseUrl() { + var url = _localStorage.read(boxName: _appBoxName, key: _baseUrlKey); baseurl.value = url; baseurl.refresh(); } Future saveApiKey(String key) async { - await _localStorage.save(boxName: _boxName, key: _apiKey, value: key); - + await _localStorage.save(boxName: _tokenBoxName, key: _apiKey, value: key); } } diff --git a/packages/auth/lib/data/utils/safe_call.dart b/packages/auth/lib/data/utils/safe_call.dart index edc659f..f850990 100644 --- a/packages/auth/lib/data/utils/safe_call.dart +++ b/packages/auth/lib/data/utils/safe_call.dart @@ -1,6 +1,6 @@ import 'package:rasadyar_core/core.dart'; -Future safeCall({ +Future safeCall({ required AppAsyncCallback call, Function(T result)? onSuccess, ErrorCallback? onError, @@ -12,10 +12,8 @@ Future safeCall({ bool showSnackBar = false, Function()? onShowLoading, Function()? onHideLoading, - Function()? onShowSuccessMessage, - Function()? onShowErrorMessage, }) { - return gSafeCall( + return gSafeCall( call: call, onSuccess: onSuccess, onError: onError, @@ -23,12 +21,7 @@ Future safeCall({ showLoading: showLoading, showError: showError, showSuccess: showSuccess, - showToast: showToast, - showSnackBar: showSnackBar, onShowLoading: onShowLoading, onHideLoading: onHideLoading, - onShowSuccessMessage: onShowSuccessMessage, - onShowErrorMessage: onShowErrorMessage, ); -} - +} \ No newline at end of file diff --git a/packages/auth/lib/presentation/pages/auth/logic.dart b/packages/auth/lib/presentation/pages/auth/logic.dart index 0c6093a..05acde5 100644 --- a/packages/auth/lib/presentation/pages/auth/logic.dart +++ b/packages/auth/lib/presentation/pages/auth/logic.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_auth/data/common/dio_error_handler.dart'; import 'package:rasadyar_auth/data/models/request/login_request/login_request_model.dart'; -import 'package:rasadyar_auth/data/models/response/auth/auth_response_model.dart'; import 'package:rasadyar_auth/data/models/response/user_info/user_info_model.dart'; import 'package:rasadyar_auth/data/models/response/user_profile_model/user_profile_model.dart'; import 'package:rasadyar_auth/data/repositories/auth_repository_imp.dart'; @@ -28,8 +27,7 @@ class AuthLogic extends GetxController { Rx> formKeySentOtp = GlobalKey().obs; Rx phoneNumberController = TextEditingController().obs; Rx passwordController = TextEditingController().obs; - Rx phoneOtpNumberController = - TextEditingController().obs; + Rx phoneOtpNumberController = TextEditingController().obs; Rx otpCodeController = TextEditingController().obs; var captchaController = Get.find(); @@ -73,15 +71,11 @@ class AuthLogic extends GetxController { return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; } - @override - void onInit() { - super.onInit(); - } @override void onReady() { super.onReady(); - iLog('module111 : ${_module.toString()}'); + iLog('module selected : ${_module.toString()}'); } @override @@ -91,8 +85,7 @@ class AuthLogic extends GetxController { } bool _isFormValid() { - final isCaptchaValid = - captchaController.formKey.currentState?.validate() ?? false; + final isCaptchaValid = captchaController.formKey.currentState?.validate() ?? false; final isFormValid = formKey.currentState?.validate() ?? false; return isCaptchaValid && isFormValid; } @@ -179,22 +172,4 @@ class AuthLogic extends GetxController { ); isLoading.value = false; } - - GetSnackBar _errorSnackBar(String message) { - return GetSnackBar( - titleText: Text( - 'خطا', - style: AppFonts.yekan14.copyWith(color: Colors.white), - ), - messageText: Text( - message, - style: AppFonts.yekan12.copyWith(color: Colors.white), - ), - backgroundColor: AppColor.error, - margin: EdgeInsets.symmetric(horizontal: 12, vertical: 8), - borderRadius: 12, - duration: Duration(milliseconds: 3500), - snackPosition: SnackPosition.TOP, - ); - } } diff --git a/packages/chicken/lib/data/common/dio_manager.dart b/packages/chicken/lib/data/common/dio_manager.dart index e6d2946..3b1a566 100644 --- a/packages/chicken/lib/data/common/dio_manager.dart +++ b/packages/chicken/lib/data/common/dio_manager.dart @@ -4,7 +4,7 @@ import 'package:rasadyar_core/core.dart'; import '../di/chicken_di.dart'; import 'constant.dart'; -class DioRemoteManager { +/*class DioRemoteManager { DioRemote? _currentClient; ApiEnvironment? _currentEnv; @@ -28,6 +28,6 @@ class DioRemoteManager { } ApiEnvironment? get currentEnv => _currentEnv; -} +}*/ diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index a233521..eca66b7 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -1,4 +1,3 @@ -import 'package:rasadyar_auth/data/di/auth_di.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_core/core.dart'; @@ -8,10 +7,30 @@ GetIt diChicken = GetIt.instance; Future setupChickenDI() async { var tokenService = Get.find(); - diAuth.registerLazySingleton(() => DioRemote(baseUrl: tokenService.baseurl.value)); - final dioRemote = diAuth.get(); + diChicken.registerLazySingleton( + () => AppInterceptor( + refreshTokenCallback: () async {}, + saveTokenCallback: (String newToken) async { + await tokenService.saveAccessToken(newToken); // ذخیره توکن جدید + }, + clearTokenCallback: () async { + await tokenService.deleteTokens(); + }, + ), + instanceName: 'chickenInterceptor', + ); + + tokenService.getBaseUrl(); + diChicken.registerLazySingleton(() { + return DioRemote( + baseUrl: tokenService.baseurl.value, + interceptors: diChicken.get(instanceName: 'chickenInterceptor'), + ); + }, instanceName: 'chickenDioRemote'); + + final dioRemote = diChicken.get(instanceName: 'chickenDioRemote'); await dioRemote.init(); - diAuth.registerLazySingleton(() => ChickenRepositoryImpl(dioRemote)); + diChicken.registerLazySingleton(() => ChickenRepositoryImpl(dioRemote)); diChicken.registerSingleton(ImagePicker()); } diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 6ab177b..e85f4a9 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -24,7 +24,7 @@ import 'package:rasadyar_core/core.dart'; import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { - Future?> getInventory({required String token}); + Future?> getInventory({required String token, CancelToken? cancelToken}); Future getKillHouseDistributionInfo({required String token}); @@ -117,7 +117,7 @@ abstract class ChickenRepository { required OutProvinceCarcassesBuyer body, }); - Future?> getProvince(); + Future?> getProvince({CancelToken? cancelToken}); Future?> getCity({required String provinceName}); diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 86eecf1..6067433 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -30,10 +30,13 @@ class ChickenRepositoryImpl implements ChickenRepository { ChickenRepositoryImpl(this._httpClient); @override - Future?> getInventory({required String token}) async { + Future?> getInventory({required String token, CancelToken? cancelToken}) async { + + eLog(_httpClient.baseUrl); var res = await _httpClient.get( '/roles-products/?role=Steward', headers: {'Authorization': 'Bearer $token'}, + fromJsonList: (json) => (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), ); @@ -290,7 +293,7 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future?> getProvince() async { + Future?> getProvince({CancelToken? cancelToken}) async { var res = await _httpClient.get( '/iran_province/', fromJsonList: (json) => diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index d544079..16a3954 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -9,20 +9,19 @@ import 'package:rasadyar_core/core.dart'; class HomeLogic extends GetxController { RootLogic rootLogic = Get.find(); RxnInt totalWeightTodayBars = RxnInt(); - Rxn inventoryModel = Rxn(); Rxn killHouseDistributionInfo = Rxn(); RxBool isExpanded = false.obs; @override - void onInit() { - super.onInit(); + void onReady() { + super.onReady(); getTodayBars(); - getInventory(); getDistributionInformation(); } + Future getTodayBars() async { await safeCall( call: () async => await rootLogic.chickenRepository.getGeneralBarInformation( @@ -30,51 +29,22 @@ class HomeLogic extends GetxController { queryParameters: buildQueryParams(fromDate: DateTime.now(), toDate: DateTime.now()), ), onSuccess: (result) { + iLog(result); if (result != null) { totalWeightTodayBars.value = result.totalBarsWeight?.toInt(); } }, onError: (error, stackTrace) { - switch (error.response?.statusCode) { - case 401: - errorHandler(error); - break; - case 403: - errorHandler(error); - break; - default: - errorHandler(error); - } - }, - ); - } - Future getInventory() async { - await safeCall?>( - call: () async => await rootLogic.chickenRepository.getInventory(token: rootLogic.tokenService.accessToken.value!), - onSuccess: (result) { - if (result != null) { - inventoryModel.value = result.first; - } - }, - onError: (error, stackTrace) { - switch (error.response?.statusCode) { - case 401: - errorHandler(error); - break; - case 403: - errorHandler(error); - break; - default: - errorHandler(error); - } }, ); } Future getDistributionInformation() async { await safeCall( - call: () async => await rootLogic.chickenRepository.getKillHouseDistributionInfo(token: rootLogic.tokenService.accessToken.value!), + call: () async => await rootLogic.chickenRepository.getKillHouseDistributionInfo( + token: rootLogic.tokenService.accessToken.value!, + ), onSuccess: (result) { if (result != null) { killHouseDistributionInfo.value = result; @@ -85,19 +55,5 @@ class HomeLogic extends GetxController { } - void errorHandler(DioException error) { - handleGeneric(error, () { - rootLogic.tokenService.deleteTokens(); - }); - } - @override - void onReady() { - super.onReady(); - } - - @override - void onClose() { - super.onClose(); - } } diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index 11e40f6..bd9f07a 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -309,7 +309,7 @@ class HomePage extends GetView { ), ], ); - }, controller.inventoryModel), + }, controller.rootLogic.inventoryModel), ); } @@ -345,7 +345,7 @@ class HomePage extends GetView { ], ), ); - }, controller.inventoryModel); + }, controller.rootLogic.inventoryModel); } Widget _todayShipmentWidget() { diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 5d89ac1..4d020da 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,7 +1,10 @@ +import 'dart:async'; + import 'package:flutter/material.dart' show Colors; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; @@ -39,19 +42,39 @@ class RootLogic extends GetxController { Rxn inventoryModel = Rxn(); RxList provinces = [].obs; + // Cancel tokens for API calls + CancelToken? _inventoryCancelToken; + CancelToken? _provincesCancelToken; + @override void onInit() { super.onInit(); - dioRemote = DioRemote(baseUrl: tokenService.baseurl.value); - dioRemote.init(); - chickenRepository = ChickenRepositoryImpl(dioRemote); - getProvinces(); + chickenRepository = diChicken.get(); - getInventory(); //getKillHouseDistributionInfo(); } + @override + void onReady() { + super.onReady(); + // Only call these methods if they haven't been called before + if (provinces.isEmpty) { + getProvinces(); + } + if (inventoryModel.value == null) { + getInventory(); + } + } + + @override + void onClose() { + // Cancel any ongoing requests when controller is disposed + _inventoryCancelToken?.cancel(); + _provincesCancelToken?.cancel(); + super.onClose(); + } + void toggleExpanded(int index) { if (inventoryExpandedList.keys.contains(index)) { inventoryExpandedList.remove(index); @@ -61,24 +84,24 @@ class RootLogic extends GetxController { } Future getInventory() async { + // Cancel previous request if still running + _inventoryCancelToken?.cancel(); + _inventoryCancelToken = CancelToken(); + await safeCall?>( - call: () async => - await chickenRepository.getInventory(token: tokenService.accessToken.value!), + call: () async => await chickenRepository.getInventory( + token: tokenService.accessToken.value!, + cancelToken: _inventoryCancelToken, + ), onSuccess: (result) { if (result != null) { inventoryModel.value = result.first; } }, onError: (error, stackTrace) { - switch (error.response?.statusCode) { - case 401: - errorHandler(error); - break; - case 403: - errorHandler(error); - break; - default: - errorHandler(error); + if (error is DioException && error.type == DioExceptionType.cancel) { + // Request was cancelled, ignore the error + return; } }, ); @@ -95,20 +118,22 @@ class RootLogic extends GetxController { } Future getProvinces() async { + // Cancel previous request if still running + _provincesCancelToken?.cancel(); + _provincesCancelToken = CancelToken(); + try { - final res = await chickenRepository.getProvince(); + final res = await chickenRepository.getProvince(cancelToken: _provincesCancelToken); if (res != null) { provinces.clear(); provinces.value = res; } } catch (e) { + if (e is DioException && e.type == DioExceptionType.cancel) { + // Request was cancelled, ignore the error + return; + } provinces.clear(); } } - - void errorHandler(DioException error) { - handleGeneric(error, () { - tokenService.deleteTokens(); - }); - } } diff --git a/packages/chicken/lib/presentation/pages/sale/logic.dart b/packages/chicken/lib/presentation/pages/sale/logic.dart index 458c1ee..234d362 100644 --- a/packages/chicken/lib/presentation/pages/sale/logic.dart +++ b/packages/chicken/lib/presentation/pages/sale/logic.dart @@ -8,14 +8,12 @@ import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class SaleLogic extends GetxController { - Rxn?> allocatedMadeModel = - Rxn?>(); + Rxn?> allocatedMadeModel = Rxn?>(); RxList rolesProductsModel = RxList(); RxList guildsModel = [].obs; - Rxn stewardFreeDashboard = - Rxn(); + Rxn stewardFreeDashboard = Rxn(); RootLogic rootLogic = Get.find(); @@ -25,6 +23,11 @@ class SaleLogic extends GetxController { void onInit() { super.onInit(); routesName = [...rootLogic.routesName, 'فروش'].toList(); + } + + @override + void onReady() { + super.onReady(); getStewardDashBord(); getRolesProducts(); } @@ -33,12 +36,7 @@ class SaleLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.getAllocatedMade( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - page: 1, - pageSize: 20, - search: 'filter', - role: 'Steward', - ), + queryParameters: buildQueryParams(page: 1, pageSize: 20, search: 'filter', role: 'Steward'), ), onSuccess: (result) { if (result != null) { @@ -81,8 +79,7 @@ class SaleLogic extends GetxController { safeCall( call: () async => await rootLogic.chickenRepository.confirmAllAllocation( token: rootLogic.tokenService.accessToken.value!, - allocationTokens: - allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], + allocationTokens: allocatedMadeModel.value?.map((e) => e.key!).toList() ?? [], ), onSuccess: (result) { getAllocatedMade(); diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 15d9d88..6323aa9 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,11 +1,7 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/buy_in_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/buy_in_province_all/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/buy_in_province_waiting/logic.dart'; -import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; @@ -14,18 +10,13 @@ import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_in_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/search/logic.dart'; import 'package:rasadyar_core/core.dart'; -import '../pages/sales_out_of_province_buyers/logic.dart'; -import '../pages/sales_out_of_province_sales_list/logic.dart'; - sealed class ChickenPages { ChickenPages._(); @@ -35,12 +26,12 @@ sealed class ChickenPages { page: () => RootPage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.put(RootLogic()); + Get.lazyPut(() => RootLogic()); + Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => HomeLogic()); Get.lazyPut(() => BuyLogic()); Get.lazyPut(() => SaleLogic()); Get.lazyPut(() => ProfileLogic()); - Get.lazyPut(() => BaseLogic()); }), ), @@ -50,8 +41,7 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.put(HomeLogic()); - Get.put(RootLogic()); - Get.lazyPut(() => BaseLogic()); + //Get.lazyPut(() => BaseLogic()); }), ), @@ -61,7 +51,7 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => EnteringTheWarehouseLogic()); - Get.lazyPut(() => RootLogic()); + // RootLogic already registered in root page binding }), ),*/ @@ -72,9 +62,9 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => SaleLogic()); - Get.lazyPut(() => BaseLogic()); - Get.lazyPut(() => SalesOutOfProvinceLogic()); - Get.lazyPut(() => RootLogic()); + //Get.lazyPut(() => BaseLogic()); + //Get.lazyPut(() => SalesOutOfProvinceLogic()); + //Get.lazyPut(() => RootLogic()); }), ), GetPage( @@ -82,13 +72,10 @@ sealed class ChickenPages { page: () => SalesOutOfProvincePage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(() => RootLogic()); - Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); - Get.lazyPut(() => SalesOutOfProvinceLogic()); - Get.lazyPut(() => SalesOutOfProvinceBuyersLogic()); - Get.lazyPut(() => SalesOutOfProvinceSalesListLogic()); - + // Get.lazyPut(() => SalesOutOfProvinceLogic()); + // Get.lazyPut(() => SalesOutOfProvinceBuyersLogic()); + // Get.lazyPut(() => SalesOutOfProvinceSalesListLogic()); }), ), GetPage( @@ -97,8 +84,7 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); - Get.lazyPut(() => SalesInProvinceLogic()); - Get.lazyPut(() => RootLogic()); + // Get.lazyPut(() => SalesInProvinceLogic()); Get.lazyPut(() => SearchLogic()); }), ), @@ -111,7 +97,6 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => BuyLogic()); - Get.lazyPut(() => RootLogic()); }), ), @@ -122,8 +107,7 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); - Get.lazyPut(() => BuyOutOfProvinceLogic()); - Get.lazyPut(() => RootLogic()); + // Get.lazyPut(() => BuyOutOfProvinceLogic()); }), ), @@ -134,10 +118,9 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); - Get.lazyPut(() => BuyInProvinceLogic()); - Get.lazyPut(() => BuyInProvinceWaitingLogic()); - Get.lazyPut(() => BuyInProvinceAllLogic()); - Get.lazyPut(() => RootLogic()); + // Get.lazyPut(() => BuyInProvinceLogic()); + // Get.lazyPut(() => BuyInProvinceWaitingLogic()); + // Get.lazyPut(() => BuyInProvinceAllLogic()); }), ), ]; diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index d91ae8d..ce08250 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -1,8 +1,8 @@ sealed class ChickenRoutes { ChickenRoutes._(); - static const _base = '/init'; - static const init = '$_base/root'; + static const _base = '/chicken'; + static const init = '$_base/'; static const home = '$_base/home'; static const buy = '$_base/buy'; static const sale = '$_base/sale'; diff --git a/packages/core/lib/infrastructure/remote/app_interceptor.dart b/packages/core/lib/infrastructure/remote/app_interceptor.dart index 725889c..602d34f 100644 --- a/packages/core/lib/infrastructure/remote/app_interceptor.dart +++ b/packages/core/lib/infrastructure/remote/app_interceptor.dart @@ -1,62 +1,101 @@ import 'dart:async'; + import '../../core.dart'; typedef RefreshTokenCallback = Future Function(); +typedef SaveTokenCallback = Future Function(String token); +typedef ClearTokenCallback = Future Function(); + class AppInterceptor extends Interceptor { - final RefreshTokenCallback refreshTokenCallback; - Completer? _refreshCompleter; + final RefreshTokenCallback? refreshTokenCallback; + final SaveTokenCallback saveTokenCallback; + final ClearTokenCallback clearTokenCallback; + late final Dio dio; + static Completer? _refreshCompleter; + static bool _isRefreshing = false; - AppInterceptor({required this.refreshTokenCallback}); + AppInterceptor({ + required this.saveTokenCallback, + required this.clearTokenCallback, + this.refreshTokenCallback, + }); + @override + Future onRequest(RequestOptions options, RequestInterceptorHandler handler) async { + if (_isRefreshing && _refreshCompleter != null) { + try { + final newToken = await _refreshCompleter!.future; + if (newToken != null && newToken.isNotEmpty) { + options.headers['Authorization'] = 'Bearer $newToken'; + } + } catch (_) { + handler.reject(DioException(requestOptions: options, type: DioExceptionType.cancel)); + return; + } + } + handler.next(options); + } @override Future onError(DioException err, ErrorInterceptorHandler handler) async { - if (err.response?.statusCode == 401 && !ApiHandler.isRefreshing) { - ApiHandler.cancelAllRequests("Token expired - refreshing"); - - if (_refreshCompleter == null) { - _refreshCompleter = Completer(); - ApiHandler.isRefreshing = true; - - try { - final newToken = await refreshTokenCallback(); - if (newToken == null) throw Exception("Refresh failed"); - - ApiHandler.reset(); - _refreshCompleter?.complete(newToken); - } catch (e) { - _refreshCompleter?.completeError(e); - if (!ApiHandler.isRedirecting) { - ApiHandler.isRedirecting = true; - ApiHandler.cancelAllRequests("Cancel All Requests - Unauthorized"); - if (Get.currentRoute != '/Auth') { - Get.offAllNamed('/Auth'); - } - } - } finally { - ApiHandler.isRefreshing = false; - _refreshCompleter = null; - } + if (err.response?.statusCode == 401) { + final retryResult = await _handleUnauthorizedError(err); + if (retryResult != null) { + handler.resolve(retryResult); + return; } + } + handler.next(err); + } + Future _handleUnauthorizedError(DioException err) async { + if (_isRefreshing && _refreshCompleter != null) { try { final newToken = await _refreshCompleter!.future; - if (newToken != null) { - final opts = err.requestOptions; - opts.headers['Authorization'] = 'Bearer $newToken'; - - final dio = Dio(); - final cloneReq = await dio.fetch(opts); - handler.resolve(cloneReq); - return; - } + return newToken != null ? await _retryRequest(err.requestOptions, newToken) : null; } catch (_) { - handler.reject(err); + return null; } - } else if (err.type == DioExceptionType.cancel) { - handler.next(err); - } else { - handler.next(err); + } + + _isRefreshing = true; + _refreshCompleter = Completer(); + + try { + final newToken = await refreshTokenCallback!(); + + if (!_refreshCompleter!.isCompleted) _refreshCompleter!.complete(newToken); + + if (newToken != null) { + await saveTokenCallback(newToken); // ✅ ذخیره توکن جدید + return await _retryRequest(err.requestOptions, newToken); + } else { + await clearTokenCallback(); // ✅ پاک‌کردن توکن‌های قبلی + return null; + } + } catch (e) { + if (!_refreshCompleter!.isCompleted) _refreshCompleter!.completeError(e); + await clearTokenCallback(); // ✅ پاک‌کردن توکن در صورت خطا + _handleRefreshFailure(); + return null; + } finally { + _isRefreshing = false; + _refreshCompleter = null; } } + + Future _retryRequest(RequestOptions options, String token) async { + final newOptions = options.copyWith(); + newOptions.headers['Authorization'] = 'Bearer $token'; + return dio.fetch(newOptions); + } + + void _handleRefreshFailure() { + ApiHandler.cancelAllRequests("Token refresh failed"); + Future.delayed(const Duration(milliseconds: 100), () { + if (Get.currentRoute != '/Auth') { + Get.offAllNamed('/Auth'); + } + }); + } } \ No newline at end of file diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index e87c10f..96ba77a 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -1,45 +1,45 @@ import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; - class DioRemote implements IHttpClient { String? baseUrl; - late final Dio _dio; - final List interceptors; + late Dio dio; + final AppInterceptor interceptors; - DioRemote({this.baseUrl, this.interceptors = const []}); + + DioRemote({this.baseUrl, required this.interceptors}); @override Future init() async { - final dio = Dio(BaseOptions(baseUrl: baseUrl ?? '')); - dio.interceptors.addAll(interceptors); + dio = Dio(BaseOptions(baseUrl: baseUrl ?? '')); + dio.interceptors.add(interceptors); if (kDebugMode) { dio.interceptors.add( PrettyDioLogger( requestHeader: true, responseHeader: true, requestBody: true, + responseBody: true, ), ); } - _dio = dio; } @override Future> get( - String path, { - Map? queryParameters, - Map? headers, - ProgressCallback? onReceiveProgress, - T Function(Map json)? fromJson, - T Function(List json)? fromJsonList, - }) async { - final response = await _dio.get( + String path, { + Map? queryParameters, + Map? headers, + ProgressCallback? onReceiveProgress, + T Function(Map json)? fromJson, + T Function(List json)? fromJsonList, + }) async { + final response = await dio.get( path, queryParameters: queryParameters, options: Options(headers: headers), onReceiveProgress: onReceiveProgress, - cancelToken: ApiHandler.globalCancelToken + cancelToken: ApiHandler.globalCancelToken, ); if (fromJsonList != null && response.data is List) { response.data = fromJsonList(response.data); @@ -62,21 +62,19 @@ class DioRemote implements IHttpClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { - final response = await _dio.post( + final response = await dio.post( path, data: data, queryParameters: queryParameters, options: Options(headers: headers), onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, - cancelToken: ApiHandler.globalCancelToken + cancelToken: ApiHandler.globalCancelToken, ); if (fromJson != null) { final rawData = response.data; - final parsedData = rawData is Map - ? fromJson(rawData) - : null; + final parsedData = rawData is Map ? fromJson(rawData) : null; response.data = parsedData; return DioResponse(response); } @@ -93,14 +91,14 @@ class DioRemote implements IHttpClient { ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { - final response = await _dio.put( + final response = await dio.put( path, data: data, queryParameters: queryParameters, options: Options(headers: headers), onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, - cancelToken: ApiHandler.globalCancelToken + cancelToken: ApiHandler.globalCancelToken, ); return DioResponse(response); } @@ -112,12 +110,12 @@ class DioRemote implements IHttpClient { Map? queryParameters, Map? headers, }) async { - final response = await _dio.delete( + final response = await dio.delete( path, data: data, queryParameters: queryParameters, options: Options(headers: headers), - cancelToken: ApiHandler.globalCancelToken + cancelToken: ApiHandler.globalCancelToken, ); return DioResponse(response); } @@ -127,11 +125,11 @@ class DioRemote implements IHttpClient { String url, { ProgressCallback? onReceiveProgress, }) async { - final response = await _dio.get( + final response = await dio.get( url, options: Options(responseType: ResponseType.bytes), onReceiveProgress: onReceiveProgress, - cancelToken: ApiHandler.globalCancelToken + cancelToken: ApiHandler.globalCancelToken, ); return DioResponse(response); } @@ -143,12 +141,12 @@ class DioRemote implements IHttpClient { Map? headers, ProgressCallback? onSendProgress, }) async { - final response = await _dio.post( + final response = await dio.post( path, data: (formData as DioFormData).raw, options: Options(headers: headers, contentType: 'multipart/form-data'), onSendProgress: onSendProgress, - cancelToken: ApiHandler.globalCancelToken + cancelToken: ApiHandler.globalCancelToken, ); return DioResponse(response); } diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index 8e1c1b2..9df3a5f 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -17,6 +17,7 @@ Future _setUpLogger() async{ Future _setupLocalStorage() async { diCore.registerSingleton(HiveLocalStorage()); + print('====> HiveLocalStorage registered'); } diff --git a/packages/core/lib/utils/network/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart index fca9f61..19e354a 100644 --- a/packages/core/lib/utils/network/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -1,84 +1,169 @@ +import 'package:flutter/material.dart'; + import '../../core.dart'; class ApiHandler { - static bool _isRefreshing = false; - static bool _isRedirecting = false; - static CancelToken globalCancelToken = CancelToken(); + static CancelToken _globalCancelToken = CancelToken(); + + static CancelToken get globalCancelToken => _globalCancelToken; static Future reset() async { - _isRefreshing = false; - _isRedirecting = false; - globalCancelToken = CancelToken(); + _globalCancelToken = CancelToken(); } - static void cancelAllRequests(String reason) { - if (!globalCancelToken.isCancelled) { - globalCancelToken.cancel(reason); + if (!_globalCancelToken.isCancelled) { + _globalCancelToken.cancel(reason); } - globalCancelToken = CancelToken(); + reset(); } - - static bool get isRefreshing => _isRefreshing; - static set isRefreshing(bool val) => _isRefreshing = val; - - static bool get isRedirecting => _isRedirecting; - static set isRedirecting(bool val) => _isRedirecting = val; } + + typedef AppAsyncCallback = Future Function(); typedef ErrorCallback = Function(dynamic error, StackTrace? stackTrace); typedef VoidCallback = void Function(); -/// this is global safe call function -/// A utility function to safely cal l an asynchronous function with error -/// handling and optional loading, success, and error messages. -Future gSafeCall({ +Future gSafeCall({ required AppAsyncCallback call, Function(T result)? onSuccess, ErrorCallback? onError, VoidCallback? onComplete, bool showLoading = false, - bool showError = false, + bool showError = true, bool showSuccess = false, - bool showToast = false, - bool showSnackBar = false, Function()? onShowLoading, Function()? onHideLoading, - Function()? onShowSuccessMessage, - Function()? onShowErrorMessage, + Function(String message)? onShowErrorMessage, + Function(String message)? onShowSuccessMessage, + int maxRetries = 0, + Duration retryDelay = const Duration(seconds: 1), }) async { - try { - if (showLoading) (onShowLoading ?? _defaultShowLoading)(); - final result = await call(); - if (showSuccess) (onShowSuccessMessage ?? _defaultShowSuccessMessage)(); - onSuccess?.call(result); - } catch (error, stackTrace) { - if (showError) (onShowErrorMessage ?? _defaultShowErrorMessage)(); - onError?.call(error, stackTrace); - } finally { - if (showLoading) (onHideLoading ?? _defaultHideLoading)(); - onComplete?.call(); + int retryCount = 0; + + while (retryCount <= maxRetries) { + try { + if (showLoading && retryCount == 0) { + (onShowLoading ?? _defaultShowLoading)(); + } + + final result = await call(); + + if (showSuccess) { + (onShowSuccessMessage ?? _defaultShowSuccessMessage)('عملیات با موفقیت انجام شد'); + } + + onSuccess?.call(result); + return result; + + } catch (error, stackTrace) { + retryCount++; + + + if (error is DioException && error.response?.statusCode == 401) { + if (showError) { + (onShowErrorMessage ?? _defaultShowErrorMessage)('خطا در احراز هویت'); + } + onError?.call(error, stackTrace); + return null; + } + + + if (retryCount > maxRetries || !_isRetryableError(error)) { + if (showError) { + final message = _getErrorMessage(error); + (onShowErrorMessage ?? _defaultShowErrorMessage)(message); + } + onError?.call(error, stackTrace); + return null; + } + + // صبر قبل از retry + if (retryCount <= maxRetries) { + await Future.delayed(retryDelay); + } + } finally { + if (showLoading && retryCount > maxRetries) { + (onHideLoading ?? _defaultHideLoading)(); + } + if (retryCount > maxRetries) { + onComplete?.call(); + } + } } + + return null; } +bool _isRetryableError(dynamic error) { + if (error is DioException) { + // خطاهای قابل retry + return error.type == DioExceptionType.connectionTimeout || + error.type == DioExceptionType.receiveTimeout || + error.type == DioExceptionType.sendTimeout || + (error.response?.statusCode != null && + error.response!.statusCode! >= 500); + } + return false; +} + +String _getErrorMessage(dynamic error) { + if (error is DioException) { + switch (error.type) { + case DioExceptionType.connectionTimeout: + return 'خطا در اتصال - زمان اتصال تمام شد'; + case DioExceptionType.receiveTimeout: + return 'خطا در دریافت پاسخ'; + case DioExceptionType.sendTimeout: + return 'خطا در ارسال درخواست'; + case DioExceptionType.badCertificate: + return 'خطا در گواهی امنیتی'; + case DioExceptionType.connectionError: + return 'خطا در اتصال به سرور'; + case DioExceptionType.unknown: + return 'خطای نامشخص'; + default: + if (error.response?.statusCode != null) { + return 'خطا: ${error.response!.statusCode}'; + } + return 'خطای نامشخص'; + } + } + return error.toString(); +} void _defaultShowLoading() { - // پیاده‌سازی پیش‌فرض + // نمایش loading + Get.dialog( + Center(child: CircularProgressIndicator()), + barrierDismissible: false, + ); } void _defaultHideLoading() { - // پیاده‌سازی پیش‌فرض + // مخفی کردن loading + if (Get.isDialogOpen == true) { + Get.back(); + } } -void _defaultShowSuccessMessage() { - // پیاده‌سازی پیش‌فرض +void _defaultShowSuccessMessage(String message) { + Get.snackbar( + 'موفقیت', + message, + snackPosition: SnackPosition.TOP, + backgroundColor: Colors.green, + colorText: Colors.white, + ); } -void _defaultShowErrorMessage() { - // پیاده‌سازی پیش‌فرض -} - -bool isTokenExpiredError(dynamic error) { - return error is DioException && error.response?.statusCode == 401; +void _defaultShowErrorMessage(String message) { + Get.snackbar( + 'خطا', + message, + snackPosition: SnackPosition.TOP, + backgroundColor: Colors.red, + colorText: Colors.white, + ); } diff --git a/pubspec.lock b/pubspec.lock index 5c08254..1bba7de 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1162,7 +1162,7 @@ packages: path: "packages/chicken" relative: true source: path - version: "1.0.0" + version: "1.0.1" rasadyar_core: dependency: "direct main" description: From f64ac3748b1af023e8b332c0417bb3460eb35e3a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 12 Jul 2025 20:02:53 +0330 Subject: [PATCH 189/256] chore : un comment logic --- .../lib/presentation/routes/pages.dart | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index 6323aa9..ed401e7 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -1,7 +1,11 @@ import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_in_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_all/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_in_province_waiting/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/buy_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; @@ -10,8 +14,12 @@ import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/root/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_in_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/logic.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/search/logic.dart'; @@ -41,19 +49,10 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.put(HomeLogic()); - //Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => BaseLogic()); }), ), - /* GetPage( - name: ChickenRoutes.enteringTheWarehouse, - page: () => EnteringTheWarehousePage(), - middlewares: [AuthMiddleware()], - binding: BindingsBuilder(() { - Get.lazyPut(() => EnteringTheWarehouseLogic()); - // RootLogic already registered in root page binding - }), - ),*/ //sales GetPage( @@ -62,9 +61,9 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => SaleLogic()); - //Get.lazyPut(() => BaseLogic()); - //Get.lazyPut(() => SalesOutOfProvinceLogic()); - //Get.lazyPut(() => RootLogic()); + Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => RootLogic()); }), ), GetPage( @@ -73,9 +72,9 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => SearchLogic()); - // Get.lazyPut(() => SalesOutOfProvinceLogic()); - // Get.lazyPut(() => SalesOutOfProvinceBuyersLogic()); - // Get.lazyPut(() => SalesOutOfProvinceSalesListLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => SalesOutOfProvinceBuyersLogic()); + Get.lazyPut(() => SalesOutOfProvinceSalesListLogic()); }), ), GetPage( @@ -84,7 +83,7 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); - // Get.lazyPut(() => SalesInProvinceLogic()); + Get.lazyPut(() => SalesInProvinceLogic()); Get.lazyPut(() => SearchLogic()); }), ), @@ -107,7 +106,7 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); - // Get.lazyPut(() => BuyOutOfProvinceLogic()); + Get.lazyPut(() => BuyOutOfProvinceLogic()); }), ), @@ -118,9 +117,9 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); - // Get.lazyPut(() => BuyInProvinceLogic()); - // Get.lazyPut(() => BuyInProvinceWaitingLogic()); - // Get.lazyPut(() => BuyInProvinceAllLogic()); + Get.lazyPut(() => BuyInProvinceLogic()); + Get.lazyPut(() => BuyInProvinceWaitingLogic()); + Get.lazyPut(() => BuyInProvinceAllLogic()); }), ), ]; From a909210144c8cec1611747287c7c69e7715c2d28 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Jul 2025 08:34:59 +0330 Subject: [PATCH 190/256] fix : saleOrBuyItemCard color --- packages/chicken/lib/data/di/chicken_di.dart | 2 +- .../lib/presentation/pages/buy/view.dart | 6 ++++-- .../lib/presentation/pages/sale/view.dart | 4 ++-- .../presentation/widget/sale_buy_card_item.dart | 17 +++++++++++++---- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index eca66b7..ed05229 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -11,7 +11,7 @@ Future setupChickenDI() async { () => AppInterceptor( refreshTokenCallback: () async {}, saveTokenCallback: (String newToken) async { - await tokenService.saveAccessToken(newToken); // ذخیره توکن جدید + await tokenService.saveAccessToken(newToken); }, clearTokenCallback: () async { await tokenService.deleteTokens(); diff --git a/packages/chicken/lib/presentation/pages/buy/view.dart b/packages/chicken/lib/presentation/pages/buy/view.dart index cbdef58..27be7b2 100644 --- a/packages/chicken/lib/presentation/pages/buy/view.dart +++ b/packages/chicken/lib/presentation/pages/buy/view.dart @@ -23,15 +23,17 @@ class BuyPage extends GetView { spacing: 14.w, children: [ saleOrBuyItemCard( - title: 'داخل استان', + title: 'خرید داخل استان', iconPath: Assets.vec.cubeSvg.path, + color: AppColor.greenNormalActive, onTap: () { Get.toNamed(ChickenRoutes.buysInProvince, id: 0); }, ), saleOrBuyItemCard( - title: 'خارج استان', + title: 'خرید خارج استان', iconPath: Assets.vec.truckFastSvg.path, + color: AppColor.greenNormalActive, onTap: () { Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); }, diff --git a/packages/chicken/lib/presentation/pages/sale/view.dart b/packages/chicken/lib/presentation/pages/sale/view.dart index 703dfaf..3e6f697 100644 --- a/packages/chicken/lib/presentation/pages/sale/view.dart +++ b/packages/chicken/lib/presentation/pages/sale/view.dart @@ -24,14 +24,14 @@ class SalePage extends GetView { spacing: 14.w, children: [ saleOrBuyItemCard( - title: 'داخل استان', + title: 'فروش داخل استان', iconPath: Assets.vec.cubeSvg.path, onTap: () { Get.toNamed(ChickenRoutes.salesInProvince, id: 1); }, ), saleOrBuyItemCard( - title: 'خارج استان', + title: 'فروش خارج استان', iconPath: Assets.vec.truckFastSvg.path, onTap: () { Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); diff --git a/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart b/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart index b261a29..9c8459c 100644 --- a/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart +++ b/packages/chicken/lib/presentation/widget/sale_buy_card_item.dart @@ -1,14 +1,19 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -Widget saleOrBuyItemCard({String? title, String? iconPath, required VoidCallback onTap}) { +Widget saleOrBuyItemCard({ + String? title, + String? iconPath, + required VoidCallback onTap, + Color? color, +}) { return InkWell( borderRadius: BorderRadius.circular(8.r), onTap: onTap, child: Card( color: Colors.white, shape: RoundedRectangleBorder( - side: BorderSide(color: AppColor.blueNormal, width: 1.0.w), + side: BorderSide(color: color ?? AppColor.blueNormal, width: 1.0.w), borderRadius: BorderRadius.circular(8.r), ), child: Container( @@ -23,10 +28,14 @@ Widget saleOrBuyItemCard({String? title, String? iconPath, required VoidCallback SvgGenImage.vec(iconPath).svg( width: 64.w, height: 64.h, - colorFilter: const ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + colorFilter: ColorFilter.mode(color ?? AppColor.blueNormal, BlendMode.srcIn), ), SizedBox(height: 12.h), - if (title != null) Text(title, style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + if (title != null) + Text( + title, + style: AppFonts.yekan16Bold.copyWith(color: color ?? AppColor.blueNormal), + ), ], ), ), From 0558ebdb37d98c2377321a53e6eeab07377928f8 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Jul 2025 11:50:38 +0330 Subject: [PATCH 191/256] fix : get not entered --- .../pages/buy_in_province_waiting/logic.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart index 9be6f7b..2de5ede 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -10,8 +10,8 @@ import 'package:rasadyar_core/core.dart'; class BuyInProvinceWaitingLogic extends GetxController { RxList isExpandedList = [].obs; - Rx fromDateFilter = Jalali.now().obs; - Rx toDateFilter = Jalali.now().obs; + Rxn fromDateFilter = Rxn(); + Rxn toDateFilter = Rxn(); RxnString searchedValue = RxnString(); RxMap isLoadingConfirmMap = RxMap(); Rx bgConfirmAllColor = AppColor.blueNormal.obs; @@ -56,7 +56,7 @@ class BuyInProvinceWaitingLogic extends GetxController { if (searchedValue.value != null && searchedValue.value!.trim().isNotEmpty && currentPage.value > 1) { - currentPage.value = 1; // Reset to first page if search value is set + currentPage.value = 1; } safeCall( @@ -69,8 +69,8 @@ class BuyInProvinceWaitingLogic extends GetxController { search: 'filter', role: 'Steward', value: searchedValue.value, - fromDate: fromDateFilter.value.toDateTime(), - toDate: toDateFilter.value.toDateTime(), + fromDate: fromDateFilter.value?.toDateTime(), + toDate: toDateFilter.value?.toDateTime(), ), ), onSuccess: (res) async { From 7c8d9357b3febbd117bc270ad53c0ec0bd078b6e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Jul 2025 11:50:53 +0330 Subject: [PATCH 192/256] chore : new Logger --- packages/core/lib/utils/logger_utils.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/core/lib/utils/logger_utils.dart b/packages/core/lib/utils/logger_utils.dart index 4edf8a0..8d83ded 100644 --- a/packages/core/lib/utils/logger_utils.dart +++ b/packages/core/lib/utils/logger_utils.dart @@ -8,6 +8,12 @@ void iLog(dynamic message) { } } +void wLog(dynamic message){ + if(kDebugMode){ + diCore.get().w(message.toString()); + } +} + void eLog(dynamic message) { if(kDebugMode){ diCore.get().e(message.toString()); From 9c8ab53188b0b49eef96ce1efe457ddb361505b4 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Jul 2025 11:51:34 +0330 Subject: [PATCH 193/256] fix : ui change's in sale --- .../lib/presentation/pages/sale/view.dart | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sale/view.dart b/packages/chicken/lib/presentation/pages/sale/view.dart index 3e6f697..12710e7 100644 --- a/packages/chicken/lib/presentation/pages/sale/view.dart +++ b/packages/chicken/lib/presentation/pages/sale/view.dart @@ -45,8 +45,6 @@ class SalePage extends GetView { ); } - - Widget addSaleOutOfTheProvinceBottomSheet() { return BaseBottomSheet( child: Column( @@ -54,7 +52,10 @@ class SalePage extends GetView { const SizedBox(height: 20), Align( alignment: Alignment.centerRight, - child: Text('ثبت فروش خارج استان', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + child: Text( + 'ثبت فروش خارج استان', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), ), SizedBox(height: 4), RElevated(text: 'ثبت توزیع/ فروش', onPressed: () {}), @@ -88,9 +89,11 @@ class SalePage extends GetView { children: [ Positioned( top: -41, - child: SvgGenImage.vec( - iconPath, - ).svg(width: 45, height: 45, colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn)), + child: SvgGenImage.vec(iconPath).svg( + width: 45, + height: 45, + colorFilter: ColorFilter.mode(foregroundColor, BlendMode.srcIn), + ), ), Assets.vec.shoppingBasketSvg.svg( @@ -120,7 +123,12 @@ class SalePage extends GetView { Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Row( - children: [Text('خلاصه اطلاعات', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal))], + children: [ + Text( + 'خلاصه اطلاعات', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + ], ), ), Container( From 6de5c21919df8680ad4577297b4b4af38da4367d Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Jul 2025 11:52:19 +0330 Subject: [PATCH 194/256] feat : PopScope and there logic --- .../lib/presentation/pages/root/view.dart | 224 +++++++++++------- .../presentation/widget/base_page/view.dart | 57 ++--- 2 files changed, 169 insertions(+), 112 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 85f7e41..c3bbaa4 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -1,89 +1,119 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_core/core.dart'; class RootPage extends GetView { - const RootPage({super.key}); + RootPage({super.key}); + + DateTime? _lastBackPressed; @override Widget build(BuildContext context) { return ObxValue((data) { - return Scaffold( - backgroundColor: AppColor.bgLight, - body: IndexedStack( - children: [ - Navigator( - key: Get.nestedKey(0), - onGenerateRoute: (settings) { - final page = ChickenPages.pages.firstWhere( - (e) => e.name == settings.name, - orElse: () => ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.buy), - ); + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) async { + final nestedKey = Get.nestedKey(controller.currentPage.value); + final currentNavigator = nestedKey?.currentState; - return buildRouteFromGetPage(page); - }, - ), - Navigator( - key: Get.nestedKey(1), - onGenerateRoute: (settings) { - final page = ChickenPages.pages.firstWhere( - (e) => e.name == settings.name, - orElse: () => ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.sale), - ); + if (currentNavigator?.canPop() ?? false) { + currentNavigator?.pop(); + } else { + final now = DateTime.now(); + if (_lastBackPressed == null || + now.difference(_lastBackPressed!) > Duration(seconds: 2)) { + _lastBackPressed = now; + Get.snackbar( + 'خروج از برنامه', + 'برای خروج دوباره بازگشت را بزنید', + snackPosition: SnackPosition.TOP, + duration: Duration(seconds: 2), + backgroundColor: AppColor.warning, + ); + } else { + await SystemNavigator.pop(); + } + } + }, + child: Scaffold( + backgroundColor: AppColor.bgLight, + body: IndexedStack( + children: [ + Navigator( + key: Get.nestedKey(0), + onGenerateRoute: (settings) { + final page = ChickenPages.pages.firstWhere( + (e) => e.name == settings.name, + orElse: () => ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.buy), + ); - return buildRouteFromGetPage(page); - }, - ), - Navigator( - key: Get.nestedKey(2), - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]), - ), - Navigator( - key: Get.nestedKey(3), - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[3]), - ), - Navigator( - key: Get.nestedKey(4), - onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[4]), - ), - ], - index: data.value, - ), + return buildRouteFromGetPage(page); + }, + ), + Navigator( + key: Get.nestedKey(1), + onGenerateRoute: (settings) { + final page = ChickenPages.pages.firstWhere( + (e) => e.name == settings.name, + orElse: () => + ChickenPages.pages.firstWhere((e) => e.name == ChickenRoutes.sale), + ); - bottomNavigationBar: RBottomNavigation( - items: [ - RBottomNavigationItem( - label: 'خرید', - icon: Assets.vec.buySvg.path, - isSelected: controller.currentPage.value == 0, - onTap: () => controller.changePage(0), - ), - RBottomNavigationItem( - label: 'فروش', - icon: Assets.vec.saleSvg.path, - isSelected: controller.currentPage.value == 1, - onTap: () => controller.changePage(1), - ), - RBottomNavigationItem( - label: 'خانه', - icon: Assets.vec.homeSvg.path, - isSelected: controller.currentPage.value == 2, - onTap: () => controller.changePage(2), - ), - RBottomNavigationItem( - label: 'قطعه بندی', - icon: Assets.vec.convertCubeSvg.path, - isSelected: controller.currentPage.value == 3, - onTap: () => controller.changePage(3), - ), - RBottomNavigationItem( - label: 'پروفایل', - icon: Assets.vec.profileCircleSvg.path, - isSelected: controller.currentPage.value == 4, - onTap: () => controller.changePage(4), - ), - ], + return buildRouteFromGetPage(page); + }, + ), + Navigator( + key: Get.nestedKey(2), + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]), + ), + Navigator( + key: Get.nestedKey(3), + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[3]), + ), + Navigator( + key: Get.nestedKey(4), + onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[4]), + ), + ], + index: data.value, + ), + + bottomNavigationBar: RBottomNavigation( + items: [ + RBottomNavigationItem( + label: 'خرید', + icon: Assets.vec.buySvg.path, + isSelected: controller.currentPage.value == 0, + onTap: () => controller.changePage(0), + ), + RBottomNavigationItem( + label: 'فروش', + icon: Assets.vec.saleSvg.path, + isSelected: controller.currentPage.value == 1, + onTap: () => controller.changePage(1), + ), + RBottomNavigationItem( + label: 'خانه', + icon: Assets.vec.homeSvg.path, + isSelected: controller.currentPage.value == 2, + onTap: () => controller.changePage(2), + ), + RBottomNavigationItem( + label: 'قطعه بندی', + icon: Assets.vec.convertCubeSvg.path, + isSelected: controller.currentPage.value == 3, + onTap: () => controller.changePage(3), + ), + RBottomNavigationItem( + label: 'پروفایل', + icon: Assets.vec.profileCircleSvg.path, + isSelected: controller.currentPage.value == 4, + onTap: () => controller.changePage(4), + ), + ], + ), ), ); }, controller.currentPage); @@ -164,15 +194,20 @@ class RootPage extends GetView { height: 82, decoration: BoxDecoration( color: bgLabelColor, - borderRadius: BorderRadius.only(topRight: Radius.circular(8), bottomRight: Radius.circular(8)), + borderRadius: BorderRadius.only( + topRight: Radius.circular(8), + bottomRight: Radius.circular(8), + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 4, children: [ - SvgGenImage.vec( - iconPath, - ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), + ), Text( title, textAlign: TextAlign.right, @@ -187,7 +222,10 @@ class RootPage extends GetView { child: Container( decoration: BoxDecoration( color: bgDescriptionColor, - borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + bottomLeft: Radius.circular(8), + ), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -275,9 +313,11 @@ class RootPage extends GetView { ), ), child: Center( - child: SvgGenImage.vec( - iconPath, - ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), + ), ), ), ), @@ -286,7 +326,11 @@ class RootPage extends GetView { ); } - Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { + Widget widelyUsed({ + required String title, + required String iconPath, + required VoidCallback onTap, + }) { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, @@ -525,15 +569,25 @@ class RootPage extends GetView { style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), const SizedBox(height: 12), - buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), - buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), + buildRow( + 'فروش و توزیع داخل استان (کیلوگرم)', + model.stewardAllocationsWeight!.toInt().toString(), + ), + buildRow( + 'فروش و توزیع خارج استان (کیلوگرم)', + model.freeSalesWeight!.toInt().toString(), + ), ], ) : const Center(child: CircularProgressIndicator()), ); } - Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { + Widget cardWidget({ + required String title, + required String iconPath, + required VoidCallback onTap, + }) { return Container( width: Get.width / 4, height: 130, diff --git a/packages/chicken/lib/presentation/widget/base_page/view.dart b/packages/chicken/lib/presentation/widget/base_page/view.dart index b74db0f..3a98885 100644 --- a/packages/chicken/lib/presentation/widget/base_page/view.dart +++ b/packages/chicken/lib/presentation/widget/base_page/view.dart @@ -23,11 +23,10 @@ class BasePage extends StatefulWidget { this.onFilterTap, this.onSearchTap, this.filteringWidget, - }):assert( - (routes != null ) || routesWidget != null, - 'Either routes or routesWidget must be provided.', - ); - + }) : assert( + (routes != null) || routesWidget != null, + 'Either routes or routesWidget must be provided.', + ); final List? routes; final Widget? routesWidget; @@ -77,29 +76,33 @@ class _BasePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColor.bgLight, - appBar: chickenAppBar( - hasBack: widget.isBase ? false : widget.hasBack, - onBackPressed: widget.onBackPressed, - hasFilter: widget.hasFilter, - hasSearch: widget.hasSearch, - isBase: widget.isBase, - onFilterTap: widget.hasFilter ? () => controller.toggleFilter() : null, - onSearchTap: widget.hasSearch ? () => Get.find().toggleSearch() : null, + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) => widget.onBackPressed, + child: Scaffold( + backgroundColor: AppColor.bgLight, + appBar: chickenAppBar( + hasBack: widget.isBase ? false : widget.hasBack, + onBackPressed: widget.onBackPressed, + hasFilter: widget.hasFilter, + hasSearch: widget.hasSearch, + isBase: widget.isBase, + onFilterTap: widget.hasFilter ? () => controller.toggleFilter() : null, + onSearchTap: widget.hasSearch ? () => Get.find().toggleSearch() : null, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!), + if (!widget.isBase && widget.hasSearch) ...{ + SearchWidget(onSearchChanged: widget.onSearchChanged), + }, + ...widget.widgets, + ], + ), + floatingActionButtonLocation: widget.floatingActionButtonLocation, + floatingActionButton: widget.floatingActionButton, ), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!), - if (!widget.isBase && widget.hasSearch) ...{ - SearchWidget(onSearchChanged: widget.onSearchChanged), - }, - ...widget.widgets, - ], - ), - floatingActionButtonLocation: widget.floatingActionButtonLocation, - floatingActionButton: widget.floatingActionButton, ); } } From d78a604d037ba99c7e9503ccc4cb72b4d6f15d51 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Jul 2025 13:11:03 +0330 Subject: [PATCH 195/256] feat : segmentation model and api call --- .../segmentation_model.dart | 21 ++ .../segmentation_model.freezed.dart | 323 ++++++++++++++++++ .../segmentation_model.g.dart | 41 +++ .../data/repositories/chicken_repository.dart | 10 + .../repositories/chicken_repository_imp.dart | 42 ++- 5 files changed, 435 insertions(+), 2 deletions(-) create mode 100644 packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart create mode 100644 packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart create mode 100644 packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart new file mode 100644 index 0000000..3ab099b --- /dev/null +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -0,0 +1,21 @@ +// segmentation_model.dart +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'segmentation_model.freezed.dart'; +part 'segmentation_model.g.dart'; + +@freezed +abstract class SegmentationModel with _$SegmentationModel { + const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, double? weight}) = + _SegmentationModel; + + factory SegmentationModel.fromJson(Map json) => + _$SegmentationModelFromJson(json); +} + +@freezed +abstract class Buyer with _$Buyer { + const factory Buyer({String? fullname, String? mobile, String? shop, String? type}) = _Buyer; + + factory Buyer.fromJson(Map json) => _$BuyerFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart new file mode 100644 index 0000000..0546eca --- /dev/null +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -0,0 +1,323 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'segmentation_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$SegmentationModel { + + String? get key; Buyer? get buyer; DateTime? get date; double? get weight; +/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SegmentationModelCopyWith get copyWith => _$SegmentationModelCopyWithImpl(this as SegmentationModel, _$identity); + + /// Serializes this SegmentationModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,buyer,date,weight); + +@override +String toString() { + return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight)'; +} + + +} + +/// @nodoc +abstract mixin class $SegmentationModelCopyWith<$Res> { + factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; +@useResult +$Res call({ + String? key, Buyer? buyer, DateTime? date, double? weight +}); + + +$BuyerCopyWith<$Res>? get buyer; + +} +/// @nodoc +class _$SegmentationModelCopyWithImpl<$Res> + implements $SegmentationModelCopyWith<$Res> { + _$SegmentationModelCopyWithImpl(this._self, this._then); + + final SegmentationModel _self; + final $Res Function(SegmentationModel) _then; + +/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} +/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerCopyWith<$Res>? get buyer { + if (_self.buyer == null) { + return null; + } + + return $BuyerCopyWith<$Res>(_self.buyer!, (value) { + return _then(_self.copyWith(buyer: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _SegmentationModel implements SegmentationModel { + const _SegmentationModel({this.key, this.buyer, this.date, this.weight}); + factory _SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); + +@override final String? key; +@override final Buyer? buyer; +@override final DateTime? date; +@override final double? weight; + +/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SegmentationModelCopyWith<_SegmentationModel> get copyWith => __$SegmentationModelCopyWithImpl<_SegmentationModel>(this, _$identity); + +@override +Map toJson() { + return _$SegmentationModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,buyer,date,weight); + +@override +String toString() { + return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight)'; +} + + +} + +/// @nodoc +abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationModelCopyWith<$Res> { + factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; +@override @useResult +$Res call({ + String? key, Buyer? buyer, DateTime? date, double? weight +}); + + +@override $BuyerCopyWith<$Res>? get buyer; + +} +/// @nodoc +class __$SegmentationModelCopyWithImpl<$Res> + implements _$SegmentationModelCopyWith<$Res> { + __$SegmentationModelCopyWithImpl(this._self, this._then); + + final _SegmentationModel _self; + final $Res Function(_SegmentationModel) _then; + +/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,}) { + return _then(_SegmentationModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$BuyerCopyWith<$Res>? get buyer { + if (_self.buyer == null) { + return null; + } + + return $BuyerCopyWith<$Res>(_self.buyer!, (value) { + return _then(_self.copyWith(buyer: value)); + }); +} +} + + +/// @nodoc +mixin _$Buyer { + + String? get fullname; String? get mobile; String? get shop; String? get type; +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BuyerCopyWith get copyWith => _$BuyerCopyWithImpl(this as Buyer, _$identity); + + /// Serializes this Buyer to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Buyer&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.shop, shop) || other.shop == shop)&&(identical(other.type, type) || other.type == type)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,mobile,shop,type); + +@override +String toString() { + return 'Buyer(fullname: $fullname, mobile: $mobile, shop: $shop, type: $type)'; +} + + +} + +/// @nodoc +abstract mixin class $BuyerCopyWith<$Res> { + factory $BuyerCopyWith(Buyer value, $Res Function(Buyer) _then) = _$BuyerCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? mobile, String? shop, String? type +}); + + + + +} +/// @nodoc +class _$BuyerCopyWithImpl<$Res> + implements $BuyerCopyWith<$Res> { + _$BuyerCopyWithImpl(this._self, this._then); + + final Buyer _self; + final $Res Function(Buyer) _then; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? shop = freezed,Object? type = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,shop: freezed == shop ? _self.shop : shop // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Buyer implements Buyer { + const _Buyer({this.fullname, this.mobile, this.shop, this.type}); + factory _Buyer.fromJson(Map json) => _$BuyerFromJson(json); + +@override final String? fullname; +@override final String? mobile; +@override final String? shop; +@override final String? type; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$BuyerCopyWith<_Buyer> get copyWith => __$BuyerCopyWithImpl<_Buyer>(this, _$identity); + +@override +Map toJson() { + return _$BuyerToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Buyer&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.shop, shop) || other.shop == shop)&&(identical(other.type, type) || other.type == type)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,mobile,shop,type); + +@override +String toString() { + return 'Buyer(fullname: $fullname, mobile: $mobile, shop: $shop, type: $type)'; +} + + +} + +/// @nodoc +abstract mixin class _$BuyerCopyWith<$Res> implements $BuyerCopyWith<$Res> { + factory _$BuyerCopyWith(_Buyer value, $Res Function(_Buyer) _then) = __$BuyerCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? mobile, String? shop, String? type +}); + + + + +} +/// @nodoc +class __$BuyerCopyWithImpl<$Res> + implements _$BuyerCopyWith<$Res> { + __$BuyerCopyWithImpl(this._self, this._then); + + final _Buyer _self; + final $Res Function(_Buyer) _then; + +/// Create a copy of Buyer +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? shop = freezed,Object? type = freezed,}) { + return _then(_Buyer( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,shop: freezed == shop ? _self.shop : shop // ignore: cast_nullable_to_non_nullable +as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart new file mode 100644 index 0000000..22b4989 --- /dev/null +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -0,0 +1,41 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'segmentation_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_SegmentationModel _$SegmentationModelFromJson(Map json) => + _SegmentationModel( + key: json['key'] as String?, + buyer: json['buyer'] == null + ? null + : Buyer.fromJson(json['buyer'] as Map), + date: json['date'] == null + ? null + : DateTime.parse(json['date'] as String), + weight: (json['weight'] as num?)?.toDouble(), + ); + +Map _$SegmentationModelToJson(_SegmentationModel instance) => + { + 'key': instance.key, + 'buyer': instance.buyer, + 'date': instance.date?.toIso8601String(), + 'weight': instance.weight, + }; + +_Buyer _$BuyerFromJson(Map json) => _Buyer( + fullname: json['fullname'] as String?, + mobile: json['mobile'] as String?, + shop: json['shop'] as String?, + type: json['type'] as String?, +); + +Map _$BuyerToJson(_Buyer instance) => { + 'fullname': instance.fullname, + 'mobile': instance.mobile, + 'shop': instance.shop, + 'type': instance.type, +}; diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index e85f4a9..54c88f7 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -13,6 +13,7 @@ import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_pr import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; @@ -141,4 +142,13 @@ abstract class ChickenRepository { Future updateUserProfile({required String token, required UserProfile userProfile}); Future updatePassword({required String token, required ChangePasswordRequestModel model}); + + Future?> getSegmentation({ + required String token, + Map? queryParameters, + }); + + Future editSegmentation({required String token, required SegmentationModel model}); + + Future deleteSegmentation({required String token, required String key}); } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 6067433..3e1a80a 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -14,6 +14,7 @@ import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_pr import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; @@ -30,8 +31,10 @@ class ChickenRepositoryImpl implements ChickenRepository { ChickenRepositoryImpl(this._httpClient); @override - Future?> getInventory({required String token, CancelToken? cancelToken}) async { - + Future?> getInventory({ + required String token, + CancelToken? cancelToken, + }) async { eLog(_httpClient.baseUrl); var res = await _httpClient.get( '/roles-products/?role=Steward', @@ -429,4 +432,39 @@ class ChickenRepositoryImpl implements ChickenRepository { data: model.toJson()..removeWhere((key, value) => value == null), ); } + + @override + Future?> getSegmentation({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/app-segmentation/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => SegmentationModel.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future editSegmentation({required String token, required SegmentationModel model}) async { + await _httpClient.put( + '/app-segmentation/0/', + data: model.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future deleteSegmentation({required String token, required String key}) async { + await _httpClient.delete( + '/app-segmentation/0/', + queryParameters: {'key': key}, + headers: {'Authorization': 'Bearer $token'}, + ); + } } From 2ae5f805af7dbae8bcf6e44e5322d0babcff8244 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 13 Jul 2025 16:17:17 +0330 Subject: [PATCH 196/256] feat : segmentation page --- .../segmentation_model.dart | 2 +- .../segmentation_model.freezed.dart | 12 +- .../segmentation_model.g.dart | 2 +- .../data/repositories/chicken_repository.dart | 2 + .../repositories/chicken_repository_imp.dart | 9 + .../lib/presentation/pages/root/logic.dart | 10 +- .../pages/segmentation/logic.dart | 192 ++++++++++ .../presentation/pages/segmentation/view.dart | 331 ++++++++++++++++++ .../lib/presentation/routes/pages.dart | 21 +- .../lib/presentation/routes/routes.dart | 3 + packages/core/lib/core.dart | 6 +- .../lib/utils/extension/date_time_utils.dart | 13 + .../lib/utils/{ => extension}/num_utils.dart | 0 .../string_utils.dart} | 26 +- packages/core/lib/utils/string_utils.dart | 13 - packages/core/lib/utils/utils.dart | 14 + 16 files changed, 600 insertions(+), 56 deletions(-) create mode 100644 packages/chicken/lib/presentation/pages/segmentation/logic.dart create mode 100644 packages/chicken/lib/presentation/pages/segmentation/view.dart create mode 100644 packages/core/lib/utils/extension/date_time_utils.dart rename packages/core/lib/utils/{ => extension}/num_utils.dart (100%) rename packages/core/lib/utils/{date_time_utils.dart => extension/string_utils.dart} (74%) delete mode 100644 packages/core/lib/utils/string_utils.dart create mode 100644 packages/core/lib/utils/utils.dart diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart index 3ab099b..6efce7b 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -6,7 +6,7 @@ part 'segmentation_model.g.dart'; @freezed abstract class SegmentationModel with _$SegmentationModel { - const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, double? weight}) = + const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, int? weight}) = _SegmentationModel; factory SegmentationModel.fromJson(Map json) => diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index 0546eca..74e1a86 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$SegmentationModel { - String? get key; Buyer? get buyer; DateTime? get date; double? get weight; + String? get key; Buyer? get buyer; DateTime? get date; int? get weight; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -49,7 +49,7 @@ abstract mixin class $SegmentationModelCopyWith<$Res> { factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, double? weight + String? key, Buyer? buyer, DateTime? date, int? weight }); @@ -72,7 +72,7 @@ key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as double?, +as int?, )); } /// Create a copy of SegmentationModel @@ -101,7 +101,7 @@ class _SegmentationModel implements SegmentationModel { @override final String? key; @override final Buyer? buyer; @override final DateTime? date; -@override final double? weight; +@override final int? weight; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @@ -136,7 +136,7 @@ abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationM factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; @override @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, double? weight + String? key, Buyer? buyer, DateTime? date, int? weight }); @@ -159,7 +159,7 @@ key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as double?, +as int?, )); } diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart index 22b4989..82835b2 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -15,7 +15,7 @@ _SegmentationModel _$SegmentationModelFromJson(Map json) => date: json['date'] == null ? null : DateTime.parse(json['date'] as String), - weight: (json['weight'] as num?)?.toDouble(), + weight: (json['weight'] as num?)?.toInt(), ); Map _$SegmentationModelToJson(_SegmentationModel instance) => diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 54c88f7..35697da 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -148,6 +148,8 @@ abstract class ChickenRepository { Map? queryParameters, }); + Future createSegmentation({required String token, required SegmentationModel model}); + Future editSegmentation({required String token, required SegmentationModel model}); Future deleteSegmentation({required String token, required String key}); diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 3e1a80a..42d6c75 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -450,6 +450,15 @@ class ChickenRepositoryImpl implements ChickenRepository { return res.data; } + @override + Future createSegmentation({required String token, required SegmentationModel model}) async { + await _httpClient.post( + '/app-segmentation/', + data: model.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + @override Future editSegmentation({required String token, required SegmentationModel model}) async { await _httpClient.put( diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 4d020da..57bfeeb 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:flutter/material.dart' show Colors; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; @@ -13,6 +12,7 @@ import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; import 'package:rasadyar_chicken/presentation/pages/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/profile/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/view.dart'; +import 'package:rasadyar_chicken/presentation/pages/segmentation/view.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; @@ -21,13 +21,7 @@ enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { RxInt currentPage = 2.obs; - List pages = [ - BuyPage(), - SalePage(), - HomePage(), - Container(color: Colors.blue), - ProfilePage(), - ]; + List pages = [BuyPage(), SalePage(), HomePage(), SegmentationPage(), ProfilePage()]; final defaultRoutes = {0: ChickenRoutes.buy, 1: ChickenRoutes.sale}; diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart new file mode 100644 index 0000000..257e699 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -0,0 +1,192 @@ +import 'package:flutter/cupertino.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; +import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; +import 'package:rasadyar_core/core.dart'; + +class SegmentationLogic extends GetxController { + RootLogic rootLogic = Get.find(); + + RxBool isLoadingMoreAllocationsMade = false.obs; + RxInt currentPage = 1.obs; + + late List routesName; + RxInt selectedSegmentIndex = 0.obs; + RxBool isExpanded = false.obs; + + RxList isExpandedList = [].obs; + Rx fromDateFilter = Jalali.now().obs; + Rx toDateFilter = Jalali.now().obs; + RxnString searchedValue = RxnString(); + + GlobalKey formKey = GlobalKey(); + TextEditingController weightController = TextEditingController(); + RxBool isSaleSubmitButtonEnabled = false.obs; + + RxList rolesProductsModel = RxList(); + Rxn selectedProduct = Rxn(); + Rxn selectedSegment = Rxn(); + + Rx>> segmentationList = + Resource>.loading().obs; + + @override + void onInit() { + super.onInit(); + routesName = ['قطعه‌بندی'].toList(); + getAllSegmentation(); + } + + @override + void onReady() { + super.onReady(); + setUpListener(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } + + void setSearchValue(String? value) { + searchedValue.value = value?.trim(); + } + + void setUpListener() { + debounce( + searchedValue, + (callback) => getAllSegmentation(), + time: Duration(milliseconds: timeDebounce), + ); + } + + void setEditData(SegmentationModel item) { + selectedSegment.value = item; + weightController.text = item.weight.toString(); + } + + void clearForm() { + weightController.clear(); + isSaleSubmitButtonEnabled.value = false; + selectedProduct.value = null; + selectedSegment.value = null; + formKey.currentState?.reset(); + } + + Future getAllSegmentation([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + segmentationList.value = Resource>.loading(); + } + + if (searchedValue.value != null && + searchedValue.value!.trim().isNotEmpty && + currentPage.value > 1) { + currentPage.value = 1; // Reset to first page if search value is set + } + + await safeCall( + call: () async => await rootLogic.chickenRepository.getSegmentation( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 20, + page: currentPage.value, + search: 'filter', + role: 'Steward', + value: searchedValue.value, + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), + + onSuccess: (result) { + if ((result?.count ?? 0) == 0) { + segmentationList.value = Resource>.empty(); + } else { + segmentationList.value = Resource>.success( + PaginationModel( + count: result?.count ?? 0, + next: result?.next, + previous: result?.previous, + results: [ + ...(segmentationList.value.data?.results ?? []), + ...(result?.results ?? []), + ], + ), + ); + + isLoadingMoreAllocationsMade.value = false; + } + }, + ); + } + + Future deleteSegmentation(String key) async { + await safeCall( + call: () => rootLogic.chickenRepository.deleteSegmentation( + token: rootLogic.tokenService.accessToken.value!, + key: key, + ), + ); + } + + Future getRolesProducts() async { + safeCall( + call: () async => await rootLogic.chickenRepository.getRolesProducts( + token: rootLogic.tokenService.accessToken.value!, + ), + onSuccess: (result) { + if (result != null) { + rolesProductsModel.value = result; + + selectedProduct.value = rolesProductsModel.first; + } + }, + onError: (error, stacktrace) {}, + ); + } + + Future editSegment() async { + var res = true; + safeCall( + call: () async => await rootLogic.chickenRepository.editSegmentation( + token: rootLogic.tokenService.accessToken.value!, + model: SegmentationModel( + key: selectedSegment.value?.key, + weight: int.tryParse(weightController.text) ?? 0, + ), + ), + onSuccess: (result) { + res = true; + }, + onError: (error, stacktrace) { + res = false; + }, + ); + return res; + } + + Future createSegment() async { + var res = true; + safeCall( + call: () async => await rootLogic.chickenRepository.createSegmentation( + token: rootLogic.tokenService.accessToken.value!, + model: SegmentationModel( + key: selectedProduct.value?.key, + weight: int.tryParse(weightController.text) ?? 0, + ), + ), + onSuccess: (result) { + res = true; + }, + onError: (error, stacktrace) { + res = false; + }, + ); + return res; + } +} diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart new file mode 100644 index 0000000..2cf5101 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -0,0 +1,331 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class SegmentationPage extends GetView { + @override + Widget build(BuildContext context) { + return BasePage( + routes: controller.routesName, + onSearchChanged: (data) => controller.setSearchValue(data), + filteringWidget: filterBottomSheet(), + isBase: true, + widgets: [ + Expanded( + child: ObxValue((data) { + return RPaginatedListView( + onLoadMore: () async => controller.getAllSegmentation(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getAllSegmentation(); + }, + hasMore: data.value.data?.next != null, + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item, index), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.timerSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.segmentationList), + ), + ], + + floatingActionButton: RFab.add( + onPressed: () { + //TODO + //Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); + }, + ), + ); + } + + Widget filterBottomSheet() => filterBottomSheetWidget( + fromDate: controller.fromDateFilter, + onChangedFromDate: (jalali) => controller.fromDateFilter.value = jalali, + toDate: controller.toDateFilter, + onChangedToDate: (jalali) => controller.toDateFilter.value = jalali, + onSubmit: () => controller.getAllSegmentation(), + ); + + itemListWidget(SegmentationModel item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + Expanded( + flex: 3, + child: Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + SizedBox(width: 4), + Expanded( + flex: 5, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + item.buyer?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2), + Text( + item.buyer?.shop ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + SizedBox(width: 4), + Expanded( + flex: 4, + child: Text( + item.date?.formattedJalaliDate, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + Expanded( + flex: 2, + child: Text( + '${item.weight} KG', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + ], + ); + } + + itemListExpandedWidget(SegmentationModel item, int index) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + DateTimeExtensions(item.date)?.toJalali().formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${DateTimeExtensions(item.date)?.toJalali().formatter.d} ${DateTimeExtensions(item.date)?.toJalali().formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${DateTimeExtensions(item.date)?.toJalali().formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${DateTimeExtensions(item.date)?.toJalali().formatter.tHH}:${DateTimeExtensions(item.date)?.toJalali().formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + buildRow(title: 'مشخصات خریدار', value: item.buyer?.fullname ?? 'N/A'), + buildRow(title: 'تلفن خریدار', value: item.buyer?.mobile ?? 'N/A'), + buildRow(title: 'نام واحد', value: item.buyer?.shop ?? 'N/A'), + buildRow(title: 'وزن قطعه‌بندی', value: '${item.weight?.separatedByComma}'), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.clearForm(); + }); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + controller.isExpandedList.remove(index); + controller.deleteSegmentation(item.key!); + }, + onRefresh: () => controller.getAllSegmentation(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ], + ), + ); + } + + Widget addOrEditBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + height: 500.h, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش قطعه‌بندی' : 'افزودن قطعه‌بندی', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + _productDropDown(), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 12, + children: [ + RTextField( + controller: controller.weightController, + label: 'وزن', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + + validator: (value) { + if (value == null) { + return 'لطفاً وزن لاشه را وارد کنید'; + } + return null; + }, + ), + submitButtonWidget(isOnEdit), + ], + ), + ), + SizedBox(), + ], + ), + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + text: isOnEdit ? 'ویرایش' : 'ثبت', + onPressed: data.value + ? () async { + var res = isOnEdit + ? await controller.editSegment() + : await controller.createSegment(); + if (res) { + controller.getAllSegmentation(); + controller.clearForm(); + Get.back(); + } + } + : null, + height: 40, + ); + }, controller.isSaleSubmitButtonEnabled); + } + + Widget _productDropDown() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rolesProductsModel, + height: 56, + hasDropIcon: false, + background: Colors.white, + onChanged: (value) { + controller.selectedProduct.value = value; + }, + selectedItem: controller.selectedProduct.value, + initialValue: controller.selectedProduct.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Row( + spacing: 8, + children: [ + (item?.name?.contains('مرغ گرم') ?? false) + ? Assets.images.chicken.image(width: 40, height: 40) + : Assets.vec.placeHolderSvg.svg(width: 40, height: 40), + + Text(item?.name ?? 'انتخاب محصول'), + Spacer(), + Text( + 'موجودی:${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0}', + ), + ], + ), + ); + }); + } +} diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index ed401e7..b207d91 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -20,6 +20,7 @@ import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic. import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/segmentation/logic.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/search/logic.dart'; @@ -40,6 +41,7 @@ sealed class ChickenPages { Get.lazyPut(() => BuyLogic()); Get.lazyPut(() => SaleLogic()); Get.lazyPut(() => ProfileLogic()); + Get.lazyPut(() => SegmentationLogic()); }), ), @@ -53,7 +55,6 @@ sealed class ChickenPages { }), ), - //sales GetPage( name: ChickenRoutes.sale, @@ -61,9 +62,9 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => SaleLogic()); - Get.lazyPut(() => BaseLogic()); - Get.lazyPut(() => SalesOutOfProvinceLogic()); - Get.lazyPut(() => RootLogic()); + Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => RootLogic()); }), ), GetPage( @@ -83,7 +84,7 @@ sealed class ChickenPages { middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); - Get.lazyPut(() => SalesInProvinceLogic()); + Get.lazyPut(() => SalesInProvinceLogic()); Get.lazyPut(() => SearchLogic()); }), ), @@ -98,7 +99,6 @@ sealed class ChickenPages { Get.lazyPut(() => BuyLogic()); }), ), - GetPage( name: ChickenRoutes.buysOutOfProvince, page: () => BuyOutOfProvincePage(), @@ -106,10 +106,9 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); - Get.lazyPut(() => BuyOutOfProvinceLogic()); + Get.lazyPut(() => BuyOutOfProvinceLogic()); }), ), - GetPage( name: ChickenRoutes.buysInProvince, page: () => BuyInProvincePage(), @@ -117,9 +116,9 @@ sealed class ChickenPages { binding: BindingsBuilder(() { Get.lazyPut(() => BaseLogic()); Get.lazyPut(() => SearchLogic()); - Get.lazyPut(() => BuyInProvinceLogic()); - Get.lazyPut(() => BuyInProvinceWaitingLogic()); - Get.lazyPut(() => BuyInProvinceAllLogic()); + Get.lazyPut(() => BuyInProvinceLogic()); + Get.lazyPut(() => BuyInProvinceWaitingLogic()); + Get.lazyPut(() => BuyInProvinceAllLogic()); }), ), ]; diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index ce08250..ba16f5d 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -6,6 +6,7 @@ sealed class ChickenRoutes { static const home = '$_base/home'; static const buy = '$_base/buy'; static const sale = '$_base/sale'; + static const segmentation = '$_base/segmentation'; //buys static const buysOutOfProvince = '$buy/buyOutOfProvince'; @@ -14,4 +15,6 @@ sealed class ChickenRoutes { //sales static const salesInProvince = '$sale/SalesInProvince'; static const salesOutOfProvince = '$sale/saleOutOfProvince'; + + } diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index ce8d522..6d9a392 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -48,9 +48,9 @@ export 'package:image_picker/image_picker.dart'; //utils export 'utils/logger_utils.dart'; export 'utils/network/network.dart'; -export 'utils/date_time_utils.dart'; -export 'utils/num_utils.dart'; +export 'utils/extension/date_time_utils.dart'; +export 'utils/extension/num_utils.dart'; export 'utils/map_utils.dart'; export 'utils/route_utils.dart'; -export 'utils/string_utils.dart'; +export 'utils/extension/string_utils.dart'; export 'utils/separator_input_formatter.dart'; diff --git a/packages/core/lib/utils/extension/date_time_utils.dart b/packages/core/lib/utils/extension/date_time_utils.dart new file mode 100644 index 0000000..caa653a --- /dev/null +++ b/packages/core/lib/utils/extension/date_time_utils.dart @@ -0,0 +1,13 @@ +import 'package:intl/intl.dart'; +import 'package:persian_datetime_picker/persian_datetime_picker.dart'; + +extension XDateTime2 on DateTime { + get formattedJalaliDate { + final jalaliDate = Jalali.fromDateTime(this); + return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; + } + + get formattedYHMS { + return DateFormat('yyyy-MM-dd HH:mm:ss').format(this); + } +} diff --git a/packages/core/lib/utils/num_utils.dart b/packages/core/lib/utils/extension/num_utils.dart similarity index 100% rename from packages/core/lib/utils/num_utils.dart rename to packages/core/lib/utils/extension/num_utils.dart diff --git a/packages/core/lib/utils/date_time_utils.dart b/packages/core/lib/utils/extension/string_utils.dart similarity index 74% rename from packages/core/lib/utils/date_time_utils.dart rename to packages/core/lib/utils/extension/string_utils.dart index 0c045ff..47252a1 100644 --- a/packages/core/lib/utils/date_time_utils.dart +++ b/packages/core/lib/utils/extension/string_utils.dart @@ -1,7 +1,18 @@ import 'package:intl/intl.dart'; import 'package:persian_datetime_picker/persian_datetime_picker.dart'; -extension XDateTime on String { +extension XString on String { + String get separatedByComma { + final formatter = NumberFormat('#,###'); + final number = num.tryParse(this); + return number != null ? formatter.format(number) : this; + } + + String get clearComma { + return replaceAll(RegExp(r'\D'), ''); + } + + get toDateTime => DateTime.parse(this); String get formattedJalaliDate { @@ -26,15 +37,4 @@ extension XDateTime on String { final dateTime = DateTime.parse(this); return Jalali.fromDateTime(dateTime); } -} - -extension XDateTime2 on DateTime { - get formattedJalaliDate { - final jalaliDate = Jalali.fromDateTime(this); - return "${jalaliDate.year}/${jalaliDate.month.toString().padLeft(2, '0')}/${jalaliDate.day.toString().padLeft(2, '0')}"; - } - - get formattedYHMS { - return DateFormat('yyyy-MM-dd HH:mm:ss').format(this); - } -} +} \ No newline at end of file diff --git a/packages/core/lib/utils/string_utils.dart b/packages/core/lib/utils/string_utils.dart deleted file mode 100644 index 148434e..0000000 --- a/packages/core/lib/utils/string_utils.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:intl/intl.dart'; - -extension XString on String { - String get separatedByComma { - final formatter = NumberFormat('#,###'); - final number = num.tryParse(this); - return number != null ? formatter.format(number) : this; - } - - String get clearComma { - return replaceAll(RegExp(r'\D'), ''); - } -} diff --git a/packages/core/lib/utils/utils.dart b/packages/core/lib/utils/utils.dart new file mode 100644 index 0000000..8701a53 --- /dev/null +++ b/packages/core/lib/utils/utils.dart @@ -0,0 +1,14 @@ +export 'mixins/pagination_controller_mixin.dart'; + +export 'network/network.dart'; + +export 'extension/date_time_utils.dart'; +export 'extension/num_utils.dart'; +export 'extension/string_utils.dart'; + +export 'apk_updater.dart'; +export 'logger_utils.dart'; +export 'map_utils.dart'; +export 'route_utils.dart'; +export 'separator_input_formatter.dart'; + From b5d96b98439104e936660b658a02173e7bd104d1 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Jul 2025 09:18:48 +0330 Subject: [PATCH 197/256] feat : change icon bottom navigation --- assets/icons/buy.svg | 22 +++++----------------- assets/icons/sale.svg | 22 +++------------------- assets/vec/buy.svg.vec | Bin 2059 -> 767 bytes assets/vec/sale.svg.vec | Bin 2170 -> 1059 bytes 4 files changed, 8 insertions(+), 36 deletions(-) diff --git a/assets/icons/buy.svg b/assets/icons/buy.svg index de8f2fe..ce540e4 100644 --- a/assets/icons/buy.svg +++ b/assets/icons/buy.svg @@ -1,18 +1,6 @@ - - - - - - - - - + + + diff --git a/assets/icons/sale.svg b/assets/icons/sale.svg index 2b7d939..9b2775c 100644 --- a/assets/icons/sale.svg +++ b/assets/icons/sale.svg @@ -1,20 +1,4 @@ - - - - - - - - - - - + + + diff --git a/assets/vec/buy.svg.vec b/assets/vec/buy.svg.vec index 7a54d0841f4ac25219315f9c17e1576a83b9c9be..9b7f886f4d394097477aca2f822887461d56580f 100644 GIT binary patch literal 767 zcmXw%O=uHA6vt;bBr1Yf@dK##{p)vIlRXI0^Aq(SQd(8lj8Yidc%f z@sL|}JrvYKNg@g2_fQm&=6vuz+srCNz*j&ZtyKppamf;>n~J;y^zldMYOCG^SQrAO<+u1*nNf> ztdD}$yHv1#8^U0_y5Nq3h*D};Pk<0f<@(6TWUe@?lHwKT6SE-RNbOKOE9tv}c#Qg8 zj2}wMcc66#^)Wd6v@C=8CPcQ4`UsQiQ%rsux+lqJL-(0Gmv^v#vvnRGJSj`dx(M^1 z^YVCfg;`2pW4-5(!mCraBr(&hNz$i|_)_Z={CyaFWs2xE>qYw|)Q4-5m}yoe>6E|c z&v9PQ=`yqF-e%qZeH;{q*iVf$u;X+ksQcV@(@dPE72!F3>{lI5Mke!e_)St=ZY^NF zX?Qm9PU^}GTwmTm{TKdg3T{-As-X|^K0LB6F>88`S+sv{@(=FMHkD2H!E=AZk07an zr5SkPrj+MSV~zx#kUDJDujzTL{{gZCHDn)3mJ4As1|yt;ye(8QH^~f}_n9T@9mR|ZR5v+>z83MlNjyKRcvfbiXm^k;)Z6&n h#yoBG(?NF7M;Cns=(h`2?mcYz%?wc&<9Ntm`~#g1HGu#C literal 2059 zcmZ8i2~?C-6n_5r{zEApKtDc_kHi)@4xr|Gs1G2 zGKR5JV9clnIryb0TE?=8F~)C)Bapk8R^k8tzpCk5b!fHytBm#S%{IGmpMjHT_{}r} z`Hww52;Tmu7B{uRyGA4%`Y_`K&oknu6yn;_!j zOeJu}YnZ2G*Zgy7V}yr=xK^Y7okrMy{2J@sTCgDJ01mHcMO5Hk+$nCwM%xYyX>7&H zrVnv-{ADz-sS=aon8Xbq717}Htr#^jl|=lr^ZA7xAJVv0v0D_(Z*eADPt<=N;N#4RO9ek&i%;U-((^pr~ zjj_X2-#teuufd=mKX;Ohi-XkM6)iL?J6P?tw9}Q^V72~LPb8#-s9kO2u*?yn3e5$2 z`_7YCd@>iO`Fh=(>mcH%g=|Cu-(Qx$8Sb2KfzKAq<@}2_m*5OPZ$@&M1IeYu7b$-!nxfD-rkD&rDaerweo&gjTa|4pS8f7URr72$+VML7xjwx{<;m! zh51M!G>W1Tx56*cYFdkMFU*WW$cl74wO2(%d^%b#0S5}x5LX5?rlw-&ETGw#f+N2I z`s2w+uT|lG--_~j6*sO~@$B14IJGAl6@fEw#WxxcH_zZbIT>|XR^H!}(PT)*(94ri za3C3Bq0z{kWJAiqXk3W4;f-U_xU|`Zc07xxCZ`}~sRc7fq(DuJf&EA_Zf%c6*zROl zt71{wG7ZOuC*qd>6#U+8L+=?Y&nE>(S1(6#c^bZbyxifKQ5wH<^DlN3%auW%nt%$kv*tAvSe*MVm#U-dsZb%|HXBQP^$gRzNd09 zaCj)~S^7RMmK*6O{c_a%j-vtI%i%ut35i7>L`8GoM^%3vm8Ao>3gOy94Q>@U$~il%=K*_R%0{9aC-b97vva%$?;;ou|XR#HWT7ABCx;GgwxMOAas`r6XKkBd`twQcAD_$)o^%iHep~zIG;NcYF`e=wRtAA z>B7;HV1hPM5AEw-VB__8@RAo?yS&g-?1{)&9qd~?5ITDh8i%?=;pn>8MdJOADiZdZ z(UmmE(*yR73hJ-hz}(nisSg)L4xo@n(LODDXx}PcTLl$ZbMblO7Zh?g7nP&R=~_k} z+$UC0{nb3Yl(my~kI%=6eU)^TV^49FL{{L!-}U(je3E~U?&M-(m=6BkE8!C81>NnH zP>f#q`Bujn8W{)!EW{PdCxSZ>FQ$+(iBLO$ZhO xI2^%>6Eyr=$t?~4U~mSJQA&Ho5iykbHTyM!9;y#$> zLz}w>8Lfw|4~a`%t_;IMa;cg|heZ(Kfnf9HFC=lsrZ!3LE{ z2NVaCe}7d{Qg^#qZ7BwqBoVZ@@GIs0wugAP!4I`#S_*EqU?W1 zOlCKURq_sg%wNKhn1}RL&Jjn#88DVgdBi^f>8wNSPr^z;5_$@%>KKm%ra|`q0x3TY z!^ThW)nyj-a_%W&YB{thy%tRsy|>jsh?BH3gZ6o zcIx+=x0L#iS(cdBG>mz^D4IG2uUnUeo`l2t6J;bkLG#4>*mIpD;=HPv#P;Ff#dF}= zdK3o}N^EX@jsY|>rm4I6(5{e}zmvbHbpvBN`AYnjBFiPb{A8PA8q0vp>CcE}Hf_`B zCu-3iqLe>G91pxv&_5p?RPdY+a*uLj)eQ}oI+XSH5L`5mDvO~$I5T!m*_^ow2lLmJ zpl297=0l~)NI_0rSGue*m`~OKQpz78nnouyF5MRIc>x*=aWIWO(q?v$;t~I7(Kl}E zz+;HFro>zqV6itL?)4Iao)pOPM~chx8qrrLajat+WqdJ|0xem=gU$r>MJsuexT7q) z`01I;@OMs(-G`^O$HjU2KMt)1i@F=M=p7hZ?G<{IsHs{}$A!OJ?8k*hKWaRupQx!< ziaG}C?QLQ|CUgsNqq$Mk$9R3wkHmbN@0(qu3%pGDG??i6tzdm5_G4=uFphoOe(WFf l@jmsU?*~Oa3s{e_S)sB1EcIi@v0wZCO>X@6Se9EN`~kI0iOv83 literal 2170 zcmai#2~1Q+7{_P#aif5MBCNQ$um#E?MpJD)-u$1S)ZzuG;Dt9fRPn4tZCs=+haAcg zj}o;aNZQ&;ZLC+7c-0yYR4A>YC@7Euir~SaZf9m8wTVq%cHeKlZ{|B^@@7Fm3Q_qI zQU*eXDFck`kq9vw-T6qRVq*g(gisaJ@mV6N-!d!p=m_byFvw=z7DmbZEwdI(r%@4N z#+(ziO0r=noaBzq<~=ww#~QoVmEeraAM}HQYiN%qOZxrx-gP5#`HUSy=3*7tk7>%B^@NxL|9m;LW>_vBt7Pw#aT4 z>m3Ul!R;sZtpoQLy}cIP|D%nyh)my2FO97QkKfr`1D+2j&yO>Eb}`C=Yr*s9>v=ug zp4Z3y@p`#`tSkkOcj9O%czjNt4=2xWrg`Ol%CD7IXwZfL zCFP51x^{D*@;bDYwww=Ct}U^HGHo?q=F+&d2tWklR)kQa;b?fbO1;T=%^WIsJoV-)2utOC2XS)_7s+tr_ye`Fad5ikBUt^oR^klGC($ zB;;qx)*3xxe6!^5YTOVrE`mBbyCHw*T`=H4sn2uCAV(9&`bXK7=UO9QtrcPJX#{D2KUSW-p z@z3S{vyRYxK6B}a*d*HSdY8)S`E=5CJ!G<*PI>8rL((o9RqO|Kc^>T;;*V+jx6z;z z{^)ga3;iYB59=e+sF#lq^A$;TZs+JXekbYbeRt%ZK4^$#cfWX-On))xK2a?PCPGR` zp&8q!qB=E+x{sJH=;bq0=$i)5#H-{K`d8m{Sb0=XFP99QZKrHN#%`Q=hbhG_Q@0n$#QN%`J3pgDno#HBw`}EqETB z?sZkP_;_zb##d5qXJe?KCO;LF`{niY)U6>_#8I3lew5fTVy8-sq%mB}9y_?2c_L_$ zJ(dsCA^Efez8#~3bgvJpDs{M}31y+O+e&A1Jox!gmakzJ5Pk--he~|caBHLkVHI4GBHhSV%5@d*y@pp_J|PJ zG#FS+C-}~eWj%3V`?O5R4pFge?1bvcvFNJo!?*;=vK?H0UdVc5i&Vr2TDC+BN(tUb zVf{PuxgHa5_d@7>Pj&;E>eUcyV$aKG9TCSyKpMeSP1mzo9XdS7&4F={4z=TR;S#Dt z`^{Wt?};fJ^RVNNCmP%GuqsV27!>9$=vEpnm{%Ty<8ir&y0i#Z{@G~L#=_PsoAogk z_ib0P@2dgthpfbPT_U22SBRbjg_)RoBVNcCE#q<3HIe1AjKwxUzVHcBSWheJ<8V&d zBxtjg_dE{Tr+g3MFtR!rU$-yEZx3bGtJPx9UL~& Date: Mon, 14 Jul 2025 09:19:07 +0330 Subject: [PATCH 198/256] fix : fab add size --- .../lib/presentation/widget/buttons/fab.dart | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/packages/core/lib/presentation/widget/buttons/fab.dart b/packages/core/lib/presentation/widget/buttons/fab.dart index 3a33df7..a9dda88 100644 --- a/packages/core/lib/presentation/widget/buttons/fab.dart +++ b/packages/core/lib/presentation/widget/buttons/fab.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/utils/color_utils.dart'; @@ -30,7 +31,7 @@ class RFab extends StatefulWidget { RFab.add({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.addSvg.svg(width: 40, height: 40), + icon: Assets.vec.addSvg.svg(width: 56.w, height: 56.h), backgroundColor: AppColor.greenNormal, key: key, ); @@ -201,14 +202,11 @@ class _RFabState extends State { side: WidgetStateProperty.all(BorderSide.none), backgroundColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.pressed)) { - return widget.backgroundColor?.pressedColor ?? - AppColor.blueNormalActive; + return widget.backgroundColor?.pressedColor ?? AppColor.blueNormalActive; } else if (states.contains(WidgetState.hovered)) { - return widget.backgroundColor?.hoverColor ?? - AppColor.blueNormalHover; + return widget.backgroundColor?.hoverColor ?? AppColor.blueNormalHover; } else if (states.contains(WidgetState.disabled)) { - return widget.backgroundColor?.disabledColor ?? - AppColor.blueNormal.disabledColor; + return widget.backgroundColor?.disabledColor ?? AppColor.blueNormal.disabledColor; } return widget.backgroundColor ?? AppColor.blueNormal; }), @@ -222,24 +220,19 @@ class _RFabState extends State { shape: WidgetStatePropertyAll( CircleBorder(side: BorderSide(width: 1, color: Colors.transparent)), ), - fixedSize: WidgetStatePropertyAll( - Size(widget.radius ?? 56, widget.radius ?? 56), - ), + fixedSize: WidgetStatePropertyAll(Size(widget.radius ?? 56, widget.radius ?? 56)), padding: WidgetStatePropertyAll(EdgeInsets.zero), ), - child: - widget.isLoading - ? SizedBox( - height: widget.radius / 2, - width: widget.radius / 2, - child: CircularProgressIndicator( - strokeWidth: 2.5, - valueColor: AlwaysStoppedAnimation( - widget.foregroundColor ?? Colors.white, - ), - ), - ) - : widget.icon, + child: widget.isLoading + ? SizedBox( + height: widget.radius / 2, + width: widget.radius / 2, + child: CircularProgressIndicator( + strokeWidth: 2.5, + valueColor: AlwaysStoppedAnimation(widget.foregroundColor ?? Colors.white), + ), + ) + : widget.icon, ); } } From 6567f5561b1f878ef54922fec919291ef05b1c2f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Jul 2025 09:19:43 +0330 Subject: [PATCH 199/256] fix : change clipboardTask icon size --- .../lib/presentation/pages/buy_in_province_waiting/view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index e29bbba..45a66ee 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -50,7 +50,7 @@ class BuyInProvinceWaitingPage extends GetView { return AnimatedFab( onPressed: () {}, message: 'تایید یکجا', - icon: Assets.vec.clipboardTaskSvg.svg(), + icon: Assets.vec.clipboardTaskSvg.svg(width: 45.w, height: 42.h), backgroundColor: controller.bgConfirmAllColor.value, ); } else { From 963630602e68a8f3e0288772ac81cc319de628c2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Jul 2025 09:27:13 +0330 Subject: [PATCH 200/256] fix : page route widget and other page --- packages/chicken/lib/presentation/pages/buy/logic.dart | 3 +-- packages/chicken/lib/presentation/pages/root/logic.dart | 1 - packages/chicken/lib/presentation/pages/sale/logic.dart | 7 +------ packages/chicken/lib/presentation/widget/page_route.dart | 5 ++++- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy/logic.dart b/packages/chicken/lib/presentation/pages/buy/logic.dart index 1fb717b..57b8aab 100644 --- a/packages/chicken/lib/presentation/pages/buy/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy/logic.dart @@ -4,12 +4,11 @@ import 'package:rasadyar_core/core.dart'; class BuyLogic extends GetxController { RootLogic rootLogic = Get.find(); - late List routesName; + List routesName = ['خرید']; @override void onInit() { super.onInit(); - routesName = [...rootLogic.routesName, 'خرید'].toList(); } @override diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 57bfeeb..457ef1a 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -25,7 +25,6 @@ class RootLogic extends GetxController { final defaultRoutes = {0: ChickenRoutes.buy, 1: ChickenRoutes.sale}; - List routesName = ['رصدطیور']; late DioRemote dioRemote; var tokenService = Get.find(); diff --git a/packages/chicken/lib/presentation/pages/sale/logic.dart b/packages/chicken/lib/presentation/pages/sale/logic.dart index 234d362..b180d1b 100644 --- a/packages/chicken/lib/presentation/pages/sale/logic.dart +++ b/packages/chicken/lib/presentation/pages/sale/logic.dart @@ -17,13 +17,8 @@ class SaleLogic extends GetxController { RootLogic rootLogic = Get.find(); - late List routesName; + List routesName = ['فروش']; - @override - void onInit() { - super.onInit(); - routesName = [...rootLogic.routesName, 'فروش'].toList(); - } @override void onReady() { diff --git a/packages/chicken/lib/presentation/widget/page_route.dart b/packages/chicken/lib/presentation/widget/page_route.dart index badde4e..956d564 100644 --- a/packages/chicken/lib/presentation/widget/page_route.dart +++ b/packages/chicken/lib/presentation/widget/page_route.dart @@ -4,6 +4,9 @@ import 'package:rasadyar_core/core.dart'; Widget buildPageRoute(List route) { return Padding( padding: const EdgeInsets.fromLTRB(0, 4, 7, 4), - child: Text(route.isEmpty ? 'خانه' : route.join("/"), style: AppFonts.yekan14.copyWith(color: AppColor.bgDark)), + child: Text( + route.isEmpty ? 'خانه' : route.join(" > "), + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), ); } From 2feb2d9ee4aa2cea44c70d3c6608aa54f94c3025 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Jul 2025 11:29:35 +0330 Subject: [PATCH 201/256] feat : unit_text_field.dart and baller inputs --- .../presentation/widget/inputs/inputs.dart | 3 + .../widget/inputs/unit_text_field.dart | 116 ++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 packages/core/lib/presentation/widget/inputs/inputs.dart create mode 100644 packages/core/lib/presentation/widget/inputs/unit_text_field.dart diff --git a/packages/core/lib/presentation/widget/inputs/inputs.dart b/packages/core/lib/presentation/widget/inputs/inputs.dart new file mode 100644 index 0000000..bf7f7ce --- /dev/null +++ b/packages/core/lib/presentation/widget/inputs/inputs.dart @@ -0,0 +1,3 @@ +export 'unit_text_field.dart'; +export 'r_input.dart'; +export 'input_fixed_hint.dart'; diff --git a/packages/core/lib/presentation/widget/inputs/unit_text_field.dart b/packages/core/lib/presentation/widget/inputs/unit_text_field.dart new file mode 100644 index 0000000..4065fef --- /dev/null +++ b/packages/core/lib/presentation/widget/inputs/unit_text_field.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:rasadyar_core/presentation/common/app_color.dart'; +import 'package:rasadyar_core/presentation/common/app_fonts.dart'; + +class UnitTextField extends StatefulWidget { + const UnitTextField({ + super.key, + required this.hint, + required this.unit, + required this.onChanged, + this.initialValue, + this.controller, + this.keyboardType, + this.textInputAction, + this.enabled, + this.readOnly, + this.maxLines, + this.minLines, + this.textStyle, + this.textColor, + this.inputFormatters, + }); + + final String hint; + final String unit; + final TextStyle? textStyle; + final Color? textColor; + final ValueChanged? onChanged; + final String? initialValue; + final TextEditingController? controller; + final TextInputType? keyboardType; + final TextInputAction? textInputAction; + final List? inputFormatters; + final bool? enabled; + final bool? readOnly; + final int? maxLines; + final int? minLines; + + @override + State createState() => _UnitTextFieldState(); +} + +class _UnitTextFieldState extends State { + TextEditingController? tmpController; + + @override + void initState() { + super.initState(); + if (widget.controller == null) { + tmpController = TextEditingController(text: widget.initialValue); + if (widget.initialValue != null) { + tmpController?.text = widget.initialValue!; + } + } else { + tmpController = widget.controller; + } + } + + @override + Widget build(BuildContext context) { + return Container( + height: 40, + width: MediaQuery.of(context).size.width, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + color: AppColor.bgLight, + border: Border.all(color: AppColor.darkGreyLight), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + widget.hint, + style: + widget.textStyle?.copyWith(color: widget.textColor) ?? + AppFonts.yekan14.copyWith(color: widget.textColor ?? AppColor.textColorLight), + ), + + const SizedBox(width: 8), + + Expanded( + child: TextField( + controller: tmpController, + keyboardType: TextInputType.number, + textInputAction: widget.textInputAction, + onChanged: widget.onChanged, + enabled: widget.enabled, + readOnly: widget.readOnly ?? false, + maxLines: 1, + textAlign: TextAlign.center, + textDirection: TextDirection.ltr, + inputFormatters: widget.inputFormatters, + style: AppFonts.yekan18.copyWith(color: AppColor.darkGreyNormalActive), + decoration: const InputDecoration( + isDense: true, + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric(vertical: 8), + ), + ), + ), + + const SizedBox(width: 8), + + Text( + widget.unit, + style: + widget.textStyle?.copyWith(color: widget.textColor) ?? + AppFonts.yekan14.copyWith(color: widget.textColor ?? AppColor.textColorLight), + ), + ], + ), + ); + } +} From d2de07e5de2529969601f066b0323426ab91eddf Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Jul 2025 12:23:59 +0330 Subject: [PATCH 202/256] feat : unit_text_field --- .../lib/presentation/widget/inputs/unit_text_field.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/presentation/widget/inputs/unit_text_field.dart b/packages/core/lib/presentation/widget/inputs/unit_text_field.dart index 4065fef..e1bc585 100644 --- a/packages/core/lib/presentation/widget/inputs/unit_text_field.dart +++ b/packages/core/lib/presentation/widget/inputs/unit_text_field.dart @@ -8,7 +8,7 @@ class UnitTextField extends StatefulWidget { super.key, required this.hint, required this.unit, - required this.onChanged, + this.onChanged, this.initialValue, this.controller, this.keyboardType, @@ -20,6 +20,7 @@ class UnitTextField extends StatefulWidget { this.textStyle, this.textColor, this.inputFormatters, + this.validator }); final String hint; @@ -32,6 +33,7 @@ class UnitTextField extends StatefulWidget { final TextInputType? keyboardType; final TextInputAction? textInputAction; final List? inputFormatters; + final FormFieldValidator? validator; final bool? enabled; final bool? readOnly; final int? maxLines; @@ -81,7 +83,7 @@ class _UnitTextFieldState extends State { const SizedBox(width: 8), Expanded( - child: TextField( + child: TextFormField( controller: tmpController, keyboardType: TextInputType.number, textInputAction: widget.textInputAction, @@ -92,6 +94,7 @@ class _UnitTextFieldState extends State { textAlign: TextAlign.center, textDirection: TextDirection.ltr, inputFormatters: widget.inputFormatters, + validator: widget.validator, style: AppFonts.yekan18.copyWith(color: AppColor.darkGreyNormalActive), decoration: const InputDecoration( isDense: true, From ac75fc38c2fdc73194989cb708ea4c4fd829398a Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Jul 2025 12:33:42 +0330 Subject: [PATCH 203/256] feat : Exporting inputs --- packages/core/lib/presentation/widget/widget.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 8a1cbf7..43077b5 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -12,8 +12,6 @@ export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; export 'empty_widget.dart'; -export 'inputs/input_fixed_hint.dart'; -export 'inputs/r_input.dart'; export 'list_view/list_view.dart'; export 'loading_widget.dart'; export 'overlay_dropdown_widget/view.dart'; @@ -23,3 +21,5 @@ export 'tabs/new_tab.dart'; export 'tabs/r_segment.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; +//inputs +export 'inputs/inputs.dart'; From f79a3ae46f82b7b8209325c18f59899de9a4853f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 14 Jul 2025 12:35:12 +0330 Subject: [PATCH 204/256] fix : change product list in root --- .../pages/buy_out_of_province/logic.dart | 4 +- .../pages/buy_out_of_province/view.dart | 2 +- .../lib/presentation/pages/root/logic.dart | 19 ++++++++- .../lib/presentation/pages/sale/logic.dart | 16 +------- .../logic.dart | 4 +- .../view.dart | 2 +- .../pages/segmentation/logic.dart | 41 +++++++++---------- .../lib/presentation/routes/pages.dart | 3 +- 8 files changed, 47 insertions(+), 44 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index 3a71c4e..17d7907 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -59,7 +59,7 @@ class BuyOutOfProvinceLogic extends GetxController { getStewardPurchaseOutOfProvince(); selectedProvince.listen((p0) => getCites()); - selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.first; + selectedProduct.value = rootLogic.rolesProductsModel.first; setupListeners(); debounce( @@ -220,7 +220,7 @@ class BuyOutOfProvinceLogic extends GetxController { carcassWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? ''; selectedProvince.value = IranProvinceCityModel(name: item.province); selectedCity.value = IranProvinceCityModel(name: item.city); - selectedProduct.value = outOfTheProvinceLogic.rolesProductsModel.firstWhere( + selectedProduct.value = rootLogic.rolesProductsModel.firstWhere( (element) => element.key == item.product!.key, ); isSubmitButtonEnabled.value = true; diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index ca39b0a..d7a2881 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -407,7 +407,7 @@ class BuyOutOfProvincePage extends GetView { Widget _productDropDown() { return Obx(() { return OverlayDropdownWidget( - items: controller.outOfTheProvinceLogic.rolesProductsModel, + items: controller.rootLogic.rolesProductsModel, height: 56, hasDropIcon: false, background: Colors.white, diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 457ef1a..733b962 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -6,6 +6,7 @@ import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; import 'package:rasadyar_chicken/presentation/pages/buy/view.dart'; @@ -24,7 +25,7 @@ class RootLogic extends GetxController { List pages = [BuyPage(), SalePage(), HomePage(), SegmentationPage(), ProfilePage()]; final defaultRoutes = {0: ChickenRoutes.buy, 1: ChickenRoutes.sale}; - + RxList rolesProductsModel = RxList(); late DioRemote dioRemote; var tokenService = Get.find(); @@ -58,6 +59,9 @@ class RootLogic extends GetxController { if (inventoryModel.value == null) { getInventory(); } + if (rolesProductsModel.isEmpty) { + getRolesProducts(); + } } @override @@ -129,4 +133,17 @@ class RootLogic extends GetxController { provinces.clear(); } } + + Future getRolesProducts() async { + safeCall( + call: () async => + await chickenRepository.getRolesProducts(token: tokenService.accessToken.value!), + onSuccess: (result) { + if (result != null) { + rolesProductsModel.value = result; + } + }, + onError: (error, stacktrace) {}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/sale/logic.dart b/packages/chicken/lib/presentation/pages/sale/logic.dart index b180d1b..5f3ff7e 100644 --- a/packages/chicken/lib/presentation/pages/sale/logic.dart +++ b/packages/chicken/lib/presentation/pages/sale/logic.dart @@ -9,7 +9,6 @@ import 'package:rasadyar_core/core.dart'; class SaleLogic extends GetxController { Rxn?> allocatedMadeModel = Rxn?>(); - RxList rolesProductsModel = RxList(); RxList guildsModel = [].obs; @@ -24,7 +23,7 @@ class SaleLogic extends GetxController { void onReady() { super.onReady(); getStewardDashBord(); - getRolesProducts(); + } Future getAllocatedMade() async { @@ -83,19 +82,6 @@ class SaleLogic extends GetxController { ); } - Future getRolesProducts() async { - safeCall( - call: () async => await rootLogic.chickenRepository.getRolesProducts( - token: rootLogic.tokenService.accessToken.value!, - ), - onSuccess: (result) { - if (result != null) { - rolesProductsModel.value = result; - } - }, - onError: (error, stacktrace) {}, - ); - } Future getGuilds() async {} diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart index ea1223b..944f546 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/logic.dart @@ -56,7 +56,7 @@ class SalesOutOfProvinceSalesListLogic extends GetxController { void onReady() { super.onReady(); - selectedProduct.value = saleLogic.rolesProductsModel.first; + selectedProduct.value = rootLogic.rolesProductsModel.first; debounce( searchedValue, (callback) => getOutProvinceSales(), @@ -140,7 +140,7 @@ class SalesOutOfProvinceSalesListLogic extends GetxController { selectedBuyer.value = buyerLogic.buyerList.value.data?.results?.firstWhere( (element) => element.key == item.buyer?.key, ); - selectedProduct.value = saleLogic.rolesProductsModel.first; + selectedProduct.value = rootLogic.rolesProductsModel.first; key = item.key; isSaleSubmitButtonEnabled.value = true; } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index 28d4058..20f5f46 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -343,7 +343,7 @@ class SalesOutOfProvinceSalesListPage extends GetView( - items: controller.saleLogic.rolesProductsModel, + items: controller.rootLogic.rolesProductsModel, height: 56, hasDropIcon: false, background: Colors.white, diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 257e699..250bfae 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -22,10 +22,9 @@ class SegmentationLogic extends GetxController { RxnString searchedValue = RxnString(); GlobalKey formKey = GlobalKey(); - TextEditingController weightController = TextEditingController(); - RxBool isSaleSubmitButtonEnabled = false.obs; + TextEditingController weightController = TextEditingController(text: '0'); + RxBool isSubmitButtonEnabled = false.obs; - RxList rolesProductsModel = RxList(); Rxn selectedProduct = Rxn(); Rxn selectedSegment = Rxn(); @@ -36,6 +35,7 @@ class SegmentationLogic extends GetxController { void onInit() { super.onInit(); routesName = ['قطعه‌بندی'].toList(); + once(rootLogic.rolesProductsModel, (callback) => selectedProduct.value = callback.first); getAllSegmentation(); } @@ -61,6 +61,11 @@ class SegmentationLogic extends GetxController { (callback) => getAllSegmentation(), time: Duration(milliseconds: timeDebounce), ); + ever(selectedSegment, (_) { + validateForm(); + }); + + weightController.addListener(() => validateForm()); } void setEditData(SegmentationModel item) { @@ -69,13 +74,23 @@ class SegmentationLogic extends GetxController { } void clearForm() { - weightController.clear(); - isSaleSubmitButtonEnabled.value = false; + weightController.text = '0'; + isSubmitButtonEnabled.value = false; selectedProduct.value = null; selectedSegment.value = null; formKey.currentState?.reset(); } + void validateForm() { + isSubmitButtonEnabled = RxBool( + selectedProduct.value != null && + selectedSegment.value != null && + weightController.text.isNotEmpty && + int.tryParse(weightController.text) != null && + int.tryParse(weightController.text)! > 0, + ); + } + Future getAllSegmentation([bool isLoadingMore = false]) async { if (isLoadingMore) { isLoadingMoreAllocationsMade.value = true; @@ -134,22 +149,6 @@ class SegmentationLogic extends GetxController { ); } - Future getRolesProducts() async { - safeCall( - call: () async => await rootLogic.chickenRepository.getRolesProducts( - token: rootLogic.tokenService.accessToken.value!, - ), - onSuccess: (result) { - if (result != null) { - rolesProductsModel.value = result; - - selectedProduct.value = rolesProductsModel.first; - } - }, - onError: (error, stacktrace) {}, - ); - } - Future editSegment() async { var res = true; safeCall( diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index b207d91..abab154 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -35,13 +35,14 @@ sealed class ChickenPages { page: () => RootPage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { - Get.lazyPut(() => RootLogic()); Get.lazyPut(() => BaseLogic()); + Get.lazyPut(() => RootLogic()); Get.lazyPut(() => HomeLogic()); Get.lazyPut(() => BuyLogic()); Get.lazyPut(() => SaleLogic()); Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => SegmentationLogic()); + Get.lazyPut(() => SearchLogic()); }), ), From b1496b1ed09f42b6493dda9f29b1fb3f8910ef6c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Jul 2025 09:03:11 +0330 Subject: [PATCH 205/256] feat : segment page --- assets/icons/killogram.svg | 3 -- assets/vec/killogram.svg.vec | Bin 4824 -> 0 bytes .../segmentation_model.dart | 2 +- .../segmentation_model.freezed.dart | 31 ++++++++++-------- .../segmentation_model.g.dart | 2 ++ .../data/repositories/chicken_repository.dart | 2 +- .../repositories/chicken_repository_imp.dart | 7 ++-- .../pages/buy_out_of_province/view.dart | 17 +++------- .../pages/segmentation/logic.dart | 7 ++-- .../presentation/pages/segmentation/view.dart | 28 +++++++--------- .../widget/list_item/list_item.dart | 5 ++- .../lib/infrastructure/remote/dio_remote.dart | 8 ++++- .../lib/presentation/common/app_color.dart | 1 + .../lib/presentation/common/assets.gen.dart | 8 ----- .../lib/utils/network/safe_call_utils.dart | 5 +++ 15 files changed, 63 insertions(+), 63 deletions(-) delete mode 100644 assets/icons/killogram.svg delete mode 100644 assets/vec/killogram.svg.vec diff --git a/assets/icons/killogram.svg b/assets/icons/killogram.svg deleted file mode 100644 index 695689c..0000000 --- a/assets/icons/killogram.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/vec/killogram.svg.vec b/assets/vec/killogram.svg.vec deleted file mode 100644 index 72a627f740fa945adc116a4501af25242cb98abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4824 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 diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart index 6efce7b..86122c3 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -6,7 +6,7 @@ part 'segmentation_model.g.dart'; @freezed abstract class SegmentationModel with _$SegmentationModel { - const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, int? weight}) = + const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, int? weight,String? result}) = _SegmentationModel; factory SegmentationModel.fromJson(Map json) => diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index 74e1a86..2f106c3 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$SegmentationModel { - String? get key; Buyer? get buyer; DateTime? get date; int? get weight; + String? get key; Buyer? get buyer; DateTime? get date; int? get weight; String? get result; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $SegmentationModelCopyWith get copyWith => _$SegmentationMode @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,buyer,date,weight); +int get hashCode => Object.hash(runtimeType,key,buyer,date,weight,result); @override String toString() { - return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight)'; + return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight, result: $result)'; } @@ -49,7 +49,7 @@ abstract mixin class $SegmentationModelCopyWith<$Res> { factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, int? weight + String? key, Buyer? buyer, DateTime? date, int? weight, String? result }); @@ -66,13 +66,14 @@ class _$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as int?, +as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable +as String?, )); } /// Create a copy of SegmentationModel @@ -95,13 +96,14 @@ $BuyerCopyWith<$Res>? get buyer { @JsonSerializable() class _SegmentationModel implements SegmentationModel { - const _SegmentationModel({this.key, this.buyer, this.date, this.weight}); + const _SegmentationModel({this.key, this.buyer, this.date, this.weight, this.result}); factory _SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); @override final String? key; @override final Buyer? buyer; @override final DateTime? date; @override final int? weight; +@override final String? result; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @@ -116,16 +118,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,buyer,date,weight); +int get hashCode => Object.hash(runtimeType,key,buyer,date,weight,result); @override String toString() { - return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight)'; + return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight, result: $result)'; } @@ -136,7 +138,7 @@ abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationM factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; @override @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, int? weight + String? key, Buyer? buyer, DateTime? date, int? weight, String? result }); @@ -153,13 +155,14 @@ class __$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { return _then(_SegmentationModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as int?, +as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable +as String?, )); } diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart index 82835b2..d10cb35 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -16,6 +16,7 @@ _SegmentationModel _$SegmentationModelFromJson(Map json) => ? null : DateTime.parse(json['date'] as String), weight: (json['weight'] as num?)?.toInt(), + result: json['result'] as String?, ); Map _$SegmentationModelToJson(_SegmentationModel instance) => @@ -24,6 +25,7 @@ Map _$SegmentationModelToJson(_SegmentationModel instance) => 'buyer': instance.buyer, 'date': instance.date?.toIso8601String(), 'weight': instance.weight, + 'result': instance.result, }; _Buyer _$BuyerFromJson(Map json) => _Buyer( diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 35697da..fe9d23d 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -152,5 +152,5 @@ abstract class ChickenRepository { Future editSegmentation({required String token, required SegmentationModel model}); - Future deleteSegmentation({required String token, required String key}); + Future deleteSegmentation({required String token, required String key}); } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 42d6c75..a0c19c9 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -469,11 +469,14 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future deleteSegmentation({required String token, required String key}) async { - await _httpClient.delete( + Future deleteSegmentation({required String token, required String key}) async { + var res = await _httpClient.delete( '/app-segmentation/0/', queryParameters: {'key': key}, headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => SegmentationModel.fromJson(json), ); + + return res.data; } } diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index d7a2881..41f7b84 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -31,7 +31,7 @@ class BuyOutOfProvincePage extends GetView { return RPaginatedListView( listType: ListType.separated, resource: data.value, - hasMore:data.value.data?.next!=null , + hasMore: data.value.data?.next != null, padding: EdgeInsets.fromLTRB(8, 8, 8, 80), itemBuilder: (context, index) { var item = data.value.data!.results![index]; @@ -356,17 +356,10 @@ class BuyOutOfProvincePage extends GetView { }, ), - RTextField( + UnitTextField( controller: controller.carcassWeightController, - label: 'وزن', - filled: true, - suffixIcon: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Assets.vec.killogramSvg.svg(), - ), - filledColor: AppColor.bgLight, - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, + hint: 'وزن', + unit: 'کیلوگرم', inputFormatters: [ FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter(), @@ -589,10 +582,8 @@ class BuyOutOfProvincePage extends GetView { }, height: 40, ), - ], ), ); } - } diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 250bfae..5d11df4 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -1,4 +1,5 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; @@ -75,10 +76,8 @@ class SegmentationLogic extends GetxController { void clearForm() { weightController.text = '0'; - isSubmitButtonEnabled.value = false; - selectedProduct.value = null; selectedSegment.value = null; - formKey.currentState?.reset(); + } void validateForm() { @@ -142,6 +141,7 @@ class SegmentationLogic extends GetxController { Future deleteSegmentation(String key) async { await safeCall( + showError: true, call: () => rootLogic.chickenRepository.deleteSegmentation( token: rootLogic.tokenService.accessToken.value!, key: key, @@ -152,6 +152,7 @@ class SegmentationLogic extends GetxController { Future editSegment() async { var res = true; safeCall( + showError: true, call: () async => await rootLogic.chickenRepository.editSegmentation( token: rootLogic.tokenService.accessToken.value!, model: SegmentationModel( diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index 2cf5101..c0cf686 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -17,7 +17,7 @@ class SegmentationPage extends GetView { routes: controller.routesName, onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), - isBase: true, + hasBack: false, widgets: [ Expanded( child: ObxValue((data) { @@ -41,7 +41,8 @@ class SegmentationPage extends GetView { child: itemListWidget(item), secondChild: itemListExpandedWidget(item, index), labelColor: AppColor.blueLight, - labelIcon: Assets.vec.timerSvg.path, + labelIconColor: AppColor.customGrey, + labelIcon: Assets.vec.convertCubeSvg.path, ); }, controller.isExpandedList); }, @@ -51,11 +52,10 @@ class SegmentationPage extends GetView { }, controller.segmentationList), ), ], - + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, floatingActionButton: RFab.add( onPressed: () { - //TODO - //Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); + Get.bottomSheet(addOrEditBottomSheet(), isScrollControlled: true); }, ), ); @@ -221,7 +221,7 @@ class SegmentationPage extends GetView { Widget addOrEditBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( - height: 500.h, + height: 300.h, child: SingleChildScrollView( child: Form( key: controller.formKey, @@ -244,18 +244,14 @@ class SegmentationPage extends GetView { child: Column( spacing: 12, children: [ - RTextField( + UnitTextField( + hint: 'وزن', + unit: 'کیلوگرم', controller: controller.weightController, - label: 'وزن', - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, inputFormatters: [ FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter(), ], - validator: (value) { if (value == null) { return 'لطفاً وزن لاشه را وارد کنید'; @@ -295,13 +291,13 @@ class SegmentationPage extends GetView { : null, height: 40, ); - }, controller.isSaleSubmitButtonEnabled); + }, controller.isSubmitButtonEnabled); } Widget _productDropDown() { return Obx(() { return OverlayDropdownWidget( - items: controller.rolesProductsModel, + items: controller.rootLogic.rolesProductsModel, height: 56, hasDropIcon: false, background: Colors.white, @@ -321,7 +317,7 @@ class SegmentationPage extends GetView { Text(item?.name ?? 'انتخاب محصول'), Spacer(), Text( - 'موجودی:${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0}', + 'موجودی: ${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0} کیلوگرم', ), ], ), diff --git a/packages/chicken/lib/presentation/widget/list_item/list_item.dart b/packages/chicken/lib/presentation/widget/list_item/list_item.dart index 9b54657..fd65df6 100644 --- a/packages/chicken/lib/presentation/widget/list_item/list_item.dart +++ b/packages/chicken/lib/presentation/widget/list_item/list_item.dart @@ -193,7 +193,10 @@ class ListItem2 extends StatelessWidget { width: 16.w, height: 16.h, //TODO - colorFilter: ColorFilter.mode(labelIconColor ?? AppColor.mediumGreyDarkActive, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + labelIconColor ?? AppColor.mediumGreyDarkActive, + BlendMode.srcIn, + ), ), ), ), diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 96ba77a..c5160ab 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -6,7 +6,6 @@ class DioRemote implements IHttpClient { late Dio dio; final AppInterceptor interceptors; - DioRemote({this.baseUrl, required this.interceptors}); @override @@ -90,6 +89,7 @@ class DioRemote implements IHttpClient { Map? headers, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, + T Function(Map json)? fromJson, }) async { final response = await dio.put( path, @@ -100,6 +100,11 @@ class DioRemote implements IHttpClient { onReceiveProgress: onReceiveProgress, cancelToken: ApiHandler.globalCancelToken, ); + + if (fromJson != null && response.data is Map) { + response.data = fromJson(response.data); + return DioResponse(response); + } return DioResponse(response); } @@ -109,6 +114,7 @@ class DioRemote implements IHttpClient { dynamic data, Map? queryParameters, Map? headers, + T Function(Map json)? fromJson, }) async { final response = await dio.delete( path, diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index c309e7e..0b589f9 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -149,6 +149,7 @@ class AppColor { static const Color mediumGreyDarker = Color( 0xFF323232, ); // #323232 rgb(50, 50, 50) + static const Color customGrey = Color(0xFF808081); // #808081 rgb(128, 128, 129) //endregion //region ---Light Grey Colors --- diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 07d012e..59e9001 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -143,9 +143,6 @@ class $AssetsIconsGen { /// File path: assets/icons/key.svg SvgGenImage get key => const SvgGenImage('assets/icons/key.svg'); - /// File path: assets/icons/killogram.svg - SvgGenImage get killogram => const SvgGenImage('assets/icons/killogram.svg'); - /// File path: assets/icons/liveStock.svg SvgGenImage get liveStock => const SvgGenImage('assets/icons/liveStock.svg'); @@ -285,7 +282,6 @@ class $AssetsIconsGen { inside, inspection, key, - killogram, liveStock, lock, logout, @@ -468,9 +464,6 @@ class $AssetsVecGen { /// File path: assets/vec/key.svg.vec SvgGenImage get keySvg => const SvgGenImage.vec('assets/vec/key.svg.vec'); - /// File path: assets/vec/killogram.svg.vec - SvgGenImage get killogramSvg => const SvgGenImage.vec('assets/vec/killogram.svg.vec'); - /// File path: assets/vec/liveStock.svg.vec SvgGenImage get liveStockSvg => const SvgGenImage.vec('assets/vec/liveStock.svg.vec'); @@ -610,7 +603,6 @@ class $AssetsVecGen { insideSvg, inspectionSvg, keySvg, - killogramSvg, liveStockSvg, lockSvg, logoutSvg, diff --git a/packages/core/lib/utils/network/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart index 19e354a..c0005a3 100644 --- a/packages/core/lib/utils/network/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -110,6 +110,11 @@ bool _isRetryableError(dynamic error) { String _getErrorMessage(dynamic error) { if (error is DioException) { + final responseData = error.response?.data; + if (responseData is Map && responseData['result'] != null) { + return responseData['result'].toString(); + } + switch (error.type) { case DioExceptionType.connectionTimeout: return 'خطا در اتصال - زمان اتصال تمام شد'; From 655f67823a4adea51b11929e51b94aa1fa52d1c5 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Jul 2025 09:03:46 +0330 Subject: [PATCH 206/256] chore : change vec generator --- tools/vecGeneratoe.sh | 91 +++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 30 deletions(-) diff --git a/tools/vecGeneratoe.sh b/tools/vecGeneratoe.sh index 4c6cf89..178436a 100644 --- a/tools/vecGeneratoe.sh +++ b/tools/vecGeneratoe.sh @@ -1,45 +1,76 @@ -#!/bin/bash +##!/bin/bash +# +# +## Relative path to the package +#PACKAGE_PATH="../packages/core" +# +## Get absolute path to the package +#SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +#PACKAGE_ABS_PATH="$SCRIPT_DIR/$PACKAGE_PATH" +# +#echo "🗃️ package path: $PACKAGE_ABS_PATH" +# +## Directory to read files from +#sourcePath="../assets/icons" +#targetPath="../assets/vec" +#echo "🗃️ sourcePath path: $sourcePath" +#echo "🗃️ targetPath path: $targetPath" +# +# +#if [ ! -e "$targetPath" ]; then +# echo "📁 Directory does not exist. Creating: $targetPath" +# mkdir -p "$targetPath" +#fi +# +# +## Loop and delete old vec file +#for file in "$targetPath"/* +#do +# if [ -f "$file" ]; then +# +# echo "Delete old ===> $file" +# rm "$file" +# fi +#done +## Loop through all files in the directory +#for file in "$sourcePath"/* +#do +# if [ -f "$file" ]; then +# echo "Generate Vec file ===> $file" +# fileName=$(basename -- "$file") +# echo "Generate Vec file ===> $fileName" +# dart run vector_graphics_compiler -i "$file" -o "$targetPath/$fileName.vec" +# git add . +# fi +#done -# Relative path to the package PACKAGE_PATH="../packages/core" - -# Get absolute path to the package SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PACKAGE_ABS_PATH="$SCRIPT_DIR/$PACKAGE_PATH" echo "🗃️ package path: $PACKAGE_ABS_PATH" -# Directory to read files from sourcePath="../assets/icons" targetPath="../assets/vec" -echo "🗃️ sourcePath path: $sourcePath" -echo "🗃️ targetPath path: $targetPath" +echo "🗃️ sourcePath: $sourcePath" +echo "🗃️ targetPath: $targetPath" +mkdir -p "$targetPath" -if [ ! -e "$targetPath" ]; then - echo "📁 Directory does not exist. Creating: $targetPath" - mkdir -p "$targetPath" -fi +# Delete old .vec files +echo "🧹 Deleting old .vec files..." +find "$targetPath" -type f -name "*.vec" -exec rm {} \; +# Generate .vec files in parallel +echo "⚙️ Generating .vec files in parallel..." -# Loop and delete old vec file -for file in "$targetPath"/* -do - if [ -f "$file" ]; then +find "$sourcePath" -type f | xargs -P 10 -I {} bash -c ' + input="{}" + filename=$(basename "$input") + output="'$targetPath'/$filename.vec" + echo "➡️ Generating: $filename" + dart run vector_graphics_compiler -i "$input" -o "$output" +' - echo "Delete old ===> $file" - rm "$file" - fi -done -# Loop through all files in the directory -for file in "$sourcePath"/* -do - if [ -f "$file" ]; then - echo "Generate Vec file ===> $file" - fileName=$(basename -- "$file") - echo "Generate Vec file ===> $fileName" - dart run vector_graphics_compiler -i "$file" -o "$targetPath/$fileName.vec" - git add . - fi -done \ No newline at end of file +git add . From 75738a154a59be25d57e57ad39febffdc4a85a1e Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Jul 2025 09:21:51 +0330 Subject: [PATCH 207/256] feat : logout ui and logic --- assets/icons/logout.svg | 5 +- assets/vec/logout.svg.vec | Bin 738 -> 511 bytes .../lib/presentation/pages/profile/view.dart | 62 ++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/assets/icons/logout.svg b/assets/icons/logout.svg index c5a263d..5fdbcf7 100644 --- a/assets/icons/logout.svg +++ b/assets/icons/logout.svg @@ -1,5 +1,4 @@ - - - + + diff --git a/assets/vec/logout.svg.vec b/assets/vec/logout.svg.vec index 8ea1d5f7bf3ab532127872f6cbbd61d459f8e2ea..a8a9e2b21d594693c1f7622c3d2d4085719d4957 100644 GIT binary patch literal 511 zcmXw$u}i~16vp4BWN?xex0a$~heDyDxS4l!lR^;#4i-_t2s(5S{S(YAw3r|`sA#h~ zs$;=o69oxQw*ChW?mh3lq&dQm_uY5z-pB1#JrEUuWl4WY?Nn6`K&hetSOonEgO@N2 zA&i_wlIy(SLff$cewZ!ClvF>41^KX%*nwY=!`T`V_tlg++cagXY07o&8GlcaNPUQY zc)95&E+K4Qk@I*#F`_M4E&2*jq(0d1nS^ bqx3$1i0Ql`XSHC?ex~=aR;CwJsw^1)OMbX` literal 738 zcmX|qmxRWN%YEC_<2_ThG(XU=oE{LcS5&-0xBJ?FNq9}=2J z2$!U{%2dNDglRf8A?!j8%|eeF3lnRL3MWse(a~d(Niv|j!1o2w?T?>=SO=hkDB z?0e=HF`(ja(HswA+rAI*cZKj|qD&6UORAq;md?|uX`-xn?iNkctPV9F`~F22;vO<) z3dFkZ31-I3;%N6R70)VtgE=xZGQS?5&yQo{EY-(x>g#jeYmTDS&nYZo3GG$9VohDM z)vM(8MO8@MokqiN2eT%>0;#8OP?KM(IE7vHKHa}PkyYW7$1yP=vs#x$$dze}(%{sZ%>5XS%j diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart index 0ef195a..6d2c993 100644 --- a/packages/chicken/lib/presentation/pages/profile/view.dart +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; +import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; @@ -79,6 +81,15 @@ class ProfilePage extends GetView { }, icon: Assets.vec.lockSvg.path, ), + + cardActionWidget( + title: 'خروج', + selected: true, + onPressed: () { + Get.bottomSheet(exitBottomSheet(), isScrollControlled: true); + }, + icon: Assets.vec.logoutSvg.path, + ), /*cardActionWidget( title: 'اطلاعات بانکی', onPressed: () { @@ -499,4 +510,55 @@ class ProfilePage extends GetView { ), ); } + + Widget exitBottomSheet() { + return BaseBottomSheet( + height: 220.h, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 8, + children: [ + Text('خروج', style: AppFonts.yekan16Bold.copyWith(color: AppColor.error)), + SizedBox(), + Text( + 'آیا مطمئن هستید که می‌خواهید از حساب کاربری خود خارج شوید؟', + textAlign: TextAlign.center, + style: AppFonts.yekan16Bold.copyWith(color: AppColor.textColor), + ), + + SizedBox(), + + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + RElevated( + height: 40.h, + text: 'خروج', + backgroundColor: AppColor.error, + onPressed: () async { + await controller.rootLogic.tokenService.deleteTokens().then((value) { + Get.back(); + Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); + }); + }, + ), + ROutlinedElevated( + height: 40.h, + text: 'انصراف', + borderColor: AppColor.blueNormal, + onPressed: () { + Get.back(); + }, + ), + ], + ), + ], + ), + ), + ), + ); + } } From 3bc87340d4a3a9f968435e58f9bde7a0eaf625a2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Jul 2025 09:34:05 +0330 Subject: [PATCH 208/256] fix : state our/buyer conformation in list item --- .../pages/sales_in_province/view.dart | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index d5607e9..9559997 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -55,6 +55,7 @@ class SalesInProvincePage extends GetView { secondChild: itemListExpandedWidget(item, index), labelColor: AppColor.blueLight, labelIcon: Assets.vec.timerSvg.path, + labelIconColor: item.registrationCode == null ? AppColor.darkGreyDark : AppColor.error, ); }, controller.isExpandedList); }, @@ -193,12 +194,21 @@ class SalesInProvincePage extends GetView { ), Spacer(), Text( - 'در انتظار', + item.registrationCode == null ? 'در انتظار' : 'در انتظار تایید خریدار', textAlign: TextAlign.center, - style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), + style: AppFonts.yekan10.copyWith( + color: item.registrationCode == null ? AppColor.darkGreyDark : AppColor.error, + ), ), SizedBox(width: 7), - Assets.vec.clockSvg.svg(width: 16.w, height: 16.h), + Assets.vec.clockSvg.svg( + width: 16.w, + height: 16.h, + colorFilter: ColorFilter.mode( + item.registrationCode == null ? AppColor.darkGreyDark : AppColor.error, + BlendMode.srcIn, + ), + ), ], ), Container( From 699d18977ca0510bb51d367dcd1b48dc13b2be04 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Jul 2025 09:38:08 +0330 Subject: [PATCH 209/256] fix : edit or delete in list item expanded when in state waiting for buyer conformation --- .../pages/sales_in_province/view.dart | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 9559997..aa23d76 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -280,43 +280,46 @@ class SalesInProvincePage extends GetView { value: item.systemRegistrationCode == true ? "ارسال شده" : "ارسال نشده", ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 16.w, - children: [ - RElevated( - text: 'ویرایش', - width: 150.w, - height: 40.h, - onPressed: () { - controller.setEditData(item); - Get.bottomSheet( - addOrEditBottomSheet(true), - isScrollControlled: true, - backgroundColor: Colors.transparent, - ); - }, - textStyle: AppFonts.yekan20.copyWith(color: Colors.white), - backgroundColor: AppColor.greenNormal, - ), - ROutlinedElevated( - text: 'حذف', - textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), - width: 150.w, - height: 40.h, - onPressed: () { - buildDeleteDialog( - onConfirm: () async { - controller.isExpandedList.remove(index); - // controller.denyAllocation(item.key ?? ''); - //await controller.deleteAllocation(item); - }, - onRefresh: () => controller.getAllocatedMade(), - ); - }, - borderColor: AppColor.redNormal, - ), - ], + Visibility( + visible: item.registrationCode == null, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditData(item); + Get.bottomSheet( + addOrEditBottomSheet(true), + isScrollControlled: true, + backgroundColor: Colors.transparent, + ); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + controller.isExpandedList.remove(index); + // controller.denyAllocation(item.key ?? ''); + //await controller.deleteAllocation(item); + }, + onRefresh: () => controller.getAllocatedMade(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), ), ], ), From f1b2e20056ed526e683c3a7f7b6c3cae08f34643 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 15 Jul 2025 10:31:37 +0330 Subject: [PATCH 210/256] feat : alert for all conformation fab button --- .../pages/buy_in_province_waiting/view.dart | 4 ++- .../pages/sales_in_province/view.dart | 35 +++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 45a66ee..7310b28 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -48,7 +48,9 @@ class BuyInProvinceWaitingPage extends GetView { floatingActionButton: ObxValue((data) { if ((data.value.data?.results?.length ?? 0) > 1) { return AnimatedFab( - onPressed: () {}, + onPressed: () { + //TODO FAB + }, message: 'تایید یکجا', icon: Assets.vec.clipboardTaskSvg.svg(width: 45.w, height: 42.h), backgroundColor: controller.bgConfirmAllColor.value, diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index aa23d76..35e3106 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -55,7 +55,9 @@ class SalesInProvincePage extends GetView { secondChild: itemListExpandedWidget(item, index), labelColor: AppColor.blueLight, labelIcon: Assets.vec.timerSvg.path, - labelIconColor: item.registrationCode == null ? AppColor.darkGreyDark : AppColor.error, + labelIconColor: item.registrationCode == null + ? AppColor.darkGreyDark + : AppColor.error, ); }, controller.isExpandedList); }, @@ -86,7 +88,36 @@ class SalesInProvincePage extends GetView { visible: (data.value.data?.results?.length ?? 0) > 1, child: AnimatedFab( onPressed: () async { - await controller.confirmAllAllocations(); + Get.defaultDialog( + title: 'تایید یکجا', + middleText: 'آیا از تایید تمامی تخصیص ها اطمینان دارید؟', + confirm: ElevatedButton( + onPressed: () async { + await controller.confirmAllAllocations(); + controller.getAllocatedMade(); + controller.rootLogic.getInventory(); + Get.back(); + }, + child: Text('تایید'), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.blueNormal, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ), + cancel: OutlinedButton( + style: OutlinedButton.styleFrom( + foregroundColor: AppColor.error, + enableFeedback: true, + side: BorderSide(color: AppColor.error, width: 1), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + onPressed: () { + Get.back(); + }, + child: Text('لغو'), + ), + ); }, message: 'تایید یکجا', icon: Assets.vec.clipboardTaskSvg.svg(width: 40.w, height: 40.h), From 6d5f918fbbe3bd2a1c78b339a2738c1275778403 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Jul 2025 11:47:51 +0330 Subject: [PATCH 211/256] feat : buy in province all --- assets/icons/clock.svg | 6 +- .../local/user_local/user_local_model.dart | 7 +- .../data/datasource/local/chicken_local.dart | 8 + .../datasource/local/chicken_local_imp.dart | 59 +++ .../datasource/remote/chicken_remote.dart | 155 ++++++ .../datasource/remote/chicken_remote_imp.dart | 484 ++++++++++++++++++ packages/chicken/lib/data/di/chicken_di.dart | 18 +- .../models/local/widely_used_local_model.dart | 73 +++ .../data/repositories/chicken_repository.dart | 10 + .../repositories/chicken_repository_imp.dart | 319 ++++-------- .../pages/buy_in_province/logic.dart | 2 +- .../pages/buy_in_province_all/logic.dart | 125 ++++- .../pages/buy_in_province_all/view.dart | 249 ++++++++- .../pages/buy_in_province_waiting/logic.dart | 6 + .../lib/presentation/pages/home/logic.dart | 1 - .../lib/presentation/pages/home/view.dart | 140 +---- .../lib/presentation/pages/root/logic.dart | 14 +- .../local/hive_local_storage.dart | 35 +- .../infrastructure/local/i_local_storage.dart | 2 + .../core/lib/utils/local/local_utils.dart | 7 + packages/core/lib/utils/utils.dart | 3 + 21 files changed, 1304 insertions(+), 419 deletions(-) create mode 100644 packages/chicken/lib/data/datasource/local/chicken_local.dart create mode 100644 packages/chicken/lib/data/datasource/local/chicken_local_imp.dart create mode 100644 packages/chicken/lib/data/datasource/remote/chicken_remote.dart create mode 100644 packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart create mode 100644 packages/chicken/lib/data/models/local/widely_used_local_model.dart create mode 100644 packages/core/lib/utils/local/local_utils.dart diff --git a/assets/icons/clock.svg b/assets/icons/clock.svg index fd5588b..11bff2c 100644 --- a/assets/icons/clock.svg +++ b/assets/icons/clock.svg @@ -1,4 +1,6 @@ - - + + diff --git a/packages/auth/lib/data/models/local/user_local/user_local_model.dart b/packages/auth/lib/data/models/local/user_local/user_local_model.dart index 0e18269..beb08f2 100644 --- a/packages/auth/lib/data/models/local/user_local/user_local_model.dart +++ b/packages/auth/lib/data/models/local/user_local/user_local_model.dart @@ -1,9 +1,9 @@ -import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/utils/local/local_utils.dart'; part 'user_local_model.g.dart'; -@HiveType(typeId: 0) +@HiveType(typeId: authUserLocalModelTypeId) class UserLocalModel extends HiveObject { @HiveField(0) String? username; @@ -45,7 +45,6 @@ class UserLocalModel extends HiveObject { Module? module, String? backend, String? apiKey, - }) { return UserLocalModel( username: username ?? this.username, @@ -60,7 +59,7 @@ class UserLocalModel extends HiveObject { } } -@HiveType(typeId: 1) +@HiveType(typeId: authModuleTypeId) enum Module { @HiveField(0) liveStocks, diff --git a/packages/chicken/lib/data/datasource/local/chicken_local.dart b/packages/chicken/lib/data/datasource/local/chicken_local.dart new file mode 100644 index 0000000..e02478a --- /dev/null +++ b/packages/chicken/lib/data/datasource/local/chicken_local.dart @@ -0,0 +1,8 @@ +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; + +abstract class ChickenLocalDataSource { + Future openBox(); + Future initWidleyUsed(); + + WidelyUsedLocalModel? getAllWidely(); +} diff --git a/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart b/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart new file mode 100644 index 0000000..2ccd6ed --- /dev/null +++ b/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart @@ -0,0 +1,59 @@ +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_chicken/data/datasource/local/chicken_local.dart'; +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; +import 'package:rasadyar_core/core.dart'; + +class ChickenLocalDataSourceImp implements ChickenLocalDataSource { + HiveLocalStorage local =diCore.get(); + final String boxName = 'Chicken_Widley_Box'; + + + @override + Future openBox() async { + await local.openBox(boxName); + } + + @override + Future initWidleyUsed() async { + List tmpList = [ + WidelyUsedLocalItem( + index: 0, + pathId: 0, + title: 'خرید داخل استان', + color: AppColor.greenLightActive.toARGB32(), + iconColor: AppColor.greenNormal.toARGB32(), + iconPath: Assets.vec.cubeSearchSvg.path, + path: ChickenRoutes.buysInProvince, + ), + WidelyUsedLocalItem( + index: 1, + pathId: 1, + title: 'فروش داخل استان', + color: AppColor.blueLightActive.toARGB32(), + iconColor: AppColor.blueNormal.toARGB32(), + iconPath: Assets.vec.cubeSvg.path, + path: ChickenRoutes.salesInProvince, + ), + + WidelyUsedLocalItem( + index: 2, + title: 'قطعه‌بندی', + color: AppColor.blueLightActive.toARGB32(), + iconColor: AppColor.blueNormal.toARGB32(), + iconPath: Assets.vec.cubeRotateSvg.path, + path: ChickenRoutes.buysInProvince, + ), + ]; + await local.add( + boxName: boxName, + value: WidelyUsedLocalModel(hasInit: true, items: tmpList), + ); + } + + @override + WidelyUsedLocalModel? getAllWidely() { + var res = local.readBox(boxName: boxName); + fLog(res.toString()); + return res; + } +} diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote.dart b/packages/chicken/lib/data/datasource/remote/chicken_remote.dart new file mode 100644 index 0000000..e6f04b8 --- /dev/null +++ b/packages/chicken/lib/data/datasource/remote/chicken_remote.dart @@ -0,0 +1,155 @@ +import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; +import 'package:rasadyar_core/core.dart'; + +abstract class ChickenRemoteDatasource { + Future?> getInventory({required String token, CancelToken? cancelToken}); + + Future getKillHouseDistributionInfo({required String token}); + + Future getGeneralBarInformation({ + required String token, + Map? queryParameters, + }); + + Future?> getWaitingArrivals({ + required String token, + Map? queryParameters, + }); + + Future setSateForArrivals({required String token, required Map request}); + + Future?> getImportedLoadsModel({ + required String token, + Map? queryParameters, + }); + + Future?> getAllocatedMade({ + required String token, + Map? queryParameters, + }); + + Future confirmAllocation({required String token, required Map allocation}); + + Future denyAllocation({required String token, required String allocationToken}); + + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }); + + Future?> getRolesProducts({required String token}); + + Future?> getGuilds({ + required String token, + Map? queryParameters, + }); + + Future getProfile({required String token}); + + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }); + + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }); + + Future updateStewardAllocation({required String token, required ConformAllocation request}); + + Future getStewardDashboard({ + required String token, + required String stratDate, + required String endDate, + }); + + Future getDashboardKillHouseFreeBar({ + required String token, + required String stratDate, + required String endDate, + }); + + Future?> getStewardPurchasesOutSideOfTheProvince({ + required String token, + Map? queryParameters, + }); + + Future createStewardPurchasesOutSideOfTheProvince({ + required String token, + required CreateStewardFreeBar body, + }); + + Future deleteStewardPurchasesOutSideOfTheProvince({ + required String token, + required String stewardFreeBarKey, + }); + + Future?> getOutProvinceCarcassesBuyer({ + required String token, + Map? queryParameters, + }); + + Future createOutProvinceCarcassesBuyer({ + required String token, + required OutProvinceCarcassesBuyer body, + }); + + Future?> getProvince({CancelToken? cancelToken}); + + Future?> getCity({required String provinceName}); + + Future?> getStewardFreeSaleBar({ + required String token, + Map? queryParameters, + }); + + Future createOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }); + + Future updateOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }); + + Future getUserProfile({required String token}); + + Future updateUserProfile({required String token, required UserProfile userProfile}); + + Future updatePassword({required String token, required ChangePasswordRequestModel model}); + + Future?> getSegmentation({ + required String token, + Map? queryParameters, + }); + + Future createSegmentation({required String token, required SegmentationModel model}); + + Future editSegmentation({required String token, required SegmentationModel model}); + + Future deleteSegmentation({required String token, required String key}); +} diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart new file mode 100644 index 0000000..5d72f8a --- /dev/null +++ b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart @@ -0,0 +1,484 @@ +import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote.dart'; +import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; +import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; +import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; +import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; +import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; +import 'package:rasadyar_chicken/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; +import 'package:rasadyar_chicken/data/models/response/guild_profile/guild_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar/steward_free_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart' + hide ProductModel; +import 'package:rasadyar_core/core.dart'; + +class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource { + final DioRemote _httpClient; + + ChickenRemoteDatasourceImp(this._httpClient); + + @override + Future?> getInventory({ + required String token, + CancelToken? cancelToken, + }) async { + eLog(_httpClient.baseUrl); + var res = await _httpClient.get( + '/roles-products/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + + fromJsonList: (json) => + (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), + ); + + return res.data; + } + + @override + Future getKillHouseDistributionInfo({required String token}) async { + var res = await _httpClient.get( + '/kill-house-distribution-info/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJson: KillHouseDistributionInfo.fromJson, + ); + + return res.data; + } + + @override + Future getGeneralBarInformation({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/bars_for_kill_house_dashboard/?role=Steward', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: BarInformation.fromJson, + ); + return res.data; + } + + @override + Future?> getWaitingArrivals({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward-allocation/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: queryParameters, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => WaitingArrivalModel.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future setSateForArrivals({ + required String token, + required Map request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: request, + ); + } + + @override + Future?> getImportedLoadsModel({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward-allocation/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (data) => ImportedLoadsModel.fromJson(data as Map), + ), + ); + return res.data; + } + + @override + Future?> getAllocatedMade({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward-allocation/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => AllocatedMadeModel.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future confirmAllocation({ + required String token, + required Map allocation, + }) async { + var res = await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: allocation, + ); + } + + @override + Future denyAllocation({required String token, required String allocationToken}) async { + await _httpClient.delete( + '/steward-allocation/0/?steward_allocation_key=$allocationToken', + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future confirmAllAllocation({ + required String token, + required List allocationTokens, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + data: {'steward_allocation_list': allocationTokens}, + ); + } + + @override + Future?> getRolesProducts({required String token}) async { + var res = await _httpClient.get( + '/roles-products/?role=Steward', + headers: {'Authorization': 'Bearer $token'}, + fromJsonList: (json) => + json.map((item) => ProductModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future?> getGuilds({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/guilds/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJsonList: (json) => + json.map((item) => GuildModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future getProfile({required String token}) async { + var res = await _httpClient.get( + '/guilds/0/?profile', + headers: {'Authorization': 'Bearer $token'}, + fromJson: GuildProfile.fromJson, + ); + return res.data; + } + + @override + Future postSubmitStewardAllocation({ + required String token, + required SubmitStewardAllocation request, + }) async { + await _httpClient.post( + '/steward-allocation/', + headers: {'Authorization': 'Bearer $token'}, + data: request.toJson(), + ); + } + + @override + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }) async { + await _httpClient.delete( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: queryParameters, + ); + } + + @override + Future updateStewardAllocation({ + required String token, + required ConformAllocation request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: request.toJson(), + ); + } + + @override + Future getStewardDashboard({ + required String token, + required String stratDate, + required String endDate, + }) async { + var res = await _httpClient.get( + '/steward_free_bar_dashboard/?date1=$stratDate&date2=$endDate&search=filter', + headers: {'Authorization': 'Bearer $token'}, + fromJson: StewardFreeBarDashboard.fromJson, + ); + return res.data; + } + + @override + Future getDashboardKillHouseFreeBar({ + required String token, + required String stratDate, + required String endDate, + }) async { + var res = await _httpClient.get( + '/dashboard_kill_house_free_bar/?date1=$stratDate&date2=$endDate&search=filter', + headers: {'Authorization': 'Bearer $token'}, + fromJson: DashboardKillHouseFreeBar.fromJson, + ); + return res.data; + } + + @override + Future?> getStewardPurchasesOutSideOfTheProvince({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward_free_bar/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => StewardFreeBar.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future?> getCity({required String provinceName}) async { + var res = await _httpClient.get( + '/iran_city/', + queryParameters: {'name': provinceName}, + fromJsonList: (json) => + json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future?> getProvince({CancelToken? cancelToken}) async { + var res = await _httpClient.get( + '/iran_province/', + fromJsonList: (json) => + json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), + ); + return res.data; + } + + @override + Future createStewardPurchasesOutSideOfTheProvince({ + required String token, + required CreateStewardFreeBar body, + }) async { + var res = await _httpClient.post( + '/steward_free_bar/', + headers: {'Authorization': 'Bearer $token'}, + data: body.toJson(), + ); + } + + @override + Future deleteStewardPurchasesOutSideOfTheProvince({ + required String token, + required String stewardFreeBarKey, + }) async { + await _httpClient.delete( + '/steward_free_bar/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: {'key': stewardFreeBarKey}, + ); + } + + @override + Future?> getOutProvinceCarcassesBuyer({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/out-province-carcasses-buyer/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => OutProvinceCarcassesBuyer.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createOutProvinceCarcassesBuyer({ + required String token, + required OutProvinceCarcassesBuyer body, + }) async { + await _httpClient.post( + '/out-province-carcasses-buyer/', + data: body.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future?> getStewardFreeSaleBar({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/steward_free_sale_bar/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => StewardFreeSaleBar.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }) async { + await _httpClient.post( + '/steward_free_sale_bar/', + data: body.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future updateOutProvinceStewardFreeBar({ + required String token, + required StewardFreeSaleBarRequest body, + }) async { + await _httpClient.put( + '/steward_free_sale_bar/0/', + data: body.toJson() + ..removeWhere((key, value) => value == null) + ..addAll({'carcassWeight': body.weightOfCarcasses, 'carcassCount': body.numberOfCarcasses}), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future getUserProfile({required String token}) async { + var res = await _httpClient.get( + '/system_user_profile/?self-profile', + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => UserProfile.fromJson(json), + ); + + return res.data; + } + + @override + Future updateUserProfile({required String token, required UserProfile userProfile}) async { + await _httpClient.put( + '/system_user_profile/?self-profile/0/', + headers: {'Authorization': 'Bearer $token'}, + data: userProfile.toJson()..removeWhere((key, value) => value == null), + ); + } + + @override + Future updatePassword({ + required String token, + required ChangePasswordRequestModel model, + }) async { + await _httpClient.post( + '/api/change_password/', + headers: {'Authorization': 'Bearer $token'}, + data: model.toJson()..removeWhere((key, value) => value == null), + ); + } + + @override + Future?> getSegmentation({ + required String token, + Map? queryParameters, + }) async { + var res = await _httpClient.get( + '/app-segmentation/', + queryParameters: queryParameters, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => PaginationModel.fromJson( + json, + (json) => SegmentationModel.fromJson(json as Map), + ), + ); + return res.data; + } + + @override + Future createSegmentation({required String token, required SegmentationModel model}) async { + await _httpClient.post( + '/app-segmentation/', + data: model.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future editSegmentation({required String token, required SegmentationModel model}) async { + await _httpClient.put( + '/app-segmentation/0/', + data: model.toJson()..removeWhere((key, value) => value == null), + headers: {'Authorization': 'Bearer $token'}, + ); + } + + @override + Future deleteSegmentation({ + required String token, + required String key, + }) async { + var res = await _httpClient.delete( + '/app-segmentation/0/', + queryParameters: {'key': key}, + headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => SegmentationModel.fromJson(json), + ); + + return res.data; + } +} diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index ed05229..1c5aece 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -1,11 +1,17 @@ import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; +import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; +import 'package:rasadyar_chicken/hive_registrar.g.dart'; import 'package:rasadyar_core/core.dart'; GetIt diChicken = GetIt.instance; Future setupChickenDI() async { var tokenService = Get.find(); + Hive.registerAdapters(); + diChicken.registerLazySingleton(() => ChickenLocalDataSourceImp()); + diChicken.get().openBox(); diChicken.registerLazySingleton( () => AppInterceptor( @@ -21,6 +27,7 @@ Future setupChickenDI() async { ); tokenService.getBaseUrl(); + diChicken.registerLazySingleton(() { return DioRemote( baseUrl: tokenService.baseurl.value, @@ -29,8 +36,17 @@ Future setupChickenDI() async { }, instanceName: 'chickenDioRemote'); final dioRemote = diChicken.get(instanceName: 'chickenDioRemote'); + await dioRemote.init(); - diChicken.registerLazySingleton(() => ChickenRepositoryImpl(dioRemote)); + + diChicken.registerLazySingleton(() => ChickenRemoteDatasourceImp(dioRemote)); + + diChicken.registerLazySingleton( + () => ChickenRepositoryImp( + local: diChicken.get(), + remote: diChicken.get(), + ), + ); diChicken.registerSingleton(ImagePicker()); } diff --git a/packages/chicken/lib/data/models/local/widely_used_local_model.dart b/packages/chicken/lib/data/models/local/widely_used_local_model.dart new file mode 100644 index 0000000..02d89c7 --- /dev/null +++ b/packages/chicken/lib/data/models/local/widely_used_local_model.dart @@ -0,0 +1,73 @@ +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/utils/utils.dart'; + +part 'widely_used_local_model.g.dart'; + +@HiveType(typeId: chickenWidelyUsedLocalModelTypeId) +class WidelyUsedLocalModel extends HiveObject { + @HiveField(0) + bool? hasInit; + + @HiveField(1) + List? items; + + WidelyUsedLocalModel({this.hasInit, this.items}); + + WidelyUsedLocalModel copyWith({bool? hasInit, List? items}) { + return WidelyUsedLocalModel(hasInit: hasInit ?? this.hasInit, items: items ?? this.items); + } +} + +@HiveType(typeId: chickenWidelyUsedLocalItemTypeId) +class WidelyUsedLocalItem extends HiveObject { + @HiveField(0) + String? title; + + @HiveField(1) + String? iconPath; + + @HiveField(2) + int? iconColor; + + @HiveField(3) + int? color; + + @HiveField(4) + String? path; + + @HiveField(5) + int? pathId; + + @HiveField(6) + int? index; + + WidelyUsedLocalItem({ + this.title, + this.iconPath, + this.iconColor, + this.color, + this.path, + this.pathId, + this.index, + }); + + WidelyUsedLocalItem copyWith({ + String? title, + String? iconPath, + int? iconColor, + int? color, + int? pathId, + int? index, + String? path, + }) { + return WidelyUsedLocalItem( + title: title ?? this.title, + iconPath: iconPath ?? this.iconPath, + iconColor: iconColor ?? this.iconColor, + color: color ?? this.color, + path: path ?? this.path, + pathId: pathId ?? this.pathId, + index: index ?? this.index, + ); + } +} diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index fe9d23d..1d0aee9 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; @@ -25,6 +26,7 @@ import 'package:rasadyar_core/core.dart'; import '../models/request/create_steward_free_bar/create_steward_free_bar.dart'; abstract class ChickenRepository { + //region Remote Future?> getInventory({required String token, CancelToken? cancelToken}); Future getKillHouseDistributionInfo({required String token}); @@ -153,4 +155,12 @@ abstract class ChickenRepository { Future editSegmentation({required String token, required SegmentationModel model}); Future deleteSegmentation({required String token, required String key}); + + //endregion + + //region local + Future initWidleyUsed(); + + WidelyUsedLocalModel? getAllWidely(); + //endregion } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index a0c19c9..6eaf786 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,3 +1,6 @@ +import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; +import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart'; import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; @@ -25,37 +28,26 @@ import 'package:rasadyar_core/core.dart'; import 'chicken_repository.dart'; -class ChickenRepositoryImpl implements ChickenRepository { - final DioRemote _httpClient; +class ChickenRepositoryImp implements ChickenRepository { + final ChickenRemoteDatasourceImp remote; + final ChickenLocalDataSourceImp local; - ChickenRepositoryImpl(this._httpClient); + ChickenRepositoryImp({required this.remote, required this.local}); + //region Remote @override Future?> getInventory({ required String token, CancelToken? cancelToken, }) async { - eLog(_httpClient.baseUrl); - var res = await _httpClient.get( - '/roles-products/?role=Steward', - headers: {'Authorization': 'Bearer $token'}, - - fromJsonList: (json) => - (json).map((item) => InventoryModel.fromJson(item as Map)).toList(), - ); - - return res.data; + var res = await remote.getInventory(token: token, cancelToken: cancelToken); + return res; } @override Future getKillHouseDistributionInfo({required String token}) async { - var res = await _httpClient.get( - '/kill-house-distribution-info/?role=Steward', - headers: {'Authorization': 'Bearer $token'}, - fromJson: KillHouseDistributionInfo.fromJson, - ); - - return res.data; + var res = await remote.getKillHouseDistributionInfo(token: token); + return res; } @override @@ -63,13 +55,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/bars_for_kill_house_dashboard/?role=Steward', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: BarInformation.fromJson, - ); - return res.data; + var res = await remote.getGeneralBarInformation(token: token, queryParameters: queryParameters); + return res; } @override @@ -77,16 +64,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward-allocation/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: queryParameters, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => WaitingArrivalModel.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getWaitingArrivals(token: token, queryParameters: queryParameters); + return res; } @override @@ -94,11 +73,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required Map request, }) async { - await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - data: request, - ); + await remote.setSateForArrivals(token: token, request: request); } @override @@ -106,16 +81,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward-allocation/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (data) => ImportedLoadsModel.fromJson(data as Map), - ), - ); - return res.data; + var res = await remote.getImportedLoadsModel(token: token, queryParameters: queryParameters); + return res; } @override @@ -123,16 +90,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward-allocation/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => AllocatedMadeModel.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getAllocatedMade(token: token, queryParameters: queryParameters); + return res; } @override @@ -140,19 +99,12 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required Map allocation, }) async { - var res = await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - data: allocation, - ); + await remote.confirmAllocation(token: token, allocation: allocation); } @override Future denyAllocation({required String token, required String allocationToken}) async { - await _httpClient.delete( - '/steward-allocation/0/?steward_allocation_key=$allocationToken', - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.denyAllocation(token: token, allocationToken: allocationToken); } @override @@ -160,22 +112,13 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required List allocationTokens, }) async { - await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - data: {'steward_allocation_list': allocationTokens}, - ); + await remote.confirmAllAllocation(token: token, allocationTokens: allocationTokens); } @override Future?> getRolesProducts({required String token}) async { - var res = await _httpClient.get( - '/roles-products/?role=Steward', - headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => - json.map((item) => ProductModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getRolesProducts(token: token); + return res; } @override @@ -183,24 +126,14 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/guilds/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJsonList: (json) => - json.map((item) => GuildModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getGuilds(token: token, queryParameters: queryParameters); + return res; } @override Future getProfile({required String token}) async { - var res = await _httpClient.get( - '/guilds/0/?profile', - headers: {'Authorization': 'Bearer $token'}, - fromJson: GuildProfile.fromJson, - ); - return res.data; + var res = await remote.getProfile(token: token); + return res; } @override @@ -208,11 +141,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required SubmitStewardAllocation request, }) async { - await _httpClient.post( - '/steward-allocation/', - headers: {'Authorization': 'Bearer $token'}, - data: request.toJson(), - ); + await remote.postSubmitStewardAllocation(token: token, request: request); } @override @@ -220,11 +149,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - await _httpClient.delete( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: queryParameters, - ); + await remote.deleteStewardAllocation(token: token, queryParameters: queryParameters); } @override @@ -232,11 +157,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required ConformAllocation request, }) async { - await _httpClient.put( - '/steward-allocation/0/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: request.toJson(), - ); + await remote.updateStewardAllocation(token: token, request: request); } @override @@ -245,12 +166,12 @@ class ChickenRepositoryImpl implements ChickenRepository { required String stratDate, required String endDate, }) async { - var res = await _httpClient.get( - '/steward_free_bar_dashboard/?date1=$stratDate&date2=$endDate&search=filter', - headers: {'Authorization': 'Bearer $token'}, - fromJson: StewardFreeBarDashboard.fromJson, + var res = await remote.getStewardDashboard( + token: token, + stratDate: stratDate, + endDate: endDate, ); - return res.data; + return res; } @override @@ -259,12 +180,12 @@ class ChickenRepositoryImpl implements ChickenRepository { required String stratDate, required String endDate, }) async { - var res = await _httpClient.get( - '/dashboard_kill_house_free_bar/?date1=$stratDate&date2=$endDate&search=filter', - headers: {'Authorization': 'Bearer $token'}, - fromJson: DashboardKillHouseFreeBar.fromJson, + var res = await remote.getDashboardKillHouseFreeBar( + token: token, + stratDate: stratDate, + endDate: endDate, ); - return res.data; + return res; } @override @@ -272,37 +193,23 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward_free_bar/', + var res = await remote.getStewardPurchasesOutSideOfTheProvince( + token: token, queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => StewardFreeBar.fromJson(json as Map), - ), ); - return res.data; + return res; } @override Future?> getCity({required String provinceName}) async { - var res = await _httpClient.get( - '/iran_city/', - queryParameters: {'name': provinceName}, - fromJsonList: (json) => - json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getCity(provinceName: provinceName); + return res; } @override Future?> getProvince({CancelToken? cancelToken}) async { - var res = await _httpClient.get( - '/iran_province/', - fromJsonList: (json) => - json.map((item) => IranProvinceCityModel.fromJson(item as Map)).toList(), - ); - return res.data; + var res = await remote.getProvince(cancelToken: cancelToken); + return res; } @override @@ -310,11 +217,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required CreateStewardFreeBar body, }) async { - var res = await _httpClient.post( - '/steward_free_bar/', - headers: {'Authorization': 'Bearer $token'}, - data: body.toJson(), - ); + await remote.createStewardPurchasesOutSideOfTheProvince(token: token, body: body); } @override @@ -322,10 +225,9 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required String stewardFreeBarKey, }) async { - await _httpClient.delete( - '/steward_free_bar/0/', - headers: {'Authorization': 'Bearer $token'}, - queryParameters: {'key': stewardFreeBarKey}, + await remote.deleteStewardPurchasesOutSideOfTheProvince( + token: token, + stewardFreeBarKey: stewardFreeBarKey, ); } @@ -334,16 +236,11 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/out-province-carcasses-buyer/', + var res = await remote.getOutProvinceCarcassesBuyer( + token: token, queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => OutProvinceCarcassesBuyer.fromJson(json as Map), - ), ); - return res.data; + return res; } @override @@ -351,11 +248,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required OutProvinceCarcassesBuyer body, }) async { - await _httpClient.post( - '/out-province-carcasses-buyer/', - data: body.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.createOutProvinceCarcassesBuyer(token: token, body: body); } @override @@ -363,16 +256,8 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/steward_free_sale_bar/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => StewardFreeSaleBar.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getStewardFreeSaleBar(token: token, queryParameters: queryParameters); + return res; } @override @@ -380,11 +265,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required StewardFreeSaleBarRequest body, }) async { - await _httpClient.post( - '/steward_free_sale_bar/', - data: body.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.createOutProvinceStewardFreeBar(token: token, body: body); } @override @@ -392,33 +273,18 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required StewardFreeSaleBarRequest body, }) async { - await _httpClient.put( - '/steward_free_sale_bar/0/', - data: body.toJson() - ..removeWhere((key, value) => value == null) - ..addAll({'carcassWeight': body.weightOfCarcasses, 'carcassCount': body.numberOfCarcasses}), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.updateOutProvinceStewardFreeBar(token: token, body: body); } @override Future getUserProfile({required String token}) async { - var res = await _httpClient.get( - '/system_user_profile/?self-profile', - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => UserProfile.fromJson(json), - ); - - return res.data; + var res = await remote.getUserProfile(token: token); + return res; } @override Future updateUserProfile({required String token, required UserProfile userProfile}) async { - await _httpClient.put( - '/system_user_profile/?self-profile/0/', - headers: {'Authorization': 'Bearer $token'}, - data: userProfile.toJson()..removeWhere((key, value) => value == null), - ); + await remote.updateUserProfile(token: token, userProfile: userProfile); } @override @@ -426,11 +292,7 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, required ChangePasswordRequestModel model, }) async { - await _httpClient.post( - '/api/change_password/', - headers: {'Authorization': 'Bearer $token'}, - data: model.toJson()..removeWhere((key, value) => value == null), - ); + await remote.updatePassword(token: token, model: model); } @override @@ -438,45 +300,36 @@ class ChickenRepositoryImpl implements ChickenRepository { required String token, Map? queryParameters, }) async { - var res = await _httpClient.get( - '/app-segmentation/', - queryParameters: queryParameters, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => PaginationModel.fromJson( - json, - (json) => SegmentationModel.fromJson(json as Map), - ), - ); - return res.data; + var res = await remote.getSegmentation(token: token, queryParameters: queryParameters); + return res; } @override Future createSegmentation({required String token, required SegmentationModel model}) async { - await _httpClient.post( - '/app-segmentation/', - data: model.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.createSegmentation(token: token, model: model); } @override Future editSegmentation({required String token, required SegmentationModel model}) async { - await _httpClient.put( - '/app-segmentation/0/', - data: model.toJson()..removeWhere((key, value) => value == null), - headers: {'Authorization': 'Bearer $token'}, - ); + await remote.editSegmentation(token: token, model: model); } @override - Future deleteSegmentation({required String token, required String key}) async { - var res = await _httpClient.delete( - '/app-segmentation/0/', - queryParameters: {'key': key}, - headers: {'Authorization': 'Bearer $token'}, - fromJson: (json) => SegmentationModel.fromJson(json), - ); - - return res.data; + Future deleteSegmentation({ + required String token, + required String key, + }) async { + var res = await remote.deleteSegmentation(token: token, key: key); + return res; } + + //endregion + + //region local + @override + WidelyUsedLocalModel? getAllWidely() => local.getAllWidely(); + + @override + Future initWidleyUsed() async => local.initWidleyUsed(); + //endregion } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart index 9fdb789..93cf531 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/logic.dart @@ -68,7 +68,7 @@ class BuyInProvinceLogic extends GetxController { if (isWaiting) { buyWaitingLogic.getWaitingArrivals(); } else { - buyAllLogic.getImportedEntries(); + buyAllLogic.getAllArrivals(); } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart index eb08e10..b9dfcef 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/logic.dart @@ -1,25 +1,32 @@ import 'package:rasadyar_auth/data/utils/safe_call.dart'; -import 'package:rasadyar_chicken/data/models/response/imported_loads_model/imported_loads_model.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_allocation/steward_allocation_request.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_core/core.dart'; class BuyInProvinceAllLogic extends GetxController { RxList isExpandedList = [].obs; - Rx fromDateFilter = Jalali.now().obs; - Rx toDateFilter = Jalali.now().obs; + Rxn fromDateFilter = Rxn(); + Rxn toDateFilter = Rxn(); RxnString searchedValue = RxnString(); + RxMap isLoadingConfirmMap = RxMap(); + final RxBool isLoadingMoreAllocationsMade = false.obs; + RxInt currentPage = 1.obs; RootLogic rootLogic = Get.find(); - Rx>> importedLoads = - Resource>.loading().obs; - - + Rx>> allProduct = + Resource>.loading().obs; + @override + void onInit() { + super.onInit(); + getAllArrivals(); + } @override void onReady() { - debounce(searchedValue, (callback) => getImportedEntries(), time: Duration(milliseconds: 2000)); + debounce(searchedValue, (callback) => getAllArrivals(), time: Duration(milliseconds: 2000)); super.onReady(); } @@ -29,27 +36,111 @@ class BuyInProvinceAllLogic extends GetxController { super.onClose(); } - Future getImportedEntries() async { + Future getAllArrivals([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; + } else { + allProduct.value = Resource>.loading(); + } + + if (searchedValue.value != null && + searchedValue.value!.trim().isNotEmpty && + currentPage.value > 1) { + currentPage.value = 1; + } + safeCall( - call: () async => await rootLogic.chickenRepository.getImportedLoadsModel( + call: () async => await rootLogic.chickenRepository.getWaitingArrivals( token: rootLogic.tokenService.accessToken.value!, queryParameters: buildQueryParams( - queryParams: {'type': 'entered'}, - role: 'Steward', + queryParams: {'type': 'all'}, + pageSize: 20, + page: currentPage.value, search: 'filter', - page: 1, - pageSize: 10, - value: searchedValue.value + role: 'Steward', + value: searchedValue.value, + fromDate: fromDateFilter.value?.toDateTime(), + toDate: toDateFilter.value?.toDateTime(), ), ), onSuccess: (res) async { await Future.delayed(Duration(milliseconds: 200)); if ((res?.count ?? 0) == 0) { - importedLoads.value = Resource>.empty(); + allProduct.value = Resource>.empty(); } else { - importedLoads.value = Resource>.success(res!.results!); + allProduct.value = Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [...(allProduct.value.data?.results ?? []), ...(res?.results ?? [])], + ), + ); } }, ); } + + Future acceptEntries(WaitingArrivalModel model) async { + var request = StewardAllocationRequest( + allocationKey: model.key, + checkAllocation: true, + state: 'accepted', + receiverRealNumberOfCarcasses: model.realNumberOfCarcasses ?? 0, + receiverRealWeightOfCarcasses: model.realWeightOfCarcasses?.toInt() ?? 0, + registrationCode: model.registrationCode ?? 0, + weightLossOfCarcasses: model.weightLossOfCarcasses?.toInt() ?? 0, + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + getAllArrivals(); + rootLogic.getInventory(); + }, + ); + } + + Future denyEntries(WaitingArrivalModel model) async { + var request = StewardAllocationRequest( + allocationKey: model.key, + checkAllocation: true, + state: 'rejected', + ).toJson(); + request.removeWhere((key, value) => value == null); + + safeCall( + call: () async => await rootLogic.chickenRepository.setSateForArrivals( + token: rootLogic.tokenService.accessToken.value!, + request: request, + ), + onError: (error, stackTrace) { + eLog(error); + }, + onSuccess: (result) { + getAllArrivals(); + rootLogic.getInventory(); + }, + ); + } + + String getVecPathItem(String? item) { + switch (item) { + case 'pending': + return Assets.vec.timerSvg.path; + case 'accepted': + return Assets.vec.checkSquareSvg.path; + case 'rejected': + return Assets.vec.closeCircleSvg.path; + default: + return Assets.vec.timerSvg.path; + } + } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart index fab0ebc..e6929b2 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -1,4 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; +import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -8,6 +12,249 @@ class BuyInProvinceAllPage extends GetView { @override Widget build(BuildContext context) { - return Container(color: Colors.blue); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: ObxValue((data) { + return RPaginatedListView( + listType: ListType.separated, + resource: data.value, + hasMore: data.value.data?.next != null, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), + labelColor: getLabelColor(item.receiverState), + labelIcon: controller.getVecPathItem(item.receiverState), + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + onLoadMore: () async => controller.getAllArrivals(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getAllArrivals(); + }, + ); + }, controller.allProduct), + ); + } + + Row itemListWidget(WaitingArrivalModel item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 20), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 3, + children: [ + Text( + item.toSteward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.start, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 6, + children: [ + Visibility( + visible: item.product?.name?.contains('مرغ گرم') ?? false, + child: Assets.vec.hotChickenSvg.svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma}kg', + textAlign: TextAlign.left, + style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + SizedBox(height: 2), + ], + ), + ), + Expanded( + flex: 1, + child: Assets.vec.scanSvg.svg( + width: 32.w, + height: 32.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ], + ); + } + + Container itemListExpandedWidget(WaitingArrivalModel item) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + item.steward?.user?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + Spacer(), + Text( + item.receiverState?.faItem, + textAlign: TextAlign.center, + style: AppFonts.yekan10.copyWith(color: AppColor.darkGreyDark), + ), + SizedBox(width: 7), + SvgGenImage.vec( + controller.getVecPathItem(item.receiverState), + ).svg(width: 16.w, height: 16.h, + colorFilter: ColorFilter.mode(AppColor.darkGreyDark, BlendMode.srcIn) + ), + + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + item.date?.toJalali.formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${item.date?.toJalali.formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + + buildRow( + title: 'نام و نام خانوادگی فروشنده', + value: item.steward?.user?.fullname ?? 'N/A', + ), + buildRow( + title: 'تلفن فروشنده', + value: item.steward?.user?.mobile ?? 'N/A', + valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), + buildRow( + title: 'وزن خریداری شده', + value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', + ), + buildRow(title: 'قیمت کل', value: '${item.totalAmount?.separatedByComma} ریال'), + Visibility( + visible: item.receiverState == 'pending', + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + ObxValue((data) { + return RElevated( + text: 'تایید', + width: 150.w, + height: 40.h, + isLoading: data[item.key!] ?? false, + onPressed: () async { + data[item.key!] = !(data[item.key!] ?? false); + await controller.acceptEntries(item); + data.remove(item.key!); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ); + }, controller.isLoadingConfirmMap), + ROutlinedElevated( + text: 'رد', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildWarningDialog( + title: 'اخطار', + middleText: 'آیا از رد شدن این مورد اطمینان دارید؟', + onConfirm: () => controller.denyEntries(item), + onRefresh: () => controller.getAllArrivals(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ), + ], + ), + ); + } + + Color getLabelColor(String? item) { + switch (item) { + case 'pending': + return AppColor.greenLightHover; + case 'accepted': + return AppColor.blueLight; + case 'rejected': + return AppColor.redLightHover; + default: + return AppColor.blueLight; + } } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart index 2de5ede..c2efb00 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/logic.dart @@ -18,9 +18,12 @@ class BuyInProvinceWaitingLogic extends GetxController { RxInt currentPage = 1.obs; final RxBool isLoadingMoreAllocationsMade = false.obs; RootLogic rootLogic = Get.find(); + Rx>> waitingProduct = Resource>.loading().obs; + + @override void onInit() { super.onInit(); @@ -35,6 +38,7 @@ class BuyInProvinceWaitingLogic extends GetxController { void onReady() { super.onReady(); getWaitingArrivals(); + } @override @@ -92,6 +96,8 @@ class BuyInProvinceWaitingLogic extends GetxController { ); } + + Future acceptEntries(WaitingArrivalModel model) async { var request = StewardAllocationRequest( allocationKey: model.key, diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index 16a3954..5c0e315 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -29,7 +29,6 @@ class HomeLogic extends GetxController { queryParameters: buildQueryParams(fromDate: DateTime.now(), toDate: DateTime.now()), ), onSuccess: (result) { - iLog(result); if (result != null) { totalWeightTodayBars.value = result.totalBarsWeight?.toInt(); } diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index bd9f07a..4fba960 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -2,8 +2,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; -import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/app_bar.dart'; +import 'package:rasadyar_chicken/presentation/widget/widely_used/view.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -153,76 +153,7 @@ class HomePage extends GetView { ), ), - Padding( - padding: EdgeInsetsGeometry.all(6), - child: Row( - children: [Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16)], - ), - ), - - SizedBox( - height: 70, - child: ListView( - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 12), - physics: BouncingScrollPhysics(), - children: [ - widelyUsed( - title: 'خرید خارج استان', - iconPath: Assets.vec.truckFastSvg.path, - onTap: () async { - controller.rootLogic.currentPage.value = 0; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'خرید داخل استان', - iconPath: Assets.vec.cubeSvg.path, - onTap: () async { - controller.rootLogic.currentPage.value = 0; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.buysInProvince, id: 0); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'فروش خارج استان', - iconPath: Assets.vec.truckFastSvg.path, - onTap: () async { - controller.rootLogic.currentPage.value = 1; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'فروش داخل استان', - iconPath: Assets.vec.cubeSvg.path, - onTap: () async{ - controller.rootLogic.currentPage.value = 1; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.salesInProvince, id: 1); - }, - ), - SizedBox(width: 15), - widelyUsed( - title: 'ثبت قطعه بندی', - iconPath: Assets.vec.convertCubeSvg.path, - onTap: () { - // Get.toNamed(ChickenRoutes.salesWithOutProvince); - }, - ), - SizedBox(width: 15), - addWidelyUsed(onTap: () {}), - ], - ), - ), + WidelyUsedWidget(), ], ), ); @@ -566,73 +497,6 @@ class HomePage extends GetView { ); } - Widget widelyUsed({ - required String title, - required String iconPath, - required VoidCallback onTap, - }) { - return GestureDetector( - onTap: onTap, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - spacing: 4, - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(4), - decoration: ShapeDecoration( - color: const Color(0xFFBECDFF), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - color: AppColor.blueNormal, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: SvgGenImage.vec(iconPath).svg( - width: 24, - height: 24, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - fit: BoxFit.cover, - ), - ), - ), - Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), - ], - ), - ); - } - - Widget addWidelyUsed({required VoidCallback onTap}) { - return Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - spacing: 4, - children: [ - Container( - width: 48, - height: 48, - padding: EdgeInsets.all(4), - decoration: ShapeDecoration( - color: const Color(0xFFD9F7F0), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Assets.vec.messageAddSvg.svg( - width: 40, - height: 40, - colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), - fit: BoxFit.cover, - ), - ), - Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), - ], - ); - } - Widget inventoryItem({ required bool isExpanded, required int index, diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 733b962..0f3c0cd 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -3,7 +3,9 @@ import 'dart:async'; import 'package:flutter/widgets.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; @@ -26,10 +28,12 @@ class RootLogic extends GetxController { final defaultRoutes = {0: ChickenRoutes.buy, 1: ChickenRoutes.sale}; RxList rolesProductsModel = RxList(); + Rxn widelyUsedList = Rxn(); late DioRemote dioRemote; var tokenService = Get.find(); late ChickenRepository chickenRepository; + late ChickenLocalDataSourceImp localDatasource; RxList errorLocationType = RxList(); RxMap inventoryExpandedList = RxMap(); @@ -43,8 +47,10 @@ class RootLogic extends GetxController { @override void onInit() { super.onInit(); + localDatasource = diChicken.get(); + chickenRepository = diChicken.get(); - chickenRepository = diChicken.get(); + widelyUsedList.value = localDatasource.getAllWidely(); //getKillHouseDistributionInfo(); } @@ -62,6 +68,12 @@ class RootLogic extends GetxController { if (rolesProductsModel.isEmpty) { getRolesProducts(); } + + if (widelyUsedList.value?.hasInit != true) { + localDatasource.initWidleyUsed().then( + (value) => localDatasource.getAllWidely(), + ); + } } @override diff --git a/packages/core/lib/infrastructure/local/hive_local_storage.dart b/packages/core/lib/infrastructure/local/hive_local_storage.dart index 53b7b55..d164dbf 100644 --- a/packages/core/lib/infrastructure/local/hive_local_storage.dart +++ b/packages/core/lib/infrastructure/local/hive_local_storage.dart @@ -1,8 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; -import 'i_local_storage.dart'; - class HiveLocalStorage implements ILocalStorage { HiveLocalStorage() { Hive.initFlutter(); @@ -43,6 +41,17 @@ class HiveLocalStorage implements ILocalStorage { } } + @override + T? readBox({required String boxName}) { + try { + Box? box = getBox(boxName); + return box?.values as T?; + } on Exception catch (e) { + eLog(e); + return null; + } + } + @override Future add({required String boxName, required dynamic value}) async { Box? box = getBox(boxName); @@ -50,10 +59,7 @@ class HiveLocalStorage implements ILocalStorage { } @override - Future addAll({ - required String boxName, - required Iterable values, - }) async { + Future addAll({required String boxName, required Iterable values}) async { Box? box = getBox(boxName); await box?.addAll(values); } @@ -76,20 +82,13 @@ class HiveLocalStorage implements ILocalStorage { Future close(String boxName) async => await _boxes[boxName]?.close(); @override - Future deleteValue({ - required String boxName, - required String key, - }) async { + Future deleteValue({required String boxName, required String key}) async { Box? box = getBox(boxName); await box?.delete(key); } @override - Future save({ - required String boxName, - required String key, - required value, - }) async { + Future save({required String boxName, required String key, required value}) async { Box? box = getBox(boxName); await box?.put(key, value); } @@ -101,11 +100,7 @@ class HiveLocalStorage implements ILocalStorage { } @override - Future saveAt({ - required String boxName, - required int index, - required value, - }) async { + Future saveAt({required String boxName, required int index, required value}) async { Box? box = getBox(boxName); await box?.putAt(index, value); } diff --git a/packages/core/lib/infrastructure/local/i_local_storage.dart b/packages/core/lib/infrastructure/local/i_local_storage.dart index 7cb4f49..98e6c5b 100644 --- a/packages/core/lib/infrastructure/local/i_local_storage.dart +++ b/packages/core/lib/infrastructure/local/i_local_storage.dart @@ -15,6 +15,8 @@ abstract class ILocalStorage { T? read({required String boxName, required String key}); + T? readBox({required String boxName}); + Future deleteValue({required String boxName, required String key}); Future add({required String boxName, required E value}); diff --git a/packages/core/lib/utils/local/local_utils.dart b/packages/core/lib/utils/local/local_utils.dart new file mode 100644 index 0000000..04f3e5d --- /dev/null +++ b/packages/core/lib/utils/local/local_utils.dart @@ -0,0 +1,7 @@ +//Auth +const int authUserLocalModelTypeId = 0; +const int authModuleTypeId = 1; + +//chicken +const int chickenWidelyUsedLocalModelTypeId = 2; +const int chickenWidelyUsedLocalItemTypeId = 3; \ No newline at end of file diff --git a/packages/core/lib/utils/utils.dart b/packages/core/lib/utils/utils.dart index 8701a53..064ac55 100644 --- a/packages/core/lib/utils/utils.dart +++ b/packages/core/lib/utils/utils.dart @@ -12,3 +12,6 @@ export 'map_utils.dart'; export 'route_utils.dart'; export 'separator_input_formatter.dart'; + +export 'local/local_utils.dart'; + From 3566e5820d9d33b3a7bc5252e9c8fb5b8aea0563 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Jul 2025 11:48:00 +0330 Subject: [PATCH 212/256] feat : buy in province all --- .../local/widely_used_local_model.g.dart | 96 ++++++++++ packages/chicken/lib/hive_registrar.g.dart | 20 ++ .../widget/widely_used/logic.dart | 32 ++++ .../presentation/widget/widely_used/view.dart | 180 ++++++++++++++++++ 4 files changed, 328 insertions(+) create mode 100644 packages/chicken/lib/data/models/local/widely_used_local_model.g.dart create mode 100644 packages/chicken/lib/hive_registrar.g.dart create mode 100644 packages/chicken/lib/presentation/widget/widely_used/logic.dart create mode 100644 packages/chicken/lib/presentation/widget/widely_used/view.dart diff --git a/packages/chicken/lib/data/models/local/widely_used_local_model.g.dart b/packages/chicken/lib/data/models/local/widely_used_local_model.g.dart new file mode 100644 index 0000000..271c009 --- /dev/null +++ b/packages/chicken/lib/data/models/local/widely_used_local_model.g.dart @@ -0,0 +1,96 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'widely_used_local_model.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class WidelyUsedLocalModelAdapter extends TypeAdapter { + @override + final typeId = 2; + + @override + WidelyUsedLocalModel read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return WidelyUsedLocalModel( + hasInit: fields[0] as bool?, + items: (fields[1] as List?)?.cast(), + ); + } + + @override + void write(BinaryWriter writer, WidelyUsedLocalModel obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.hasInit) + ..writeByte(1) + ..write(obj.items); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is WidelyUsedLocalModelAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} + +class WidelyUsedLocalItemAdapter extends TypeAdapter { + @override + final typeId = 3; + + @override + WidelyUsedLocalItem read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return WidelyUsedLocalItem( + title: fields[0] as String?, + iconPath: fields[1] as String?, + iconColor: (fields[2] as num?)?.toInt(), + color: (fields[3] as num?)?.toInt(), + path: fields[4] as String?, + pathId: (fields[5] as num?)?.toInt(), + index: (fields[6] as num?)?.toInt(), + ); + } + + @override + void write(BinaryWriter writer, WidelyUsedLocalItem obj) { + writer + ..writeByte(7) + ..writeByte(0) + ..write(obj.title) + ..writeByte(1) + ..write(obj.iconPath) + ..writeByte(2) + ..write(obj.iconColor) + ..writeByte(3) + ..write(obj.color) + ..writeByte(4) + ..write(obj.path) + ..writeByte(5) + ..write(obj.pathId) + ..writeByte(6) + ..write(obj.index); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is WidelyUsedLocalItemAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/packages/chicken/lib/hive_registrar.g.dart b/packages/chicken/lib/hive_registrar.g.dart new file mode 100644 index 0000000..25d0c02 --- /dev/null +++ b/packages/chicken/lib/hive_registrar.g.dart @@ -0,0 +1,20 @@ +// Generated by Hive CE +// Do not modify +// Check in to version control + +import 'package:hive_ce/hive.dart'; +import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart'; + +extension HiveRegistrar on HiveInterface { + void registerAdapters() { + registerAdapter(WidelyUsedLocalItemAdapter()); + registerAdapter(WidelyUsedLocalModelAdapter()); + } +} + +extension IsolatedHiveRegistrar on IsolatedHiveInterface { + void registerAdapters() { + registerAdapter(WidelyUsedLocalItemAdapter()); + registerAdapter(WidelyUsedLocalModelAdapter()); + } +} diff --git a/packages/chicken/lib/presentation/widget/widely_used/logic.dart b/packages/chicken/lib/presentation/widget/widely_used/logic.dart new file mode 100644 index 0000000..9da8caf --- /dev/null +++ b/packages/chicken/lib/presentation/widget/widely_used/logic.dart @@ -0,0 +1,32 @@ +import 'package:rasadyar_chicken/chicken.dart'; +import 'package:rasadyar_core/core.dart'; + +enum WidelyUsedType { edit, normal } + +class WidelyUsedLogic extends GetxController { + Rx type = WidelyUsedType.normal.obs; + RootLogic rootLogic = Get.find(); + + + @override + void onReady() { + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } + + bool isOnEdit() => type.value == WidelyUsedType.edit; + + void toggleType() { + fLog(rootLogic.widelyUsedList); + if (type.value == WidelyUsedType.edit) { + type.value = WidelyUsedType.normal; + } else { + type.value = WidelyUsedType.edit; + } + } +} diff --git a/packages/chicken/lib/presentation/widget/widely_used/view.dart b/packages/chicken/lib/presentation/widget/widely_used/view.dart new file mode 100644 index 0000000..bec4f71 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/widely_used/view.dart @@ -0,0 +1,180 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class WidelyUsedWidget extends StatelessWidget { + const WidelyUsedWidget({super.key}); + + @override + Widget build(BuildContext context) { + final WidelyUsedLogic controller = Get.put(WidelyUsedLogic()); + + return Column( + children: [ + Padding( + padding: EdgeInsetsGeometry.all(6), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16), + ObxValue((data) { + return GestureDetector( + onTap: () { + controller.toggleType(); + }, + child: controller.isOnEdit() + ? Assets.vec.checkSvg.svg( + width: 12.w, + height: 12.h, + colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), + ) + : Assets.vec.editSvg.svg( + width: 16.w, + height: 16.h, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ); + }, controller.type), + ], + ), + ), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 2.0, vertical: 2), + child: ObxValue((data) { + return Wrap( + spacing: 4, + runSpacing: 18, + children: [ + widelyUsed( + title: 'خرید خارج استان', + isOnEdit: controller.type.value == WidelyUsedType.edit, + iconPath: Assets.vec.truckFastSvg.path, + onTap: () async { + controller.rootLogic.currentPage.value = 0; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); + }, + ), + ], + ); + }, controller.type), + ), + ], + ); + } + + Widget widelyUsed({ + required String title, + required String iconPath, + required VoidCallback onTap, + required bool isOnEdit, + }) { + return GestureDetector( + onTap: !isOnEdit ? onTap : null, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Stack( + clipBehavior: Clip.none, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: Color(0xFFBECDFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + ), + Visibility( + visible: isOnEdit, + child: Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: Colors.white60, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + ), + ), + + Visibility( + visible: isOnEdit, + child: Positioned( + top: -15, + left: -12, + child: SizedBox( + width: 32.w, + height: 32.h, + child: GestureDetector( + onTap: () {}, + behavior: HitTestBehavior.translucent, + child: Center( + child: Container( + width: 16, + height: 16, + decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.white), + alignment: Alignment.center, + child: Icon(CupertinoIcons.minus, color: AppColor.error, size: 15), + ), + ), + ), + ), + ), + ), + ], + ), + Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + ], + ), + ); + } + + Widget addWidelyUsed({required VoidCallback onTap}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFD9F7F0), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Assets.vec.messageAddSvg.svg( + width: 40, + height: 40, + colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), + ], + ); + } +} From c28a0e6630c3830c6fc80caf832c2b5589dc42f7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 16 Jul 2025 18:31:47 +0330 Subject: [PATCH 213/256] fix : ui fix after release 1.3.3 --- .../service/app_navigation_observer.dart | 4 + lib/main.dart | 4 +- .../datasource/local/chicken_local_imp.dart | 8 +- .../pages/buy_in_province_waiting/view.dart | 4 +- .../pages/buy_out_of_province/logic.dart | 4 +- .../pages/buy_out_of_province/view.dart | 7 +- .../lib/presentation/pages/profile/view.dart | 77 +++++----------- .../lib/presentation/pages/root/logic.dart | 9 +- .../lib/presentation/pages/root/view.dart | 11 ++- .../pages/sales_in_province/view.dart | 7 +- .../pages/sales_out_of_province/view.dart | 12 +-- .../view.dart | 23 ++++- .../pages/segmentation/logic.dart | 10 +- .../lib/presentation/routes/pages.dart | 12 +++ .../lib/presentation/routes/routes.dart | 1 + .../presentation/widget/widely_used/view.dart | 92 ++++++++++++++----- .../local/hive_local_storage.dart | 62 ++++++------- .../infrastructure/local/i_local_storage.dart | 25 ++--- .../lib/infrastructure/remote/dio_remote.dart | 10 +- .../lib/presentation/common/app_fonts.dart | 4 +- .../local/hive_local_storage.dart | 44 ++++----- pubspec.yaml | 2 +- 22 files changed, 229 insertions(+), 203 deletions(-) diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart index 5d4a8dc..12afc4d 100644 --- a/lib/infrastructure/service/app_navigation_observer.dart +++ b/lib/infrastructure/service/app_navigation_observer.dart @@ -18,12 +18,14 @@ class CustomNavigationObserver extends NavigatorObserver { _isWorkDone = true; await setupInjection(); } + iLog('message'); } @override void didReplace({Route? newRoute, Route? oldRoute}) { super.didReplace(newRoute: newRoute, oldRoute: oldRoute); + iLog('didReplace'); } @@ -31,10 +33,12 @@ class CustomNavigationObserver extends NavigatorObserver { void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); + iLog('didPop'); } @override void didRemove(Route route, Route? previousRoute) { super.didRemove(route, previousRoute); + iLog('didRemove'); } } diff --git a/lib/main.dart b/lib/main.dart index b693b95..3fdd903 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,8 +13,8 @@ Future main() async { await setupPreInjection(); Get.put(TokenStorageService()); - var tokenService = Get.find(); - await tokenService.init(); + await Get.find().init(); + Get.put(AuthMiddleware()); Get.put(AuthService()); runApp(MyApp()); diff --git a/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart b/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart index 2ccd6ed..663af1f 100644 --- a/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart +++ b/packages/chicken/lib/data/datasource/local/chicken_local_imp.dart @@ -4,13 +4,12 @@ import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart' import 'package:rasadyar_core/core.dart'; class ChickenLocalDataSourceImp implements ChickenLocalDataSource { - HiveLocalStorage local =diCore.get(); + HiveLocalStorage local = diCore.get(); final String boxName = 'Chicken_Widley_Box'; - @override Future openBox() async { - await local.openBox(boxName); + await local.openBox(boxName); } @override @@ -53,7 +52,6 @@ class ChickenLocalDataSourceImp implements ChickenLocalDataSource { @override WidelyUsedLocalModel? getAllWidely() { var res = local.readBox(boxName: boxName); - fLog(res.toString()); - return res; + return res?.first; } } diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 7310b28..6658f35 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -44,7 +44,7 @@ class BuyInProvinceWaitingPage extends GetView { ); }, controller.waitingProduct), ), - floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, + /* floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, floatingActionButton: ObxValue((data) { if ((data.value.data?.results?.length ?? 0) > 1) { return AnimatedFab( @@ -58,7 +58,7 @@ class BuyInProvinceWaitingPage extends GetView { } else { return SizedBox.shrink(); } - }, controller.waitingProduct), + }, controller.waitingProduct),*/ ); } diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart index 17d7907..2defabc 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/logic.dart @@ -17,6 +17,7 @@ class BuyOutOfProvinceLogic extends GetxController { RxList isExpandedList = [].obs; final RxInt currentPage = 1.obs; final RxBool isLoadingMoreAllocationsMade = false.obs; + final RxBool isOnLoadingSubmitOrEdit = false.obs; //TODO add this to Di ImagePicker imagePicker = ImagePicker(); @@ -170,6 +171,7 @@ class BuyOutOfProvinceLogic extends GetxController { Future createStewardPurchaseOutOfProvince() async { bool res = false; + isOnLoadingSubmitOrEdit.value = true; if (!(formKey.currentState?.validate() ?? false)) { return res; } @@ -196,6 +198,7 @@ class BuyOutOfProvinceLogic extends GetxController { res = true; }, ); + isOnLoadingSubmitOrEdit.value = false; return res; } @@ -205,7 +208,6 @@ class BuyOutOfProvinceLogic extends GetxController { carcassWeightController.clear(); selectedProvince.value = null; selectedCity.value = null; - selectedProduct.value = null; selectedImage.value = null; _base64Image.value = null; editImageUrl.value = null; diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 41f7b84..165b129 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -379,12 +379,13 @@ class BuyOutOfProvincePage extends GetView { } Widget submitButtonWidget(bool isOnEdit) { - return ObxValue((data) { + return Obx(() { return RElevated( text: isOnEdit ? 'ویرایش' : 'ثبت', width: Get.width, backgroundColor: AppColor.greenNormal, - onPressed: data.value + isLoading: controller.isOnLoadingSubmitOrEdit.value, + onPressed: controller.isSubmitButtonEnabled.value ? () async { var res = await controller.createStewardPurchaseOutOfProvince(); if (res) { @@ -394,7 +395,7 @@ class BuyOutOfProvincePage extends GetView { : null, height: 40, ); - }, controller.isSubmitButtonEnabled); + }); } Widget _productDropDown() { diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart index 6d2c993..3805a4a 100644 --- a/packages/chicken/lib/presentation/pages/profile/view.dart +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -57,59 +57,32 @@ class ProfilePage extends GetView { ), ), - ObxValue((data) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Wrap( - spacing: 20, - runSpacing: 10, - children: [ - cardActionWidget( - title: 'اطلاعات کاربری', - onPressed: () { - data.value = 0; - }, - icon: Assets.vec.profileUserSvg.path, - selected: data.value == 0, - ), + Center( + child: Wrap( + alignment: WrapAlignment.center, + spacing: 20, + runSpacing: 10, + children: [ + cardActionWidget( + title: 'تغییر رمز عبور', + selected: true, + onPressed: () { + Get.bottomSheet(changePasswordBottomSheet(), isScrollControlled: true); + }, + icon: Assets.vec.lockSvg.path, + ), + cardActionWidget( + title: 'خروج', + selected: true, + onPressed: () { + Get.bottomSheet(exitBottomSheet(), isScrollControlled: true); + }, + icon: Assets.vec.logoutSvg.path, + ), + ], + ), + ), - cardActionWidget( - title: 'تغییر رمز عبور', - selected: true, - onPressed: () { - Get.bottomSheet(changePasswordBottomSheet(), isScrollControlled: true); - }, - icon: Assets.vec.lockSvg.path, - ), - - cardActionWidget( - title: 'خروج', - selected: true, - onPressed: () { - Get.bottomSheet(exitBottomSheet(), isScrollControlled: true); - }, - icon: Assets.vec.logoutSvg.path, - ), - /*cardActionWidget( - title: 'اطلاعات بانکی', - onPressed: () { - data.value = 1; - }, - icon: Assets.vec.informationSvg.path, - selected: data.value == 1, - ), - cardActionWidget( - title: 'اطلاعات \nصدور فاکتور', - onPressed: () { - data.value = 2; - }, - icon: Assets.vec.receiptDiscountSvg.path, - selected: data.value == 2, - ),*/ - ], - ), - ); - }, controller.selectedInformationType), SizedBox(height: 100), ], diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 0f3c0cd..380c3c7 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -49,10 +49,11 @@ class RootLogic extends GetxController { super.onInit(); localDatasource = diChicken.get(); chickenRepository = diChicken.get(); + localDatasource.openBox().then((value) async { + widelyUsedList.value = localDatasource.getAllWidely(); + }); - widelyUsedList.value = localDatasource.getAllWidely(); - //getKillHouseDistributionInfo(); } @override @@ -70,9 +71,7 @@ class RootLogic extends GetxController { } if (widelyUsedList.value?.hasInit != true) { - localDatasource.initWidleyUsed().then( - (value) => localDatasource.getAllWidely(), - ); + localDatasource.initWidleyUsed().then((value) => localDatasource.getAllWidely()); } } diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index c3bbaa4..1419f22 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -86,13 +86,20 @@ class RootPage extends GetView { label: 'خرید', icon: Assets.vec.buySvg.path, isSelected: controller.currentPage.value == 0, - onTap: () => controller.changePage(0), + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + + controller.changePage(0); + }, ), RBottomNavigationItem( label: 'فروش', icon: Assets.vec.saleSvg.path, isSelected: controller.currentPage.value == 1, - onTap: () => controller.changePage(1), + onTap: () { + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); + controller.changePage(1); + }, ), RBottomNavigationItem( label: 'خانه', diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 35e3106..7171ab7 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -3,7 +3,6 @@ import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; -import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; @@ -743,7 +742,7 @@ class SalesInProvincePage extends GetView { Widget show2StepAddBottomSheet() { return BaseBottomSheet( - height: Get.height * .35, + height: Get.height * .39, child: Column( spacing: 8, children: [ @@ -808,7 +807,9 @@ class SalesInProvincePage extends GetView { text: ' بازگشت', textStyle: AppFonts.yekan18.copyWith(color: AppColor.error), onPressed: () { - Get.until((route) => route.settings.name == ChickenRoutes.salesInProvince); + Get + ..back() + ..back(); }, ), ), diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index a2ee38f..ba334bb 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/view.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; @@ -21,14 +20,8 @@ class SalesOutOfProvincePage extends GetView { filteringWidget: filterBottomSheet(), widgets: [ inventoryWidget(controller.rootLogic), - segmentWidget(), - Expanded( - child: ObxValue((index) { - return index.value == 0 - ? SalesOutOfProvinceSalesListPage() - : SalesOutOfProvinceBuyersPage(); - }, controller.selectedSegmentIndex), - ), + + Expanded(child: SalesOutOfProvinceSalesListPage()), ], ); } @@ -61,5 +54,4 @@ class SalesOutOfProvincePage extends GetView { onChangedToDate: (jalali) => controller.toDateFilter.value = jalali, onSubmit: () => controller.submitFilter(), ); - } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index 20f5f46..1b36690 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -1,8 +1,10 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_core/core.dart'; @@ -44,10 +46,23 @@ class SalesOutOfProvinceSalesListPage extends GetView SizedBox(height: 8.h), ); }, controller.salesList), - floatingActionButton: RFab.add( - onPressed: () { - Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); - }, + floatingActionButton: Row( + children: [ + RFab.add( + onPressed: () { + Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); + }, + ), + Spacer(), + RFab( + icon: Icon(CupertinoIcons.person_add_solid, color: Colors.white, size: 35.w), + backgroundColor: AppColor.blueNormal, + onPressed: () { + Get.toNamed(ChickenRoutes.salesOutOfProvinceBuyer, id: 1); + }, + ), + SizedBox(width: 25), + ], ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 5d11df4..1c4ed0d 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -77,17 +77,15 @@ class SegmentationLogic extends GetxController { void clearForm() { weightController.text = '0'; selectedSegment.value = null; - } void validateForm() { - isSubmitButtonEnabled = RxBool( + var weight = int.tryParse(weightController.text.clearComma.trim()); + isSubmitButtonEnabled.value = selectedProduct.value != null && - selectedSegment.value != null && weightController.text.isNotEmpty && - int.tryParse(weightController.text) != null && - int.tryParse(weightController.text)! > 0, - ); + weight! > 0 + ; } Future getAllSegmentation([bool isLoadingMore = false]) async { diff --git a/packages/chicken/lib/presentation/routes/pages.dart b/packages/chicken/lib/presentation/routes/pages.dart index abab154..531fa16 100644 --- a/packages/chicken/lib/presentation/routes/pages.dart +++ b/packages/chicken/lib/presentation/routes/pages.dart @@ -19,6 +19,7 @@ import 'package:rasadyar_chicken/presentation/pages/sales_in_province/view.dart' import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/logic.dart'; +import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/view.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/segmentation/logic.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; @@ -79,6 +80,17 @@ sealed class ChickenPages { Get.lazyPut(() => SalesOutOfProvinceSalesListLogic()); }), ), + GetPage( + name: ChickenRoutes.salesOutOfProvinceBuyer, + page: () => SalesOutOfProvinceBuyersPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => SearchLogic()); + Get.lazyPut(() => SalesOutOfProvinceLogic()); + Get.lazyPut(() => SalesOutOfProvinceBuyersLogic()); + Get.lazyPut(() => SalesOutOfProvinceSalesListLogic()); + }), + ), GetPage( name: ChickenRoutes.salesInProvince, page: () => SalesInProvincePage(), diff --git a/packages/chicken/lib/presentation/routes/routes.dart b/packages/chicken/lib/presentation/routes/routes.dart index ba16f5d..f880d94 100644 --- a/packages/chicken/lib/presentation/routes/routes.dart +++ b/packages/chicken/lib/presentation/routes/routes.dart @@ -15,6 +15,7 @@ sealed class ChickenRoutes { //sales static const salesInProvince = '$sale/SalesInProvince'; static const salesOutOfProvince = '$sale/saleOutOfProvince'; + static const salesOutOfProvinceBuyer = '$sale/saleOutOfProvinceBuyer '; } diff --git a/packages/chicken/lib/presentation/widget/widely_used/view.dart b/packages/chicken/lib/presentation/widget/widely_used/view.dart index bec4f71..26db171 100644 --- a/packages/chicken/lib/presentation/widget/widely_used/view.dart +++ b/packages/chicken/lib/presentation/widget/widely_used/view.dart @@ -20,7 +20,7 @@ class WidelyUsedWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16), - ObxValue((data) { + /* ObxValue((data) { return GestureDetector( onTap: () { controller.toggleType(); @@ -37,32 +37,73 @@ class WidelyUsedWidget extends StatelessWidget { colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ); - }, controller.type), + }, controller.type)*/ ], ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 2.0, vertical: 2), - child: ObxValue((data) { - return Wrap( - spacing: 4, - runSpacing: 18, - children: [ - widelyUsed( - title: 'خرید خارج استان', - isOnEdit: controller.type.value == WidelyUsedType.edit, - iconPath: Assets.vec.truckFastSvg.path, - onTap: () async { - controller.rootLogic.currentPage.value = 0; - controller.rootLogic.currentPage.refresh(); - await Future.delayed(Duration(milliseconds: 100)); - Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); - }, - ), - ], - ); - }, controller.type), + child: Wrap( + spacing: 15, + runSpacing: 8, + children: [ + widelyUsed( + title: 'خرید خارج استان', + iconPath: Assets.vec.truckFastSvg.path, + isOnEdit: false, + + cardColor: AppColor.greenLightActive, + labelColor: AppColor.greenNormal, + textColor: AppColor.greenDarkHover, + onTap: () async { + controller.rootLogic.currentPage.value = 0; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.buysOutOfProvince, id: 0); + }, + ), + + widelyUsed( + title: 'خرید داخل استان', + iconPath: Assets.vec.cubeSvg.path, + cardColor: AppColor.greenLightActive, + labelColor: AppColor.greenNormal, + textColor: AppColor.greenDarkHover, + onTap: () async { + controller.rootLogic.currentPage.value = 0; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.buysInProvince, id: 0); + }, + isOnEdit: false, + ), + + widelyUsed( + title: 'فروش خارج استان', + iconPath: Assets.vec.truckFastSvg.path, + isOnEdit: false, + onTap: () async { + controller.rootLogic.currentPage.value = 1; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.salesOutOfProvince, id: 1); + }, + ), + + widelyUsed( + title: 'فروش داخل استان', + iconPath: Assets.vec.cubeSvg.path, + isOnEdit: false, + onTap: () async { + controller.rootLogic.currentPage.value = 1; + controller.rootLogic.currentPage.refresh(); + await Future.delayed(Duration(milliseconds: 100)); + Get.toNamed(ChickenRoutes.salesInProvince, id: 1); + }, + ), + ], + ), ), ], ); @@ -73,6 +114,9 @@ class WidelyUsedWidget extends StatelessWidget { required String iconPath, required VoidCallback onTap, required bool isOnEdit, + Color? cardColor, + Color? labelColor, + Color? textColor, }) { return GestureDetector( onTap: !isOnEdit ? onTap : null, @@ -89,14 +133,14 @@ class WidelyUsedWidget extends StatelessWidget { height: 48, padding: EdgeInsets.all(4), decoration: ShapeDecoration( - color: Color(0xFFBECDFF), + color: cardColor ?? Color(0xFFBECDFF), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: Container( width: 40, height: 40, decoration: ShapeDecoration( - color: AppColor.blueNormal, + color: labelColor ?? AppColor.blueNormal, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: SvgGenImage.vec(iconPath).svg( @@ -146,7 +190,7 @@ class WidelyUsedWidget extends StatelessWidget { ), ], ), - Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + Text(title, style: AppFonts.yekan10.copyWith(color: textColor ?? AppColor.blueNormal)), ], ), ); diff --git a/packages/core/lib/infrastructure/local/hive_local_storage.dart b/packages/core/lib/infrastructure/local/hive_local_storage.dart index d164dbf..fb3142e 100644 --- a/packages/core/lib/infrastructure/local/hive_local_storage.dart +++ b/packages/core/lib/infrastructure/local/hive_local_storage.dart @@ -2,14 +2,14 @@ import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; class HiveLocalStorage implements ILocalStorage { - HiveLocalStorage() { - Hive.initFlutter(); - } - - final Map _boxes = {}; - @override - Future init() async => await Hive.initFlutter(); + Future init() async { + if (kIsWeb) { + Hive.init('hive_storage_rasadyar'); + } else { + await Hive.initFlutter(); + } + } @override Future openBox( @@ -20,13 +20,13 @@ class HiveLocalStorage implements ILocalStorage { Uint8List? bytes, String? collection, }) async { - if (!_boxes.containsKey(boxName)) { - final box = await Hive.openBox( + var exist = await Hive.boxExists(boxName); + if (!exist || !Hive.isBoxOpen(boxName)) { + await Hive.openBox( boxName, encryptionCipher: encryptionCipher, crashRecovery: crashRecovery, ); - _boxes[boxName] = box; } } @@ -42,10 +42,10 @@ class HiveLocalStorage implements ILocalStorage { } @override - T? readBox({required String boxName}) { + List? readBox({required String boxName}) { try { - Box? box = getBox(boxName); - return box?.values as T?; + Box? box = getBox(boxName); + return box?.values.cast().toList(); } on Exception catch (e) { eLog(e); return null; @@ -53,55 +53,51 @@ class HiveLocalStorage implements ILocalStorage { } @override - Future add({required String boxName, required dynamic value}) async { - Box? box = getBox(boxName); + Future add({required String boxName, required dynamic value}) async { + Box? box = getBox(boxName); await box?.add(value); } @override - Future addAll({required String boxName, required Iterable values}) async { - Box? box = getBox(boxName); + Future addAll({required String boxName, required Iterable values}) async { + Box? box = getBox(boxName); await box?.addAll(values); } Box? getBox(String boxName) { - final box = _boxes[boxName]; - if (box is Box) { - return box; - } else { - throw Exception('Box $boxName is not of exist'); - } + final box = Hive.box(boxName); + return box; } @override Future clear(String boxName) async { - await _boxes[boxName]?.clear(); + await Hive.box(boxName).clear(); } @override - Future close(String boxName) async => await _boxes[boxName]?.close(); + Future close(String boxName) async => await Hive.box(boxName).close(); @override - Future deleteValue({required String boxName, required String key}) async { - Box? box = getBox(boxName); + Future deleteValue({required String boxName, required String key}) async { + Box? box = getBox(boxName); await box?.delete(key); } @override - Future save({required String boxName, required String key, required value}) async { - Box? box = getBox(boxName); + Future save({required String boxName, required String key, required value}) async { + Box? box = getBox(boxName); await box?.put(key, value); } @override - Future saveAll({required String boxName, required Map entries}) async { - Box? box = getBox(boxName); + Future saveAll({required String boxName, required Map entries}) async { + Box? box = getBox(boxName); await box?.putAll(entries); } @override - Future saveAt({required String boxName, required int index, required value}) async { - Box? box = getBox(boxName); + Future saveAt({required String boxName, required int index, required value}) async { + Box? box = getBox(boxName); await box?.putAt(index, value); } } diff --git a/packages/core/lib/infrastructure/local/i_local_storage.dart b/packages/core/lib/infrastructure/local/i_local_storage.dart index 98e6c5b..55026de 100644 --- a/packages/core/lib/infrastructure/local/i_local_storage.dart +++ b/packages/core/lib/infrastructure/local/i_local_storage.dart @@ -15,32 +15,21 @@ abstract class ILocalStorage { T? read({required String boxName, required String key}); - T? readBox({required String boxName}); + List? readBox({required String boxName}); - Future deleteValue({required String boxName, required String key}); + Future deleteValue({required String boxName, required String key}); - Future add({required String boxName, required E value}); + Future add({required String boxName, required E value}); - Future addAll({required String boxName, required Iterable values}); + Future addAll({required String boxName, required Iterable values}); Future clear(String boxName); Future close(String boxName); - Future save({ - required String boxName, - required String key, - required dynamic value, - }); + Future save({required String boxName, required String key, required dynamic value}); - Future saveAt({ - required String boxName, - required int index, - required dynamic value, - }); + Future saveAt({required String boxName, required int index, required dynamic value}); - Future saveAll({ - required String boxName, - required Map entries, - }); + Future saveAll({required String boxName, required Map entries}); } diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index c5160ab..a4f7459 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -15,10 +15,12 @@ class DioRemote implements IHttpClient { if (kDebugMode) { dio.interceptors.add( PrettyDioLogger( - requestHeader: true, - responseHeader: true, - requestBody: true, - responseBody: true, + request: false, + enabled: false, + requestHeader: false, + responseHeader: false, + requestBody: false, + responseBody: false, ), ); } diff --git a/packages/core/lib/presentation/common/app_fonts.dart b/packages/core/lib/presentation/common/app_fonts.dart index a4d3f7c..e7daed0 100644 --- a/packages/core/lib/presentation/common/app_fonts.dart +++ b/packages/core/lib/presentation/common/app_fonts.dart @@ -100,11 +100,11 @@ class AppFonts { ); - static const TextStyle yekan10 = TextStyle( + static TextStyle yekan10 = TextStyle( // Rounded from 10.24 fontFamily: yekan, fontWeight: regular, - fontSize: 10, + fontSize: 10.sp, height: _height, ); diff --git a/packages/core/test/infrastructure/local/hive_local_storage.dart b/packages/core/test/infrastructure/local/hive_local_storage.dart index 52f98da..37e2dd4 100644 --- a/packages/core/test/infrastructure/local/hive_local_storage.dart +++ b/packages/core/test/infrastructure/local/hive_local_storage.dart @@ -1,7 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:rasadyar_core/core.dart'; - class HiveLocalStorage implements ILocalStorage { +class HiveLocalStorage implements ILocalStorage { HiveLocalStorage() { Hive.initFlutter(); } @@ -42,16 +42,13 @@ import 'package:rasadyar_core/core.dart'; } @override - Future add({required String boxName, required dynamic value}) async { + Future add({required String boxName, required dynamic value}) async { Box? box = getBox(boxName); await box?.add(value); } @override - Future addAll({ - required String boxName, - required Iterable values, - }) async { + Future addAll({required String boxName, required Iterable values}) async { Box? box = getBox(boxName); await box?.addAll(values); } @@ -67,44 +64,39 @@ import 'package:rasadyar_core/core.dart'; @override Future clear(String boxName) async { - await _boxes[boxName]?.clear(); + await Hive.box(boxName).clear(); } @override Future close(String boxName) async => await _boxes[boxName]?.close(); @override - Future deleteValue({ - required String boxName, - required String key, - }) async { - Box? box = getBox(boxName); + Future deleteValue({required String boxName, required String key}) async { + Box? box = getBox(boxName); await box?.delete(key); } @override - Future save({ - required String boxName, - required String key, - required value, - }) async { - Box? box = getBox(boxName); + Future save({required String boxName, required String key, required value}) async { + Box? box = getBox(boxName); await box?.put(key, value); } @override - Future saveAll({required String boxName, required Map entries}) async { - Box? box = getBox(boxName); + Future saveAll({required String boxName, required Map entries}) async { + Box? box = getBox(boxName); await box?.putAll(entries); } @override - Future saveAt({ - required String boxName, - required int index, - required value, - }) async { - Box? box = getBox(boxName); + Future saveAt({required String boxName, required int index, required value}) async { + Box? box = getBox(boxName); await box?.putAt(index, value); } + + @override + T? readBox({required String boxName}) { + // TODO: implement readBox + throw UnimplementedError(); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 33a89a4..4008ff1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_app description: "A new Flutter project." publish_to: 'none' -version: 1.3.0+2 +version: 1.3.2+3 environment: sdk: ^3.8.1 From 7790a4017e9372a2ac2ac8f5abbf9491d43159aa Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Thu, 17 Jul 2025 15:44:40 +0330 Subject: [PATCH 214/256] fix : ui fix after release 1.3.3 --- assets/icons/empty.svg | 22 +- assets/icons/place_holder.svg | 2 +- assets/vec/empty.svg.vec | Bin 12776 -> 12776 bytes .../datasource/remote/chicken_remote_imp.dart | 2 +- .../segmentation_model.dart | 10 +- .../segmentation_model.freezed.dart | 27 +- .../segmentation_model.g.dart | 2 + .../lib/presentation/pages/home/logic.dart | 32 +- .../lib/presentation/pages/home/view.dart | 89 ++-- .../lib/presentation/pages/profile/view.dart | 21 +- .../pages/sales_out_of_province/logic.dart | 197 +++++++- .../pages/sales_out_of_province/view.dart | 478 +++++++++++++++++- .../sales_out_of_province_buyers/logic.dart | 65 +-- .../sales_out_of_province_buyers/view.dart | 79 +-- .../pages/segmentation/logic.dart | 18 +- .../presentation/pages/segmentation/view.dart | 2 +- .../presentation/widget/base_page/view.dart | 47 +- .../lib/infrastructure/remote/dio_remote.dart | 12 +- 18 files changed, 898 insertions(+), 207 deletions(-) diff --git a/assets/icons/empty.svg b/assets/icons/empty.svg index ffff199..b7bb9ce 100644 --- a/assets/icons/empty.svg +++ b/assets/icons/empty.svg @@ -27,19 +27,19 @@ - - + + - - - - - - + + + + + + @@ -47,9 +47,9 @@ - - - + + + diff --git a/assets/icons/place_holder.svg b/assets/icons/place_holder.svg index f76a0bf..5a0c1d4 100644 --- a/assets/icons/place_holder.svg +++ b/assets/icons/place_holder.svg @@ -1,4 +1,4 @@ - diff --git a/assets/vec/empty.svg.vec b/assets/vec/empty.svg.vec index 5fcf9c8644ffc1b01bd2f506b9410f2256fa8abb..f0a85a0d0a84ff59b1bf93dd706f0d3d0ebc0eff 100644 GIT binary patch delta 34 ocmaEn{33aRviOzW^8d_C4FCVjSQx4OXJ!VmRu;r;v|48f02a9qMF0Q* delta 34 ocmaEn{33aRviSda-T%x?4FCVjSQx4OXJ!Vm_Bo1gv|48f01bQ&nE(I) diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart index 5d72f8a..d0ecd35 100644 --- a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart +++ b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart @@ -63,7 +63,7 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource { Map? queryParameters, }) async { var res = await _httpClient.get( - '/bars_for_kill_house_dashboard/?role=Steward', + '/bars_for_kill_house_dashboard/', queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJson: BarInformation.fromJson, diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart index 86122c3..6226831 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -6,8 +6,14 @@ part 'segmentation_model.g.dart'; @freezed abstract class SegmentationModel with _$SegmentationModel { - const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, int? weight,String? result}) = - _SegmentationModel; + const factory SegmentationModel({ + String? key, + String? productKey, + Buyer? buyer, + DateTime? date, + int? weight, + String? result, + }) = _SegmentationModel; factory SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index 2f106c3..ef5569d 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$SegmentationModel { - String? get key; Buyer? get buyer; DateTime? get date; int? get weight; String? get result; + String? get key; String? get productKey; Buyer? get buyer; DateTime? get date; int? get weight; String? get result; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $SegmentationModelCopyWith get copyWith => _$SegmentationMode @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,buyer,date,weight,result); +int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result); @override String toString() { - return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight, result: $result)'; + return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result)'; } @@ -49,7 +49,7 @@ abstract mixin class $SegmentationModelCopyWith<$Res> { factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, int? weight, String? result + String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result }); @@ -66,9 +66,10 @@ class _$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable @@ -96,10 +97,11 @@ $BuyerCopyWith<$Res>? get buyer { @JsonSerializable() class _SegmentationModel implements SegmentationModel { - const _SegmentationModel({this.key, this.buyer, this.date, this.weight, this.result}); + const _SegmentationModel({this.key, this.productKey, this.buyer, this.date, this.weight, this.result}); factory _SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); @override final String? key; +@override final String? productKey; @override final Buyer? buyer; @override final DateTime? date; @override final int? weight; @@ -118,16 +120,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,buyer,date,weight,result); +int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result); @override String toString() { - return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight, result: $result)'; + return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result)'; } @@ -138,7 +140,7 @@ abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationM factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; @override @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, int? weight, String? result + String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result }); @@ -155,9 +157,10 @@ class __$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { return _then(_SegmentationModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart index d10cb35..745602a 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -9,6 +9,7 @@ part of 'segmentation_model.dart'; _SegmentationModel _$SegmentationModelFromJson(Map json) => _SegmentationModel( key: json['key'] as String?, + productKey: json['product_key'] as String?, buyer: json['buyer'] == null ? null : Buyer.fromJson(json['buyer'] as Map), @@ -22,6 +23,7 @@ _SegmentationModel _$SegmentationModelFromJson(Map json) => Map _$SegmentationModelToJson(_SegmentationModel instance) => { 'key': instance.key, + 'product_key': instance.productKey, 'buyer': instance.buyer, 'date': instance.date?.toIso8601String(), 'weight': instance.weight, diff --git a/packages/chicken/lib/presentation/pages/home/logic.dart b/packages/chicken/lib/presentation/pages/home/logic.dart index 5c0e315..d1b89f9 100644 --- a/packages/chicken/lib/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/home/logic.dart @@ -1,41 +1,56 @@ import 'package:rasadyar_auth/data/utils/safe_call.dart'; import 'package:rasadyar_chicken/chicken.dart'; import 'package:rasadyar_chicken/data/models/response/bar_information/bar_information.dart'; -import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart'; import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart'; -import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class HomeLogic extends GetxController { RootLogic rootLogic = Get.find(); RxnInt totalWeightTodayBars = RxnInt(); Rxn killHouseDistributionInfo = Rxn(); + Rxn barInformation = Rxn(); RxBool isExpanded = false.obs; - @override void onReady() { super.onReady(); + getGeneralBarsInformation(); getTodayBars(); getDistributionInformation(); } + Future getGeneralBarsInformation() async { + await safeCall( + call: () async => await rootLogic.chickenRepository.getGeneralBarInformation( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams(role: 'Steward'), + ), + onSuccess: (result) { + if (result != null) { + barInformation.value = result; + } + }, + onError: (error, stackTrace) {}, + ); + } Future getTodayBars() async { await safeCall( call: () async => await rootLogic.chickenRepository.getGeneralBarInformation( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams(fromDate: DateTime.now(), toDate: DateTime.now()), + queryParameters: buildQueryParams( + fromDate: DateTime.now(), + toDate: DateTime.now(), + role: 'Steward', + ), ), onSuccess: (result) { if (result != null) { totalWeightTodayBars.value = result.totalBarsWeight?.toInt(); } }, - onError: (error, stackTrace) { - - }, + onError: (error, stackTrace) {}, ); } @@ -52,7 +67,4 @@ class HomeLogic extends GetxController { onError: (error, stackTrace) {}, ); } - - - } diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index 4fba960..d02fd50 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -280,61 +280,44 @@ class HomePage extends GetView { } Widget _todayShipmentWidget() { - return ObxValue((data) { - return Container( - height: 70, - width: Get.width / 2, - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), - clipBehavior: Clip.hardEdge, - child: Row( - children: [ - Expanded( - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [const Color(0xFFEAEFFF), Colors.white], - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Assets.icons.cubeScan.svg(width: 30, height: 30), - Text( - 'بارهای امروز', - textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - ], - ), + return Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: ObxValue( + (data) => _informationLabelCard( + title: 'بارهای امروز', + isLoading: data.value == null, + description: data.value?.separatedByComma ?? '0', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: AppColor.blueNormal, + bgDescriptionColor: Colors.white, + bgLabelColor: Color(0xFFEAEFFF), ), + controller.totalWeightTodayBars, ), - Expanded( - child: data.value == null - ? CupertinoActivityIndicator() - : Column( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 4, - children: [ - Text( - data.value.separatedByComma, - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith(color: AppColor.textColor), - ), - Text( - 'کیلوگرم', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.textColor), - ), - ], - ), - ), - ], - ), - ); - }, controller.totalWeightTodayBars); + ), + + Expanded( + child: ObxValue((data) { + return _informationLabelCard( + title: 'درانتظار تایید', + isLoading: data.value == null, + description: '(${data.value?.totalNotEnteredBars.separatedByComma ?? '0'})', + unit: '(${data.value?.totalNotEnteredKillHouseRequestsWeight.separatedByComma})کیلوگرم', + iconPath: Assets.vec.cubeRotateSvg.path, + iconColor: Color(0xFF8F4124), + bgLabelColor: Color(0xFFF59770), + bgDescriptionColor: Color(0xFFF6DFD8), + ); + }, controller.barInformation), + ), + ], + ), + ); + } Container _informationLabelCard({ diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart index 3805a4a..f0cef35 100644 --- a/packages/chicken/lib/presentation/pages/profile/view.dart +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -74,6 +74,9 @@ class ProfilePage extends GetView { cardActionWidget( title: 'خروج', selected: true, + color: ColorFilter.mode(Colors.redAccent, BlendMode.srcIn), + cardColor:AppColor.error.withValues(alpha: 0.24), + textColor: Colors.red, onPressed: () { Get.bottomSheet(exitBottomSheet(), isScrollControlled: true); }, @@ -83,7 +86,6 @@ class ProfilePage extends GetView { ), ), - SizedBox(height: 100), ], ), @@ -214,6 +216,9 @@ class ProfilePage extends GetView { required VoidCallback onPressed, required String icon, bool selected = false, + ColorFilter? color, + Color? cardColor, + Color? textColor, }) { return GestureDetector( onTap: onPressed, @@ -225,23 +230,25 @@ class ProfilePage extends GetView { height: 52, padding: EdgeInsets.all(8), decoration: ShapeDecoration( - color: AppColor.blueLight, + color: cardColor??AppColor.blueLight, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: SvgGenImage.vec(icon).svg( width: 40, height: 40, - colorFilter: ColorFilter.mode( - selected ? AppColor.blueNormal : AppColor.whiteLight, - BlendMode.srcIn, - ), + colorFilter: + color ?? + ColorFilter.mode( + selected ? AppColor.blueNormal : AppColor.whiteLight, + BlendMode.srcIn, + ), ), ), SizedBox(height: 2), Text( title, style: AppFonts.yekan10.copyWith( - color: selected ? AppColor.blueNormal : AppColor.blueLightActive, + color: textColor ?? (selected ? AppColor.blueNormal : AppColor.blueLightActive), ), textAlign: TextAlign.center, ), diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index f1df06f..1f8e19e 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -1,7 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; +import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sale/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_buyers/logic.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/logic.dart'; +import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; class SalesOutOfProvinceLogic extends GetxController { @@ -9,58 +17,199 @@ class SalesOutOfProvinceLogic extends GetxController { SaleLogic get saleLogic => Get.find(); - SalesOutOfProvinceBuyersLogic get buyersLogic => - Get.find(); + SalesOutOfProvinceBuyersLogic get buyersLogic => Get.find(); SalesOutOfProvinceSalesListLogic get saleListLogic => Get.find(); - RxInt selectedSegmentIndex = 0.obs; - RxBool isExpanded = false.obs; + SalesOutOfProvinceBuyersLogic get buyerLogic => Get.find(); + RxBool isExpanded = false.obs; + RxInt currentPage = 1.obs; + RxBool isSaleSubmitButtonEnabled = false.obs; RxList isExpandedList = [].obs; Rx fromDateFilter = Jalali.now().obs; Rx toDateFilter = Jalali.now().obs; RxnString searchedValue = RxnString(); RxList routesName = RxList(); + RxBool isLoadingMoreAllocationsMade = false.obs; + Rxn selectedCity = Rxn(); + + //TODO add this to Di + ImagePicker imagePicker = ImagePicker(); + + GlobalKey formKey = GlobalKey(); + TextEditingController quarantineCodeController = TextEditingController(); + TextEditingController saleWeightController = TextEditingController(); + Rx saleDate = Jalali.now().obs; + String? key; + + Rx>> salesList = + Resource>.loading().obs; + + Rxn selectedProduct = Rxn(); + Rxn selectedBuyer = Rxn(); @override void onInit() { super.onInit(); routesName.value = [...saleLogic.routesName, 'خارج استان'].toList(); - - routesName.add(selectedSegmentIndex.value == 0 ? 'فروش' : 'خریداران'); - ever(selectedSegmentIndex, (callback) { - routesName.removeLast(); - routesName.add(callback == 0 ? 'فروش' : 'خریداران'); - }); } @override void onReady() { super.onReady(); - - + getOutProvinceSales(); + selectedProduct.value = rootLogic.rolesProductsModel.first; + debounce( + searchedValue, + (callback) => getOutProvinceSales(), + time: Duration(milliseconds: timeDebounce), + ); } void setSearchValue(String? value) { searchedValue.value = value?.trim(); - if (selectedSegmentIndex.value == 0) { - saleListLogic.searchedValue.value = value?.trim(); - } else { - buyersLogic.searchedValue.value = value?.trim(); - } } void submitFilter() { - if (selectedSegmentIndex.value == 0) { - saleListLogic.fromDateFilter.value = fromDateFilter.value; - saleListLogic.toDateFilter.value = toDateFilter.value; - saleListLogic.getOutProvinceSales(); + fromDateFilter.value = fromDateFilter.value; + toDateFilter.value = toDateFilter.value; + getOutProvinceSales(); + } + + Future getOutProvinceSales([bool isLoadingMore = false]) async { + if (isLoadingMore) { + isLoadingMoreAllocationsMade.value = true; } else { - buyersLogic.fromDateFilter.value = fromDateFilter.value; - buyersLogic.toDateFilter.value = toDateFilter.value; - buyersLogic.getOutProvinceCarcassesBuyer(); + salesList.value = Resource>.loading(); } + await safeCall( + call: () => rootLogic.chickenRepository.getStewardFreeSaleBar( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + pageSize: 20, + page: currentPage.value, + state: 'buyer-list', + search: 'filter', + role: 'Steward', + value: searchedValue.value ?? '', + fromDate: fromDateFilter.value.toDateTime(), + toDate: toDateFilter.value.toDateTime(), + ), + ), + onSuccess: (res) { + if ((res?.count ?? 0) == 0) { + salesList.value = Resource>.empty(); + } else { + salesList.value = Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [...(salesList.value.data?.results ?? []), ...(res?.results ?? [])], + ), + ); + + isLoadingMoreAllocationsMade.value = false; + } + }, + ); + } + + void setupListeners() { + saleWeightController.addListener(checkSalesFormValid); + quarantineCodeController.addListener(checkSalesFormValid); + ever(selectedBuyer, (_) => checkSalesFormValid); + ever(selectedProduct, (_) => checkSalesFormValid); + ever(saleDate, (_) => checkSalesFormValid()); + } + + void checkSalesFormValid() { + isSaleSubmitButtonEnabled.value = + saleDate.value.toString().isNotEmpty && + selectedProduct.value != null && + selectedBuyer.value != null && + saleWeightController.text.isNotEmpty && + quarantineCodeController.text.isNotEmpty; + } + + void setEditDataSales(StewardFreeSaleBar item) { + quarantineCodeController.text = item.clearanceCode ?? ''; + saleWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? ''; + saleDate.value = Jalali.fromDateTime(DateTime.parse(item.date!)); + selectedCity.value = IranProvinceCityModel(name: item.city); + selectedBuyer.value = buyerLogic.buyerList.value.data?.results?.firstWhere( + (element) => element.key == item.buyer?.key, + ); + selectedProduct.value = rootLogic.rolesProductsModel.first; + key = item.key; + isSaleSubmitButtonEnabled.value = true; + } + + Future deleteStewardPurchaseOutOfProvince(String key) async { + await safeCall( + call: () => rootLogic.chickenRepository.deleteStewardPurchasesOutSideOfTheProvince( + token: rootLogic.tokenService.accessToken.value!, + stewardFreeBarKey: key, + ), + ); + } + + Future createSale() async { + bool res = false; + StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( + buyerKey: selectedBuyer.value?.key, + numberOfCarcasses: 0, + weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), + date: saleDate.value.toDateTime().formattedDashedGregorian, + clearanceCode: quarantineCodeController.text, + productKey: selectedProduct.value?.key, + ); + await safeCall( + call: () => rootLogic.chickenRepository.createOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), + onSuccess: (_) { + res = true; + }, + ); + return res; + } + + void clearSaleForm() { + quarantineCodeController.clear(); + saleWeightController.clear(); + saleDate.value = Jalali.now(); + selectedBuyer.value = null; + selectedProduct.value = null; + } + + Future editSale() async { + bool res = false; + StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest( + numberOfCarcasses: 0, + weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma), + date: saleDate.value.toDateTime().formattedDashedGregorian, + clearanceCode: quarantineCodeController.text, + key: key, + ); + await safeCall( + call: () => rootLogic.chickenRepository.updateOutProvinceStewardFreeBar( + token: rootLogic.tokenService.accessToken.value!, + body: requestBody, + ), + onSuccess: (_) { + res = true; + }, + ); + return res; + } + + void resetSubmitForm() { + selectedCity.value = null; + selectedProduct.value = null; + key = null; } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index ba334bb..d33e434 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -1,8 +1,16 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; +import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart'; import 'package:rasadyar_chicken/presentation/pages/sales_out_of_province_sales_list/view.dart'; +import 'package:rasadyar_chicken/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; import 'package:rasadyar_chicken/presentation/widget/inventory_widget.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; @@ -20,13 +28,61 @@ class SalesOutOfProvincePage extends GetView { filteringWidget: filterBottomSheet(), widgets: [ inventoryWidget(controller.rootLogic), - - Expanded(child: SalesOutOfProvinceSalesListPage()), + Expanded( + child: ObxValue((data) { + return RPaginatedListView( + onLoadMore: () async => controller.getOutProvinceSales(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getOutProvinceSales(); + }, + hasMore: data.value.data?.next != null, + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item, index), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.timerSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.salesList), + ), ], + floatingActionButton: Row( + children: [ + RFab.add( + onPressed: () { + Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); + }, + ), + Spacer(), + RFab( + icon: Icon(CupertinoIcons.person_add_solid, color: Colors.white, size: 35.w), + backgroundColor: AppColor.blueNormal, + onPressed: () { + Get.toNamed(ChickenRoutes.salesOutOfProvinceBuyer, id: 1); + }, + ), + SizedBox(width: 25), + ], + ), + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, ); } - Padding segmentWidget() { + /* Padding segmentWidget() { return Padding( padding: const EdgeInsets.fromLTRB(8, 0, 8, 8), child: Row( @@ -45,7 +101,7 @@ class SalesOutOfProvincePage extends GetView { ], ), ); - } + }*/ Widget filterBottomSheet() => filterBottomSheetWidget( fromDate: controller.fromDateFilter, @@ -54,4 +110,418 @@ class SalesOutOfProvincePage extends GetView { onChangedToDate: (jalali) => controller.toDateFilter.value = jalali, onSubmit: () => controller.submitFilter(), ); + + itemListWidget(StewardFreeSaleBar item) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox(width: 12), + Expanded( + flex: 3, + child: Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + SizedBox(width: 4), + Expanded( + flex: 5, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + item.buyer?.fullname ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + + SizedBox(height: 2), + Text( + item.buyer?.mobile ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + SizedBox(width: 4), + Expanded( + flex: 4, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Text( + item.buyer?.unitName ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + Text( + '${item.weightOfCarcasses?.separatedByComma ?? 0}KG', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ], + ), + ), + Expanded( + flex: 2, + child: Text( + '${item.buyer?.province}\n${item.buyer?.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ), + ], + ); + } + + itemListExpandedWidget(StewardFreeSaleBar item, int index) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + child: Column( + spacing: 8, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + '${item.province}-${item.city}', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), + ), + ], + ), + Container( + height: 32, + padding: EdgeInsets.symmetric(horizontal: 8), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + spacing: 3, + children: [ + Text( + item.date?.toJalali.formatter.wN ?? 'N/A', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.d} ${item.date?.toJalali.formatter.mN ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + + Text( + '${item.date?.toJalali.formatter.y}', + style: AppFonts.yekan20.copyWith(color: AppColor.textColor), + ), + + Text( + '${item.date?.toJalali.formatter.tHH}:${item.date?.toJalali.formatter.tMM ?? 'N/A'}', + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + buildRow(title: 'مشخصات خریدار', value: item.buyer?.fullname ?? 'N/A'), + buildRow(title: 'تلفن خریدار', value: item.buyer?.mobile ?? 'N/A'), + buildRow(title: 'نام واحد', value: item.buyer?.unitName ?? 'N/A'), + buildRow(title: 'وزن لاشه', value: '${item.weightOfCarcasses?.separatedByComma}'), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 16.w, + children: [ + RElevated( + text: 'ویرایش', + width: 150.w, + height: 40.h, + onPressed: () { + controller.setEditDataSales(item); + Get.bottomSheet( + addOrEditSaleBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.resetSubmitForm(); + }); + }, + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), + backgroundColor: AppColor.greenNormal, + ), + ROutlinedElevated( + text: 'حذف', + textStyle: AppFonts.yekan20.copyWith(color: AppColor.redNormal), + width: 150.w, + height: 40.h, + onPressed: () { + buildDeleteDialog( + onConfirm: () async { + controller.isExpandedList.remove(index); + controller.deleteStewardPurchaseOutOfProvince(item.key!); + }, + onRefresh: () => controller.getOutProvinceSales(), + ); + }, + borderColor: AppColor.redNormal, + ), + ], + ), + ], + ), + ); + } + + Widget addOrEditSaleBottomSheet([bool isOnEdit = false]) { + return BaseBottomSheet( + height: 500.h, + child: SingleChildScrollView( + child: Form( + key: controller.formKey, + child: Column( + spacing: 16, + children: [ + Text( + isOnEdit ? 'ویرایش فروش' : 'افزودن فروش', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + _productDropDown(), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 12, + children: [ + Row( + spacing: 8, + children: [ + Expanded( + child: timeFilterWidget( + date: controller.saleDate, + onChanged: (jalali) => controller.saleDate.value = jalali, + ), + ), + ], + ), + _buyerWidget(), + RTextField( + controller: controller.saleWeightController, + label: 'وزن لاشه', + keyboardType: TextInputType.number, + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + + validator: (value) { + if (value == null) { + return 'لطفاً وزن لاشه را وارد کنید'; + } + return null; + }, + ), + RTextField( + controller: controller.quarantineCodeController, + label: 'کد قرنطینه', + borderColor: AppColor.darkGreyLight, + filledColor: AppColor.bgLight, + filled: true, + validator: (value) { + if (value == null) { + return 'لطفاً کد قرنطینه را وارد کنید'; + } + return null; + }, + ), + submitButtonWidget(isOnEdit), + ], + ), + ), + SizedBox(), + ], + ), + ), + ), + ); + } + + Widget submitButtonWidget(bool isOnEdit) { + return ObxValue((data) { + return RElevated( + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + text: isOnEdit ? 'ویرایش' : 'ثبت', + onPressed: data.value + ? () async { + var res = isOnEdit ? await controller.editSale() : await controller.createSale(); + if (res) { + controller.getOutProvinceSales(); + controller.clearSaleForm(); + Get.back(); + } + } + : null, + height: 40, + ); + }, controller.isSaleSubmitButtonEnabled); + } + + Widget _buyerWidget() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.buyerLogic.buyerList.value.data?.results ?? [], + onChanged: (value) { + controller.selectedBuyer.value = value; + }, + selectedItem: controller.selectedBuyer.value, + itemBuilder: (item) => Text(item.buyer?.fullname ?? 'بدون نام'), + labelBuilder: (item) => Text(item?.buyer?.fullname ?? 'انتخاب خریدار'), + ); + }); + } + + Widget _productDropDown() { + return Obx(() { + return OverlayDropdownWidget( + items: controller.rootLogic.rolesProductsModel, + height: 56, + hasDropIcon: false, + background: Colors.white, + onChanged: (value) { + controller.selectedProduct.value = value; + }, + selectedItem: controller.selectedProduct.value, + initialValue: controller.selectedProduct.value, + itemBuilder: (item) => Text(item.name ?? 'بدون نام'), + labelBuilder: (item) => Row( + spacing: 8, + children: [ + (item?.name?.contains('مرغ گرم') ?? false) + ? Assets.images.chicken.image(width: 40, height: 40) + : Assets.vec.placeHolderSvg.svg(width: 40, height: 40), + + Text(item?.name ?? 'انتخاب محصول'), + Spacer(), + Text( + 'موجودی:${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0}', + ), + ], + ), + ); + }); + } + + GestureDetector timeFilterWidget({ + isFrom = true, + required Rx date, + required Function(Jalali jalali) onChanged, + }) { + return GestureDetector( + onTap: () { + Get.bottomSheet(modalDatePicker((value) => onChanged(value))); + }, + child: Container( + height: 40, + decoration: BoxDecoration( + color: AppColor.bgLight, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.darkGreyLight), + ), + padding: EdgeInsets.symmetric(horizontal: 11, vertical: 4), + child: Row( + spacing: 8, + children: [ + Assets.vec.calendarSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(AppColor.bgDark, BlendMode.srcIn), + ), + Text('تاریخ', style: AppFonts.yekan16.copyWith(color: AppColor.bgDark)), + Expanded( + child: ObxValue((data) { + return Text( + date.value.formatCompactDate(), + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDark), + ); + }, date), + ), + ], + ), + ), + ); + } + + Container modalDatePicker(ValueChanged onDateSelected) { + Jalali? tempPickedDate; + return Container( + height: 250, + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: Row( + children: [ + SizedBox(width: 20), + RElevated( + height: 35, + width: 70, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'تایید', + ), + Spacer(), + RElevated( + height: 35, + width: 70, + backgroundColor: AppColor.error, + textStyle: AppFonts.yekan14.copyWith(color: Colors.white), + onPressed: () { + onDateSelected(tempPickedDate ?? Jalali.now()); + Get.back(); + }, + text: 'لغو', + ), + SizedBox(width: 20), + ], + ), + ), + Divider(height: 0, thickness: 1), + Expanded( + child: Container( + child: PersianCupertinoDatePicker( + initialDateTime: controller.saleDate.value, + mode: PersianCupertinoDatePickerMode.date, + onDateTimeChanged: (dateTime) { + tempPickedDate = dateTime; + }, + ), + ), + ), + ], + ), + ); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart index 79c2df0..39344b8 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/logic.dart @@ -13,8 +13,7 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { SaleLogic get saleLogic => Get.find(); - SalesOutOfProvinceLogic get saleOutOfProvince => - Get.find(); + SalesOutOfProvinceLogic get saleOutOfProvince => Get.find(); RxInt currentPage = 1.obs; RxList isExpandedList = [].obs; @@ -39,9 +38,12 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { Rx>> buyerList = Resource>.loading().obs; + RxList routesName = RxList(); + @override void onInit() { super.onInit(); + routesName.value = [...saleLogic.routesName, 'خریداران'].toList(); getOutProvinceCarcassesBuyer(); } @@ -56,6 +58,8 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { (callback) => getOutProvinceCarcassesBuyer(), time: Duration(milliseconds: timeDebounce), ); + + setupListeners(); } @override @@ -70,14 +74,11 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { super.onClose(); } - Future getOutProvinceCarcassesBuyer([ - bool isLoadingMore = false, - ]) async { + Future getOutProvinceCarcassesBuyer([bool isLoadingMore = false]) async { if (isLoadingMore) { isLoadingMoreAllocationsMade.value = true; } else { - buyerList.value = - Resource>.loading(); + buyerList.value = Resource>.loading(); } if (searchedValue.value != null && @@ -98,25 +99,19 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { value: searchedValue.value ?? '', ), ), - onError: (error, stackTrace) => - isLoadingMoreAllocationsMade.value = false, + onError: (error, stackTrace) => isLoadingMoreAllocationsMade.value = false, onSuccess: (res) { if ((res?.count ?? 0) == 0) { - buyerList.value = - Resource>.empty(); + buyerList.value = Resource>.empty(); } else { - buyerList.value = - Resource>.success( - PaginationModel( - count: res?.count ?? 0, - next: res?.next, - previous: res?.previous, - results: [ - ...(buyerList.value.data?.results ?? []), - ...(res?.results ?? []), - ], - ), - ); + buyerList.value = Resource>.success( + PaginationModel( + count: res?.count ?? 0, + next: res?.next, + previous: res?.previous, + results: [...(buyerList.value.data?.results ?? []), ...(res?.results ?? [])], + ), + ); isLoadingMoreAllocationsMade.value = false; } @@ -135,9 +130,8 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { Future getCites() async { await safeCall( - call: () => rootLogic.chickenRepository.getCity( - provinceName: selectedProvince.value?.name ?? '', - ), + call: () => + rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''), onSuccess: (result) { if (result != null && result.isNotEmpty) { cites.value = result; @@ -181,11 +175,10 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { mobile: buyerPhoneController.text, role: 'Steward', ); - final res = await rootLogic.chickenRepository - .createOutProvinceCarcassesBuyer( - token: rootLogic.tokenService.accessToken.value!, - body: buyer, - ); + final res = await rootLogic.chickenRepository.createOutProvinceCarcassesBuyer( + token: rootLogic.tokenService.accessToken.value!, + body: buyer, + ); }, onSuccess: (result) { getOutProvinceCarcassesBuyer(); @@ -205,4 +198,14 @@ class SalesOutOfProvinceBuyersLogic extends GetxController { selectedCity.value = IranProvinceCityModel(name: item.city); isBuyerSubmitButtonEnabled.value = true; } + + void setSearchValue(String? value) { + searchedValue.value = value?.trim(); + } + + void submitFilter() { + fromDateFilter.value = fromDateFilter.value; + toDateFilter.value = toDateFilter.value; + getOutProvinceCarcassesBuyer(); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index 0ec6714..23b0a04 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -1,8 +1,11 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart'; import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; +import 'package:rasadyar_chicken/presentation/widget/page_route.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; @@ -12,36 +15,44 @@ class SalesOutOfProvinceBuyersPage extends GetView controller.getOutProvinceCarcassesBuyer(true), - onRefresh: () async { - controller.currentPage.value = 1; - await controller.getOutProvinceCarcassesBuyer(); - }, - hasMore: data.value.data?.next!= null, - listType: ListType.separated, - resource: data.value, - padding: EdgeInsets.fromLTRB(8, 8, 8, 80), - itemBuilder: (context, index) { - var item = data.value.data!.results![index]; - return ObxValue((val) { - return ListItem2( - selected: val.contains(index), - onTap: () => controller.isExpandedList.toggle(index), - index: index, - child: itemListWidget(item), - secondChild: itemListExpandedWidget(item), - labelColor: AppColor.blueLight, - labelIcon: Assets.vec.userRaduisSvg.path, - ); - }, controller.isExpandedList); - }, - itemCount: data.value.data?.results?.length ?? 0, - separatorBuilder: (context, index) => SizedBox(height: 8.h), - ); - }, controller.buyerList), + return BasePage( + routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName), + onBackPressed: () => Get.back(id: 1), + onSearchChanged: (data) => controller.setSearchValue(data), + filteringWidget: filterBottomSheet(), + widgets: [ + Expanded( + child: ObxValue((data) { + return RPaginatedListView( + onLoadMore: () async => controller.getOutProvinceCarcassesBuyer(true), + onRefresh: () async { + controller.currentPage.value = 1; + await controller.getOutProvinceCarcassesBuyer(); + }, + hasMore: data.value.data?.next != null, + listType: ListType.separated, + resource: data.value, + padding: EdgeInsets.fromLTRB(8, 8, 8, 80), + itemBuilder: (context, index) { + var item = data.value.data!.results![index]; + return ObxValue((val) { + return ListItem2( + selected: val.contains(index), + onTap: () => controller.isExpandedList.toggle(index), + index: index, + child: itemListWidget(item), + secondChild: itemListExpandedWidget(item), + labelColor: AppColor.blueLight, + labelIcon: Assets.vec.userRaduisSvg.path, + ); + }, controller.isExpandedList); + }, + itemCount: data.value.data?.results?.length ?? 0, + separatorBuilder: (context, index) => SizedBox(height: 8.h), + ); + }, controller.buyerList), + ), + ], floatingActionButton: RFab.add( onPressed: () { Get.bottomSheet(addOrEditBuyerBottomSheet(), isScrollControlled: true); @@ -296,4 +307,12 @@ class SalesOutOfProvinceBuyersPage extends GetView filterBottomSheetWidget( + fromDate: controller.fromDateFilter, + onChangedFromDate: (jalali) => controller.fromDateFilter.value = jalali, + toDate: controller.toDateFilter, + onChangedToDate: (jalali) => controller.toDateFilter.value = jalali, + onSubmit: () => controller.submitFilter(), + ); } diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 1c4ed0d..9247a90 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -82,10 +82,7 @@ class SegmentationLogic extends GetxController { void validateForm() { var weight = int.tryParse(weightController.text.clearComma.trim()); isSubmitButtonEnabled.value = - selectedProduct.value != null && - weightController.text.isNotEmpty && - weight! > 0 - ; + selectedProduct.value != null && weightController.text.isNotEmpty && weight! > 0; } Future getAllSegmentation([bool isLoadingMore = false]) async { @@ -155,7 +152,7 @@ class SegmentationLogic extends GetxController { token: rootLogic.tokenService.accessToken.value!, model: SegmentationModel( key: selectedSegment.value?.key, - weight: int.tryParse(weightController.text) ?? 0, + weight: int.tryParse(weightController.text.clearComma) ?? 0, ), ), onSuccess: (result) { @@ -170,13 +167,16 @@ class SegmentationLogic extends GetxController { Future createSegment() async { var res = true; + SegmentationModel segmentationModel = SegmentationModel( + productKey: selectedProduct.value?.key, + + weight: int.tryParse(weightController.text.clearComma) ?? 0, + ); + iLog(segmentationModel.toString()); safeCall( call: () async => await rootLogic.chickenRepository.createSegmentation( token: rootLogic.tokenService.accessToken.value!, - model: SegmentationModel( - key: selectedProduct.value?.key, - weight: int.tryParse(weightController.text) ?? 0, - ), + model: segmentationModel, ), onSuccess: (result) { res = true; diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index c0cf686..efbe797 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -283,7 +283,7 @@ class SegmentationPage extends GetView { ? await controller.editSegment() : await controller.createSegment(); if (res) { - controller.getAllSegmentation(); + await controller.getAllSegmentation(); controller.clearForm(); Get.back(); } diff --git a/packages/chicken/lib/presentation/widget/base_page/view.dart b/packages/chicken/lib/presentation/widget/base_page/view.dart index 3a98885..4159fc2 100644 --- a/packages/chicken/lib/presentation/widget/base_page/view.dart +++ b/packages/chicken/lib/presentation/widget/base_page/view.dart @@ -50,22 +50,41 @@ class BasePage extends StatefulWidget { class _BasePageState extends State { BaseLogic get controller => Get.find(); Worker? filterWorker; - + bool _isBottomSheetOpen = false; @override void initState() { super.initState(); - filterWorker = ever(controller.isFilterSelected, (bool isSelected) { + /* filterWorker = ever(controller.isFilterSelected, (bool isSelected) { + if (!mounted) return; + if (isSelected && widget.filteringWidget != null) { + // بررسی اینکه آیا bottomSheet از قبل باز است یا نه + if (_isBottomSheetOpen) { + controller.isFilterSelected.value = false; + return; + } + + // بررسی اینکه آیا route فعلی current است یا نه + if (ModalRoute.of(context)?.isCurrent != true) { + controller.isFilterSelected.value = false; + return; + } + + _isBottomSheetOpen = true; Get.bottomSheet( widget.filteringWidget!, isScrollControlled: true, isDismissible: true, enableDrag: true, ).then((_) { - controller.isFilterSelected.value = false; + // تنظیم مقدار به false بعد از بسته شدن bottomSheet + if (mounted) { + _isBottomSheetOpen = false; + controller.isFilterSelected.value = false; + } }); } - }); + });*/ } @override @@ -73,6 +92,24 @@ class _BasePageState extends State { filterWorker?.dispose(); super.dispose(); } + void _onFilterTap() { + if (widget.hasFilter && widget.filteringWidget != null) { + // بررسی اینکه آیا این route در top است یا نه + final currentRoute = ModalRoute.of(context); + if (currentRoute?.isCurrent != true) { + return; + } + + // مستقیماً bottomSheet را باز کنید + Get.bottomSheet( + widget.filteringWidget!, + isScrollControlled: true, + isDismissible: true, + enableDrag: true, + ); + } + } + @override Widget build(BuildContext context) { @@ -87,7 +124,7 @@ class _BasePageState extends State { hasFilter: widget.hasFilter, hasSearch: widget.hasSearch, isBase: widget.isBase, - onFilterTap: widget.hasFilter ? () => controller.toggleFilter() : null, + onFilterTap: widget.hasFilter ? _onFilterTap : null, onSearchTap: widget.hasSearch ? () => Get.find().toggleSearch() : null, ), body: Column( diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index a4f7459..e1d9d73 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -15,12 +15,12 @@ class DioRemote implements IHttpClient { if (kDebugMode) { dio.interceptors.add( PrettyDioLogger( - request: false, - enabled: false, - requestHeader: false, - responseHeader: false, - requestBody: false, - responseBody: false, + request: true, + enabled: true, + requestHeader: true, + responseHeader: true, + requestBody: true, + responseBody: true, ), ); } From 69945a29cfe0f7be7d4811ca5eddc052fbf9b9d4 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 19 Jul 2025 08:48:31 +0330 Subject: [PATCH 215/256] fix : clearTokenCallback in AppInterceptor in diChicken --- lib/infrastructure/service/app_navigation_observer.dart | 2 +- packages/chicken/lib/data/di/chicken_di.dart | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart index 12afc4d..068fe2d 100644 --- a/lib/infrastructure/service/app_navigation_observer.dart +++ b/lib/infrastructure/service/app_navigation_observer.dart @@ -18,7 +18,7 @@ class CustomNavigationObserver extends NavigatorObserver { _isWorkDone = true; await setupInjection(); } - iLog('message'); + iLog('didPush'); } diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index 1c5aece..3335a4d 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -1,4 +1,6 @@ +import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; +import 'package:rasadyar_auth/presentation/routes/pages.dart'; import 'package:rasadyar_chicken/data/datasource/local/chicken_local_imp.dart'; import 'package:rasadyar_chicken/data/datasource/remote/chicken_remote_imp.dart'; import 'package:rasadyar_chicken/data/repositories/chicken_repository_imp.dart'; @@ -21,6 +23,7 @@ Future setupChickenDI() async { }, clearTokenCallback: () async { await tokenService.deleteTokens(); + Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); }, ), instanceName: 'chickenInterceptor', From 3683e8a9e6ecba3776e0c2ca5e8e4caf1e6e3590 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 19 Jul 2025 15:35:07 +0330 Subject: [PATCH 216/256] feat : apk installer --- android/app/src/main/AndroidManifest.xml | 10 +- .../kotlin/ir/mnpc/rasadyar/ApkInstaller.kt | 294 ++++++++++++++++++ .../kotlin/ir/mnpc/rasadyar/MainActivity.kt | 76 ++++- android/app/src/main/res/xml/file_paths.xml | 6 +- lib/infrastructure/di/di.dart | 17 +- lib/presentation/pages/splash/logic.dart | 175 ++++++++++- lib/presentation/pages/splash/view.dart | 1 + packages/core/lib/core.dart | 41 ++- .../lib/infrastructure/remote/dio_remote.dart | 9 +- .../presentation/widget/dialog/dialog.dart | 3 +- .../widget/dialog/update_dialog.dart | 53 ++++ packages/core/pubspec.lock | 14 +- packages/core/pubspec.yaml | 7 +- .../lib/presentation/root/logic.dart | 2 +- pubspec.lock | 12 +- 15 files changed, 641 insertions(+), 79 deletions(-) create mode 100644 android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt create mode 100644 packages/core/lib/presentation/widget/dialog/update_dialog.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7c7e1d7..96504e7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,14 @@ + + + + diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt new file mode 100644 index 0000000..3fb5dbe --- /dev/null +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt @@ -0,0 +1,294 @@ +package ir.mnpc.rasadyar + +import android.app.Activity +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInstaller +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.provider.Settings +import android.util.Log +import android.widget.Toast +import androidx.core.content.FileProvider +import java.io.File +import androidx.core.net.toUri + + +class ApkInstaller(private val context: Context) { + + + companion object { + const val INSTALL_REQUEST_CODE = 1001 + private const val TAG = "ApkInstaller" + } + + /** + * Install APK with compatibility for Android 5-15 + */ + fun installApk(apkFile: File) { + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { + // Android 8+ (API 26+) - Use PackageInstaller API + installWithPackageInstaller(apkFile) + } + + Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> { + // Android 7+ (API 24+) - Use FileProvider with Intent + installWithFileProvider(apkFile) + } + + else -> { + // Android 5-6 (API 21-23) - Use file URI with Intent + installWithFileUri(apkFile) + } + } + } + + /** + * Android 8+ (API 26+) - PackageInstaller API + */ + private fun installWithPackageInstaller(apkFile: File) { + try { + val packageInstaller = context.packageManager.packageInstaller + val params = PackageInstaller.SessionParams( + PackageInstaller.SessionParams.MODE_FULL_INSTALL + ) + + // Set installer package name for better tracking + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + params.setInstallReason(PackageManager.INSTALL_REASON_USER) + } + + val sessionId = packageInstaller.createSession(params) + val session = packageInstaller.openSession(sessionId) + + session.use { activeSession -> + apkFile.inputStream().use { inputStream -> + activeSession.openWrite("package", 0, apkFile.length()).use { outputStream -> + inputStream.copyTo(outputStream) + activeSession.fsync(outputStream) + } + } + + val intent = Intent(context, InstallResultReceiver::class.java).apply { + action = "com.yourpackage.INSTALL_RESULT" + } + + val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + + val pendingIntent = PendingIntent.getBroadcast( + context, 0, intent, flags + ) + + activeSession.commit(pendingIntent.intentSender) + } + } catch (e: Exception) { + Log.e(TAG, "Error installing with PackageInstaller", e) + // Fallback to intent method + installWithFileProvider(apkFile) + } + } + + /** + * Android 7+ (API 24+) - FileProvider with Intent + */ + private fun installWithFileProvider(apkFile: File) { + try { + val apkUri = FileProvider.getUriForFile( + context, + "${context.packageName}.fileprovider", + apkFile + ) + + val intent = createInstallIntent(apkUri).apply { + flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK + + // Additional flags for better compatibility + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) + putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, context.packageName) + } + } + + if (context is Activity) { + context.startActivityForResult(intent, INSTALL_REQUEST_CODE) + } else { + context.startActivity(intent) + } + } catch (e: Exception) { + Log.e(TAG, "Error installing with FileProvider", e) + // Final fallback for Android 7+ + installWithFileUri(apkFile) + } + } + + /** + * Android 5-6 (API 21-23) - File URI with Intent + */ + private fun installWithFileUri(apkFile: File) { + try { + val apkUri = Uri.fromFile(apkFile) + val intent = createInstallIntent(apkUri).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + + if (context is Activity) { + context.startActivityForResult(intent, INSTALL_REQUEST_CODE) + } else { + context.startActivity(intent) + } + } catch (e: Exception) { + Log.e(TAG, "Error installing with file URI", e) + } + } + + /** + * Create appropriate install intent based on Android version + */ + private fun createInstallIntent(uri: Uri): Intent { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Intent(Intent.ACTION_INSTALL_PACKAGE).apply { + data = uri + } + } else { + Intent(Intent.ACTION_VIEW).apply { + setDataAndType(uri, "application/vnd.android.package-archive") + } + } + } + + /** + * Check if installation from unknown sources is allowed + */ + fun canInstallPackages(): Boolean { + return when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { + context.packageManager.canRequestPackageInstalls() + } + + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + try { + Settings.Secure.getInt( + context.contentResolver, + Settings.Secure.INSTALL_NON_MARKET_APPS + ) == 1 + } catch (e: Settings.SettingNotFoundException) { + false + } + } + + else -> { + // For older versions, assume it's allowed + true + } + } + } + + /** + * Request permission to install packages + */ + fun requestInstallPermission() { + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { + if (!context.packageManager.canRequestPackageInstalls()) { + val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply { + data = "package:${context.packageName}".toUri() + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + context.startActivity(intent) + } + } + + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + val intent = Intent(Settings.ACTION_SECURITY_SETTINGS).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + context.startActivity(intent) + } + } + } + + /** + * Check if APK file is valid + */ + fun isValidApkFile(apkFile: File): Boolean { + if (!apkFile.exists() || !apkFile.canRead()) { + return false + } + + return try { + val packageInfo = context.packageManager.getPackageArchiveInfo( + apkFile.absolutePath, + PackageManager.GET_ACTIVITIES + ) + packageInfo != null + } catch (e: Exception) { + Log.e(TAG, "Error validating APK file", e) + false + } + } + +} + +class InstallResultReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -1)) { + PackageInstaller.STATUS_SUCCESS -> { + Log.d("InstallResult", "Installation successful") + // Handle successful installation + Toast.makeText(context, "Installation successful", Toast.LENGTH_SHORT).show() + } + + PackageInstaller.STATUS_FAILURE -> { + val message = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + Log.e("InstallResult", "Installation failed: $message") + Toast.makeText(context, "Installation failed: $message", Toast.LENGTH_LONG).show() + } + + PackageInstaller.STATUS_FAILURE_BLOCKED -> { + Log.e("InstallResult", "Installation blocked") + Toast.makeText(context, "Installation blocked by system", Toast.LENGTH_LONG).show() + } + + PackageInstaller.STATUS_FAILURE_ABORTED -> { + Log.e("InstallResult", "Installation aborted") + Toast.makeText(context, "Installation was cancelled", Toast.LENGTH_SHORT).show() + } + + PackageInstaller.STATUS_FAILURE_INVALID -> { + Log.e("InstallResult", "Invalid APK") + Toast.makeText(context, "Invalid APK file", Toast.LENGTH_LONG).show() + } + + PackageInstaller.STATUS_FAILURE_CONFLICT -> { + Log.e("InstallResult", "Installation conflict") + Toast.makeText( + context, + "Installation conflict with existing app", + Toast.LENGTH_LONG + ).show() + } + + PackageInstaller.STATUS_FAILURE_STORAGE -> { + Log.e("InstallResult", "Insufficient storage") + Toast.makeText(context, "Insufficient storage space", Toast.LENGTH_LONG).show() + } + + PackageInstaller.STATUS_FAILURE_INCOMPATIBLE -> { + Log.e("InstallResult", "Incompatible app") + Toast.makeText(context, "App is incompatible with device", Toast.LENGTH_LONG).show() + } + + else -> { + Log.w("InstallResult", "Unknown status: $status") + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt index 5bae765..33565df 100644 --- a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt @@ -3,16 +3,22 @@ package ir.mnpc.rasadyar import android.content.Intent import android.net.Uri import android.os.Build -import android.os.Bundle +import android.provider.Settings +import android.util.Log +import androidx.annotation.RequiresApi import androidx.core.content.FileProvider import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel import java.io.File +import androidx.core.net.toUri class MainActivity : FlutterActivity() { private val CHANNEL = "apk_installer" + private val INSTALL_PACKAGES_REQUEST_CODE = 1001 + val installer = ApkInstaller(this) + private val TAG = "cj" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) @@ -21,9 +27,18 @@ class MainActivity : FlutterActivity() { flutterEngine.dartExecutor.binaryMessenger, CHANNEL ).setMethodCallHandler { call, result -> - if (call.method == "installApk") { + if (call.method == "apk_installer") { val apkPath = call.argument("appPath") ?: "" - installApk(apkPath) + Log.i(TAG, "configureFlutterEngine: $apkPath") + val apkFile = File(getExternalFilesDir(null), apkPath) + Log.i(TAG, "apkFile: $apkFile") + Log.i(TAG, "externalStorageDirectory: ${getExternalFilesDir(null)}") + /* + if (!installer.canInstallPackages()) { + installer.requestInstallPermission() + } else { + installer.installApk(apkFile) + }*/ result.success(null) } } @@ -34,24 +49,51 @@ class MainActivity : FlutterActivity() { private fun installApk(path: String) { val file = File(path) - val intent = Intent(Intent.ACTION_VIEW) - intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK - val apkUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - val uri = FileProvider.getUriForFile( - applicationContext, - "${applicationContext.packageName}.fileprovider", - file - ) - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - uri - } else { - Uri.fromFile(file) + if (!file.exists()) { + Log.e("jojo", "APK file does not exist: $path") + return } - intent.setDataAndType(apkUri, "application/vnd.android.package-archive") - applicationContext.startActivity(intent) + // Check if we can install unknown apps (Android 8.0+) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + if (!packageManager.canRequestPackageInstalls()) { + requestInstallPermission() + return + } + } + val intent = Intent(Intent.ACTION_VIEW).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + try { + val apkUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + FileProvider.getUriForFile( + context, + "${context.packageName}.fileprovider", + file + ).also { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + } else { + Uri.fromFile(file) + } + + intent.setDataAndType(apkUri, "application/vnd.android.package-archive") + context.startActivity(intent) + + } catch (e: Exception) { + Log.e("jojo", "installApk error: ${e.message}", e) + } } + @RequiresApi(Build.VERSION_CODES.O) + private fun requestInstallPermission() { + val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply { + data = "package:$packageName".toUri() + } + startActivityForResult(intent, INSTALL_PACKAGES_REQUEST_CODE) + } + + } diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml index 03d4219..fa0400e 100644 --- a/android/app/src/main/res/xml/file_paths.xml +++ b/android/app/src/main/res/xml/file_paths.xml @@ -1,6 +1,6 @@ - + + + diff --git a/lib/infrastructure/di/di.dart b/lib/infrastructure/di/di.dart index 8ef306c..c1aebef 100644 --- a/lib/infrastructure/di/di.dart +++ b/lib/infrastructure/di/di.dart @@ -1,23 +1,18 @@ - import 'package:rasadyar_auth/auth.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_core/core.dart'; final di = GetIt.instance; -Future setupPreInjection() async{ +Future setupPreInjection() async { await setupAllCoreProvider(); await setupAuthDI(); - - - + di.registerSingleton( + DioRemote(baseUrl: 'https://everestacademy.ir/'), + instanceName: 'baseRemote', + ); } -Future setupInjection() async{ - +Future setupInjection() async { await setupChickenDI(); - - } - - diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 8f26018..305ccac 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -1,5 +1,7 @@ -import 'package:flutter/animation.dart'; -import 'package:rasadyar_app/presentation/routes/app_pages.dart'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; @@ -8,6 +10,11 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { late final AnimationController rotateController; Rxn> scaleAnimation = Rxn(); Rxn> rotationAnimation = Rxn(); + RxBool hasUpdated = false.obs; + RxBool onUpdateDownload = false.obs; + RxDouble percent = 0.0.obs; + final RxnString _updateFilePath = RxnString(); + final platform = MethodChannel('apk_installer'); var tokenService = Get.find(); @@ -24,15 +31,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { duration: const Duration(milliseconds: 8000), ); - scaleAnimation.value = Tween( - begin: 0.8, - end: 1.2, - ).animate(scaleController); + scaleAnimation.value = Tween(begin: 0.8, end: 1.2).animate(scaleController); - rotationAnimation.value = Tween( - begin: 0.0, - end: 1, - ).animate(rotateController); + rotationAnimation.value = Tween(begin: 0.0, end: 1).animate(rotateController); rotateController.forward(); rotateController.addStatusListener((status) { @@ -51,21 +52,171 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { scaleController.forward(); } }); + + hasUpdated.listen((data) { + if (data) { + requiredUpdateDialog( + onConfirm: () async { + await fileDownload(); + }, + ); + } else if (!data && Get.isDialogOpen == true) { + Get.back(); + } + }); + onUpdateDownload.listen((data) { + hasUpdated.value = false; + if (data) { + Get.bottomSheet( + isDismissible: false, + isScrollControlled: true, + backgroundColor: Colors.transparent, + Container( + height: 170, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)), + ), + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + spacing: 8, + children: [ + const Text('در حال دانلود بروزرسانی برنامه...'), + Obx( + () => Row( + spacing: 8, + children: [ + Expanded( + child: LinearProgressIndicator( + value: percent.value, + color: AppColor.greenNormal, + minHeight: 4, + ), + ), + SizedBox( + width: 55.w, + child: Text( + '${(percent.value * 100).toStringAsFixed(2)}%', + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + + Row( + spacing: 8, + children: [ + Expanded( + child: ObxValue((data) { + return RElevated( + backgroundColor: AppColor.greenNormal, + height: 40.h, + onPressed: data.value != null + ? () { + installApk(); + Get.back(); + } + : null, + text: 'نصب', + ); + }, _updateFilePath), + ), + Expanded( + child: ROutlinedElevated( + borderColor: AppColor.error, + text: 'خروج', + onPressed: () async { + exit(0); + }, + ), + ), + ], + ), + ], + ), + ), + ); + } + }); } @override void onReady() { super.onReady(); - Future.delayed(const Duration(seconds: 1), () async { + + hasUpdated.value = !hasUpdated.value; + + //TODO + /*Future.delayed(const Duration(seconds: 1), () async { var module = tokenService.appModule.value; Get.offAndToNamed(getTargetPage(module)); - }); + });*/ } @override void onClose() { rotateController.dispose(); scaleController.dispose(); + super.onClose(); } + + Future fileDownload() async { + onUpdateDownload.value = true; + Dio dio = Dio(); + final dir = await getApplicationDocumentsDirectory(); + final filePath = "${dir.path}/app-release.apk"; + final file = File(filePath); + if (await file.exists()) { + await file.delete(); + } + int attempts = 0; + int retryCount = 4; + bool success = false; + + while (attempts < retryCount && !success) { + try { + await dio.download( + 'https://everestacademy.ir/app/app-release.apk', + filePath, + onReceiveProgress: (count, total) { + if (total != -1 && total > 0) { + percent.value = count / total; + } + }, + ); + success = true; + } on DioException catch (e) { + attempts++; + percent.value = 0.0; + if (attempts >= retryCount) { + eLog("Download failed after $attempts attempts: ${e.message}"); + } else { + await Future.delayed(const Duration(milliseconds: 1200)); + } + } + } + + if (success) { + _updateFilePath.value = filePath; + + tLog(filePath); + fLog(_updateFilePath.value); + } + + onUpdateDownload.value = false; + } + + Future installApk() async { + try { + eLog(_updateFilePath.value); + + final dir = await getApplicationDocumentsDirectory(); + await platform.invokeMethod('apk_installer', {'appPath': _updateFilePath.value}); + } catch (e) { + print("خطا در نصب: $e"); + } + } } diff --git a/lib/presentation/pages/splash/view.dart b/lib/presentation/pages/splash/view.dart index 4cd5ce8..140ed32 100644 --- a/lib/presentation/pages/splash/view.dart +++ b/lib/presentation/pages/splash/view.dart @@ -15,6 +15,7 @@ class SplashPage extends GetView { child: Stack( alignment: Alignment.center, children: [ + ObxValue((data) { return ScaleTransition( scale: data.value!, diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index 6d9a392..eb3c911 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -1,56 +1,53 @@ library; -//models -export 'data/model/pagination_model/pagination_model.dart'; - +export 'package:android_intent_plus/android_intent.dart'; +export 'package:android_intent_plus/flag.dart'; +export 'package:device_info_plus/device_info_plus.dart'; +export 'package:dio/dio.dart'; //other packages export 'package:flutter_localizations/flutter_localizations.dart'; export 'package:flutter_map/flutter_map.dart'; export 'package:flutter_map_animations/flutter_map_animations.dart'; export 'package:flutter_rating_bar/flutter_rating_bar.dart'; +export 'package:flutter_screenutil/flutter_screenutil.dart'; export 'package:flutter_secure_storage/flutter_secure_storage.dart'; export 'package:flutter_slidable/flutter_slidable.dart'; export 'package:font_awesome_flutter/font_awesome_flutter.dart'; -export 'package:device_info_plus/device_info_plus.dart'; -export 'package:dio/dio.dart'; -export 'package:pretty_dio_logger/pretty_dio_logger.dart'; -export 'package:flutter_screenutil/flutter_screenutil.dart'; - //freezed export 'package:freezed_annotation/freezed_annotation.dart'; export 'package:geolocator/geolocator.dart'; export 'package:get/get.dart' hide FormData, MultipartFile, Response; - //di export 'package:get_it/get_it.dart'; -export 'injection/di.dart'; - //local storage export 'package:hive_ce_flutter/hive_flutter.dart'; -export 'infrastructure/local/hive_local_storage.dart'; - +///image picker +export 'package:image_picker/image_picker.dart'; //encryption //export 'package:encrypt/encrypt.dart' show Encrypted; //Map and location export 'package:latlong2/latlong.dart'; +export 'package:path_provider/path_provider.dart'; +export 'package:permission_handler/permission_handler.dart' hide ServiceStatus; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; +export 'package:pretty_dio_logger/pretty_dio_logger.dart'; export 'package:rasadyar_core/presentation/common/common.dart'; export 'package:rasadyar_core/presentation/utils/utils.dart'; export 'package:rasadyar_core/presentation/widget/widget.dart'; +//models +export 'data/model/pagination_model/pagination_model.dart'; //infrastructure export 'infrastructure/infrastructure.dart'; - -///image picker -export 'package:image_picker/image_picker.dart'; - -//utils -export 'utils/logger_utils.dart'; -export 'utils/network/network.dart'; +export 'infrastructure/local/hive_local_storage.dart'; +export 'injection/di.dart'; export 'utils/extension/date_time_utils.dart'; export 'utils/extension/num_utils.dart'; -export 'utils/map_utils.dart'; -export 'utils/route_utils.dart'; export 'utils/extension/string_utils.dart'; +//utils +export 'utils/logger_utils.dart'; +export 'utils/map_utils.dart'; +export 'utils/network/network.dart'; +export 'utils/route_utils.dart'; export 'utils/separator_input_formatter.dart'; diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index e1d9d73..b5b179e 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -4,14 +4,17 @@ import 'package:rasadyar_core/core.dart'; class DioRemote implements IHttpClient { String? baseUrl; late Dio dio; - final AppInterceptor interceptors; + AppInterceptor? interceptors; - DioRemote({this.baseUrl, required this.interceptors}); + DioRemote({this.baseUrl, this.interceptors}); @override Future init() async { dio = Dio(BaseOptions(baseUrl: baseUrl ?? '')); - dio.interceptors.add(interceptors); + if (interceptors != null) { + dio.interceptors.add(interceptors!); + } + if (kDebugMode) { dio.interceptors.add( PrettyDioLogger( diff --git a/packages/core/lib/presentation/widget/dialog/dialog.dart b/packages/core/lib/presentation/widget/dialog/dialog.dart index 788ecce..9f489da 100644 --- a/packages/core/lib/presentation/widget/dialog/dialog.dart +++ b/packages/core/lib/presentation/widget/dialog/dialog.dart @@ -1,2 +1,3 @@ export 'delete_dialog.dart'; -export 'warning_dialog.dart'; \ No newline at end of file +export 'warning_dialog.dart'; +export 'update_dialog.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/dialog/update_dialog.dart b/packages/core/lib/presentation/widget/dialog/update_dialog.dart new file mode 100644 index 0000000..0b4e748 --- /dev/null +++ b/packages/core/lib/presentation/widget/dialog/update_dialog.dart @@ -0,0 +1,53 @@ +import 'dart:io'; + +import 'package:rasadyar_core/core.dart'; + +Future requiredUpdateDialog({required Future Function() onConfirm}) async { + await Get.defaultDialog( + barrierDismissible: false, + onWillPop: () async => false, + title: 'بروزرسانی', + middleText: 'برای استفاده از امکانات برنامه لطفا برنامه را بروز رسانی نمایید.', + confirm: RElevated( + height: 40.h, + width: 150.w, + text: 'خروج', + backgroundColor: AppColor.error, + onPressed: () { + exit(0); + }, + ), + + cancel: RElevated( + height: 40.h, + width: 150.w, + text: 'بروز رسانی', + onPressed: onConfirm, + backgroundColor: AppColor.greenNormal, + ), + ); +} + +Future optionalUpdateDialog({required Future Function() onConfirm}) async { + await Get.defaultDialog( + barrierDismissible: false, + onWillPop: () async => false, + title: 'بروزرسانی', + middleText: 'برای استفاده از امکانات جدید برنامه می توانید آن را بروزرسانی نمایید.', + confirm: RElevated( + height: 40.h, + width: 150.w, + text: 'ادامه', + backgroundColor: AppColor.error, + onPressed: () => Get.back(), + ), + + cancel: RElevated( + height: 40.h, + width: 150.w, + text: 'بروز رسانی', + onPressed: onConfirm, + backgroundColor: AppColor.greenNormal, + ), + ); +} diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 1965d8f..9cb141c 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.4.5" + android_intent_plus: + dependency: "direct main" + description: + name: android_intent_plus + sha256: dfc1fd3a577205ae8f11e990fb4ece8c90cceabbee56fcf48e463ecf0bd6aae3 + url: "https://pub.dev" + source: hosted + version: "5.3.0" archive: dependency: transitive description: @@ -926,7 +934,7 @@ packages: source: hosted version: "1.1.0" path_provider: - dependency: transitive + dependency: "direct main" description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" @@ -977,10 +985,10 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" + sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 url: "https://pub.dev" source: hosted - version: "12.0.0+1" + version: "12.0.1" permission_handler_android: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 263fceb..852db42 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -37,8 +37,7 @@ dependencies: hive_ce: ^2.11.1 hive_ce_flutter: ^2.3.0 flutter_secure_storage: ^9.2.4 - - + path_provider: ^2.1.5 #SVG flutter_svg: ^2.0.17 @@ -57,13 +56,15 @@ dependencies: get_it: ^8.0.3 #other - permission_handler: ^12.0.0+1 + permission_handler: ^12.0.1 persian_datetime_picker: ^3.1.0 encrypt: ^5.0.3 #L10N tools intl: ^0.20.2 + #INITENT + android_intent_plus: ^5.3.0 #Map flutter_map: ^8.1.1 diff --git a/packages/inspection/lib/presentation/root/logic.dart b/packages/inspection/lib/presentation/root/logic.dart index e95a9b3..31bd149 100644 --- a/packages/inspection/lib/presentation/root/logic.dart +++ b/packages/inspection/lib/presentation/root/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/core.dart' ; import 'package:rasadyar_inspection/presentation/action/view.dart'; import 'package:rasadyar_inspection/presentation/filter/view.dart'; import 'package:rasadyar_inspection/presentation/profile/view.dart'; diff --git a/pubspec.lock b/pubspec.lock index 1bba7de..2e46f88 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.4.5" + android_intent_plus: + dependency: transitive + description: + name: android_intent_plus + sha256: dfc1fd3a577205ae8f11e990fb4ece8c90cceabbee56fcf48e463ecf0bd6aae3 + url: "https://pub.dev" + source: hosted + version: "5.3.0" archive: dependency: transitive description: @@ -1009,10 +1017,10 @@ packages: dependency: transitive description: name: permission_handler - sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" + sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 url: "https://pub.dev" source: hosted - version: "12.0.0+1" + version: "12.0.1" permission_handler_android: dependency: transitive description: From 1cfc6e2dbd7d234cc2be3ce1b5e9e480b758b54c Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Jul 2025 09:40:41 +0330 Subject: [PATCH 217/256] fix : apk internal updater --- .../kotlin/ir/mnpc/rasadyar/ApkInstaller.kt | 46 ++++-------- .../kotlin/ir/mnpc/rasadyar/MainActivity.kt | 71 ++++--------------- android/app/src/main/res/xml/file_paths.xml | 4 +- 3 files changed, 31 insertions(+), 90 deletions(-) diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt index 3fb5dbe..aa64136 100644 --- a/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/ApkInstaller.kt @@ -19,10 +19,12 @@ import androidx.core.net.toUri class ApkInstaller(private val context: Context) { + var pendingApkFile: File? = null companion object { const val INSTALL_REQUEST_CODE = 1001 - private const val TAG = "ApkInstaller" + const val INSTALL_PERMISSION_REQUEST_CODE =2001 + } /** @@ -32,7 +34,7 @@ class ApkInstaller(private val context: Context) { when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { // Android 8+ (API 26+) - Use PackageInstaller API - installWithPackageInstaller(apkFile) + installWithFileProvider(apkFile) } Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> { @@ -74,7 +76,7 @@ class ApkInstaller(private val context: Context) { } val intent = Intent(context, InstallResultReceiver::class.java).apply { - action = "com.yourpackage.INSTALL_RESULT" + action = "${context.packageName}.INSTALL_RESULT" } val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -90,7 +92,6 @@ class ApkInstaller(private val context: Context) { activeSession.commit(pendingIntent.intentSender) } } catch (e: Exception) { - Log.e(TAG, "Error installing with PackageInstaller", e) // Fallback to intent method installWithFileProvider(apkFile) } @@ -123,7 +124,7 @@ class ApkInstaller(private val context: Context) { context.startActivity(intent) } } catch (e: Exception) { - Log.e(TAG, "Error installing with FileProvider", e) + // Final fallback for Android 7+ installWithFileUri(apkFile) } @@ -145,7 +146,7 @@ class ApkInstaller(private val context: Context) { context.startActivity(intent) } } catch (e: Exception) { - Log.e(TAG, "Error installing with file URI", e) + } } @@ -194,46 +195,25 @@ class ApkInstaller(private val context: Context) { /** * Request permission to install packages */ - fun requestInstallPermission() { + fun requestInstallPermission(activity: Activity) { when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { - if (!context.packageManager.canRequestPackageInstalls()) { + if (!activity.packageManager.canRequestPackageInstalls()) { val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply { - data = "package:${context.packageName}".toUri() - flags = Intent.FLAG_ACTIVITY_NEW_TASK + data = "package:${activity.packageName}".toUri() } - context.startActivity(intent) + activity.startActivityForResult(intent, INSTALL_PERMISSION_REQUEST_CODE) } } Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { - val intent = Intent(Settings.ACTION_SECURITY_SETTINGS).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } - context.startActivity(intent) + val intent = Intent(Settings.ACTION_SECURITY_SETTINGS) + activity.startActivityForResult(intent, INSTALL_PERMISSION_REQUEST_CODE) } } } - /** - * Check if APK file is valid - */ - fun isValidApkFile(apkFile: File): Boolean { - if (!apkFile.exists() || !apkFile.canRead()) { - return false - } - return try { - val packageInfo = context.packageManager.getPackageArchiveInfo( - apkFile.absolutePath, - PackageManager.GET_ACTIVITIES - ) - packageInfo != null - } catch (e: Exception) { - Log.e(TAG, "Error validating APK file", e) - false - } - } } diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt index 33565df..077f851 100644 --- a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt @@ -17,7 +17,7 @@ class MainActivity : FlutterActivity() { private val CHANNEL = "apk_installer" private val INSTALL_PACKAGES_REQUEST_CODE = 1001 - val installer = ApkInstaller(this) + private val installer = ApkInstaller(this) private val TAG = "cj" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { @@ -28,17 +28,16 @@ class MainActivity : FlutterActivity() { CHANNEL ).setMethodCallHandler { call, result -> if (call.method == "apk_installer") { - val apkPath = call.argument("appPath") ?: "" - Log.i(TAG, "configureFlutterEngine: $apkPath") - val apkFile = File(getExternalFilesDir(null), apkPath) - Log.i(TAG, "apkFile: $apkFile") - Log.i(TAG, "externalStorageDirectory: ${getExternalFilesDir(null)}") - /* + val internalFile = File(context.filesDir.parentFile, "app_flutter/app-release.apk") + val externalFile = File(context.getExternalFilesDir(null), "app-release.apk") + + internalFile.copyTo(externalFile, overwrite = true) if (!installer.canInstallPackages()) { - installer.requestInstallPermission() + installer.pendingApkFile = externalFile + installer.requestInstallPermission(activity) } else { - installer.installApk(apkFile) - }*/ + installer.installApk(externalFile) + } result.success(null) } } @@ -46,54 +45,14 @@ class MainActivity : FlutterActivity() { } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) - private fun installApk(path: String) { - val file = File(path) - if (!file.exists()) { - Log.e("jojo", "APK file does not exist: $path") - return - } - - // Check if we can install unknown apps (Android 8.0+) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - if (!packageManager.canRequestPackageInstalls()) { - requestInstallPermission() - return + if (requestCode == ApkInstaller.INSTALL_PERMISSION_REQUEST_CODE) { + if (installer.canInstallPackages() && installer.pendingApkFile != null) { + installer.installApk(installer.pendingApkFile!!) + installer.pendingApkFile = null } } - - val intent = Intent(Intent.ACTION_VIEW).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } - - try { - val apkUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - FileProvider.getUriForFile( - context, - "${context.packageName}.fileprovider", - file - ).also { - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - } - } else { - Uri.fromFile(file) - } - - intent.setDataAndType(apkUri, "application/vnd.android.package-archive") - context.startActivity(intent) - - } catch (e: Exception) { - Log.e("jojo", "installApk error: ${e.message}", e) - } } - - @RequiresApi(Build.VERSION_CODES.O) - private fun requestInstallPermission() { - val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply { - data = "package:$packageName".toUri() - } - startActivityForResult(intent, INSTALL_PACKAGES_REQUEST_CODE) - } - - } diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml index fa0400e..ad6701e 100644 --- a/android/app/src/main/res/xml/file_paths.xml +++ b/android/app/src/main/res/xml/file_paths.xml @@ -2,5 +2,7 @@ - + From 3808161c883ca2c2d5a608a43e4df989f5d5014b Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Jul 2025 11:31:23 +0330 Subject: [PATCH 218/256] feat : app version check in splash --- lib/data/model/app_info_model.dart | 28 ++ lib/data/model/app_info_model.freezed.dart | 311 ++++++++++++++++++ lib/data/model/app_info_model.g.dart | 33 ++ lib/presentation/pages/splash/logic.dart | 46 ++- packages/core/lib/core.dart | 1 + .../lib/utils/extension/string_utils.dart | 2 + packages/core/pubspec.lock | 16 + packages/core/pubspec.yaml | 1 + pubspec.lock | 16 + 9 files changed, 443 insertions(+), 11 deletions(-) create mode 100644 lib/data/model/app_info_model.dart create mode 100644 lib/data/model/app_info_model.freezed.dart create mode 100644 lib/data/model/app_info_model.g.dart diff --git a/lib/data/model/app_info_model.dart b/lib/data/model/app_info_model.dart new file mode 100644 index 0000000..b564474 --- /dev/null +++ b/lib/data/model/app_info_model.dart @@ -0,0 +1,28 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'app_info_model.freezed.dart'; +part 'app_info_model.g.dart'; + +@freezed +abstract class AppInfoModel with _$AppInfoModel { + const factory AppInfoModel({ + required String key, + required Info info, + required String downloadLink, + }) = _AppInfoModel; + + factory AppInfoModel.fromJson(Map json) => + _$AppInfoModelFromJson(json); +} + +@freezed +abstract class Info with _$Info { + const factory Info({ + required String version, + required bool required, + required String module, + }) = _Info; + + factory Info.fromJson(Map json) => _$InfoFromJson(json); +} + diff --git a/lib/data/model/app_info_model.freezed.dart b/lib/data/model/app_info_model.freezed.dart new file mode 100644 index 0000000..149e987 --- /dev/null +++ b/lib/data/model/app_info_model.freezed.dart @@ -0,0 +1,311 @@ +// dart format width=80 +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'app_info_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$AppInfoModel { + + String get key; Info get info; String get downloadLink; +/// Create a copy of AppInfoModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AppInfoModelCopyWith get copyWith => _$AppInfoModelCopyWithImpl(this as AppInfoModel, _$identity); + + /// Serializes this AppInfoModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.info, info) || other.info == info)&&(identical(other.downloadLink, downloadLink) || other.downloadLink == downloadLink)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,info,downloadLink); + +@override +String toString() { + return 'AppInfoModel(key: $key, info: $info, downloadLink: $downloadLink)'; +} + + +} + +/// @nodoc +abstract mixin class $AppInfoModelCopyWith<$Res> { + factory $AppInfoModelCopyWith(AppInfoModel value, $Res Function(AppInfoModel) _then) = _$AppInfoModelCopyWithImpl; +@useResult +$Res call({ + String key, Info info, String downloadLink +}); + + +$InfoCopyWith<$Res> get info; + +} +/// @nodoc +class _$AppInfoModelCopyWithImpl<$Res> + implements $AppInfoModelCopyWith<$Res> { + _$AppInfoModelCopyWithImpl(this._self, this._then); + + final AppInfoModel _self; + final $Res Function(AppInfoModel) _then; + +/// Create a copy of AppInfoModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = null,Object? info = null,Object? downloadLink = null,}) { + return _then(_self.copyWith( +key: null == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String,info: null == info ? _self.info : info // ignore: cast_nullable_to_non_nullable +as Info,downloadLink: null == downloadLink ? _self.downloadLink : downloadLink // ignore: cast_nullable_to_non_nullable +as String, + )); +} +/// Create a copy of AppInfoModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$InfoCopyWith<$Res> get info { + + return $InfoCopyWith<$Res>(_self.info, (value) { + return _then(_self.copyWith(info: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _AppInfoModel implements AppInfoModel { + const _AppInfoModel({required this.key, required this.info, required this.downloadLink}); + factory _AppInfoModel.fromJson(Map json) => _$AppInfoModelFromJson(json); + +@override final String key; +@override final Info info; +@override final String downloadLink; + +/// Create a copy of AppInfoModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$AppInfoModelCopyWith<_AppInfoModel> get copyWith => __$AppInfoModelCopyWithImpl<_AppInfoModel>(this, _$identity); + +@override +Map toJson() { + return _$AppInfoModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.info, info) || other.info == info)&&(identical(other.downloadLink, downloadLink) || other.downloadLink == downloadLink)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,info,downloadLink); + +@override +String toString() { + return 'AppInfoModel(key: $key, info: $info, downloadLink: $downloadLink)'; +} + + +} + +/// @nodoc +abstract mixin class _$AppInfoModelCopyWith<$Res> implements $AppInfoModelCopyWith<$Res> { + factory _$AppInfoModelCopyWith(_AppInfoModel value, $Res Function(_AppInfoModel) _then) = __$AppInfoModelCopyWithImpl; +@override @useResult +$Res call({ + String key, Info info, String downloadLink +}); + + +@override $InfoCopyWith<$Res> get info; + +} +/// @nodoc +class __$AppInfoModelCopyWithImpl<$Res> + implements _$AppInfoModelCopyWith<$Res> { + __$AppInfoModelCopyWithImpl(this._self, this._then); + + final _AppInfoModel _self; + final $Res Function(_AppInfoModel) _then; + +/// Create a copy of AppInfoModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = null,Object? info = null,Object? downloadLink = null,}) { + return _then(_AppInfoModel( +key: null == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String,info: null == info ? _self.info : info // ignore: cast_nullable_to_non_nullable +as Info,downloadLink: null == downloadLink ? _self.downloadLink : downloadLink // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +/// Create a copy of AppInfoModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$InfoCopyWith<$Res> get info { + + return $InfoCopyWith<$Res>(_self.info, (value) { + return _then(_self.copyWith(info: value)); + }); +} +} + + +/// @nodoc +mixin _$Info { + + String get version; bool get required; String get module; +/// Create a copy of Info +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$InfoCopyWith get copyWith => _$InfoCopyWithImpl(this as Info, _$identity); + + /// Serializes this Info to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.required, required) || other.required == required)&&(identical(other.module, module) || other.module == module)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,version,required,module); + +@override +String toString() { + return 'Info(version: $version, required: $required, module: $module)'; +} + + +} + +/// @nodoc +abstract mixin class $InfoCopyWith<$Res> { + factory $InfoCopyWith(Info value, $Res Function(Info) _then) = _$InfoCopyWithImpl; +@useResult +$Res call({ + String version, bool required, String module +}); + + + + +} +/// @nodoc +class _$InfoCopyWithImpl<$Res> + implements $InfoCopyWith<$Res> { + _$InfoCopyWithImpl(this._self, this._then); + + final Info _self; + final $Res Function(Info) _then; + +/// Create a copy of Info +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? version = null,Object? required = null,Object? module = null,}) { + return _then(_self.copyWith( +version: null == version ? _self.version : version // ignore: cast_nullable_to_non_nullable +as String,required: null == required ? _self.required : required // ignore: cast_nullable_to_non_nullable +as bool,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _Info implements Info { + const _Info({required this.version, required this.required, required this.module}); + factory _Info.fromJson(Map json) => _$InfoFromJson(json); + +@override final String version; +@override final bool required; +@override final String module; + +/// Create a copy of Info +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$InfoCopyWith<_Info> get copyWith => __$InfoCopyWithImpl<_Info>(this, _$identity); + +@override +Map toJson() { + return _$InfoToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.required, required) || other.required == required)&&(identical(other.module, module) || other.module == module)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,version,required,module); + +@override +String toString() { + return 'Info(version: $version, required: $required, module: $module)'; +} + + +} + +/// @nodoc +abstract mixin class _$InfoCopyWith<$Res> implements $InfoCopyWith<$Res> { + factory _$InfoCopyWith(_Info value, $Res Function(_Info) _then) = __$InfoCopyWithImpl; +@override @useResult +$Res call({ + String version, bool required, String module +}); + + + + +} +/// @nodoc +class __$InfoCopyWithImpl<$Res> + implements _$InfoCopyWith<$Res> { + __$InfoCopyWithImpl(this._self, this._then); + + final _Info _self; + final $Res Function(_Info) _then; + +/// Create a copy of Info +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? version = null,Object? required = null,Object? module = null,}) { + return _then(_Info( +version: null == version ? _self.version : version // ignore: cast_nullable_to_non_nullable +as String,required: null == required ? _self.required : required // ignore: cast_nullable_to_non_nullable +as bool,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +// dart format on diff --git a/lib/data/model/app_info_model.g.dart b/lib/data/model/app_info_model.g.dart new file mode 100644 index 0000000..3709ee1 --- /dev/null +++ b/lib/data/model/app_info_model.g.dart @@ -0,0 +1,33 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'app_info_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_AppInfoModel _$AppInfoModelFromJson(Map json) => + _AppInfoModel( + key: json['key'] as String, + info: Info.fromJson(json['info'] as Map), + downloadLink: json['downloadLink'] as String, + ); + +Map _$AppInfoModelToJson(_AppInfoModel instance) => + { + 'key': instance.key, + 'info': instance.info, + 'downloadLink': instance.downloadLink, + }; + +_Info _$InfoFromJson(Map json) => _Info( + version: json['version'] as String, + required: json['required'] as bool, + module: json['module'] as String, +); + +Map _$InfoToJson(_Info instance) => { + 'version': instance.version, + 'required': instance.required, + 'module': instance.module, +}; diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 305ccac..695151f 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -2,6 +2,8 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:rasadyar_app/data/model/app_info_model.dart'; +import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_auth/data/services/token_storage_service.dart'; import 'package:rasadyar_core/core.dart'; @@ -15,8 +17,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { RxDouble percent = 0.0.obs; final RxnString _updateFilePath = RxnString(); final platform = MethodChannel('apk_installer'); - + final Dio _dio = Dio(); var tokenService = Get.find(); + AppInfoModel? appInfoModel; @override void onInit() { @@ -146,26 +149,47 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { void onReady() { super.onReady(); - hasUpdated.value = !hasUpdated.value; + Future.delayed(const Duration(milliseconds: 250), () async { + try { + final isUpdateNeeded = await checkVersion(); + if (isUpdateNeeded) return; - //TODO - /*Future.delayed(const Duration(seconds: 1), () async { - var module = tokenService.appModule.value; - Get.offAndToNamed(getTargetPage(module)); - });*/ + final module = tokenService.appModule.value; + final target = getTargetPage(module); + Get.offAndToNamed(target); + } catch (e, st) { + debugPrint("onReady error: $e\n$st"); + } + }); } @override void onClose() { rotateController.dispose(); scaleController.dispose(); - super.onClose(); } + Future checkVersion() async { + try { + final info = await PackageInfo.fromPlatform(); + int version = info.version.versionNumber; + var res = await _dio.get("https://rsibackend.rasadyaar.ir/app/apk-info/"); + + appInfoModel = AppInfoModel.fromJson(res.data); + + if ((appInfoModel?.info.version.versionNumber ?? 0) > version) { + hasUpdated.value = !hasUpdated.value; + return true; + } + return false; + } catch (e) { + return false; + } + } + Future fileDownload() async { onUpdateDownload.value = true; - Dio dio = Dio(); final dir = await getApplicationDocumentsDirectory(); final filePath = "${dir.path}/app-release.apk"; final file = File(filePath); @@ -178,8 +202,8 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { while (attempts < retryCount && !success) { try { - await dio.download( - 'https://everestacademy.ir/app/app-release.apk', + await _dio.download( + appInfoModel?.downloadLink ?? '', filePath, onReceiveProgress: (count, total) { if (total != -1 && total > 0) { diff --git a/packages/core/lib/core.dart b/packages/core/lib/core.dart index eb3c911..c4a96f8 100644 --- a/packages/core/lib/core.dart +++ b/packages/core/lib/core.dart @@ -28,6 +28,7 @@ export 'package:image_picker/image_picker.dart'; //Map and location export 'package:latlong2/latlong.dart'; +export 'package:package_info_plus/package_info_plus.dart'; export 'package:path_provider/path_provider.dart'; export 'package:permission_handler/permission_handler.dart' hide ServiceStatus; export 'package:persian_datetime_picker/persian_datetime_picker.dart'; diff --git a/packages/core/lib/utils/extension/string_utils.dart b/packages/core/lib/utils/extension/string_utils.dart index 47252a1..6e7062b 100644 --- a/packages/core/lib/utils/extension/string_utils.dart +++ b/packages/core/lib/utils/extension/string_utils.dart @@ -37,4 +37,6 @@ extension XString on String { final dateTime = DateTime.parse(this); return Jalali.fromDateTime(dateTime); } + + int get versionNumber => int.parse(replaceAll(".",'')); } \ No newline at end of file diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 9cb141c..67e0b81 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -917,6 +917,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" + url: "https://pub.dev" + source: hosted + version: "8.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" + url: "https://pub.dev" + source: hosted + version: "3.2.0" path: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 852db42..ba3903e 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: #utils device_info_plus: ^11.4.0 + package_info_plus: ^8.3.0 ##image_picker image_picker: ^1.1.2 diff --git a/pubspec.lock b/pubspec.lock index 2e46f88..0b09bc9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -949,6 +949,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" + url: "https://pub.dev" + source: hosted + version: "8.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" + url: "https://pub.dev" + source: hosted + version: "3.2.0" path: dependency: transitive description: From e3e3005bba1a509ad5b7ca06a38999e6025703c3 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Jul 2025 12:39:37 +0330 Subject: [PATCH 219/256] feat : ui change's like 1 - logout icon's color 2 - profile itemList change color 3 - change empty icon and vec 4 - reset nested navigation when change main page's changed --- assets/icons/cube_watting.svg | 7 + assets/icons/empty.svg | 123 +++--- assets/vec/cube_watting.svg.vec | Bin 0 -> 1620 bytes assets/vec/empty.svg.vec | Bin 12776 -> 12318 bytes .../lib/presentation/pages/home/view.dart | 325 +++++++------- .../lib/presentation/pages/profile/view.dart | 21 +- .../lib/presentation/pages/root/logic.dart | 3 +- .../lib/presentation/pages/root/view.dart | 19 +- .../lib/presentation/common/app_color.dart | 409 +++++------------- .../lib/presentation/common/assets.gen.dart | 8 + 10 files changed, 375 insertions(+), 540 deletions(-) create mode 100644 assets/icons/cube_watting.svg create mode 100644 assets/vec/cube_watting.svg.vec diff --git a/assets/icons/cube_watting.svg b/assets/icons/cube_watting.svg new file mode 100644 index 0000000..29cbdc8 --- /dev/null +++ b/assets/icons/cube_watting.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/empty.svg b/assets/icons/empty.svg index b7bb9ce..9d67b54 100644 --- a/assets/icons/empty.svg +++ b/assets/icons/empty.svg @@ -1,68 +1,55 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/vec/cube_watting.svg.vec b/assets/vec/cube_watting.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..8f061213a91d169d4b0565463d86a1ac9820b7c7 GIT binary patch literal 1620 zcmY*aZAg<*6u$4~j}S_Tk;G*CC+*<-=brPNyKT>k^UCrm zHBUS%)Ig!&RH{&@C}21(Jh?5U$`yv?&@ZPvVZm?bc6RX?1%nL1=7Y_4ajh0S7h`nn zmHM}&eSEsYWMtnwvCm}n?^*jyEbrAmK8bxwO=o-QQ@(^&tvW)B`v>hECuciJI; zlVGlAtJtTrb2i7h5})nwy^F{f%-JhP$^)i}&CFW*6dFfA z*U-gBY2b78y&Lyn#9rFhiFKDxTxx+WuO^4cPO`Hj_7!w7;z10Q;o< zraeIQnOCp}$kgGsoN5U-Q98=yVmJeA!N}0y>M-_ZNONb1x${+NV(yG5Nt%0KN{38uk;oyJ^bxw1^h| z(lEV?v1TpUpG00QG&wgSxXv0DJX{^8VDv0_qd5OERh(+0nUmM)>bX|r+fBzEEr=Ty z47)}J^HnKY^Na1eUbiYy%eZ{42J}$;6XUR0Bj;}RsM6dse7CQmZ%@E`3CO)VFWijY zNRO;tiJQpx0@l}1Ule;TNj@Bt>*@M$4|8a)C&JBV_=3DY3uM06MgG@_8jGYJj*F(+W} zL%tJu?ghsL=A9yT6|ocbJpykWF&W&ETgYV$ImJ;s_x3h?BRFRezg0tm)7dUTZzK+m sA$%udSSJK|k6x#+KMs2eYmV3XuJmvh3I&g)_|L)P(18C0UX=*^1+8OA?*IS* literal 0 HcmV?d00001 diff --git a/assets/vec/empty.svg.vec b/assets/vec/empty.svg.vec index f0a85a0d0a84ff59b1bf93dd706f0d3d0ebc0eff..b60778f125e37e85d38e9f7d1cfbc091db75eb5f 100644 GIT binary patch literal 12318 zcmc(Fd014(()XDe)>#-fMH~TmWW|bxTHFM_7W|f+^Yi@2o1z0hUuGb zgT2cs5ElOizuemh%ckCji+4A{qAAxvt~V$Yf6GbkC%4OfkqMeVZh)nb3F{vfyr*0I zXcrvU-gr+}=HvE!CrmRf0J+|vPzq*j0(?el_Dd){y9b)w&cc&x`(du`9OSs~fxW+! zLr#nBu&d@N$n^#i0q?7%KUHhqH!OD;9B8=(nr_d4aMKMi_|0PI;Jq4Z9xsNY4y$3+ z&Bf5$WHn@to&mG|y&h@@41;?YQ^6%H972El7p(9y!k8mFp;wF%@^g2BW{wdei*~}! zP2u3sJ{@HG28D@W&NwO+j5%9;VZ+SD&?9RLtW<3RMbjEk_+)^?prx?KF#~quQrJoO zHQ|re8PKx(Qn;V95vF9UfeHSLVdA(gP!u@=wzt{|<*$3g>a+VG-C2a@oBLo|mmn+7SCn;~=Yau9E1z_{Nh!@OntVDRc_7}PNvybeXfuOZp+svsJA56p(;pHG3K zGzOWzL1Fgi{JHSkviWOF)%CBVX)TQZC=)8De+KFIkHUjCLt*8zvv3fH zLSx!l7(Znw%-nYtUaIH96B?t;*Pt-}U`?(Cra<TVWnnv@Q0*6xBQH}}A<=1uT0^)MWtwglSrJqr_7P5__Ui(vS10_-ro z1Qq!cz`^kn1f5(0<7g~0AA`c;Z|&xlg%K~kdH^F&4905BA;|iDKF$o%;hK(vv9_xR z%Jr`%O~whosBv!7B%BqY!yRFRur^DLt_KI<<1Q8`*Bca;f6GViC$~$<8-r&vE%D8y zF*w3U`=0K`@KNX-W%-`2%;#M3NIY^)gL1t=q5i-=2Pcij!fOh=p&W}7Je3$?9F3=r z*kSGuBXG_@JCy4U3e5-ld7?uE`qY+yby^f|Gr0$kyToF>T>*G|#bUBh05hFp(W>eW zl+265OW8$mRU3grca^~0bi~SyWhDFFxPECR4A=KYlhjIDgWj0*eI@KZiFl^C3}pHS zh4us9$wDla%qsvQP^|TU8pG=#d#U;kHP@~cVT_$5cKnV0NE)6&`ePQlYIMPOz8{o|2PaC zO&U3_b7+La(P8M~(FnHv`{L7(I*{ob6jmSbF2Hy^@o_Co*)|+!O?nCmUnSz+@CUH% z%S6u0ZGIx2ad`j>7Y#>m^QVy5B_3xzeGc~5qVdF~x6t8UAIy2Fz=x0f;KF7Fj;!c| z;buw{s-rR9s}W@S28I3u-is;*p_gw1*y1QG?pFg%-NvJRr>79=JsvY!KZRAU<2lcV z9-}a=`VUYS48r2PH*jipET-Hg9a|cSN#&-vW^E+;y)Z@djgk27jVbQ^Iu=KpD^aFz zP+0%1Jp@G^g@&t{(DU0`SWtUkJQmy*XILSGY*t`O+HH{Q=ihz_h2I{8Sx;-Aq;D1^ zO@0Ix3)jPv_;L_#tOL2;ps@K{K5{>~-MM)+F!k7W$ldS^I#1d8o^EtbIh-7q4&nQ& zp+0Ndd-^gzx!$0#m1OyseR0~vchHc&1@Z%$!FK01SaIhb7{AyHE~Z7`G>`VxKkE$& zyARf(uv(41cSV59V>Q~Z3jY! zQ#yP;dmJnbvBy6?{*-jt9@{j|q&?UkyXMaXhe92W$r=l@E}G($kpp1;(zo!bT7`yJY&o?qP4?*$WY5`UXXd4|orsu0qY6aj@bu4XQ59fuc7yDC8}H zRFy3{?3K`G$r5N>rNPz3v*E^46)vDLM7@3mU(y(M)s)k|848_$FNYxo5<*ibBwl|7 z@A?b`nZ7~M@&n#NTLm_6pF_UQ65q~ChDDiroHu?o1Rl}j#^BXZcUq5oDJIG2VTmDT z$uP%Hfiq|fDT8a_^EG3kvj1b4mmLoc!H*%@B!Odh?*#DaS_@2$GJS)>;RD_g+uy;8 ziOG;xV1~&yYr$=p4wa3Y;P-JlY?Z$W(*B{to#!`kJ?Kesf$zn4z{XH?yb6{dn+<-4 zACT-P!kKR$z%XA4!v;@;IVn}Z<|NZMC|XIp|DvZ2={ky%1;KWw_C2ouX_?5r%gE{t z3dcYDQV^xGWuJtQe0OYr#*VM`U$Jh(8@Q9ST->!;qLF=5LhIdav6#Ng{bV#KT7NLE zx`kGJJldtw_!zSBuog)$+x$}`Eh+9YOXylejNtk-R z?9-xe2GTy+8q3Z5gPDID9BS4dT<<#J$MJEn($odh4#Y#`QzzVibP$xjYJ;EU4S}Y( zHt0EU7{CJq#UI1r$VvllIXeQZ2OIF2-$*FwVZh+MBVn4Cf%ct|kmY2+F*pk9?F`s* z$|wj@{|B|7QCVle;~}G9T`L2I6^?{bAHo+S;Nl1a9&SAxe9sy1Eya+tCJ}$n!Engj z37f?P81#n|mcNRFZ&fa6<2C|%U2w)B-eaL?s1tV4PJ;9w4ftmLWG*|8U#8F=(i*?F zn@YZ;HGbY>D%4DL#O)Lp=O1f@M}|y-h%v3u)_ww7c_T=U<{_0J!wL?&Kg;#cwT{c}(BT^$d<7J1_K#qp4M+!LQp ziHBS3JaL>;JP5r#Y0r#3tic*SA>Lorn9P-4Hn0Tl; z=ZTKv<00*)Cw?<89?q3|qAY)d!bPxS3-aIVq*P5}pY!Xx!Kg~fK72gKD{-5dORGI-cG1+?hD&Y+Twt+7)adE4kNbr2dioB2uyAX9(bJO z;o#_r8%Yik+dc6S#>42xo_Lt_i20v@WAWU7nHR?sUoX64ngAQ8{RabGrE*b=1h_rc z3!R(eVMweO9(x%NQ4wA^rXn6T2YVsw&-@>w$NU?kznk>7GwJENEuI)OERN*kiK(9s zgsV{=_|FytVCxWfoU^naR4-_Ug~fegTA2%uo8Jf4IXK~+mI!r0t?@~7FqEBiz<=H7 z39p{Ez^dpTu&~)4Yij~%-1gYlA^_%|vBUZle{lR#k|#Th$m?QIwEbUp#!l`0Pc@P) zpOBj44H2$R*z*T}*hl(*+67@=OBbx__AxjfbVb9L5pZ^;EB3hD2WrQ-Vwia!Iw!bd zY;-7OA8w1oQbd?Ope>Fs4Cd=FWkC>~@mz3*OE0*T?Si4@Js@tU3;ATq%`A7pTeQAY z7P#QtY5wqPk_#$EcBfd-1&30;A-As!9$woGwBUl8U4Aeizy-UNc7?P~fLpg@QNp11hW`v=S z+TwZAs~d@~Xu6N~hK;UxD0=@ zf|hD`KA)2T?Vxs(GalXS1_ckD@L;Vwoa*L;ZBDi4>nh9Jpl}r&*aEy?5P4x3sur-S z|JQRai~1NMN?dX0roP}es~zo^(G+95VOmrS#j0-TVeAL$Ep8Zby&t$0xnbK)vCz}S z9cR4gQwN#pU}a$C6cYCQh3-^FJ z-3-k8cMDjh_!NJCWXG}Yv>oKVo{6qA>>$Z<28O(}hrPR}q2Z5~;21g;Up;L_zGX6& zoovnVMyZ4+EDaQ!OvPnCID$;ypzshZWqVX86{@zZAP7Is^1+Mh?_pn~5nYx!qKy6> z{CQlQ^AeHyaT#aUAs!pyjwa6$hmLngi`8K`F25blyA+NaHn+vhnSGG?h2i}M;oITI zA++yc{4VAY+-R483u^bmIKx1WGGBw>De&wtoipgPK<5Q#KCbfJPr)f53#{*6g-l;( z>@fT?-^W5W2cz#rPs~pPoO{L-YrMkIqNCgYnXmuH&*8U@-_u#E3dTEr58>J6aGG+l zGCzaDOW>Jz(ojAiJ|-!P-HS%%vaBQSdGpQxSzZ&K0M_jB!p8^wk?p(6Ub`ul_d@T9 z863Z!_)l*0KYq6rMtiiw9J^I8FE^WV+AASm{1LugvkuNK+zSU%zvg&BFhR%CJ^W04 z`SvE5UTcMWk~YBlL~DG~X+5~s*lIlNVnF>sAloOo%{wdY58` zHz3y=6dwsKnAXtF@?YDHLiGt(C&BARZ!8^b0EVHH+rSlth^GfQ(Oxg&yj&;9A1vb7 zYA1;NM8c$15(ZUBnCB1JX+s-esMi>vq&47pM{DrE1fd=Q?p~U??h2Rf&&d5kH?- zE*={RC~SNx#;)s)C7Lqv$lhQ)_TzK${71pK(@lVlx?nuNR{;n51mgoA6|nkkJ5=N+ zLU4$K3ElaG@b3p!gz$DD`5~NNlf8%q-Cl@n9*pn8vw$y;*Kxk1KYJ}!9zr^cy%pI! z-sqdf;?AM?L!JWmwF$-LmsEUyV{%M+Ubfe1bI1xpTv=xUCfPvpRCBqEtyTk*A1fRB ziFn&v4ac0Nazb@)lCv7JPWML3)f&p3^rrn+%h9I0j;{|}CxgQK17De%BVuf$2YA^4 zM~aov^nyG27{KG}++dXmnB2J?WW5uy?h{vVJt*P&L! zIi~&ozcIP9p3cKY%$s0M=VK!p(rxH`YNT=5!M0E%&h=>t$G$L9Zq5-*?ijJ5$_do| z-SJR~EA5%xQ8&|*Vg!F&RQM72PY%FZu`{H69*FZPuap&FhEJf-g9I9fNNsw};A|(b#y? zg<_g$yxP;5Vv`u`71Ih*cgA3Wtt}LN6N4j~G#pFIO?myb%w{pKAR7BmtrLB2M&U<2 z?u#3%B5`fxucF(@2(qp7qIO3g?6K*jxMWT^-dFxxWI6TluaAhk--eRUJ1p8C2&KK~ zuoyHY6ywiliA_kaY2o=vo7GPCmqKZ$rjGG4`s644ICe9&k{c zv@ryK^vDvgED6Th;YY*{3xZH{G+PuF_ri#?$HnuRJ+V3Kv}jcoh*P&-5Vw94KsK2t zPTS*;+v^L(+Mm1Qij0S%2d&$*h$=Diz7g#XzZAc{ZN%>uzY@n?G2*?**W&u0jM&Yl zUNrn@#5cYTV%a~9#J^FTwbDrZo5ZHsMxxg&hEAosr^fy&y7XXLVF_`g#5p=;(xcpgH%9TdqRPQd71C7Kb zCSBm+c&VIrErREivtNYc@}WJT&?=1h^@5;}5bJ-Ua~%27((+)gS4@9|b3qt6zZbk} z-wPj{34|s2J$V0^rGZ#^t}E1j8h}x|I{}kVVbDi(p6t%;x_)4HZof(8Mhs4J0-sGr zOdsh;c_bt5DsDk}BqL7Dx8?JTh_&JKYiwoB=XI#WisMxBIn3Ucm`M2F_9mB^Ju-Sx zyDd2GR!ivPYR=`!^pMFlHOqwapG&@$$$k0~1+aB^a7N&E`F41-$i`{8`klDrJ0m*$ z`>mLN%!mV1--waF8u6<+uSLt7M%0wN5-si;u`u%0`}MyU+#Or&uM+iFy5o?TM_gYj zI~Q^NIq7wS>(gqNTrpyMPpnyXR$TE}FRt&?KMlg``Nzbxe+1KBlr09%4&i#q_6(-q z6LyPS->;FcXXWm+S9$3Viy1?a+lB95Bt1GTT2vyp7q$mEmL3tkSA=3^=cA(XN+@o+ za#T!d6~^_P?$T-RIWE>r?1LT0pBAI$Mv!mM5rvFM{KDxP#pF?F&^-{qzRx4KZCAsX|`Tqxd)#w0TWr@`5V?yU-7dRH5Ye+%GYmK1a7jP@ zy$y5k+hRGzT?|jGD&XkA?k}&{qWwP#VdPd@R1f+MPE58%b{Dk6!xm%L6;bZr2Ak~f z0W7w`oH_S^@s;OmP;?Sn{wWjokmNsNpgcaSxmQX&x3Pa|UfUkv~?juVm2G`SBqLg%0 zkAvTo@_hWXJrC*LP>-8@9zpF4J$5_$2tN5-kFs10iq3S3p}+sc3$iXU@sr%8^Mmw% zDr+fBx=~5{Grb2mQwc8P)u{ZT5;FTsSkp(1L6^(H|9drN(f!oEQ)*=QRj$|7bXQzK zajzQJIaI(RwFc(~SHJ-;4OaHAfV3D5=6_xROXg@WcTEM|3v2LTRt3c6Xwc)A3J9vu z&>egQ#ZOvV>t|pcpv7{}XV5TGiz9nHgNMtscq{rD-9c(GV$3sWyrjibv!8)?nS>b) zTJ&A{jP81M9Cy$fviciz-@@7pBzs0@&S4$Sv3myPzvwu>k)#W39FC+LY+MXSkFVgm z#KzBbO6e`3tYf3cOFGK>F{C0z*5u7+LLbsUFJ*YWQ|N%z=YX;4^P1=>UnAIBtLl6QC&To5$a z)1?ZE3e}jasRH)igN-+5vl`{~H@WkK?&EFHB%z$!KU)`8PG0x=c3{5ziq z`HP~!8eV4eW$om8gQAPz#uSWv;a{zvIRg0~*GZ*n8*5hFuZi2d^<4?8do_W5wGQuo zC1KF&CT>d!U%lg4KTyK0j_R#=U&$?Lx8+;~vuc0q-Xg74RG*NEiQZZhVqN%f+v2QrvZ9l)^ za%8MOks_fF=L2W~xT&C+nxIuMF8Zm3;-$DLt-esX(@u)$CCqlh+XoC7!CY!t~Bc z+)ev_c!H92PLJiwmAroAekHOy*Sg=8$b5X7m5S!1$A(}Pr^DU>FuFp9gsD5tdD-i^ zgvWv{csq-=7M#x3LJLl}-p&%)USc0(iA*lOD=l#s`J=)EmbixeQOr-4w1-<^PQE2F zJz&W6HszQlGJW6uPfL0~q($XaOH>zV=#7{qE?lIcw`LZU^U~1UF$>Z~HTh8sdMBmE zJO>LjOlSLsIr>JZvG!AQJk?E&Wd?KFE7Z8{XEVH|Q=@vWgh?GFEGshQ_10;oynSGt zDev#p+LY5fQ*1&uti~PRnc!Y}zZNpb1fyP)9}6`ho6umOy$M=;Lhs5bS2JO^hT5no z1|ok*@=EKZMTaC6GW+f@Tt)A`v|O%iuh+IyA+y)tO;pJAe$sO#vRHww1H<{Zm0T`n z=asZyQ%phY#A1kool0Dhs>59yl)PW(g-T@pX3i`nGCMypSxLO;9l&TMr_a`##TX2k zzsP;2;PR`PC~!P@Q{dmH+!J^^hHM=evKWQcGx`h}-=1d$K91ZU1U|k2X#&}>j$#G@ zSm<7Gh)8TGHCKvXd$&2YRn`fxE1v39=Z)L&d&h(tENBu2xKEGJX#j*KK zSZ>becV?71GJlyLAYsE7CcIqsPZKVu8$X$F`bp&`Xx&POiPom1qguSs+Z2n}Ytd__ zDebl7|9>#$<7fKF^hcJHLFoEtj87gwb`11Jn#K56D|N_X`4g5_$YOhjEY=Tyr9&3` z+dkAGi;da)Bo-?V_*{o9cAii13yY;Y(|*rlYo?zp)~+!pd!yK!y%}OLIeYuW(8@(<>G!CWU+pBiUwKizmDvc@y(<-i=7P$$qv|Afz6Yh9oV|CvjpSI z&K6S^Xpx;YSeczYSUYwWVQ-t*8D%8JT@2;&`6+_KqrBf1bPYBDU15qNF`ed>?E+4poIi2C2)|SmB8N3J39*O z(Y$kO2@C>zIPcs>Dmh8uEP;yzZ6$D(pq%Kl+tgOn+EnYp z>i{b2TvVclsK{0Z*#r#W3Ns)(0s1R-8GWmjCE@}~exK*unP6Y+-*4LM_nvc}^E}Ua zwsY>i!!2h&ZiUXYYWljCbx4jsc<^9z*s_|NkKeOrPjfh=cU#8&p*ftVcNg|7Zw`m` z?v=Z5Xb$J=-IC^l=5Q;$OQfvkaDm=6^A|4UE*7$^h{a!szi{y1PTID9amM9x_<=8- z(vMzo8h?JdjJ{9g+sj{*U++lBRVyb*Zro3d5x?;X@w|J*YM3B?q5`CyxlGcj$7l!R zu~6toB^{j?&^^5DW^qpVZ+Y|Hq4Htt@hyDUEUS_mA0PVzzJZ)C?!8Vr|9+h0#$%y8 ztCcQ57t~sB_^Y{5teX3|ZWTNE0M`xZmH@97t0EyWmR_KAdHjXD>YZiV-5KvC>B{cV z_7clFk@-IpKiYwIKe6pF_XAnqUdK-iM$f&DRWq3Wy^iP6&g3!w7tpq64Ekg@=yiT~ z=JbLt;2#U+Tg56cFO(NH3ZTLT+JTqf>Mo~k>L<6{d6}I2c5iv=PlLG5g5Mynv!oKd z3@jKqNOliBOWwWUR#{lrTXOS`WamHIzq|bAKtK6t-I#?$eHrbYp;-Aw{(|Lovx6aKCw`% z|G4INJK7SzaFCp{tiO!y;mS>^>*ec@dt<-rv1MTAerB#r`Tf#q0jkTgXCB5eeQHyaEpA^Tp(k5j+U?9DwN0G87)ok70Tml zM@wa@kZUxu3b{thyB`*Ejg|q$o#oR_x5`!fx=Xtm*U6Xm+0wV$U>We(xpL&`Yw-8^ z*y(E7J)oxyTro(R=k}D%_YG>%D;6sFk87Sbq^}HqWQZIt_?28eW}uuE9WHP7bm2Fg zcyT4uJWTEZYs15(T_;zDzJHH=GI*fm=1tAczu?0@Qa5vm{PEU4#J~`Ax`=Cte16OK z&SyvNk~Nj>q~D+Jmo**R%hjD8kcQ*h%Qc-JkZ80$*8|9E&-H*zKCeC31Je1|C(3Il z{#LsD%$D7s4VP6ly`=RW!=&?;-m>oRHxomBh^3)2Yib`kq0LZPf4Gm#cxQ;@^ofNE zEt7(pSA=yrG3|K{z8r-ws+fBtm);MA*C_I9p!7a|l;n>XD7_BcAbsxpwJa*>FSpIT zO>SD(PgKsZkDGS?<O#I_R~t;AqN*rZafxhb4(qy?M`kw zHA}2LWv*56s(1yRT)%3y_*ETUzi}0HuTWucZ!#yK6I<*U?@2)3H)o($QUi>R3sZc61Y6$07%vqhn=6G{9Jwj_yGEZ)@Mt zeN^eP^Kw|=b#QO`cC0L3QtV#3iG8IX>u5kvFCSY>C-yA-S8LF#uayH2S#H(5TJi4B zcc=Yvy4ZuDwcVx(millia)<_RA}FFU+4IH~b^wUR5@OGeX4m%4f*Psg|3#Wv29>7j`of zX32M7hTU=bugZb1!|tDpUKRh_uzN)$z%&^DF6=gxy(-OL7P?11oJoy_k2gam{ZGW* zdg%=5TTtwdiq2?}9}Bhn@pXMr;tngXlhKn(-5oohmEu92-Gy%uua%u$J2?%12YBYS zo!uv9O_QyqF*nojtgOt=%VEFOCGM!+b#lY=CGMZDtRsF(i2FJjIT(LTo+bT9w{oLv z=E-*pTe%Ir=gWb`t=xqd&li7bEBC%j1GFmUOMH1Nx9Q6H(!8+9?b-QN>lfG}4xV4paE%IZb_CH!j{(MfY6wiIySut$1ELk~JCUkvOKK|Pi(sSx&iC%3< zZaiK20rgYj6X!;i{onU|&e?VHcZ?)R>iO^-~MdHI7| z_?~f%FV|7e-<|lZ{Ny?aO#NhT>M3f+jp+9z?ZL!s z=`r;xox*mhy^d`!V13_nZduH}kWbxOOpVHi*J8#wyHzcq|2xNSBDNA=IO#aKWBtSN ztH>p5o0G02_q}b7RZ$E5Hu%hh{sSk+KNjkAtnB!F_S-h($7UFrF%-7DDf}k)rnX@@2shXU-kZ%HcMjBkNh{1N6Ml(NT44M#q4EEL8R*vga6? zUO9V3@?>N;AVbft4XiIftEM}$8MjYHHuUIF)c!@;Gop>mxx<%_?g*iekBtKK6Ctsi zhy&J?jtBf>q2rE`Z8fZbhBIw)1%A1J>oxQ}8$Pp;jjYTJWFCjjr*a=LNZuN>lM!gC zPsuW9p^u&nE%R%7u!a@r$k{u~KNjkIjBGo(4EoDh&oXr9nIp0QJ6wprUqV(7o=u*C z*U9v;hjB(w^rHbUxX~(x0Es znPZnI+D*H#V=Ffu+0D9%GfzU4WHIPjXV$8vaoPJ221#4&Bp`-kI|uV76d6US@l|0m;b zL#Mg-F24DioJ~QO$CbuU{RrH7OPXqG;`LWRPmT`+YYPS3* ze68x3Y)c%hL$=0o+Mu1>z+7UlVxxQlesk$Y@qZeTec*rfipZznJzb0C+BY}IskfC# zYV3M+Zij4i8?QsRiVT?(C!mtueVYf2eAiXT2!DhI+T zDH>iXn>(gt)JdiC!8s|J_;^Rj+?kRm26m9)dzD{%WTxfPg(Y&$bL++XU9p_HVS~J% zh{&uy8>K^Y2k}3BU*;StlXu$cx}vOC<#**up+k&(SjT+~ebuHh#@{197;kzP{i5gw zW;&ziyU05Z{ojSI6Jz)$**;5GO#fQifjwiP6Rc7VRuc{_Hs>ZhT)R7$6{Ghq)bBwY z)Oh{?%pm#8r#a1pYD)7nYQvkyGHrA zsjc+y)oA9a9gID&i`vId?lksNyN!G!BAYMSC1q`M_K)8s zL-LAc{k&b0^Fu7u&FZ3#IeNzXH>cgp(CwG(cltj>es$XKr0!mY4*S`Uj-qV`?H}TT z(W@jk@3!pxwU_UA;^S9I@vrtfJD*!c9PM{BZ~X-GGs^D(`OdRP;sEbW6q{)4K6#Kj z@h12+d+}S~VaIBC2OC)URbx0zOs(g>fEe1uyw=!uEBxCKGdlts#{=7?l)J<+Zxlht+7vR*X%@gTdlxrzQTm)01ITqDOg zn|Sr_K=%!2khj3EoODF(@+G*2Hg(op&AJb;&#a~m@(gF}Tfa)i{BFN<-?UXydhLGa z;`l1b`6U)QG054h=R+;I8y<@Lt#s-G?7dzJ9y#F5X~xc*Ecw%*jgs7!FW0@XMZUN> zU&cMLMb7*rEMunb2Mrq;-^aSOU*D^3WS;I1I{q)>M3M7Qwf28zFrE4|+x~+1(s9mypz=wl z0=_vpmKDhLqk$e)MOH6Q^*v;AJvx^E84n^U&P1*7t1 z*!C^b@%wz~*>$VjcFrN^iv`^?l9}JZO)MO?;}Us8_=(jb*sPs zANnc=c8`Tl3Uc(QWBx5iAH+xhS8Mk&?8%m{t$=#1v0F$?Z^Jg4gWFg`Yhrsl?IOm& zWD&8vojL5gl{=V6jwW`{-xhjuL34w;uk}rF()9tZ85ohhb9c&#eIv4-9KQ0bh-|Fh zDRpHLnfps}TI*@~PI$D1zvdK}BKBe+>-`CpEhJMXG^k_t{nj$XM z4}GKBM*oIw@GZpGtSec7zU(h{E9n34V?7o+`Ixhx=kfe))e^g9JO|GqmbAUZ@s|c@ zH3XQR9gKUA2K3g@GM+D=cKnO9{W!HZz;urQt%_hg$3GT2>_yK73x#4>5X{QDmwC$gpyt3^|@?tBzcqXg4oBXih>5(sexWAD+ zaSf&`=hAlryk4j8GIEONf#@ZyWhJ(`7@7uyepL6*i{ZD&V7l@{=I~xOr+0iIdG`YA z=DD~2C3N9^WBuc_pN8gP+QE1%RQ?~{QRL30-4WK6CJ&BalMU=Y&DeJX`+tCbRWsuo*zW>N#{={VEb?Uo zxoi=`>$8|*zWQ|qd^MI<5c?rwez}t#rMQfJIz<0s-gV?LFUff#kM>-0DUW%tkRyt9 zhK_fm)EK3IhPLueFs||v=%@NlqYfMfXK)@ljNUIpcLe*Tj&$lJ$9t4_$*Ec7u=dX}{gySK z`MiTpEFi}%)=RyKE1yNiF6q=F+ReyWWbB(xy++;1wj0zB^w%6gpT*ckaf!inYN_#) z`YXnV+5i20!*6WHmpdKnB(?cY)}+4KLG4o=wi{f0aGP_8_J1$i<~(|Z<=*(vHm7!g z1y$kFbWAT@>Mhw;jNcmQ9Fz4E>IaUp)*i~U|R z=y^ZDs%$@)P9>?u+72+C`YU$S`ST6>35~bC*q3(^iM_0K7W;)F@t4$jFSAc5pL+bL zbnG|QKIYdUcOU&PI5o~bnX{tS>2%LN=|BECr#87y$_6~+j4j_UZ+g?5{MYx(l`;uA z2blLHwrzsXSlS2S|1j;Z!3VI_H}LyC@o@;cYHX-+I~w`l(Z18fc{()`y_#v?Vd7KU z3GyqEp#81-Zj_Vmq47A1b!+_HY4XOh?m~{n=Uwbknt!8-5zV)|S(oNnHR}%3KZbdH z6Y*-;gIdx580#&hJ(2N3+Rr10Z!M{p(X%ye>QQt;2X5)Q|RLLU2L zYLC&=Ph_%s^E_hKu`j!>gJzw!{VjggI(Nv_7eB%C9CgU^c;{@ZzrS_uC-Glc#<5stFAN|GuIQdNl?uQ-!<+MJpwYy^5KKxdMoq6t?t>4%6Clw*uxp$~yQqWFt zF%~+@>X5CuLDe;tHZN=nvA&mliu2S;&NxqTX5ig9n2zv{v;nMK&a>20@ZsHQ=1Fid z$ah0fe`llpe&Yo01GH^@S3UuKbUytSd=nGkqh~HKzLGggPh0sk@y<5R871-tXBWPQ zmcPNdY#cP8ox`|kr{i&S;hhlYFN1uyRJ5!K%+r1_!v1lD1bxl)bB`L%Kiw9Dm}Gp9(=isdq_)l~WW+skG1Z>LIT z?Q(RV%6gW;H$Xocpq-pz`t53+&v$|HDd@Ef*^{A#J~bJe&|g29b?AKhBaByrsipWt z>6W7RWY)iw3%Z6SjB&QJ{tDtR(6;rgw*(%12ZheBn#kIruU0zcOS?+tFpeI&n6>Q_Aj??v!{y}nYERI97CL-v zzV*D0zO*fTop_c@<$+Q3pkHInuBKh3>*kwMxyBNRJ**0_eu?479?u*d*I0Z8TD3b^ zPHm_MGwK)gNvfaF!~FgPJ*(88^y7EWn}!X@MZWWD4yzxuZPg^uL2E@Y?l*# z5$tS(DeP+LxZ3x5<}9Rd24kVGez{Lml%>6FF;avJIPUSv$;m+>aXtpN2o*tBZ` zwCw=>#^(*aRl_=Te);o;pVd%n_(OytCzuLQ z?Wg?ow-YMItH*xSIxmA=(Zi4OTNY2p`4&!|SvBfUrJKn-%`=S)&ATAJa&Z<5oon^V z#-~Q12~oWX{(ca#dHf3W=&%likLW~dW;RB1F`JI_djws(_liNgdX}+?ZR_tg&>_ih z3Zkkz?Ml^swy~*SHQS7*?HAvT%N@OA6C9*Y~v@0XKE17w&;qDGSqhyQ(7N1wy5hGyN%G3BX*Mc32IF> z^DM2=^vAW9^ZtYyZ`CY>AGL&h(Y?V=CZW;2gm)k89e(2i!^`s)7+!YMU(ru_1n89q zXf@0?-g}sS=FQfh-C-H-#)iB%G#j96;(XW0oHHPs@ z%}vIcm#$>ohQ4Apay3`!w>0;lhrjyU)FAacH6tC@cwldg6EC12on`vHa*Z3+i#C2R z?TF?iZTKsyT+5ne^zbsT82!>I_)tSQn_?5>SHA*3)r0W{`Wv&gG#j_+2xpZh_$epWi-FG75Hv~BDjCoZe7H}Rk~)o)BP zpLP>yslAC$;wv4|IL#vK)_!9*;@Q;jl=8uj^|Z0S#=F_WtB5n!Y2LBvI-68K^_S|W zehScTnrqsAlsLj~>B@PAzg0uKUgMj#o++B;Y+9qnopYB={U%lT~W{Qb~Ssvp6RRfoX393Z-LC&7d`bXY~qTuu~|1~W!+=U z**T;6#+kZ8_oP+yV{e0cHq)~<`NrAYvef>%Uk9lE(6hUqsmxiP^_Vj@>(jHoAJzEd ztgrSr&jM<9&fv&3&kCHW^w}ZU>sSwT!P!&oqr5e)Gy@>N(1N=Kv@9C z1<*NwE|&hAh;GpUx?1}0BD%$b*6{(H5J0y8P7L6r08S1joD#sP0i0&(zp3bUdO%Xn o+hAJyQW!XcZxq0p0dx;0oMq`hv*^|%fU^TQCxCMUIM2ZU2kWvK%>V!Z diff --git a/packages/chicken/lib/presentation/pages/home/view.dart b/packages/chicken/lib/presentation/pages/home/view.dart index d02fd50..03e804d 100644 --- a/packages/chicken/lib/presentation/pages/home/view.dart +++ b/packages/chicken/lib/presentation/pages/home/view.dart @@ -16,145 +16,149 @@ class HomePage extends GetView { return Scaffold( backgroundColor: AppColor.bgLight, appBar: chickenAppBar(hasBack: false, hasFilter: false, hasSearch: false), - body: Column( - spacing: 8, - children: [ - InkWell( - onTap: () { - controller.isExpanded.value = !controller.isExpanded.value; - }, - child: Card( - margin: EdgeInsetsGeometry.all(6), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), + body: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + spacing: 8, + children: [ + InkWell( + onTap: () { + controller.isExpanded.value = !controller.isExpanded.value; + }, + child: Card( + margin: EdgeInsetsGeometry.all(6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), + ), + + child: ObxValue((data) { + return AnimatedSize( + duration: Duration(milliseconds: 300), + child: data.value + ? Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage(Assets.images.chicken.path), + fit: BoxFit.cover, + ), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.25, + color: const Color(0xFFB0B0B0), + ), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDarkActive, + ), + ), + Spacer(), + AnimatedRotation( + turns: 180, + duration: Duration(milliseconds: 3000), + child: Icon(CupertinoIcons.chevron_up, size: 18), + ), + ], + ), + SizedBox(height: 8), + _todayShipmentWidget(), + + _inventoryWidget(), + + Row( + children: [ + Text( + 'اطلاعات بارها', + textAlign: TextAlign.right, + style: AppFonts.yekan16, + ), + ], + ), + + _informationShipment(), + + Row( + children: [ + Text( + 'اطلاعات توزیع', + textAlign: TextAlign.right, + style: AppFonts.yekan16, + ), + ], + ), + + distributionInformationWidget(), + ], + ), + ) + : Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage( + image: AssetImage(Assets.images.chicken.path), + fit: BoxFit.cover, + ), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.25, + color: const Color(0xFFB0B0B0), + ), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith( + color: AppColor.darkGreyDarkActive, + ), + ), + Spacer(), + Icon(CupertinoIcons.chevron_down, size: 18), + ], + ), + _todayShipmentWidget(), + _inventoryWidget(), + ], + ), + ), + ); + }, controller.isExpanded), ), - - child: ObxValue((data) { - return AnimatedSize( - duration: Duration(milliseconds: 300), - child: data.value - ? Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - spacing: 8, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - image: DecorationImage( - image: AssetImage(Assets.images.chicken.path), - fit: BoxFit.cover, - ), - shape: RoundedRectangleBorder( - side: BorderSide( - width: 0.25, - color: const Color(0xFFB0B0B0), - ), - borderRadius: BorderRadius.circular(4), - ), - ), - ), - Text( - 'مرغ گرم', - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDarkActive, - ), - ), - Spacer(), - AnimatedRotation( - turns: 180, - duration: Duration(milliseconds: 3000), - child: Icon(CupertinoIcons.chevron_up, size: 18), - ), - ], - ), - SizedBox(height: 8), - _todayShipmentWidget(), - - _inventoryWidget(), - - Row( - children: [ - Text( - 'اطلاعات بارها', - textAlign: TextAlign.right, - style: AppFonts.yekan16, - ), - ], - ), - - _informationShipment(), - - Row( - children: [ - Text( - 'اطلاعات توزیع', - textAlign: TextAlign.right, - style: AppFonts.yekan16, - ), - ], - ), - - distributionInformationWidget(), - ], - ), - ) - : Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - spacing: 8, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 40, - height: 40, - decoration: ShapeDecoration( - image: DecorationImage( - image: AssetImage(Assets.images.chicken.path), - fit: BoxFit.cover, - ), - shape: RoundedRectangleBorder( - side: BorderSide( - width: 0.25, - color: const Color(0xFFB0B0B0), - ), - borderRadius: BorderRadius.circular(4), - ), - ), - ), - Text( - 'مرغ گرم', - textAlign: TextAlign.right, - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDarkActive, - ), - ), - Spacer(), - Icon(CupertinoIcons.chevron_down, size: 18), - ], - ), - _todayShipmentWidget(), - _inventoryWidget(), - ], - ), - ), - ); - }, controller.isExpanded), ), - ), - - WidelyUsedWidget(), - ], + + WidelyUsedWidget(), + SizedBox(height: 20,) + ], + ), ), ); } @@ -288,13 +292,18 @@ class HomePage extends GetView { Expanded( child: ObxValue( (data) => _informationLabelCard( - title: 'بارهای امروز', + title: 'بارهای امروز', + titleColor: AppColor.blueNormal, isLoading: data.value == null, description: data.value?.separatedByComma ?? '0', iconPath: Assets.vec.cubeSearchSvg.path, iconColor: AppColor.blueNormal, bgDescriptionColor: Colors.white, - bgLabelColor: Color(0xFFEAEFFF), + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [AppColor.blueLight, Colors.white], + ), ), controller.totalWeightTodayBars, ), @@ -305,30 +314,35 @@ class HomePage extends GetView { return _informationLabelCard( title: 'درانتظار تایید', isLoading: data.value == null, - description: '(${data.value?.totalNotEnteredBars.separatedByComma ?? '0'})', - unit: '(${data.value?.totalNotEnteredKillHouseRequestsWeight.separatedByComma})کیلوگرم', - iconPath: Assets.vec.cubeRotateSvg.path, - iconColor: Color(0xFF8F4124), - bgLabelColor: Color(0xFFF59770), - bgDescriptionColor: Color(0xFFF6DFD8), + description: data.value?.totalNotEnteredBars.separatedByComma ?? '0', + unit: + '(${data.value?.totalNotEnteredKillHouseRequestsWeight.separatedByComma})\nکیلوگرم', + iconPath: Assets.vec.cubeWattingSvg.path, + bgDescriptionColor: Colors.white, + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [const Color(0xFFFFE7BB), Colors.white], + ), ); }, controller.barInformation), ), ], ), ); - } Container _informationLabelCard({ required String title, required String description, + required String iconPath, + required Color bgDescriptionColor, String unit = 'کیلوگرم', bool isLoading = false, - required String iconPath, - required Color iconColor, - required Color bgDescriptionColor, - required Color bgLabelColor, + Color? iconColor, + Color? titleColor, + Color? bgLabelColor, + LinearGradient? gradient, }) { return Container( height: 82, @@ -341,11 +355,12 @@ class HomePage extends GetView { child: Container( height: 82, decoration: BoxDecoration( - color: bgLabelColor, + color: gradient == null ? bgLabelColor : null, borderRadius: BorderRadius.only( topRight: Radius.circular(8), bottomRight: Radius.circular(8), ), + gradient: gradient, ), child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -354,12 +369,16 @@ class HomePage extends GetView { SvgGenImage.vec(iconPath).svg( width: 24, height: 24, - colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn), + colorFilter: iconColor != null + ? ColorFilter.mode(iconColor, BlendMode.srcIn) + : null, ), Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + style: AppFonts.yekan14.copyWith( + color: titleColor ?? AppColor.mediumGreyDarkActive, + ), ), ], ), diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart index f0cef35..59335f8 100644 --- a/packages/chicken/lib/presentation/pages/profile/view.dart +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -75,8 +75,8 @@ class ProfilePage extends GetView { title: 'خروج', selected: true, color: ColorFilter.mode(Colors.redAccent, BlendMode.srcIn), - cardColor:AppColor.error.withValues(alpha: 0.24), - textColor: Colors.red, + cardColor: Color(0xFFEFEFEF), + textColor: AppColor.redDarkerText, onPressed: () { Get.bottomSheet(exitBottomSheet(), isScrollControlled: true); }, @@ -187,9 +187,10 @@ class ProfilePage extends GetView { }) => Container( padding: EdgeInsets.symmetric(horizontal: 12.h, vertical: 6.h), decoration: BoxDecoration( - color: hasColoredBox ? AppColor.blueLight : Colors.transparent, + color: hasColoredBox ? AppColor.greenLight : Colors.transparent, + borderRadius: BorderRadius.circular(8), border: hasColoredBox - ? Border.all(width: 1, color: AppColor.blueLightHover) + ? Border.all(width: 0.25, color: AppColor.bgDark) : Border.all(width: 0, color: Colors.transparent), ), child: Row( @@ -199,14 +200,14 @@ class ProfilePage extends GetView { Padding( padding: const EdgeInsets.only(left: 8.0), child: SvgGenImage.vec(icon).svg( - width: 20, - height: 20, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + width: 20.w, + height: 20.h, + colorFilter: ColorFilter.mode(AppColor.mediumGreyNormalActive, BlendMode.srcIn), ), ), - Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal)), + Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyNormalActive)), Spacer(), - Text(content, style: AppFonts.yekan13.copyWith(color: AppColor.darkGreyNormalHover)), + Text(content, style: AppFonts.yekan13.copyWith(color: AppColor.mediumGreyNormalHover)), ], ), ); @@ -230,7 +231,7 @@ class ProfilePage extends GetView { height: 52, padding: EdgeInsets.all(8), decoration: ShapeDecoration( - color: cardColor??AppColor.blueLight, + color: cardColor ?? AppColor.blueLight, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), child: SvgGenImage.vec(icon).svg( diff --git a/packages/chicken/lib/presentation/pages/root/logic.dart b/packages/chicken/lib/presentation/pages/root/logic.dart index 380c3c7..1994afc 100644 --- a/packages/chicken/lib/presentation/pages/root/logic.dart +++ b/packages/chicken/lib/presentation/pages/root/logic.dart @@ -59,7 +59,7 @@ class RootLogic extends GetxController { @override void onReady() { super.onReady(); - // Only call these methods if they haven't been called before + if (provinces.isEmpty) { getProvinces(); } @@ -157,4 +157,5 @@ class RootLogic extends GetxController { onError: (error, stacktrace) {}, ); } + } diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 1419f22..6579a21 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -105,19 +105,32 @@ class RootPage extends GetView { label: 'خانه', icon: Assets.vec.homeSvg.path, isSelected: controller.currentPage.value == 2, - onTap: () => controller.changePage(2), + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); + controller.changePage(2); + }, ), RBottomNavigationItem( label: 'قطعه بندی', icon: Assets.vec.convertCubeSvg.path, isSelected: controller.currentPage.value == 3, - onTap: () => controller.changePage(3), + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); + controller.changePage(3); + }, ), RBottomNavigationItem( label: 'پروفایل', icon: Assets.vec.profileCircleSvg.path, isSelected: controller.currentPage.value == 4, - onTap: () => controller.changePage(4), + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); + + controller.changePage(4); + }, ), ], ), diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index 0b589f9..f676d19 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -4,364 +4,163 @@ class AppColor { AppColor._(); //region --- Blue Colors --- - static const Color blueLight = Color( - 0xFFeaefff, - ); // #eaefff rgb(234, 239, 255) - static const Color blueLightHover = Color( - 0xFFe0e7ff, - ); // #e0e7ff rgb(224, 231, 255) - static const Color blueLightActive = Color( - 0xFFbecdff, - ); // #becdff rgb(190, 205, 255) + static const Color blueLight = Color(0xFFeaefff); // #eaefff rgb(234, 239, 255) + static const Color blueLightHover = Color(0xFFe0e7ff); // #e0e7ff rgb(224, 231, 255) + static const Color blueLightActive = Color(0xFFbecdff); // #becdff rgb(190, 205, 255) static const Color blueNormal = Color(0xFF2d5fff); // #2d5fff rgb(45, 95, 255) - static const Color blueNormalHover = Color( - 0xFF2956e6, - ); // #2956e6 rgb(41, 86, 230) - static const Color blueNormalActive = Color( - 0xFF244ccc, - ); // #244ccc rgb(36, 76, 204) + static const Color blueNormalHover = Color(0xFF2956e6); // #2956e6 rgb(41, 86, 230) + static const Color blueNormalActive = Color(0xFF244ccc); // #244ccc rgb(36, 76, 204) static const Color blueDark = Color(0xFF2247bf); // #2247bf rgb(34, 71, 191) - static const Color blueDarkHover = Color( - 0xFF1b3999, - ); // #1b3999 rgb(27, 57, 153) - static const Color blueDarkActive = Color( - 0xFF142b73, - ); // #142b73 rgb(20, 43, 115) + static const Color blueDarkHover = Color(0xFF1b3999); // #1b3999 rgb(27, 57, 153) + static const Color blueDarkActive = Color(0xFF142b73); // #142b73 rgb(20, 43, 115) static const Color blueDarker = Color(0xFF102159); // #102159 rgb(16, 33, 89) - static const Color blueFlashing = Color(0xFF6F91FF); // #6F91FF rgb(111, 145, 255) + static const Color blueFlashing = Color(0xFF6F91FF); // #6F91FF rgb(111, 145, 255) //endregion //region --- Green Colors --- - static const Color greenLight = Color( - 0xFFe6faf5, - ); // #e6faf5 rgb(230, 250, 245) - static const Color greenLightHover = Color( - 0xFFd9f7f0, - ); // #d9f7f0 rgb(217, 247, 240) - static const Color greenLightActive = Color( - 0xFFb0efdf, - ); // #b0efdf rgb(176, 239, 223) - static const Color greenNormal = Color( - 0xFF00cc99, - ); // #00cc99 rgb(0, 204, 153) - static const Color greenNormalHover = Color( - 0xFF00b88a, - ); // #00b88a rgb(0, 184, 138) - static const Color greenNormalActive = Color( - 0xFF00a37a, - ); // #00a37a rgb(0, 163, 122) + static const Color greenLight = Color(0xFFe6faf5); // #e6faf5 rgb(230, 250, 245) + static const Color greenLightHover = Color(0xFFd9f7f0); // #d9f7f0 rgb(217, 247, 240) + static const Color greenLightActive = Color(0xFFb0efdf); // #b0efdf rgb(176, 239, 223) + static const Color greenNormal = Color(0xFF00cc99); // #00cc99 rgb(0, 204, 153) + static const Color greenNormalHover = Color(0xFF00b88a); // #00b88a rgb(0, 184, 138) + static const Color greenNormalActive = Color(0xFF00a37a); // #00a37a rgb(0, 163, 122) static const Color greenDark = Color(0xFF009973); // #009973 rgb(0, 153, 115) - static const Color greenDarkHover = Color( - 0xFF007a5c, - ); // #007a5c rgb(0, 122, 92) - static const Color greenDarkActive = Color( - 0xFF005c45, - ); // #005c45 rgb(0, 92, 69) + static const Color greenDarkHover = Color(0xFF007a5c); // #007a5c rgb(0, 122, 92) + static const Color greenDarkActive = Color(0xFF005c45); // #005c45 rgb(0, 92, 69) static const Color greenDarker = Color(0xFF004736); // #004736 rgb(0, 71, 54) //endregion //region --- Black Colors --- - static const Color blackLight = Color( - 0xFFe6e6e6, - ); // #e6e6e6 rgb(230, 230, 230) - static const Color blackLightHover = Color( - 0xFFd9d9d9, - ); // #d9d9d9 rgb(217, 217, 217) - static const Color blackLightActive = Color( - 0xFFb0b0b0, - ); // #b0b0b0 rgb(176, 176, 176) + static const Color blackLight = Color(0xFFe6e6e6); // #e6e6e6 rgb(230, 230, 230) + static const Color blackLightHover = Color(0xFFd9d9d9); // #d9d9d9 rgb(217, 217, 217) + static const Color blackLightActive = Color(0xFFb0b0b0); // #b0b0b0 rgb(176, 176, 176) static const Color blackNormal = Color(0xFF000000); // #000000 rgb(0, 0, 0) - static const Color blackNormalHover = Color( - 0xFF000000, - ); // #000000 rgb(0, 0, 0) - static const Color blackNormalActive = Color( - 0xFF000000, - ); // #000000 rgb(0, 0, 0) + static const Color blackNormalHover = Color(0xFF000000); // #000000 rgb(0, 0, 0) + static const Color blackNormalActive = Color(0xFF000000); // #000000 rgb(0, 0, 0) static const Color blackDark = Color(0xFF000000); // #000000 rgb(0, 0, 0) static const Color blackDarkHover = Color(0xFF000000); // #000000 rgb(0, 0, 0) - static const Color blackDarkActive = Color( - 0xFF000000, - ); // #000000 rgb(0, 0, 0) + static const Color blackDarkActive = Color(0xFF000000); // #000000 rgb(0, 0, 0) static const Color blackDarker = Color(0xFF000000); // #000000 rgb(0, 0, 0) //endregion //region --- Grey Colors --- - static const Color darkGreyLight = Color( - 0xFFeaeaea, - ); // #eaeaea rgb(234, 234, 234) - static const Color darkGreyLightHover = Color( - 0xFFdfdfdf, - ); // #dfdfdf rgb(223, 223, 223) - static const Color darkGreyLightActive = Color( - 0xFFbdbdbd, - ); // #bdbdbd rgb(189, 189, 189) - static const Color darkGreyNormal = Color( - 0xFF2a2a2a, - ); // #2a2a2a rgb(42, 42, 42) - static const Color darkGreyNormalHover = Color( - 0xFF262626, - ); // #262626 rgb(38, 38, 38) - static const Color darkGreyNormalActive = Color( - 0xFF222222, - ); // #222222 rgb(34, 34, 34) - static const Color darkGreyDark = Color( - 0xFF202020, - ); // #202020 rgb(32, 32, 32) - static const Color darkGreyDarkHover = Color( - 0xFF191919, - ); // #191919 rgb(25, 25, 25) - static const Color darkGreyDarkActive = Color( - 0xFF131313, - ); // #131313 rgb(19, 19, 19) - static const Color darkGreyDarker = Color( - 0xFF0f0f0f, - ); // #0f0f0f rgb(15, 15, 15) + static const Color darkGreyLight = Color(0xFFeaeaea); // #eaeaea rgb(234, 234, 234) + static const Color darkGreyLightHover = Color(0xFFdfdfdf); // #dfdfdf rgb(223, 223, 223) + static const Color darkGreyLightActive = Color(0xFFbdbdbd); // #bdbdbd rgb(189, 189, 189) + static const Color darkGreyNormal = Color(0xFF2a2a2a); // #2a2a2a rgb(42, 42, 42) + static const Color darkGreyNormalHover = Color(0xFF262626); // #262626 rgb(38, 38, 38) + static const Color darkGreyNormalActive = Color(0xFF222222); // #222222 rgb(34, 34, 34) + static const Color darkGreyDark = Color(0xFF202020); // #202020 rgb(32, 32, 32) + static const Color darkGreyDarkHover = Color(0xFF191919); // #191919 rgb(25, 25, 25) + static const Color darkGreyDarkActive = Color(0xFF131313); // #131313 rgb(19, 19, 19) + static const Color darkGreyDarker = Color(0xFF0f0f0f); // #0f0f0f rgb(15, 15, 15) //endregion //region ---Medium Grey Colors --- - static const Color mediumGreyLight = Color( - 0xFFf4f4f4, - ); // #f4f4f4 rgb(244, 244, 244) - static const Color mediumGreyLightHover = Color( - 0xFFeeeeee, - ); // #eeeeee rgb(238, 238, 238) - static const Color mediumGreyLightActive = Color( - 0xFFdcdcdc, - ); // #dcdcdc rgb(220, 220, 220) - static const Color mediumGreyNormal = Color( - 0xFF8f8f8f, - ); // #8f8f8f rgb(143, 143, 143) - static const Color mediumGreyNormalHover = Color( - 0xFF818181, - ); // #818181 rgb(129, 129, 129) - static const Color mediumGreyNormalActive = Color( - 0xFF727272, - ); // #727272 rgb(114, 114, 114) - static const Color mediumGreyDark = Color( - 0xFF6b6b6b, - ); // #6b6b6b rgb(107, 107, 107) - static const Color mediumGreyDarkHover = Color( - 0xFF565656, - ); // #565656 rgb(86, 86, 86) - static const Color mediumGreyDarkActive = Color( - 0xFF404040, - ); // #404040 rgb(64, 64, 64) - static const Color mediumGreyDarker = Color( - 0xFF323232, - ); // #323232 rgb(50, 50, 50) + static const Color mediumGreyLight = Color(0xFFf4f4f4); // #f4f4f4 rgb(244, 244, 244) + static const Color mediumGreyLightHover = Color(0xFFeeeeee); // #eeeeee rgb(238, 238, 238) + static const Color mediumGreyLightActive = Color(0xFFdcdcdc); // #dcdcdc rgb(220, 220, 220) + static const Color mediumGreyNormal = Color(0xFF8f8f8f); // #8f8f8f rgb(143, 143, 143) + static const Color mediumGreyNormalHover = Color(0xFF818181); // #818181 rgb(129, 129, 129) + static const Color mediumGreyNormalActive = Color(0xFF727272); // #727272 rgb(114, 114, 114) + static const Color mediumGreyDark = Color(0xFF6b6b6b); // #6b6b6b rgb(107, 107, 107) + static const Color mediumGreyDarkHover = Color(0xFF565656); // #565656 rgb(86, 86, 86) + static const Color mediumGreyDarkActive = Color(0xFF404040); // #404040 rgb(64, 64, 64) + static const Color mediumGreyDarker = Color(0xFF323232); // #323232 rgb(50, 50, 50) static const Color customGrey = Color(0xFF808081); // #808081 rgb(128, 128, 129) //endregion //region ---Light Grey Colors --- - static const Color lightGreyLight = Color( - 0xFFfdfdfd, - ); // #fdfdfd rgb(253, 253, 253) - static const Color lightGreyLightHover = Color( - 0xFFfcfcfc, - ); // #fcfcfc rgb(252, 252, 252) - static const Color lightGreyLightActive = Color( - 0xFFfafafa, - ); // #fafafa rgb(250, 250, 250) - static const Color lightGreyNormal = Color( - 0xFFeeeeee, - ); // #eeeeee rgb(238, 238, 238) - static const Color lightGreyNormalHover = Color( - 0xFFd6d6d6, - ); // #d6d6d6 rgb(214, 214, 214) - static const Color lightGreyNormalActive = Color( - 0xFFbebebe, - ); // #bebebe rgb(190, 190, 190) - static const Color lightGreyDark = Color( - 0xFFb3b3b3, - ); // #b3b3b3 rgb(179, 179, 179) - static const Color lightGreyDarkHover = Color( - 0xFF8f8f8f, - ); // #8f8f8f rgb(143, 143, 143) - static const Color lightGreyDarkActive = Color( - 0xFF6b6b6b, - ); // #6b6b6b rgb(107, 107, 107) - static const Color lightGreyDarker = Color( - 0xFF535353, - ); // #535353 rgb(83, 83, 83) + static const Color lightGreyLight = Color(0xFFfdfdfd); // #fdfdfd rgb(253, 253, 253) + static const Color lightGreyLightHover = Color(0xFFfcfcfc); // #fcfcfc rgb(252, 252, 252) + static const Color lightGreyLightActive = Color(0xFFfafafa); // #fafafa rgb(250, 250, 250) + static const Color lightGreyNormal = Color(0xFFeeeeee); // #eeeeee rgb(238, 238, 238) + static const Color lightGreyNormalHover = Color(0xFFd6d6d6); // #d6d6d6 rgb(214, 214, 214) + static const Color lightGreyNormalActive = Color(0xFFbebebe); // #bebebe rgb(190, 190, 190) + static const Color lightGreyDark = Color(0xFFb3b3b3); // #b3b3b3 rgb(179, 179, 179) + static const Color lightGreyDarkHover = Color(0xFF8f8f8f); // #8f8f8f rgb(143, 143, 143) + static const Color lightGreyDarkActive = Color(0xFF6b6b6b); // #6b6b6b rgb(107, 107, 107) + static const Color lightGreyDarker = Color(0xFF535353); // #535353 rgb(83, 83, 83) //endregion //region ---WhiteGrey Colors --- - static const Color whiteGreyLight = Color( - 0xFFfefefe, - ); // #fefefe rgb(254, 254, 254) - static const Color whiteGreyLightHover = Color( - 0xFFfefefe, - ); // #fefefe rgb(254, 254, 254) - static const Color whiteGreyLightActive = Color( - 0xFFfdfdfd, - ); // #fdfdfd rgb(253, 253, 253) - static const Color whiteGreyNormal = Color( - 0xFFf9f9f9, - ); // #f9f9f9 rgb(249, 249, 249) - static const Color whiteGreyNormalHover = Color( - 0xFFe0e0e0, - ); // #e0e0e0 rgb(224, 224, 224) - static const Color whiteGreyNormalActive = Color( - 0xFFc7c7c7, - ); // #c7c7c7 rgb(199, 199, 199) - static const Color whiteGreyDark = Color( - 0xFFbbbbbb, - ); // #bbbbbb rgb(187, 187, 187) - static const Color whiteGreyDarkHover = Color( - 0xFF959595, - ); // #959595 rgb(149, 149, 149) - static const Color whiteGreyDarkActive = Color( - 0xFF707070, - ); // #707070 rgb(112, 112, 112) - static const Color whiteGreyDarker = Color( - 0xFF575757, - ); // #575757 rgb(87, 87, 87) + static const Color whiteGreyLight = Color(0xFFfefefe); // #fefefe rgb(254, 254, 254) + static const Color whiteGreyLightHover = Color(0xFFfefefe); // #fefefe rgb(254, 254, 254) + static const Color whiteGreyLightActive = Color(0xFFfdfdfd); // #fdfdfd rgb(253, 253, 253) + static const Color whiteGreyNormal = Color(0xFFf9f9f9); // #f9f9f9 rgb(249, 249, 249) + static const Color whiteGreyNormalHover = Color(0xFFe0e0e0); // #e0e0e0 rgb(224, 224, 224) + static const Color whiteGreyNormalActive = Color(0xFFc7c7c7); // #c7c7c7 rgb(199, 199, 199) + static const Color whiteGreyDark = Color(0xFFbbbbbb); // #bbbbbb rgb(187, 187, 187) + static const Color whiteGreyDarkHover = Color(0xFF959595); // #959595 rgb(149, 149, 149) + static const Color whiteGreyDarkActive = Color(0xFF707070); // #707070 rgb(112, 112, 112) + static const Color whiteGreyDarker = Color(0xFF575757); // #575757 rgb(87, 87, 87) //endregion //region ---White Colors --- - static const Color whiteLight = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteLightHover = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteLightActive = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteNormal = Color( - 0xFFffffff, - ); // #ffffff rgb(255, 255, 255) - static const Color whiteNormalHover = Color( - 0xFFe6e6e6, - ); // #e6e6e6 rgb(230, 230, 230) - static const Color whiteNormalActive = Color( - 0xFFcccccc, - ); // #cccccc rgb(204, 204, 204) - static const Color whiteDark = Color( - 0xFFbfbfbf, - ); // #bfbfbf rgb(191, 191, 191) - static const Color whiteDarkHover = Color( - 0xFF999999, - ); // #999999 rgb(153, 153, 153) - static const Color whiteDarkActive = Color( - 0xFF737373, - ); // #737373 rgb(115, 115, 115) + static const Color whiteLight = Color(0xFFffffff); // #ffffff rgb(255, 255, 255) + static const Color whiteLightHover = Color(0xFFffffff); // #ffffff rgb(255, 255, 255) + static const Color whiteLightActive = Color(0xFFffffff); // #ffffff rgb(255, 255, 255) + static const Color whiteNormal = Color(0xFFffffff); // #ffffff rgb(255, 255, 255) + static const Color whiteNormalHover = Color(0xFFe6e6e6); // #e6e6e6 rgb(230, 230, 230) + static const Color whiteNormalActive = Color(0xFFcccccc); // #cccccc rgb(204, 204, 204) + static const Color whiteDark = Color(0xFFbfbfbf); // #bfbfbf rgb(191, 191, 191) + static const Color whiteDarkHover = Color(0xFF999999); // #999999 rgb(153, 153, 153) + static const Color whiteDarkActive = Color(0xFF737373); // #737373 rgb(115, 115, 115) static const Color whiteDarker = Color(0xFF595959); // #595959 rgb(89, 89, 89) //endregion //region --- green1 Colors --- - static const Color green1Light = Color( - 0xFFe6f6f4, - ); // #e6f6f4 rgb(230, 246, 244) - static const Color green1LightHover = Color( - 0xFFd9f2ef, - ); // #d9f2ef rgb(217, 242, 239) - static const Color green1LightActive = Color( - 0xFFb0e4dd, - ); // #b0e4dd rgb(176, 228, 221) - static const Color green1Normal = Color( - 0xFF00a991, - ); // #00a991 rgb(0, 169, 145) - static const Color green1NormalHover = Color( - 0xFF009883, - ); // #009883 rgb(0, 152, 131) - static const Color green1NormalActive = Color( - 0xFF008774, - ); // #008774 rgb(0, 135, 116) + static const Color green1Light = Color(0xFFe6f6f4); // #e6f6f4 rgb(230, 246, 244) + static const Color green1LightHover = Color(0xFFd9f2ef); // #d9f2ef rgb(217, 242, 239) + static const Color green1LightActive = Color(0xFFb0e4dd); // #b0e4dd rgb(176, 228, 221) + static const Color green1Normal = Color(0xFF00a991); // #00a991 rgb(0, 169, 145) + static const Color green1NormalHover = Color(0xFF009883); // #009883 rgb(0, 152, 131) + static const Color green1NormalActive = Color(0xFF008774); // #008774 rgb(0, 135, 116) static const Color green1Dark = Color(0xFF007f6d); // #007f6d rgb(0, 127, 109) - static const Color green1DarkHover = Color( - 0xFF006557, - ); // #006557 rgb(0, 101, 87) - static const Color green1DarkActive = Color( - 0xFF004c41, - ); // #004c41 rgb(0, 76, 65) + static const Color green1DarkHover = Color(0xFF006557); // #006557 rgb(0, 101, 87) + static const Color green1DarkActive = Color(0xFF004c41); // #004c41 rgb(0, 76, 65) static const Color green1Darker = Color(0xFF003b33); // #003b33 rgb(0, 59, 51) //endregion //region --- Yellow Colors --- - static const Color yellowLight = Color( - 0xFFfff9e6, - ); // #fff9e6 rgb(255, 249, 230) - static const Color yellowLightHover = Color( - 0xFFfff6da, - ); // #fff6da rgb(255, 246, 218) - static const Color yellowLightActive = Color( - 0xFFffecb2, - ); // #ffecb2 rgb(255, 236, 178) - static const Color yellowNormal = Color( - 0xFFffc107, - ); // #ffc107 rgb(255, 193, 7) - static const Color yellowNormalHover = Color( - 0xFFe6ae06, - ); // #e6ae06 rgb(230, 174, 6) - static const Color yellowNormalActive = Color( - 0xFFcc9a06, - ); // #cc9a06 rgb(204, 154, 6) + static const Color yellowLight = Color(0xFFfff9e6); // #fff9e6 rgb(255, 249, 230) + static const Color yellowLightHover = Color(0xFFfff6da); // #fff6da rgb(255, 246, 218) + static const Color yellowLightActive = Color(0xFFffecb2); // #ffecb2 rgb(255, 236, 178) + static const Color yellowNormal = Color(0xFFffc107); // #ffc107 rgb(255, 193, 7) + static const Color yellowNormalHover = Color(0xFFe6ae06); // #e6ae06 rgb(230, 174, 6) + static const Color yellowNormalActive = Color(0xFFcc9a06); // #cc9a06 rgb(204, 154, 6) static const Color yellowDark = Color(0xFFbf9105); // #bf9105 rgb(191, 145, 5) - static const Color yellowDarkHover = Color( - 0xFF997404, - ); // #997404 rgb(153, 116, 4) - static const Color yellowDarkActive = Color( - 0xFF735703, - ); // #735703 rgb(115, 87, 3) + static const Color yellowDarkHover = Color(0xFF997404); // #997404 rgb(153, 116, 4) + static const Color yellowDarkActive = Color(0xFF735703); // #735703 rgb(115, 87, 3) static const Color yellowDarker = Color(0xFF594402); // #594402 rgb(89, 68, 2) //endregion //region --- red Colors --- static const Color redLight = Color(0xFFfdeeee); // #fdeeee rgb(253, 238, 238) - static const Color redLightHover = Color( - 0xFFfce6e6, - ); // #fce6e6 rgb(252, 230, 230) - static const Color redLightActive = Color( - 0xFFf9cbcb, - ); // #f9cbcb rgb(249, 203, 203) + static const Color redLightHover = Color(0xFFfce6e6); // #fce6e6 rgb(252, 230, 230) + static const Color redLightActive = Color(0xFFf9cbcb); // #f9cbcb rgb(249, 203, 203) static const Color redNormal = Color(0xFFeb5757); // #eb5757 rgb(235, 87, 87) - static const Color redNormalHover = Color( - 0xFFd44e4e, - ); // #d44e4e rgb(212, 78, 78) - static const Color redNormalActive = Color( - 0xFFbc4646, - ); // #bc4646 rgb(188, 70, 70) + static const Color redNormalHover = Color(0xFFd44e4e); // #d44e4e rgb(212, 78, 78) + static const Color redNormalActive = Color(0xFFbc4646); // #bc4646 rgb(188, 70, 70) static const Color redDark = Color(0xFFb04141); // #b04141 rgb(176, 65, 65) - static const Color redDarkHover = Color( - 0xFF8d3434, - ); // #8d3434 rgb(141, 52, 52) - static const Color redDarkActive = Color( - 0xFF6a2727, - ); // #6a2727 rgb(106, 39, 39) + static const Color redDarkHover = Color(0xFF8d3434); // #8d3434 rgb(141, 52, 52) + static const Color redDarkActive = Color(0xFF6a2727); // #6a2727 rgb(106, 39, 39) static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30) + static const Color redDarkerText = Color(0xFFD24E4E); // #D34E4E rgba(211, 78, 78, 1) //endregion //region --- Teal Colors --- - static const Color tealLight = Color( - 0xFFe8f6f8, - ); // #e8f6f8 rgb(232, 246, 248) - static const Color tealLightHover = Color( - 0xFFdcf1f4, - ); // #dcf1f4 rgb(220, 241, 244) - static const Color tealLightActive = Color( - 0xFFb7e2e9, - ); // #b7e2e9 rgb(183, 226, 233) - static const Color tealNormal = Color( - 0xFF17a2b8, - ); // #17a2b8 rgb(23, 162, 184) - static const Color tealNormalHover = Color( - 0xFF1592a6, - ); // #1592a6 rgb(21, 146, 166) - static const Color tealNormalActive = Color( - 0xFF128293, - ); // #128293 rgb(18, 130, 147) + static const Color tealLight = Color(0xFFe8f6f8); // #e8f6f8 rgb(232, 246, 248) + static const Color tealLightHover = Color(0xFFdcf1f4); // #dcf1f4 rgb(220, 241, 244) + static const Color tealLightActive = Color(0xFFb7e2e9); // #b7e2e9 rgb(183, 226, 233) + static const Color tealNormal = Color(0xFF17a2b8); // #17a2b8 rgb(23, 162, 184) + static const Color tealNormalHover = Color(0xFF1592a6); // #1592a6 rgb(21, 146, 166) + static const Color tealNormalActive = Color(0xFF128293); // #128293 rgb(18, 130, 147) static const Color tealDark = Color(0xFF117a8a); // #117a8a rgb(17, 122, 138) - static const Color tealDarkHover = Color( - 0xFF0e616e, - ); // #0e616e rgb(14, 97, 110) - static const Color tealDarkActive = Color( - 0xFF0a4953, - ); // #0a4953 rgb(10, 73, 83) + static const Color tealDarkHover = Color(0xFF0e616e); // #0e616e rgb(14, 97, 110) + static const Color tealDarkActive = Color(0xFF0a4953); // #0a4953 rgb(10, 73, 83) static const Color tealDarker = Color(0xFF083940); // #083940 rgb(8, 57, 64) - - static const Color bgLight = Color(0xFFF5F5F5); // #083940 rgb(8, 57, 64) static const Color bgIcon = Color(0xFF797979); // #797979 static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64) @@ -372,8 +171,8 @@ class AppColor { //region --- category Colors --- static const Color confirm = greenNormalActive; - static const Color warning =yellowNormal; - static const Color error =redNormal; + static const Color warning = yellowNormal; + static const Color error = redNormal; static const Color info = tealNormal; //endregion } diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 59e9001..1e6f6ef 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -101,6 +101,9 @@ class $AssetsIconsGen { /// File path: assets/icons/cube_top_rotation.svg SvgGenImage get cubeTopRotation => const SvgGenImage('assets/icons/cube_top_rotation.svg'); + /// File path: assets/icons/cube_watting.svg + SvgGenImage get cubeWatting => const SvgGenImage('assets/icons/cube_watting.svg'); + /// File path: assets/icons/diagram.svg SvgGenImage get diagram => const SvgGenImage('assets/icons/diagram.svg'); @@ -268,6 +271,7 @@ class $AssetsIconsGen { cubeScan, cubeSearch, cubeTopRotation, + cubeWatting, diagram, download, edit, @@ -422,6 +426,9 @@ class $AssetsVecGen { /// File path: assets/vec/cube_top_rotation.svg.vec SvgGenImage get cubeTopRotationSvg => const SvgGenImage.vec('assets/vec/cube_top_rotation.svg.vec'); + /// File path: assets/vec/cube_watting.svg.vec + SvgGenImage get cubeWattingSvg => const SvgGenImage.vec('assets/vec/cube_watting.svg.vec'); + /// File path: assets/vec/diagram.svg.vec SvgGenImage get diagramSvg => const SvgGenImage.vec('assets/vec/diagram.svg.vec'); @@ -589,6 +596,7 @@ class $AssetsVecGen { cubeScanSvg, cubeSearchSvg, cubeTopRotationSvg, + cubeWattingSvg, diagramSvg, downloadSvg, editSvg, From cb264c3234af2fc402ef531ced7f903bcb909272 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Jul 2025 12:46:10 +0330 Subject: [PATCH 220/256] chore : change app version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 4008ff1..2f5a77c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_app description: "A new Flutter project." publish_to: 'none' -version: 1.3.2+3 +version: 1.3.5+4 environment: sdk: ^3.8.1 From e27da8da69a34f0787e792161e5a60c7ee4ba227 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Jul 2025 15:34:13 +0330 Subject: [PATCH 221/256] fix : ui changes pre release --- .../pages/buy_in_province/view.dart | 2 +- .../pages/buy_in_province_all/view.dart | 5 +- .../pages/buy_out_of_province/view.dart | 160 +++++++++--------- .../pages/sales_in_province/view.dart | 8 +- .../presentation/pages/segmentation/view.dart | 11 +- .../bottom_sheet/base_bottom_sheet.dart | 27 ++- 6 files changed, 113 insertions(+), 100 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart index 17ad848..6343fd4 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province/view.dart @@ -38,7 +38,7 @@ class BuyInProvincePage extends GetView { children: [ Expanded( child: RSegment( - children: ['در انتظار', 'همه'], + children: ['در انتظار', 'بایگانی'], selectedIndex: 0, borderColor: const Color(0xFFB4B4B4), selectedBorderColor: AppColor.blueNormal, diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart index e6929b2..3ddd066 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -248,9 +248,10 @@ class BuyInProvinceAllPage extends GetView { Color getLabelColor(String? item) { switch (item) { case 'pending': - return AppColor.greenLightHover; - case 'accepted': return AppColor.blueLight; + case 'accepted': + + return AppColor.greenLightHover; case 'rejected': return AppColor.redLightHover; default: diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index 165b129..7b85d9b 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -60,7 +60,14 @@ class BuyOutOfProvincePage extends GetView { ], floatingActionButton: RFab.add( onPressed: () { - Get.bottomSheet(addPurchasedInformationBottomSheet(), isScrollControlled: true); + Get.bottomSheet( + addPurchasedInformationBottomSheet(), + isScrollControlled: true, + ignoreSafeArea: false, + ).whenComplete(() { + controller.resetSubmitForm(); + + },); }, ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, @@ -190,6 +197,7 @@ class BuyOutOfProvincePage extends GetView { addPurchasedInformationBottomSheet(true), isScrollControlled: true, ).whenComplete(() { + controller.resetSubmitForm(); }); }, @@ -292,87 +300,85 @@ class BuyOutOfProvincePage extends GetView { Widget addPurchasedInformationBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( - child: SingleChildScrollView( - child: Form( - key: controller.formKey, - child: Column( - spacing: 8, - children: [ - Text( - isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - _productDropDown(), + child: Form( + key: controller.formKey, + child: Column( + spacing: 8, + children: [ + Text( + isOnEdit ? 'ویرایش اطلاعات خرید' : 'ثبت اطلاعات خرید', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + _productDropDown(), - Container( - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), - - child: Column(spacing: 12, children: [_provinceWidget(), _cityWidget()]), + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), ), - Container( - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), + child: Column(spacing: 12, children: [_provinceWidget(), _cityWidget()]), + ), - child: Column( - spacing: 12, - children: [ - RTextField( - controller: controller.sellerNameController, - label: 'نام فروشنده', - borderColor: AppColor.darkGreyLight, - filled: true, - filledColor: AppColor.bgLight, - ), - RTextField( - controller: controller.sellerPhoneController, - label: 'تلفن فروشنده', - keyboardType: TextInputType.phone, - borderColor: AppColor.darkGreyLight, - maxLength: 11, - filled: true, - filledColor: AppColor.bgLight, - validator: (value) { - if (value == null || value.isEmpty) { - return 'لطفاً شماره موبایل را وارد کنید'; - } - String cleaned = value.replaceAll(',', ''); - if (cleaned.length != 11) { - return 'شماره موبایل باید ۱۱ رقم باشد'; - } - if (!cleaned.startsWith('09')) { - return 'شماره موبایل باید با 09 شروع شود'; - } - return null; - }, - ), - - UnitTextField( - controller: controller.carcassWeightController, - hint: 'وزن', - unit: 'کیلوگرم', - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - SeparatorInputFormatter(), - ], - ), - ], - ), + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), ), - _imageCarcasesWidget(isOnEdit), - submitButtonWidget(isOnEdit), - SizedBox(), - ], - ), + + child: Column( + spacing: 12, + children: [ + RTextField( + controller: controller.sellerNameController, + label: 'نام فروشنده', + borderColor: AppColor.darkGreyLight, + filled: true, + filledColor: AppColor.bgLight, + ), + RTextField( + controller: controller.sellerPhoneController, + label: 'تلفن فروشنده', + keyboardType: TextInputType.phone, + borderColor: AppColor.darkGreyLight, + maxLength: 11, + filled: true, + filledColor: AppColor.bgLight, + validator: (value) { + if (value == null || value.isEmpty) { + return 'لطفاً شماره موبایل را وارد کنید'; + } + String cleaned = value.replaceAll(',', ''); + if (cleaned.length != 11) { + return 'شماره موبایل باید ۱۱ رقم باشد'; + } + if (!cleaned.startsWith('09')) { + return 'شماره موبایل باید با 09 شروع شود'; + } + return null; + }, + ), + + UnitTextField( + controller: controller.carcassWeightController, + hint: 'وزن', + unit: 'کیلوگرم', + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + SeparatorInputFormatter(), + ], + ), + ], + ), + ), + _imageCarcasesWidget(isOnEdit), + submitButtonWidget(isOnEdit), + SizedBox(), + ], ), ), ); diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 7171ab7..c3e30c5 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -78,7 +78,9 @@ class SalesInProvincePage extends GetView { addOrEditBottomSheet(), isScrollControlled: true, backgroundColor: Colors.transparent, - ); + ).whenComplete(() { + controller.clearForm(); + }); }, ), @@ -326,7 +328,9 @@ class SalesInProvincePage extends GetView { addOrEditBottomSheet(true), isScrollControlled: true, backgroundColor: Colors.transparent, - ); + ).whenComplete(() { + controller.clearForm(); + }); }, textStyle: AppFonts.yekan20.copyWith(color: Colors.white), backgroundColor: AppColor.greenNormal, diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index efbe797..080ad23 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -55,7 +55,13 @@ class SegmentationPage extends GetView { floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, floatingActionButton: RFab.add( onPressed: () { - Get.bottomSheet(addOrEditBottomSheet(), isScrollControlled: true); + Get.bottomSheet( + addOrEditBottomSheet(), + isScrollControlled: true, + ignoreSafeArea: false, + ).whenComplete(() { + controller.clearForm(); + }); }, ), ); @@ -189,6 +195,7 @@ class SegmentationPage extends GetView { Get.bottomSheet( addOrEditBottomSheet(true), isScrollControlled: true, + ignoreSafeArea: false, ).whenComplete(() { controller.clearForm(); }); @@ -221,7 +228,7 @@ class SegmentationPage extends GetView { Widget addOrEditBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( - height: 300.h, + height: 340.h, child: SingleChildScrollView( child: Form( key: controller.formKey, diff --git a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart index 71cbaff..7d921b7 100644 --- a/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart +++ b/packages/core/lib/presentation/widget/bottom_sheet/base_bottom_sheet.dart @@ -11,21 +11,18 @@ class BaseBottomSheet extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - height: height ?? MediaQuery.of(context).size.height * 0.85, - padding: EdgeInsets.symmetric(vertical: 15, horizontal: 10), - decoration: BoxDecoration( - color: bgColor ?? Colors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(25), - topRight: Radius.circular(25), + return SafeArea( + child: Container( + height: height ?? MediaQuery.of(context).size.height * 0.80, + padding: EdgeInsets.symmetric(vertical: 15, horizontal: 10), + decoration: BoxDecoration( + color: bgColor ?? Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(25), + topRight: Radius.circular(25), + ), ), - ), - child: SingleChildScrollView( child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 8, children: [ SizedBox( width: MediaQuery.of(context).size.width, @@ -54,10 +51,8 @@ class BaseBottomSheet extends StatelessWidget { ], ), ), - SizedBox(height: 2), - - child, + Expanded(child: SingleChildScrollView(child: child)), ], ), ), From e4740f786e83b4033837aca17867e0fb232205ec Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 20 Jul 2025 15:48:13 +0330 Subject: [PATCH 222/256] fix : ui changes pre-release --- .../pages/sales_out_of_province_buyers/view.dart | 10 ++++++---- .../pages/sales_out_of_province_sales_list/view.dart | 8 +++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart index 23b0a04..e04807c 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_buyers/view.dart @@ -55,7 +55,11 @@ class SalesOutOfProvinceBuyersPage extends GetView controller.resetSubmitForm()); }, ), floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, @@ -294,9 +298,7 @@ class SalesOutOfProvinceBuyersPage extends GetView controller.resetSubmitForm()); }, textStyle: AppFonts.yekan20.copyWith(color: Colors.white), backgroundColor: AppColor.greenNormal, diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart index 1b36690..6ea37ba 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province_sales_list/view.dart @@ -50,7 +50,13 @@ class SalesOutOfProvinceSalesListPage extends GetView Date: Mon, 21 Jul 2025 09:16:13 +0330 Subject: [PATCH 223/256] feat : new segment logic --- .../pages/segmentation/logic.dart | 30 +++++++- .../presentation/pages/segmentation/view.dart | 75 ++++++++++++++++++- .../widget/overlay_dropdown_widget/view.dart | 11 ++- 3 files changed, 109 insertions(+), 7 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 9247a90..40dae1f 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; @@ -21,23 +22,27 @@ class SegmentationLogic extends GetxController { Rx fromDateFilter = Jalali.now().obs; Rx toDateFilter = Jalali.now().obs; RxnString searchedValue = RxnString(); - + RxInt saleType = 1.obs; GlobalKey formKey = GlobalKey(); TextEditingController weightController = TextEditingController(text: '0'); RxBool isSubmitButtonEnabled = false.obs; - + Rxn selectedGuildModel = Rxn(); Rxn selectedProduct = Rxn(); Rxn selectedSegment = Rxn(); Rx>> segmentationList = Resource>.loading().obs; + RxList guildsModel = [].obs; + + @override void onInit() { super.onInit(); routesName = ['قطعه‌بندی'].toList(); once(rootLogic.rolesProductsModel, (callback) => selectedProduct.value = callback.first); getAllSegmentation(); + getGuilds(); } @override @@ -187,4 +192,25 @@ class SegmentationLogic extends GetxController { ); return res; } + + + Future getGuilds() async { + safeCall( + call: () async => + await rootLogic.chickenRepository.getGuilds( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + queryParams: {'all': true}, + role: 'Steward', + ), + ), + onSuccess: (result) { + if (result != null) { + guildsModel.clear(); + guildsModel.addAll(result); + } + }, + onError: (error, stacktrace) {}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index 080ad23..361ec32 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; @@ -228,7 +229,7 @@ class SegmentationPage extends GetView { Widget addOrEditBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( - height: 340.h, + height: 430.h, child: SingleChildScrollView( child: Form( key: controller.formKey, @@ -240,7 +241,53 @@ class SegmentationPage extends GetView { style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), _productDropDown(), + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + children: [ + const SizedBox(height: 8), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + + controller.selectedGuildModel.value = null; + controller.selectedGuildModel.refresh(); + }, + ), + Text('خودم', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('صنف/مباشر', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + guildsDropDown(), + ], + ), + ), Container( padding: EdgeInsets.all(8), decoration: BoxDecoration( @@ -331,4 +378,30 @@ class SegmentationPage extends GetView { ); }); } + + Widget guildsDropDown() { + return Obx(() { + final item = controller.selectedGuildModel.value; + return OverlayDropdownWidget( + key: ValueKey(item?.user?.fullname ?? ''), + items: controller.guildsModel, + isDisabled: controller.saleType.value == 1, + onChanged: (value) { + controller.selectedGuildModel.value = value; + }, + selectedItem: item, + + itemBuilder: (item) => Text( + item.user != null + ? '${item.steward == true ? 'مباشر' : 'صنف'} ${item.user!.fullname} (${item.user!.mobile})' + : 'بدون نام', + ), + labelBuilder: (item) => Text( + item?.user != null + ? '${item?.steward == true ? 'مباشر' : 'صنف'} ${item?.user!.fullname} (${item?.user!.mobile})' + : 'انتخاب مباشر/صنف', + ), + ); + }); + } } diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index 345e21a..80394cc 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -14,7 +14,7 @@ class OverlayDropdownWidget extends StatefulWidget { final Widget Function(T? selected) labelBuilder; final void Function(T selected)? onChanged; final EdgeInsets? contentPadding; - + final bool isDisabled; const OverlayDropdownWidget({ super.key, required this.items, @@ -27,6 +27,7 @@ class OverlayDropdownWidget extends StatefulWidget { this.height, this.background, this.hasDropIcon = true, + this.isDisabled = false, }); @override @@ -123,9 +124,11 @@ class _OverlayDropdownState extends State> { Widget build(BuildContext context) { return GestureDetector( key: _key, - onTap: () { - _isOpen.value ? _removeOverlay() : _showOverlay(); - }, + onTap: widget.isDisabled + ? null + : () { + _isOpen.value ? _removeOverlay() : _showOverlay(); + }, child: Container( height: widget.height?.toDouble() ?? 40, width: Get.width, From d300133adfe31d61f4f207528721fe472bb1fff2 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Jul 2025 09:32:29 +0330 Subject: [PATCH 224/256] feat : new segment logic --- .../segmentation_model.dart | 1 + .../segmentation_model.freezed.dart | 27 ++++++++++--------- .../segmentation_model.g.dart | 2 ++ .../pages/segmentation/logic.dart | 14 ++++------ 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart index 6226831..2ee7915 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -13,6 +13,7 @@ abstract class SegmentationModel with _$SegmentationModel { DateTime? date, int? weight, String? result, + String? guildKey, }) = _SegmentationModel; factory SegmentationModel.fromJson(Map json) => diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index ef5569d..94c2aa9 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$SegmentationModel { - String? get key; String? get productKey; Buyer? get buyer; DateTime? get date; int? get weight; String? get result; + String? get key; String? get productKey; Buyer? get buyer; DateTime? get date; int? get weight; String? get result; String? get guildKey; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $SegmentationModelCopyWith get copyWith => _$SegmentationMode @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result); +int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result,guildKey); @override String toString() { - return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result)'; + return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result, guildKey: $guildKey)'; } @@ -49,7 +49,7 @@ abstract mixin class $SegmentationModelCopyWith<$Res> { factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; @useResult $Res call({ - String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result + String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result, String? guildKey }); @@ -66,7 +66,7 @@ class _$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,Object? guildKey = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable @@ -74,6 +74,7 @@ as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullabl as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable +as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -97,7 +98,7 @@ $BuyerCopyWith<$Res>? get buyer { @JsonSerializable() class _SegmentationModel implements SegmentationModel { - const _SegmentationModel({this.key, this.productKey, this.buyer, this.date, this.weight, this.result}); + const _SegmentationModel({this.key, this.productKey, this.buyer, this.date, this.weight, this.result, this.guildKey}); factory _SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); @override final String? key; @@ -106,6 +107,7 @@ class _SegmentationModel implements SegmentationModel { @override final DateTime? date; @override final int? weight; @override final String? result; +@override final String? guildKey; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @@ -120,16 +122,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result); +int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result,guildKey); @override String toString() { - return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result)'; + return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result, guildKey: $guildKey)'; } @@ -140,7 +142,7 @@ abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationM factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; @override @useResult $Res call({ - String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result + String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result, String? guildKey }); @@ -157,7 +159,7 @@ class __$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,Object? guildKey = freezed,}) { return _then(_SegmentationModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable @@ -165,6 +167,7 @@ as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullabl as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable +as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable as String?, )); } diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart index 745602a..4834697 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -18,6 +18,7 @@ _SegmentationModel _$SegmentationModelFromJson(Map json) => : DateTime.parse(json['date'] as String), weight: (json['weight'] as num?)?.toInt(), result: json['result'] as String?, + guildKey: json['guild_key'] as String?, ); Map _$SegmentationModelToJson(_SegmentationModel instance) => @@ -28,6 +29,7 @@ Map _$SegmentationModelToJson(_SegmentationModel instance) => 'date': instance.date?.toIso8601String(), 'weight': instance.weight, 'result': instance.result, + 'guild_key': instance.guildKey, }; _Buyer _$BuyerFromJson(Map json) => _Buyer( diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 40dae1f..f22d1f5 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -174,10 +174,11 @@ class SegmentationLogic extends GetxController { var res = true; SegmentationModel segmentationModel = SegmentationModel( productKey: selectedProduct.value?.key, - weight: int.tryParse(weightController.text.clearComma) ?? 0, ); - iLog(segmentationModel.toString()); + if (saleType.value == 2) { + segmentationModel.copyWith(guildKey: selectedGuildModel.value?.key); + } safeCall( call: () async => await rootLogic.chickenRepository.createSegmentation( token: rootLogic.tokenService.accessToken.value!, @@ -193,16 +194,11 @@ class SegmentationLogic extends GetxController { return res; } - Future getGuilds() async { safeCall( - call: () async => - await rootLogic.chickenRepository.getGuilds( + call: () async => await rootLogic.chickenRepository.getGuilds( token: rootLogic.tokenService.accessToken.value!, - queryParameters: buildQueryParams( - queryParams: {'all': true}, - role: 'Steward', - ), + queryParameters: buildQueryParams(queryParams: {'all': true}, role: 'Steward'), ), onSuccess: (result) { if (result != null) { From 16833584f6f5a8c2eb91ea4585a9d18d4dc683e6 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Jul 2025 09:39:58 +0330 Subject: [PATCH 225/256] chore : delete unused log and fix test --- lib/infrastructure/service/app_navigation_observer.dart | 6 ++---- .../core/test/infrastructure/local/hive_local_storage.dart | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart index 068fe2d..74cec1e 100644 --- a/lib/infrastructure/service/app_navigation_observer.dart +++ b/lib/infrastructure/service/app_navigation_observer.dart @@ -18,14 +18,13 @@ class CustomNavigationObserver extends NavigatorObserver { _isWorkDone = true; await setupInjection(); } - iLog('didPush'); } @override void didReplace({Route? newRoute, Route? oldRoute}) { super.didReplace(newRoute: newRoute, oldRoute: oldRoute); - iLog('didReplace'); + } @@ -33,12 +32,11 @@ class CustomNavigationObserver extends NavigatorObserver { void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); - iLog('didPop'); } @override void didRemove(Route route, Route? previousRoute) { super.didRemove(route, previousRoute); - iLog('didRemove'); + } } diff --git a/packages/core/test/infrastructure/local/hive_local_storage.dart b/packages/core/test/infrastructure/local/hive_local_storage.dart index 37e2dd4..82fcc1b 100644 --- a/packages/core/test/infrastructure/local/hive_local_storage.dart +++ b/packages/core/test/infrastructure/local/hive_local_storage.dart @@ -95,7 +95,7 @@ class HiveLocalStorage implements ILocalStorage { } @override - T? readBox({required String boxName}) { + List? readBox({required String boxName}) { // TODO: implement readBox throw UnimplementedError(); } From e2300293a7e098abc652251747eb0771da91cb52 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Jul 2025 12:04:43 +0330 Subject: [PATCH 226/256] feat : new segment logic --- .../segmentation_model.dart | 41 +- .../segmentation_model.freezed.dart | 428 ++++++++++++++++-- .../segmentation_model.g.dart | 56 ++- .../pages/segmentation/logic.dart | 11 +- .../presentation/pages/segmentation/view.dart | 63 ++- 5 files changed, 521 insertions(+), 78 deletions(-) diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart index 2ee7915..4fd3ad4 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -9,11 +9,11 @@ abstract class SegmentationModel with _$SegmentationModel { const factory SegmentationModel({ String? key, String? productKey, + String? guildKey, + int? weight, Buyer? buyer, DateTime? date, - int? weight, - String? result, - String? guildKey, + ToGuild? toGuild, }) = _SegmentationModel; factory SegmentationModel.fromJson(Map json) => @@ -22,7 +22,40 @@ abstract class SegmentationModel with _$SegmentationModel { @freezed abstract class Buyer with _$Buyer { - const factory Buyer({String? fullname, String? mobile, String? shop, String? type}) = _Buyer; + const factory Buyer({ + String? fullname, + String? mobile, + String? shop, + }) = _Buyer; factory Buyer.fromJson(Map json) => _$BuyerFromJson(json); } + +@freezed +abstract class ToGuild with _$ToGuild { + const factory ToGuild({ + String? key, + String? guildsName, + String? typeActivity, + String? areaActivity, + String? guildsId, + bool? steward, + User? user, + }) = _ToGuild; + + factory ToGuild.fromJson(Map json) => _$ToGuildFromJson(json); +} + +@freezed +abstract class User with _$User { + const factory User({ + String? fullname, + String? firstName, + String? lastName, + String? mobile, + String? nationalId, + String? city, + }) = _User; + + factory User.fromJson(Map json) => _$UserFromJson(json); +} diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index 94c2aa9..8786599 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$SegmentationModel { - String? get key; String? get productKey; Buyer? get buyer; DateTime? get date; int? get weight; String? get result; String? get guildKey; + String? get key; String? get productKey; String? get guildKey; int? get weight; Buyer? get buyer; DateTime? get date; ToGuild? get toGuild; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $SegmentationModelCopyWith get copyWith => _$SegmentationMode @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.toGuild, toGuild) || other.toGuild == toGuild)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result,guildKey); +int get hashCode => Object.hash(runtimeType,key,productKey,guildKey,weight,buyer,date,toGuild); @override String toString() { - return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result, guildKey: $guildKey)'; + return 'SegmentationModel(key: $key, productKey: $productKey, guildKey: $guildKey, weight: $weight, buyer: $buyer, date: $date, toGuild: $toGuild)'; } @@ -49,11 +49,11 @@ abstract mixin class $SegmentationModelCopyWith<$Res> { factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; @useResult $Res call({ - String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result, String? guildKey + String? key, String? productKey, String? guildKey, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild }); -$BuyerCopyWith<$Res>? get buyer; +$BuyerCopyWith<$Res>? get buyer;$ToGuildCopyWith<$Res>? get toGuild; } /// @nodoc @@ -66,16 +66,16 @@ class _$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,Object? guildKey = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? productKey = freezed,Object? guildKey = freezed,Object? weight = freezed,Object? buyer = freezed,Object? date = freezed,Object? toGuild = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable -as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable -as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable -as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable -as String?, +as String?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable +as int?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,toGuild: freezed == toGuild ? _self.toGuild : toGuild // ignore: cast_nullable_to_non_nullable +as ToGuild?, )); } /// Create a copy of SegmentationModel @@ -90,6 +90,18 @@ $BuyerCopyWith<$Res>? get buyer { return $BuyerCopyWith<$Res>(_self.buyer!, (value) { return _then(_self.copyWith(buyer: value)); }); +}/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToGuildCopyWith<$Res>? get toGuild { + if (_self.toGuild == null) { + return null; + } + + return $ToGuildCopyWith<$Res>(_self.toGuild!, (value) { + return _then(_self.copyWith(toGuild: value)); + }); } } @@ -98,16 +110,16 @@ $BuyerCopyWith<$Res>? get buyer { @JsonSerializable() class _SegmentationModel implements SegmentationModel { - const _SegmentationModel({this.key, this.productKey, this.buyer, this.date, this.weight, this.result, this.guildKey}); + const _SegmentationModel({this.key, this.productKey, this.guildKey, this.weight, this.buyer, this.date, this.toGuild}); factory _SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); @override final String? key; @override final String? productKey; +@override final String? guildKey; +@override final int? weight; @override final Buyer? buyer; @override final DateTime? date; -@override final int? weight; -@override final String? result; -@override final String? guildKey; +@override final ToGuild? toGuild; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @@ -122,16 +134,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.toGuild, toGuild) || other.toGuild == toGuild)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,productKey,buyer,date,weight,result,guildKey); +int get hashCode => Object.hash(runtimeType,key,productKey,guildKey,weight,buyer,date,toGuild); @override String toString() { - return 'SegmentationModel(key: $key, productKey: $productKey, buyer: $buyer, date: $date, weight: $weight, result: $result, guildKey: $guildKey)'; + return 'SegmentationModel(key: $key, productKey: $productKey, guildKey: $guildKey, weight: $weight, buyer: $buyer, date: $date, toGuild: $toGuild)'; } @@ -142,11 +154,11 @@ abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationM factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; @override @useResult $Res call({ - String? key, String? productKey, Buyer? buyer, DateTime? date, int? weight, String? result, String? guildKey + String? key, String? productKey, String? guildKey, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild }); -@override $BuyerCopyWith<$Res>? get buyer; +@override $BuyerCopyWith<$Res>? get buyer;@override $ToGuildCopyWith<$Res>? get toGuild; } /// @nodoc @@ -159,16 +171,16 @@ class __$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? productKey = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,Object? guildKey = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? productKey = freezed,Object? guildKey = freezed,Object? weight = freezed,Object? buyer = freezed,Object? date = freezed,Object? toGuild = freezed,}) { return _then(_SegmentationModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable -as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable -as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable -as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable -as String?, +as String?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable +as int?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable +as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable +as DateTime?,toGuild: freezed == toGuild ? _self.toGuild : toGuild // ignore: cast_nullable_to_non_nullable +as ToGuild?, )); } @@ -184,6 +196,18 @@ $BuyerCopyWith<$Res>? get buyer { return $BuyerCopyWith<$Res>(_self.buyer!, (value) { return _then(_self.copyWith(buyer: value)); }); +}/// Create a copy of SegmentationModel +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ToGuildCopyWith<$Res>? get toGuild { + if (_self.toGuild == null) { + return null; + } + + return $ToGuildCopyWith<$Res>(_self.toGuild!, (value) { + return _then(_self.copyWith(toGuild: value)); + }); } } @@ -191,7 +215,7 @@ $BuyerCopyWith<$Res>? get buyer { /// @nodoc mixin _$Buyer { - String? get fullname; String? get mobile; String? get shop; String? get type; + String? get fullname; String? get mobile; String? get shop; /// Create a copy of Buyer /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -204,16 +228,16 @@ $BuyerCopyWith get copyWith => _$BuyerCopyWithImpl(this as Buyer, @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Buyer&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.shop, shop) || other.shop == shop)&&(identical(other.type, type) || other.type == type)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Buyer&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.shop, shop) || other.shop == shop)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,fullname,mobile,shop,type); +int get hashCode => Object.hash(runtimeType,fullname,mobile,shop); @override String toString() { - return 'Buyer(fullname: $fullname, mobile: $mobile, shop: $shop, type: $type)'; + return 'Buyer(fullname: $fullname, mobile: $mobile, shop: $shop)'; } @@ -224,7 +248,7 @@ abstract mixin class $BuyerCopyWith<$Res> { factory $BuyerCopyWith(Buyer value, $Res Function(Buyer) _then) = _$BuyerCopyWithImpl; @useResult $Res call({ - String? fullname, String? mobile, String? shop, String? type + String? fullname, String? mobile, String? shop }); @@ -241,12 +265,11 @@ class _$BuyerCopyWithImpl<$Res> /// Create a copy of Buyer /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? shop = freezed,Object? type = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? shop = freezed,}) { return _then(_self.copyWith( fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable as String?,shop: freezed == shop ? _self.shop : shop // ignore: cast_nullable_to_non_nullable -as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable as String?, )); } @@ -258,13 +281,12 @@ as String?, @JsonSerializable() class _Buyer implements Buyer { - const _Buyer({this.fullname, this.mobile, this.shop, this.type}); + const _Buyer({this.fullname, this.mobile, this.shop}); factory _Buyer.fromJson(Map json) => _$BuyerFromJson(json); @override final String? fullname; @override final String? mobile; @override final String? shop; -@override final String? type; /// Create a copy of Buyer /// with the given fields replaced by the non-null parameter values. @@ -279,16 +301,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Buyer&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.shop, shop) || other.shop == shop)&&(identical(other.type, type) || other.type == type)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Buyer&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.shop, shop) || other.shop == shop)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,fullname,mobile,shop,type); +int get hashCode => Object.hash(runtimeType,fullname,mobile,shop); @override String toString() { - return 'Buyer(fullname: $fullname, mobile: $mobile, shop: $shop, type: $type)'; + return 'Buyer(fullname: $fullname, mobile: $mobile, shop: $shop)'; } @@ -299,7 +321,7 @@ abstract mixin class _$BuyerCopyWith<$Res> implements $BuyerCopyWith<$Res> { factory _$BuyerCopyWith(_Buyer value, $Res Function(_Buyer) _then) = __$BuyerCopyWithImpl; @override @useResult $Res call({ - String? fullname, String? mobile, String? shop, String? type + String? fullname, String? mobile, String? shop }); @@ -316,12 +338,334 @@ class __$BuyerCopyWithImpl<$Res> /// Create a copy of Buyer /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? shop = freezed,Object? type = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? mobile = freezed,Object? shop = freezed,}) { return _then(_Buyer( fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable as String?,shop: freezed == shop ? _self.shop : shop // ignore: cast_nullable_to_non_nullable -as String?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + + +/// @nodoc +mixin _$ToGuild { + + String? get key; String? get guildsName; String? get typeActivity; String? get areaActivity; String? get guildsId; bool? get steward; User? get user; +/// Create a copy of ToGuild +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ToGuildCopyWith get copyWith => _$ToGuildCopyWithImpl(this as ToGuild, _$identity); + + /// Serializes this ToGuild to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ToGuild&&(identical(other.key, key) || other.key == key)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,guildsName,typeActivity,areaActivity,guildsId,steward,user); + +@override +String toString() { + return 'ToGuild(key: $key, guildsName: $guildsName, typeActivity: $typeActivity, areaActivity: $areaActivity, guildsId: $guildsId, steward: $steward, user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class $ToGuildCopyWith<$Res> { + factory $ToGuildCopyWith(ToGuild value, $Res Function(ToGuild) _then) = _$ToGuildCopyWithImpl; +@useResult +$Res call({ + String? key, String? guildsName, String? typeActivity, String? areaActivity, String? guildsId, bool? steward, User? user +}); + + +$UserCopyWith<$Res>? get user; + +} +/// @nodoc +class _$ToGuildCopyWithImpl<$Res> + implements $ToGuildCopyWith<$Res> { + _$ToGuildCopyWithImpl(this._self, this._then); + + final ToGuild _self; + final $Res Function(ToGuild) _then; + +/// Create a copy of ToGuild +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? guildsName = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? guildsId = freezed,Object? steward = freezed,Object? user = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?, + )); +} +/// Create a copy of ToGuild +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _ToGuild implements ToGuild { + const _ToGuild({this.key, this.guildsName, this.typeActivity, this.areaActivity, this.guildsId, this.steward, this.user}); + factory _ToGuild.fromJson(Map json) => _$ToGuildFromJson(json); + +@override final String? key; +@override final String? guildsName; +@override final String? typeActivity; +@override final String? areaActivity; +@override final String? guildsId; +@override final bool? steward; +@override final User? user; + +/// Create a copy of ToGuild +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$ToGuildCopyWith<_ToGuild> get copyWith => __$ToGuildCopyWithImpl<_ToGuild>(this, _$identity); + +@override +Map toJson() { + return _$ToGuildToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ToGuild&&(identical(other.key, key) || other.key == key)&&(identical(other.guildsName, guildsName) || other.guildsName == guildsName)&&(identical(other.typeActivity, typeActivity) || other.typeActivity == typeActivity)&&(identical(other.areaActivity, areaActivity) || other.areaActivity == areaActivity)&&(identical(other.guildsId, guildsId) || other.guildsId == guildsId)&&(identical(other.steward, steward) || other.steward == steward)&&(identical(other.user, user) || other.user == user)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,guildsName,typeActivity,areaActivity,guildsId,steward,user); + +@override +String toString() { + return 'ToGuild(key: $key, guildsName: $guildsName, typeActivity: $typeActivity, areaActivity: $areaActivity, guildsId: $guildsId, steward: $steward, user: $user)'; +} + + +} + +/// @nodoc +abstract mixin class _$ToGuildCopyWith<$Res> implements $ToGuildCopyWith<$Res> { + factory _$ToGuildCopyWith(_ToGuild value, $Res Function(_ToGuild) _then) = __$ToGuildCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? guildsName, String? typeActivity, String? areaActivity, String? guildsId, bool? steward, User? user +}); + + +@override $UserCopyWith<$Res>? get user; + +} +/// @nodoc +class __$ToGuildCopyWithImpl<$Res> + implements _$ToGuildCopyWith<$Res> { + __$ToGuildCopyWithImpl(this._self, this._then); + + final _ToGuild _self; + final $Res Function(_ToGuild) _then; + +/// Create a copy of ToGuild +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? guildsName = freezed,Object? typeActivity = freezed,Object? areaActivity = freezed,Object? guildsId = freezed,Object? steward = freezed,Object? user = freezed,}) { + return _then(_ToGuild( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,guildsName: freezed == guildsName ? _self.guildsName : guildsName // ignore: cast_nullable_to_non_nullable +as String?,typeActivity: freezed == typeActivity ? _self.typeActivity : typeActivity // ignore: cast_nullable_to_non_nullable +as String?,areaActivity: freezed == areaActivity ? _self.areaActivity : areaActivity // ignore: cast_nullable_to_non_nullable +as String?,guildsId: freezed == guildsId ? _self.guildsId : guildsId // ignore: cast_nullable_to_non_nullable +as String?,steward: freezed == steward ? _self.steward : steward // ignore: cast_nullable_to_non_nullable +as bool?,user: freezed == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as User?, + )); +} + +/// Create a copy of ToGuild +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$UserCopyWith<$Res>? get user { + if (_self.user == null) { + return null; + } + + return $UserCopyWith<$Res>(_self.user!, (value) { + return _then(_self.copyWith(user: value)); + }); +} +} + + +/// @nodoc +mixin _$User { + + String? get fullname; String? get firstName; String? get lastName; String? get mobile; String? get nationalId; String? get city; +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UserCopyWith get copyWith => _$UserCopyWithImpl(this as User, _$identity); + + /// Serializes this User to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); + +@override +String toString() { + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class $UserCopyWith<$Res> { + factory $UserCopyWith(User value, $Res Function(User) _then) = _$UserCopyWithImpl; +@useResult +$Res call({ + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city +}); + + + + +} +/// @nodoc +class _$UserCopyWithImpl<$Res> + implements $UserCopyWith<$Res> { + _$UserCopyWithImpl(this._self, this._then); + + final User _self; + final $Res Function(User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { + return _then(_self.copyWith( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// @nodoc +@JsonSerializable() + +class _User implements User { + const _User({this.fullname, this.firstName, this.lastName, this.mobile, this.nationalId, this.city}); + factory _User.fromJson(Map json) => _$UserFromJson(json); + +@override final String? fullname; +@override final String? firstName; +@override final String? lastName; +@override final String? mobile; +@override final String? nationalId; +@override final String? city; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$UserCopyWith<_User> get copyWith => __$UserCopyWithImpl<_User>(this, _$identity); + +@override +Map toJson() { + return _$UserToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _User&&(identical(other.fullname, fullname) || other.fullname == fullname)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.mobile, mobile) || other.mobile == mobile)&&(identical(other.nationalId, nationalId) || other.nationalId == nationalId)&&(identical(other.city, city) || other.city == city)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,fullname,firstName,lastName,mobile,nationalId,city); + +@override +String toString() { + return 'User(fullname: $fullname, firstName: $firstName, lastName: $lastName, mobile: $mobile, nationalId: $nationalId, city: $city)'; +} + + +} + +/// @nodoc +abstract mixin class _$UserCopyWith<$Res> implements $UserCopyWith<$Res> { + factory _$UserCopyWith(_User value, $Res Function(_User) _then) = __$UserCopyWithImpl; +@override @useResult +$Res call({ + String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city +}); + + + + +} +/// @nodoc +class __$UserCopyWithImpl<$Res> + implements _$UserCopyWith<$Res> { + __$UserCopyWithImpl(this._self, this._then); + + final _User _self; + final $Res Function(_User) _then; + +/// Create a copy of User +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? fullname = freezed,Object? firstName = freezed,Object? lastName = freezed,Object? mobile = freezed,Object? nationalId = freezed,Object? city = freezed,}) { + return _then(_User( +fullname: freezed == fullname ? _self.fullname : fullname // ignore: cast_nullable_to_non_nullable +as String?,firstName: freezed == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable +as String?,lastName: freezed == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable +as String?,mobile: freezed == mobile ? _self.mobile : mobile // ignore: cast_nullable_to_non_nullable +as String?,nationalId: freezed == nationalId ? _self.nationalId : nationalId // ignore: cast_nullable_to_non_nullable +as String?,city: freezed == city ? _self.city : city // ignore: cast_nullable_to_non_nullable as String?, )); } diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart index 4834697..a51a7ee 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -10,38 +10,78 @@ _SegmentationModel _$SegmentationModelFromJson(Map json) => _SegmentationModel( key: json['key'] as String?, productKey: json['product_key'] as String?, + guildKey: json['guild_key'] as String?, + weight: (json['weight'] as num?)?.toInt(), buyer: json['buyer'] == null ? null : Buyer.fromJson(json['buyer'] as Map), date: json['date'] == null ? null : DateTime.parse(json['date'] as String), - weight: (json['weight'] as num?)?.toInt(), - result: json['result'] as String?, - guildKey: json['guild_key'] as String?, + toGuild: json['to_guild'] == null + ? null + : ToGuild.fromJson(json['to_guild'] as Map), ); Map _$SegmentationModelToJson(_SegmentationModel instance) => { 'key': instance.key, 'product_key': instance.productKey, + 'guild_key': instance.guildKey, + 'weight': instance.weight, 'buyer': instance.buyer, 'date': instance.date?.toIso8601String(), - 'weight': instance.weight, - 'result': instance.result, - 'guild_key': instance.guildKey, + 'to_guild': instance.toGuild, }; _Buyer _$BuyerFromJson(Map json) => _Buyer( fullname: json['fullname'] as String?, mobile: json['mobile'] as String?, shop: json['shop'] as String?, - type: json['type'] as String?, ); Map _$BuyerToJson(_Buyer instance) => { 'fullname': instance.fullname, 'mobile': instance.mobile, 'shop': instance.shop, - 'type': instance.type, +}; + +_ToGuild _$ToGuildFromJson(Map json) => _ToGuild( + key: json['key'] as String?, + guildsName: json['guilds_name'] as String?, + typeActivity: json['type_activity'] as String?, + areaActivity: json['area_activity'] as String?, + guildsId: json['guilds_id'] as String?, + steward: json['steward'] as bool?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), +); + +Map _$ToGuildToJson(_ToGuild instance) => { + 'key': instance.key, + 'guilds_name': instance.guildsName, + 'type_activity': instance.typeActivity, + 'area_activity': instance.areaActivity, + 'guilds_id': instance.guildsId, + 'steward': instance.steward, + 'user': instance.user, +}; + +_User _$UserFromJson(Map json) => _User( + fullname: json['fullname'] as String?, + firstName: json['first_name'] as String?, + lastName: json['last_name'] as String?, + mobile: json['mobile'] as String?, + nationalId: json['national_id'] as String?, + city: json['city'] as String?, +); + +Map _$UserToJson(_User instance) => { + 'fullname': instance.fullname, + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'mobile': instance.mobile, + 'national_id': instance.nationalId, + 'city': instance.city, }; diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index f22d1f5..1bf5e90 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -35,7 +35,6 @@ class SegmentationLogic extends GetxController { RxList guildsModel = [].obs; - @override void onInit() { super.onInit(); @@ -82,12 +81,16 @@ class SegmentationLogic extends GetxController { void clearForm() { weightController.text = '0'; selectedSegment.value = null; + selectedGuildModel.value = null; } void validateForm() { var weight = int.tryParse(weightController.text.clearComma.trim()); isSubmitButtonEnabled.value = - selectedProduct.value != null && weightController.text.isNotEmpty && weight! > 0; + selectedProduct.value != null && + weightController.text.isNotEmpty && + weight! > 0 && + (saleType.value == 1 || (saleType.value == 2 && selectedGuildModel.value != null)); } Future getAllSegmentation([bool isLoadingMore = false]) async { @@ -177,9 +180,9 @@ class SegmentationLogic extends GetxController { weight: int.tryParse(weightController.text.clearComma) ?? 0, ); if (saleType.value == 2) { - segmentationModel.copyWith(guildKey: selectedGuildModel.value?.key); + segmentationModel = segmentationModel.copyWith(guildKey: selectedGuildModel.value?.key); } - safeCall( + await safeCall( call: () async => await rootLogic.chickenRepository.createSegmentation( token: rootLogic.tokenService.accessToken.value!, model: segmentationModel, diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index 361ec32..b3b898d 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -83,10 +83,21 @@ class SegmentationPage extends GetView { SizedBox(width: 12), Expanded( flex: 3, - child: Text( - item.date?.formattedJalaliDate ?? 'N/A', - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + item.toGuild != null ? 'مباشر' : 'قطعه‌بند', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + Text( + item.date?.formattedJalaliDate ?? 'N/A', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), + ], ), ), SizedBox(width: 4), @@ -96,14 +107,18 @@ class SegmentationPage extends GetView { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - item.buyer?.fullname ?? 'N/A', + item.toGuild != null + ? item.toGuild?.user?.fullname ?? 'N/A' + : item.buyer?.fullname ?? 'N/A', textAlign: TextAlign.center, style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), SizedBox(height: 2), Text( - item.buyer?.shop ?? 'N/A', + item.toGuild != null + ? item.toGuild?.guildsName ?? 'N/A' + : item.buyer?.shop ?? 'N/A', textAlign: TextAlign.center, style: AppFonts.yekan14.copyWith(color: AppColor.bgDark), ), @@ -111,18 +126,10 @@ class SegmentationPage extends GetView { ), ), SizedBox(width: 4), - Expanded( - flex: 4, - child: Text( - item.date?.formattedJalaliDate, - textAlign: TextAlign.center, - style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), - ), - ), Expanded( flex: 2, child: Text( - '${item.weight} KG', + '${item.weight.separatedByComma} KG', textAlign: TextAlign.center, style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), ), @@ -178,9 +185,25 @@ class SegmentationPage extends GetView { ], ), ), - buildRow(title: 'مشخصات خریدار', value: item.buyer?.fullname ?? 'N/A'), - buildRow(title: 'تلفن خریدار', value: item.buyer?.mobile ?? 'N/A'), - buildRow(title: 'نام واحد', value: item.buyer?.shop ?? 'N/A'), + buildRow( + title: 'مشخصات خریدار', + value: item.toGuild != null + ? item.toGuild?.user?.fullname ?? 'N/A' + : item.buyer?.fullname ?? 'N/A', + ), + buildRow( + title: 'تلفن خریدار', + value: item.toGuild != null + ? item.toGuild?.user?.mobile ?? 'N/A' + : item.buyer?.mobile ?? 'N/A', + ), + buildRow( + title: 'نام واحد', + value: item.toGuild != null + ? item.toGuild?.guildsName ?? 'N/A' + : item.buyer?.shop ?? 'N/A', + ), + buildRow(title: 'ماهیت', value: item.toGuild != null ? 'مباشر' : 'قطعه‌بند'), buildRow(title: 'وزن قطعه‌بندی', value: '${item.weight?.separatedByComma}'), Row( @@ -268,7 +291,7 @@ class SegmentationPage extends GetView { controller.selectedGuildModel.refresh(); }, ), - Text('خودم', style: AppFonts.yekan14), + Text('قطعه‌بندی(مباشر)', style: AppFonts.yekan14), SizedBox(width: 12), Radio( value: 2, @@ -277,7 +300,7 @@ class SegmentationPage extends GetView { controller.saleType.value = value!; }, ), - Text('صنف/مباشر', style: AppFonts.yekan14), + Text('تخصیص به قطعه‌بند', style: AppFonts.yekan14), ], ); }, controller.saleType), From 99503a2d72cc6f9e2e4dc579f5e807ae64aceab3 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Jul 2025 15:06:19 +0330 Subject: [PATCH 227/256] fix : new ui changes --- .../datasource/remote/chicken_remote_imp.dart | 2 +- .../segmentation_model.dart | 1 + .../segmentation_model.freezed.dart | 27 ++++++++++--------- .../segmentation_model.g.dart | 2 ++ .../pages/buy_in_province_all/view.dart | 14 +++++++--- .../pages/buy_in_province_waiting/view.dart | 17 +++++++++--- .../pages/sales_in_province/view.dart | 18 ++++++++----- .../pages/sales_out_of_province/logic.dart | 1 + .../pages/sales_out_of_province/view.dart | 2 +- .../pages/segmentation/logic.dart | 2 +- .../lib/infrastructure/remote/dio_remote.dart | 6 +++++ .../lib/utils/network/safe_call_utils.dart | 3 ++- 12 files changed, 66 insertions(+), 29 deletions(-) diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart index d0ecd35..c317b5c 100644 --- a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart +++ b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart @@ -472,7 +472,7 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource { required String token, required String key, }) async { - var res = await _httpClient.delete( + var res = await _httpClient.delete( '/app-segmentation/0/', queryParameters: {'key': key}, headers: {'Authorization': 'Bearer $token'}, diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart index 4fd3ad4..c9b1052 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -10,6 +10,7 @@ abstract class SegmentationModel with _$SegmentationModel { String? key, String? productKey, String? guildKey, + String? result, int? weight, Buyer? buyer, DateTime? date, diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index 8786599..9de3533 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$SegmentationModel { - String? get key; String? get productKey; String? get guildKey; int? get weight; Buyer? get buyer; DateTime? get date; ToGuild? get toGuild; + String? get key; String? get productKey; String? get guildKey; String? get result; int? get weight; Buyer? get buyer; DateTime? get date; ToGuild? get toGuild; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $SegmentationModelCopyWith get copyWith => _$SegmentationMode @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.toGuild, toGuild) || other.toGuild == toGuild)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.result, result) || other.result == result)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.toGuild, toGuild) || other.toGuild == toGuild)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,productKey,guildKey,weight,buyer,date,toGuild); +int get hashCode => Object.hash(runtimeType,key,productKey,guildKey,result,weight,buyer,date,toGuild); @override String toString() { - return 'SegmentationModel(key: $key, productKey: $productKey, guildKey: $guildKey, weight: $weight, buyer: $buyer, date: $date, toGuild: $toGuild)'; + return 'SegmentationModel(key: $key, productKey: $productKey, guildKey: $guildKey, result: $result, weight: $weight, buyer: $buyer, date: $date, toGuild: $toGuild)'; } @@ -49,7 +49,7 @@ abstract mixin class $SegmentationModelCopyWith<$Res> { factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; @useResult $Res call({ - String? key, String? productKey, String? guildKey, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild + String? key, String? productKey, String? guildKey, String? result, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild }); @@ -66,11 +66,12 @@ class _$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? productKey = freezed,Object? guildKey = freezed,Object? weight = freezed,Object? buyer = freezed,Object? date = freezed,Object? toGuild = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? productKey = freezed,Object? guildKey = freezed,Object? result = freezed,Object? weight = freezed,Object? buyer = freezed,Object? date = freezed,Object? toGuild = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable +as String?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable as String?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable as int?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable @@ -110,12 +111,13 @@ $ToGuildCopyWith<$Res>? get toGuild { @JsonSerializable() class _SegmentationModel implements SegmentationModel { - const _SegmentationModel({this.key, this.productKey, this.guildKey, this.weight, this.buyer, this.date, this.toGuild}); + const _SegmentationModel({this.key, this.productKey, this.guildKey, this.result, this.weight, this.buyer, this.date, this.toGuild}); factory _SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); @override final String? key; @override final String? productKey; @override final String? guildKey; +@override final String? result; @override final int? weight; @override final Buyer? buyer; @override final DateTime? date; @@ -134,16 +136,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.toGuild, toGuild) || other.toGuild == toGuild)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.productKey, productKey) || other.productKey == productKey)&&(identical(other.guildKey, guildKey) || other.guildKey == guildKey)&&(identical(other.result, result) || other.result == result)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.toGuild, toGuild) || other.toGuild == toGuild)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,productKey,guildKey,weight,buyer,date,toGuild); +int get hashCode => Object.hash(runtimeType,key,productKey,guildKey,result,weight,buyer,date,toGuild); @override String toString() { - return 'SegmentationModel(key: $key, productKey: $productKey, guildKey: $guildKey, weight: $weight, buyer: $buyer, date: $date, toGuild: $toGuild)'; + return 'SegmentationModel(key: $key, productKey: $productKey, guildKey: $guildKey, result: $result, weight: $weight, buyer: $buyer, date: $date, toGuild: $toGuild)'; } @@ -154,7 +156,7 @@ abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationM factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; @override @useResult $Res call({ - String? key, String? productKey, String? guildKey, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild + String? key, String? productKey, String? guildKey, String? result, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild }); @@ -171,11 +173,12 @@ class __$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? productKey = freezed,Object? guildKey = freezed,Object? weight = freezed,Object? buyer = freezed,Object? date = freezed,Object? toGuild = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? productKey = freezed,Object? guildKey = freezed,Object? result = freezed,Object? weight = freezed,Object? buyer = freezed,Object? date = freezed,Object? toGuild = freezed,}) { return _then(_SegmentationModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,productKey: freezed == productKey ? _self.productKey : productKey // ignore: cast_nullable_to_non_nullable as String?,guildKey: freezed == guildKey ? _self.guildKey : guildKey // ignore: cast_nullable_to_non_nullable +as String?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable as String?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable as int?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart index a51a7ee..6f4411a 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -11,6 +11,7 @@ _SegmentationModel _$SegmentationModelFromJson(Map json) => key: json['key'] as String?, productKey: json['product_key'] as String?, guildKey: json['guild_key'] as String?, + result: json['result'] as String?, weight: (json['weight'] as num?)?.toInt(), buyer: json['buyer'] == null ? null @@ -28,6 +29,7 @@ Map _$SegmentationModelToJson(_SegmentationModel instance) => 'key': instance.key, 'product_key': instance.productKey, 'guild_key': instance.guildKey, + 'result': instance.result, 'weight': instance.weight, 'buyer': instance.buyer, 'date': instance.date?.toIso8601String(), diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart index 3ddd066..bb2586b 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_all/view.dart @@ -74,6 +74,7 @@ class BuyInProvinceAllPage extends GetView { Expanded( flex: 3, child: Column( + spacing: 3, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -98,7 +99,11 @@ class BuyInProvinceAllPage extends GetView { ], ), - SizedBox(height: 2), + Text( + item.steward?.guildsName ?? 'N/A', + textAlign: TextAlign.start, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), ], ), ), @@ -186,7 +191,7 @@ class BuyInProvinceAllPage extends GetView { ), buildRow( - title: 'نام و نام خانوادگی فروشنده', + title: 'مشخصات فروشنده', value: item.steward?.user?.fullname ?? 'N/A', ), buildRow( @@ -194,7 +199,10 @@ class BuyInProvinceAllPage extends GetView { value: item.steward?.user?.mobile ?? 'N/A', valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), - + buildRow( + title: 'نوع تخصیص', + value: item.allocationType?.faAllocationType ?? 'N/A', + ), buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), buildRow( title: 'وزن خریداری شده', diff --git a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart index 6658f35..d439b53 100644 --- a/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_in_province_waiting/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/models/response/waiting_arrival/waiting_arrival.dart'; +import 'package:rasadyar_chicken/presentation/utils/string_utils.dart'; import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_chicken/presentation/widget/list_row_item.dart'; import 'package:rasadyar_core/core.dart'; @@ -75,7 +76,7 @@ class BuyInProvinceWaitingPage extends GetView { spacing: 3, children: [ Text( - item.toSteward?.user?.fullname ?? 'N/A', + item.steward?.user?.fullname ?? 'N/A', textAlign: TextAlign.start, style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal), ), @@ -90,6 +91,7 @@ class BuyInProvinceWaitingPage extends GetView { Expanded( flex: 3, child: Column( + spacing: 3, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -114,7 +116,11 @@ class BuyInProvinceWaitingPage extends GetView { ], ), - SizedBox(height: 2), + Text( + item.steward?.guildsName ?? 'N/A', + textAlign: TextAlign.start, + style: AppFonts.yekan12.copyWith(color: AppColor.bgDark), + ), ], ), ), @@ -197,7 +203,7 @@ class BuyInProvinceWaitingPage extends GetView { ), buildRow( - title: 'نام و نام خانوادگی فروشنده', + title: 'مشخصات فروشنده', value: item.steward?.user?.fullname ?? 'N/A', ), buildRow( @@ -205,7 +211,10 @@ class BuyInProvinceWaitingPage extends GetView { value: item.steward?.user?.mobile ?? 'N/A', valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), - + buildRow( + title: 'نوع تخصیص', + value: item.allocationType?.faAllocationType ?? 'N/A', + ), buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), buildRow( title: 'وزن خریداری شده', diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index c3e30c5..7b5afb6 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -145,7 +145,7 @@ class SalesInProvincePage extends GetView { spacing: 4, children: [ Text( - item.steward?.user?.fullname ?? 'N/A', + controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', textAlign: TextAlign.center, style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), @@ -219,8 +219,10 @@ class SalesInProvincePage extends GetView { Row( mainAxisAlignment: MainAxisAlignment.start, children: [ + + Text( - item.steward?.user?.fullname ?? 'N/A', + controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', textAlign: TextAlign.center, style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), @@ -284,18 +286,22 @@ class SalesInProvincePage extends GetView { ), ), - buildRow( - title: 'نام و نام خانوادگی فروشنده', + /* buildRow( + title: 'مشخصات خریدار', value: controller.getBuyerInformation(item)?.user?.fullname ?? 'N/A', - ), + ),*/ buildRow( - title: 'تلفن فروشنده', + title: 'تلفن خریدار', value: controller.getBuyerInformation(item)?.user?.mobile ?? 'N/A', valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), buildRow(title: 'نوع فروش', value: item.sellType?.faItem ?? 'N/A'), buildRow(title: 'محصول', value: item.product?.name ?? 'N/A'), + buildRow( + title: 'نوع تخصیص', + value: item.allocationType?.faAllocationType ?? 'N/A', + ), buildRow( title: 'وزن خریداری شده', value: '${item.weightOfCarcasses?.separatedByComma} کیلوگرم', diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 1f8e19e..3ebc74c 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -66,6 +66,7 @@ class SalesOutOfProvinceLogic extends GetxController { (callback) => getOutProvinceSales(), time: Duration(milliseconds: timeDebounce), ); + setupListeners(); } void setSearchValue(String? value) { diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart index d33e434..8ee11f9 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/view.dart @@ -188,7 +188,7 @@ class SalesOutOfProvincePage extends GetView { mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - '${item.province}-${item.city}', + '${item.province} - ${item.city}', textAlign: TextAlign.center, style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 1bf5e90..7844168 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -144,7 +144,7 @@ class SegmentationLogic extends GetxController { Future deleteSegmentation(String key) async { await safeCall( - showError: true, + showError: false, call: () => rootLogic.chickenRepository.deleteSegmentation( token: rootLogic.tokenService.accessToken.value!, key: key, diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index b5b179e..3cfcd98 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -128,6 +128,12 @@ class DioRemote implements IHttpClient { options: Options(headers: headers), cancelToken: ApiHandler.globalCancelToken, ); + if (fromJson != null) { + final rawData = response.data; + final parsedData = rawData is Map ? fromJson(rawData) : null; + response.data = parsedData; + return DioResponse(response); + } return DioResponse(response); } diff --git a/packages/core/lib/utils/network/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart index c0005a3..18588b6 100644 --- a/packages/core/lib/utils/network/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -60,6 +60,7 @@ Future gSafeCall({ } catch (error, stackTrace) { retryCount++; + eLog('Error in gSafeCall: $error, retryCount: $retryCount , stackTrace : $stackTrace '); if (error is DioException && error.response?.statusCode == 401) { if (showError) { @@ -79,7 +80,7 @@ Future gSafeCall({ return null; } - // صبر قبل از retry + if (retryCount <= maxRetries) { await Future.delayed(retryDelay); } From a0c1d452c6ffe16c9885577bba3336070e91d778 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Jul 2025 16:05:49 +0330 Subject: [PATCH 228/256] feat : image profile --- .../lib/presentation/pages/profile/logic.dart | 22 ++ .../lib/presentation/pages/profile/view.dart | 249 ++++++++++++------ .../pages/sales_out_of_province/logic.dart | 2 - 3 files changed, 196 insertions(+), 77 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/profile/logic.dart b/packages/chicken/lib/presentation/pages/profile/logic.dart index 629cd6c..b055406 100644 --- a/packages/chicken/lib/presentation/pages/profile/logic.dart +++ b/packages/chicken/lib/presentation/pages/profile/logic.dart @@ -28,6 +28,20 @@ class ProfileLogic extends GetxController { Rxn selectedCity = Rxn(); GlobalKey formKey = GlobalKey(); + ImagePicker imagePicker = ImagePicker(); + Rxn selectedImage = Rxn(); + RxnString _base64Image = RxnString(); + RxBool isOnLoading = false.obs; + + @override + void onInit() { + super.onInit(); + ever(selectedImage, (data) async { + if (data?.path != null) { + _base64Image.value = await convertImageToBase64(data!.path); + } + }); + } @override void onReady() { @@ -92,14 +106,22 @@ class ProfileLogic extends GetxController { nationalCode: nationalCodeController.text, nationalId: nationalIdController.text, birthday: birthDate.value?.toGregorian().toString(), + image: _base64Image.value, personType: 'self', type: 'self_profile', ); + isOnLoading.value = true; await safeCall( call: () async => await rootLogic.chickenRepository.updateUserProfile( token: rootLogic.tokenService.accessToken.value!, userProfile: userProfile, ), + onSuccess: (result) { + isOnLoading.value = false; + }, + onError: (error, stackTrace) { + isOnLoading.value = false; + }, ); } diff --git a/packages/chicken/lib/presentation/pages/profile/view.dart b/packages/chicken/lib/presentation/pages/profile/view.dart index 59335f8..78baaa6 100644 --- a/packages/chicken/lib/presentation/pages/profile/view.dart +++ b/packages/chicken/lib/presentation/pages/profile/view.dart @@ -1,3 +1,6 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/models/local/user_local/user_local_model.dart'; import 'package:rasadyar_auth/presentation/routes/pages.dart'; @@ -25,21 +28,49 @@ class ProfilePage extends GetView { crossAxisAlignment: CrossAxisAlignment.center, children: [ Row(), - Container( - width: 128.w, - height: 128.h, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: AppColor.blueLightActive, - ), - child: Center( - child: Assets.vec.userSvg.svg( - width: 64.w, - height: 64.h, - colorFilter: ColorFilter.mode(AppColor.whiteLight, BlendMode.srcIn), - ), - ), - ), + ObxValue( + (data) { + final status = data.value.status; + + if (status == ResourceStatus.loading) { + return Container( + width: 128.w, + height: 128.h, + child: Center(child: CupertinoActivityIndicator(color: AppColor + .greenNormal,)), + ); + } + + if (status == ResourceStatus.error) { + return Container( + width: 128.w, + height: 128.h, + child: Center(child: Text('خطا در دریافت اطلاعات')), + ); + } + + + // Default UI + return Container( + width: 128.w, + height: 128.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.blueLightActive, + ), + child: Center( + child: CircleAvatar( + radius: 64.w, + backgroundImage: + NetworkImage(data.value.data!.image!) + + + ), + ), + ); + }, + controller.userProfile, + ) ], ), ), @@ -96,16 +127,17 @@ class ProfilePage extends GetView { Container invoiceIssuanceInformation() => Container(); - Widget bankInformationWidget() => Column( - spacing: 16, - children: [ - itemList(title: 'نام بانک', content: 'سامان'), - itemList(title: 'نام صاحب حساب', content: 'رضا رضایی'), - itemList(title: 'شماره کارت ', content: '54154545415'), - itemList(title: 'شماره حساب', content: '62565263263652'), - itemList(title: 'شماره شبا', content: '62565263263652'), - ], - ); + Widget bankInformationWidget() => + Column( + spacing: 16, + children: [ + itemList(title: 'نام بانک', content: 'سامان'), + itemList(title: 'نام صاحب حساب', content: 'رضا رضایی'), + itemList(title: 'شماره کارت ', content: '54154545415'), + itemList(title: 'شماره حساب', content: '62565263263652'), + itemList(title: 'شماره شبا', content: '62565263263652'), + ], + ); Widget userProfileInformation() { return ObxValue((data) { @@ -120,7 +152,8 @@ class ProfilePage extends GetView { children: [ buildRowOnTapped( onTap: () { - Get.bottomSheet(userInformationBottomSheet(), isScrollControlled: true); + Get.bottomSheet( + userInformationBottomSheet(), isScrollControlled: true, ignoreSafeArea: false); }, titleWidget: Column( spacing: 3, @@ -184,33 +217,34 @@ class ProfilePage extends GetView { required String content, String? icon, bool hasColoredBox = false, - }) => Container( - padding: EdgeInsets.symmetric(horizontal: 12.h, vertical: 6.h), - decoration: BoxDecoration( - color: hasColoredBox ? AppColor.greenLight : Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: hasColoredBox - ? Border.all(width: 0.25, color: AppColor.bgDark) - : Border.all(width: 0, color: Colors.transparent), - ), - child: Row( - spacing: 4, - children: [ - if (icon != null) - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgGenImage.vec(icon).svg( - width: 20.w, - height: 20.h, - colorFilter: ColorFilter.mode(AppColor.mediumGreyNormalActive, BlendMode.srcIn), - ), - ), - Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyNormalActive)), - Spacer(), - Text(content, style: AppFonts.yekan13.copyWith(color: AppColor.mediumGreyNormalHover)), - ], - ), - ); + }) => + Container( + padding: EdgeInsets.symmetric(horizontal: 12.h, vertical: 6.h), + decoration: BoxDecoration( + color: hasColoredBox ? AppColor.greenLight : Colors.transparent, + borderRadius: BorderRadius.circular(8), + border: hasColoredBox + ? Border.all(width: 0.25, color: AppColor.bgDark) + : Border.all(width: 0, color: Colors.transparent), + ), + child: Row( + spacing: 4, + children: [ + if (icon != null) + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: SvgGenImage.vec(icon).svg( + width: 20.w, + height: 20.h, + colorFilter: ColorFilter.mode(AppColor.mediumGreyNormalActive, BlendMode.srcIn), + ), + ), + Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyNormalActive)), + Spacer(), + Text(content, style: AppFonts.yekan13.copyWith(color: AppColor.mediumGreyNormalHover)), + ], + ), + ); Widget cardActionWidget({ required String title, @@ -238,7 +272,7 @@ class ProfilePage extends GetView { width: 40, height: 40, colorFilter: - color ?? + color ?? ColorFilter.mode( selected ? AppColor.blueNormal : AppColor.whiteLight, BlendMode.srcIn, @@ -260,7 +294,7 @@ class ProfilePage extends GetView { Widget userInformationBottomSheet() { return BaseBottomSheet( - height: 500.h, + height: 750.h, child: SingleChildScrollView( child: Column( spacing: 8, @@ -270,16 +304,6 @@ class ProfilePage extends GetView { style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), ), - /* - Container( - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), - child: Column(spacing: 12, children: [_provinceWidget(), _cityWidget()]), - ),*/ Container( padding: EdgeInsets.all(8), decoration: BoxDecoration( @@ -333,25 +357,75 @@ class ProfilePage extends GetView { SizedBox(), + + ], + ), + ), + SizedBox(), + + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 8, + children: [ + Text('عکس پروفایل', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), + ObxValue((data) { + return Container( + width: Get.width, + height: 270, + decoration: BoxDecoration( + color: AppColor.lightGreyNormal, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLight), + ), + child: Center( + child: data.value == null + ? Padding( + padding: const EdgeInsets.fromLTRB(30, 10, 10, 30), + child: Image.network(controller.userProfile.value.data?.image ?? '') + ) + : Image.file(File(data.value!.path), fit: BoxFit.cover), + ), + ); + }, controller.selectedImage), + Row( - spacing: 16, + crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ RElevated( + text: 'گالری', + width: 150.w, height: 40.h, - text: 'ویرایش', + textStyle: AppFonts.yekan20.copyWith(color: Colors.white), onPressed: () async { - await controller.updateUserProfile(); - controller.getUserProfile(); - Get.back(); + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.gallery, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); }, ), + SizedBox(width: 16), ROutlinedElevated( + text: 'دوربین', + width: 150.w, height: 40.h, - text: 'انصراف', - borderColor: AppColor.blueNormal, - onPressed: () { - Get.back(); + textStyle: AppFonts.yekan20.copyWith(color: AppColor.blueNormal), + onPressed: () async { + controller.selectedImage.value = await controller.imagePicker.pickImage( + source: ImageSource.camera, + imageQuality: 60, + maxWidth: 1080, + maxHeight: 720, + ); }, ), ], @@ -359,7 +433,32 @@ class ProfilePage extends GetView { ], ), ), - SizedBox(), + Row( + spacing: 16, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ObxValue((data) { + return RElevated( + height: 40.h, + text: 'ویرایش', + isLoading: data.value, + onPressed: () async { + await controller.updateUserProfile(); + controller.getUserProfile(); + Get.back(); + }, + ); + },controller.isOnLoading), + ROutlinedElevated( + height: 40.h, + text: 'انصراف', + borderColor: AppColor.blueNormal, + onPressed: () { + Get.back(); + }, + ), + ], + ), ], ), ), diff --git a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart index 3ebc74c..53c3f3a 100644 --- a/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_out_of_province/logic.dart @@ -35,8 +35,6 @@ class SalesOutOfProvinceLogic extends GetxController { RxBool isLoadingMoreAllocationsMade = false.obs; Rxn selectedCity = Rxn(); - //TODO add this to Di - ImagePicker imagePicker = ImagePicker(); GlobalKey formKey = GlobalKey(); TextEditingController quarantineCodeController = TextEditingController(); From af0c8be5be0b9ef778986f85d957e21a6d63293f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 22 Jul 2025 09:33:45 +0330 Subject: [PATCH 229/256] fix : update profile --- .../chicken/lib/data/datasource/remote/chicken_remote_imp.dart | 2 +- packages/chicken/lib/presentation/pages/profile/logic.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart index c317b5c..700f669 100644 --- a/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart +++ b/packages/chicken/lib/data/datasource/remote/chicken_remote_imp.dart @@ -414,7 +414,7 @@ class ChickenRemoteDatasourceImp implements ChickenRemoteDatasource { @override Future updateUserProfile({required String token, required UserProfile userProfile}) async { await _httpClient.put( - '/system_user_profile/?self-profile/0/', + '/system_user_profile/0/', headers: {'Authorization': 'Bearer $token'}, data: userProfile.toJson()..removeWhere((key, value) => value == null), ); diff --git a/packages/chicken/lib/presentation/pages/profile/logic.dart b/packages/chicken/lib/presentation/pages/profile/logic.dart index b055406..65b318f 100644 --- a/packages/chicken/lib/presentation/pages/profile/logic.dart +++ b/packages/chicken/lib/presentation/pages/profile/logic.dart @@ -105,7 +105,7 @@ class ProfileLogic extends GetxController { lastName: lastNameController.text, nationalCode: nationalCodeController.text, nationalId: nationalIdController.text, - birthday: birthDate.value?.toGregorian().toString(), + birthday: birthDate.value?.toDateTime().formattedDashedGregorian.toString(), image: _base64Image.value, personType: 'self', type: 'self_profile', From 12592753d3bcde0499f8a8752daec610658c6b5d Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Tue, 22 Jul 2025 09:37:18 +0330 Subject: [PATCH 230/256] chore : change version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2f5a77c..fe55df1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_app description: "A new Flutter project." publish_to: 'none' -version: 1.3.5+4 +version: 1.3.6+4 environment: sdk: ^3.8.1 From 4fed369b5d2358b14ba22a9edd7b7bdda7181d9f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 23 Jul 2025 08:43:58 +0330 Subject: [PATCH 231/256] chore : update lib --- packages/auth/pubspec.yaml | 14 +-- packages/chicken/pubspec.yaml | 18 ++-- packages/core/pubspec.lock | 160 ++++++++++++++++++++------------ packages/core/pubspec.yaml | 28 +++--- packages/livestock/pubspec.yaml | 16 ++-- pubspec.lock | 138 ++++++++++++++++----------- pubspec.yaml | 16 ++-- 7 files changed, 231 insertions(+), 159 deletions(-) diff --git a/packages/auth/pubspec.yaml b/packages/auth/pubspec.yaml index 11617ca..15678f6 100644 --- a/packages/auth/pubspec.yaml +++ b/packages/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: rasadyar_auth description: "A new Flutter project." -version: 0.0.1 +version: 1.0.3 publish_to: 'none' @@ -15,17 +15,17 @@ dependencies: rasadyar_core: path: ../core ##code generation - freezed_annotation: ^3.0.0 + freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^5.0.0 + flutter_lints: ^6.0.0 ##code generation - build_runner: ^2.4.15 - hive_ce_generator: ^1.9.1 - freezed: ^3.0.6 - json_serializable: ^6.9.4 + build_runner: ^2.6.0 + hive_ce_generator: ^1.9.3 + freezed: ^3.2.0 + json_serializable: ^6.10.0 ##test mocktail: ^1.0.4 diff --git a/packages/chicken/pubspec.yaml b/packages/chicken/pubspec.yaml index d53f7e3..ed00202 100644 --- a/packages/chicken/pubspec.yaml +++ b/packages/chicken/pubspec.yaml @@ -1,6 +1,6 @@ name: rasadyar_chicken description: A starting point for Dart libraries or applications. -version: 1.0.1 +version: 1.2.1+2 environment: sdk: ^3.8.1 @@ -14,19 +14,19 @@ dependencies: rasadyar_auth: path: ../auth ##code generation - freezed_annotation: ^3.0.0 + freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^5.0.0 - lints: ^5.0.0 - test: ^1.24.0 + flutter_lints: ^6.0.0 + lints: ^6.0.0 + test: ^1.25.15 ##code generation - build_runner: ^2.4.15 - hive_ce_generator: ^1.9.1 - freezed: ^3.0.6 - json_serializable: ^6.9.4 + build_runner: ^2.6.0 + hive_ce_generator: ^1.9.3 + freezed: ^3.2.0 + json_serializable: ^6.10.0 ##test mocktail: ^1.0.4 diff --git a/packages/core/pubspec.lock b/packages/core/pubspec.lock index 67e0b81..ec15459 100644 --- a/packages/core/pubspec.lock +++ b/packages/core/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f url: "https://pub.dev" source: hosted - version: "82.0.0" + version: "85.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" url: "https://pub.dev" source: hosted - version: "7.4.5" + version: "7.7.1" android_intent_plus: dependency: "direct main" description: @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: asn1lib - sha256: "0511d6be23b007e95105ae023db599aea731df604608978dada7f9faf2637623" + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" url: "https://pub.dev" source: hosted - version: "1.6.4" + version: "1.6.5" async: dependency: transitive description: @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: build - sha256: "74273591bd8b7f82eeb1f191c1b65a6576535bbfd5ca3722778b07d5702d33cc" + sha256: "7d95cbbb1526ab5ae977df9b4cc660963b9b27f6d1075c0b34653868911385e4" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "3.0.0" build_config: dependency: transitive description: @@ -93,26 +93,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: badce70566085f2e87434531c4a6bc8e833672f755fc51146d612245947e91c9 + sha256: "38c9c339333a09b090a638849a4c56e70a404c6bdd3b511493addfbc113b60c2" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "3.0.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b9070a4127033777c0e63195f6f117ed16a351ed676f6313b095cf4f328c0b82 + sha256: b971d4a1c789eba7be3e6fe6ce5e5b50fd3719e3cb485b3fad6d04358304351d url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.6.0" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "1cdfece3eeb3f1263f7dbf5bcc0cba697bd0c22d2c866cb4b578c954dbb09bcf" + sha256: c04e612ca801cd0928ccdb891c263a2b1391cb27940a5ea5afcf9ba894de5d62 url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "9.2.0" built_collection: dependency: transitive description: @@ -125,10 +125,10 @@ packages: dependency: transitive description: name: built_value - sha256: "082001b5c3dc495d4a42f1d5789990505df20d8547d42507c29050af6933ee27" + sha256: "0b1b12a0a549605e5f04476031cd0bc91ead1d7c8e830773a18ee54179b3cb62" url: "https://pub.dev" source: hosted - version: "8.10.1" + version: "8.11.0" characters: dependency: transitive description: @@ -217,14 +217,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dart_polylabel2: + dependency: transitive + description: + name: dart_polylabel2 + sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" + url: "https://pub.dev" + source: hosted + version: "1.0.0" dart_style: dependency: transitive description: name: dart_style - sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af" + sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" dartx: dependency: "direct main" description: @@ -233,6 +241,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" device_info_plus: dependency: "direct main" description: @@ -346,18 +362,18 @@ packages: dependency: transitive description: name: flutter_gen_core - sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc" + sha256: eda54fdc5de08e7eeea663eb8442aafc8660b5a13fda4e0c9e572c64e50195fb url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.0" flutter_gen_runner: dependency: "direct main" description: name: flutter_gen_runner - sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9 + sha256: "669bf8b7a9b4acbdcb7fcc5e12bf638aca19acedf43341714cbca3bf3a219521" url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.0" flutter_lints: dependency: "direct dev" description: @@ -375,10 +391,10 @@ packages: dependency: "direct main" description: name: flutter_map - sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a + sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5 url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.2.1" flutter_map_animations: dependency: "direct main" description: @@ -497,18 +513,18 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" + sha256: da32f8ba8cfcd4ec71d9decc8cbf28bd2c31b5283d9887eb51eb4a0659d8110c url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.2.0" freezed_annotation: dependency: "direct main" description: name: freezed_annotation - sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" frontend_server_client: dependency: transitive description: @@ -517,22 +533,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + geoclue: + dependency: transitive + description: + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" + source: hosted + version: "0.1.1" geolocator: dependency: "direct main" description: name: geolocator - sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" url: "https://pub.dev" source: hosted - version: "14.0.1" + version: "14.0.2" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" + sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a" url: "https://pub.dev" source: hosted - version: "5.0.1+1" + version: "5.0.2" geolocator_apple: dependency: transitive description: @@ -541,6 +565,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.13" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 + url: "https://pub.dev" + source: hosted + version: "0.2.3" geolocator_platform_interface: dependency: transitive description: @@ -605,6 +637,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + gsettings: + dependency: transitive + description: + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" + url: "https://pub.dev" + source: hosted + version: "0.2.8" hashcodes: dependency: transitive description: @@ -633,18 +673,18 @@ packages: dependency: "direct dev" description: name: hive_ce_generator - sha256: "609678c10ebee7503505a0007050af40a0a4f498b1fb7def3220df341e573a89" + sha256: a169feeff2da9cc2c417ce5ae9bcebf7c8a95d7a700492b276909016ad70a786 url: "https://pub.dev" source: hosted - version: "1.9.2" + version: "1.9.3" http: dependency: transitive description: name: http - sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + sha256: "85ab0074f9bf2b24625906d8382bbec84d3d6919d285ba9c106b07b65791fb99" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0-beta.2" http_multi_server: dependency: transitive description: @@ -661,6 +701,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + url: "https://pub.dev" + source: hosted + version: "4.5.4" image_picker: dependency: "direct main" description: @@ -673,10 +721,10 @@ packages: dependency: transitive description: name: image_picker_android - sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" + sha256: "6fae381e6af2bbe0365a5e4ce1db3959462fa0c4d234facf070746024bb80c8d" url: "https://pub.dev" source: hosted - version: "0.8.12+23" + version: "0.8.12+24" image_picker_for_web: dependency: transitive description: @@ -777,10 +825,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c + sha256: ce2cf974ccdee13be2a510832d7fba0b94b364e0b0395dee42abaa51b855be27 url: "https://pub.dev" source: hosted - version: "6.9.5" + version: "6.10.0" latlong2: dependency: "direct main" description: @@ -833,10 +881,10 @@ packages: dependency: "direct main" description: name: logger - sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c" url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.1" logging: dependency: transitive description: @@ -897,10 +945,10 @@ packages: dependency: transitive description: name: mockito - sha256: "4546eac99e8967ea91bae633d2ca7698181d008e95fa4627330cf903d573277a" + sha256: "2314cbe9165bcd16106513df9cf3c3224713087f09723b128928dc11a4379f99" url: "https://pub.dev" source: hosted - version: "5.4.6" + version: "5.5.0" mocktail: dependency: "direct dev" description: @@ -1085,14 +1133,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.9.1" - polylabel: - dependency: transitive - description: - name: polylabel - sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" - url: "https://pub.dev" - source: hosted - version: "1.0.1" pool: dependency: transitive description: @@ -1105,10 +1145,10 @@ packages: dependency: transitive description: name: posix - sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.0.3" pretty_dio_logger: dependency: "direct main" description: @@ -1153,10 +1193,10 @@ packages: dependency: transitive description: name: shamsi_date - sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51 + sha256: "0383fddc9bce91e9e08de0c909faf93c3ab3a0e532abd271fb0dcf5d0617487b" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" shelf: dependency: transitive description: @@ -1190,18 +1230,18 @@ packages: dependency: transitive description: name: source_gen - sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + sha256: fc787b1f89ceac9580c3616f899c9a447413cbdac1df071302127764c023a134 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.0" source_helper: dependency: transitive description: name: source_helper - sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + sha256: "4f81479fe5194a622cdd1713fe1ecb683a6e6c85cd8cec8e2e35ee5ab3fdf2a1" url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.6" source_span: dependency: transitive description: diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index ba3903e..e064032 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_core description: "A new Flutter project." publish_to: none -version: 1.0.0+1 +version: 1.2.0+2 environment: sdk: ^3.8.1 @@ -13,7 +13,7 @@ dependencies: sdk: flutter #utils - device_info_plus: ^11.4.0 + device_info_plus: ^11.5.0 package_info_plus: ^8.3.0 ##image_picker @@ -28,27 +28,27 @@ dependencies: flutter_screenutil: ^5.9.3 ##Log - logger: ^2.5.0 + logger: ^2.6.1 ## reactive dartx: ^1.2.0 rxdart: ^0.28.0 ## local storage - hive_ce: ^2.11.1 - hive_ce_flutter: ^2.3.0 + hive_ce: ^2.11.3 + hive_ce_flutter: ^2.3.1 flutter_secure_storage: ^9.2.4 path_provider: ^2.1.5 #SVG - flutter_svg: ^2.0.17 + flutter_svg: ^2.2.0 font_awesome_flutter: ^10.8.0 #Shimmer shimmer: ^3.0.0 #Generator - flutter_gen_runner: ^5.10.0 + flutter_gen_runner: ^5.11.0 ##state manger get: ^4.7.2 @@ -68,11 +68,11 @@ dependencies: android_intent_plus: ^5.3.0 #Map - flutter_map: ^8.1.1 + flutter_map: ^8.2.1 flutter_map_animations: ^0.9.0 #location latlong2: ^0.9.1 - geolocator: ^14.0.0 + geolocator: ^14.0.2 #network dio: ^5.8.0+1 @@ -80,17 +80,17 @@ dependencies: pretty_dio_logger: ^1.4.0 ##code generation - freezed_annotation: ^3.0.0 + freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^6.0.0 ##code generation - build_runner: ^2.4.15 - hive_ce_generator: ^1.9.1 - freezed: ^3.0.3 - json_serializable: ^6.9.4 + build_runner: ^2.6.0 + hive_ce_generator: ^1.9.3 + freezed: ^3.2.0 + json_serializable: ^6.10.0 ##test diff --git a/packages/livestock/pubspec.yaml b/packages/livestock/pubspec.yaml index 3819913..5713c92 100644 --- a/packages/livestock/pubspec.yaml +++ b/packages/livestock/pubspec.yaml @@ -16,19 +16,19 @@ dependencies: rasadyar_auth: path: ../auth ##code generation - freezed_annotation: ^3.0.0 + freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^5.0.0 - lints: ^5.0.0 - test: ^1.24.0 + flutter_lints: ^6.0.0 + lints: ^6.0.0 + test: ^1.25.15 ##code generation - build_runner: ^2.4.15 - hive_ce_generator: ^1.9.1 - freezed: ^3.0.6 - json_serializable: ^6.9.4 + build_runner: ^2.6.0 + hive_ce_generator: ^1.9.3 + freezed: ^3.2.0 + json_serializable: ^6.10.0 ##test mocktail: ^1.0.4 diff --git a/pubspec.lock b/pubspec.lock index 0b09bc9..1877341 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f url: "https://pub.dev" source: hosted - version: "82.0.0" + version: "85.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" url: "https://pub.dev" source: hosted - version: "7.4.5" + version: "7.7.1" android_intent_plus: dependency: transitive description: @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: build - sha256: "74273591bd8b7f82eeb1f191c1b65a6576535bbfd5ca3722778b07d5702d33cc" + sha256: "7d95cbbb1526ab5ae977df9b4cc660963b9b27f6d1075c0b34653868911385e4" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "3.0.0" build_config: dependency: transitive description: @@ -93,26 +93,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: badce70566085f2e87434531c4a6bc8e833672f755fc51146d612245947e91c9 + sha256: "38c9c339333a09b090a638849a4c56e70a404c6bdd3b511493addfbc113b60c2" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "3.0.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b9070a4127033777c0e63195f6f117ed16a351ed676f6313b095cf4f328c0b82 + sha256: b971d4a1c789eba7be3e6fe6ce5e5b50fd3719e3cb485b3fad6d04358304351d url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.6.0" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "1cdfece3eeb3f1263f7dbf5bcc0cba697bd0c22d2c866cb4b578c954dbb09bcf" + sha256: c04e612ca801cd0928ccdb891c263a2b1391cb27940a5ea5afcf9ba894de5d62 url: "https://pub.dev" source: hosted - version: "9.1.1" + version: "9.2.0" built_collection: dependency: transitive description: @@ -233,6 +233,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dart_polylabel2: + dependency: transitive + description: + name: dart_polylabel2 + sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" + url: "https://pub.dev" + source: hosted + version: "1.0.0" dart_style: dependency: transitive description: @@ -249,6 +257,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" device_info_plus: dependency: transitive description: @@ -362,18 +378,18 @@ packages: dependency: transitive description: name: flutter_gen_core - sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc" + sha256: eda54fdc5de08e7eeea663eb8442aafc8660b5a13fda4e0c9e572c64e50195fb url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.0" flutter_gen_runner: dependency: "direct dev" description: name: flutter_gen_runner - sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9 + sha256: "669bf8b7a9b4acbdcb7fcc5e12bf638aca19acedf43341714cbca3bf3a219521" url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.0" flutter_launcher_icons: dependency: "direct main" description: @@ -386,10 +402,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_localizations: dependency: transitive description: flutter @@ -399,10 +415,10 @@ packages: dependency: transitive description: name: flutter_map - sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a + sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5 url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.2.1" flutter_map_animations: dependency: transitive description: @@ -521,18 +537,18 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c" + sha256: da32f8ba8cfcd4ec71d9decc8cbf28bd2c31b5283d9887eb51eb4a0659d8110c url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.2.0" freezed_annotation: dependency: "direct main" description: name: freezed_annotation - sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" frontend_server_client: dependency: transitive description: @@ -541,14 +557,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + geoclue: + dependency: transitive + description: + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" + source: hosted + version: "0.1.1" geolocator: dependency: transitive description: name: geolocator - sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" url: "https://pub.dev" source: hosted - version: "14.0.1" + version: "14.0.2" geolocator_android: dependency: transitive description: @@ -565,6 +589,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.13" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 + url: "https://pub.dev" + source: hosted + version: "0.2.3" geolocator_platform_interface: dependency: transitive description: @@ -629,6 +661,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + gsettings: + dependency: transitive + description: + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" + url: "https://pub.dev" + source: hosted + version: "0.2.8" hashcodes: dependency: transitive description: @@ -657,18 +697,18 @@ packages: dependency: "direct dev" description: name: hive_ce_generator - sha256: "609678c10ebee7503505a0007050af40a0a4f498b1fb7def3220df341e573a89" + sha256: a169feeff2da9cc2c417ce5ae9bcebf7c8a95d7a700492b276909016ad70a786 url: "https://pub.dev" source: hosted - version: "1.9.2" + version: "1.9.3" http: dependency: transitive description: name: http - sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + sha256: "85ab0074f9bf2b24625906d8382bbec84d3d6919d285ba9c106b07b65791fb99" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0-beta.2" http_multi_server: dependency: transitive description: @@ -809,10 +849,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c + sha256: ce2cf974ccdee13be2a510832d7fba0b94b364e0b0395dee42abaa51b855be27 url: "https://pub.dev" source: hosted - version: "6.9.5" + version: "6.10.0" latlong2: dependency: transitive description: @@ -849,10 +889,10 @@ packages: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" lists: dependency: transitive description: @@ -865,10 +905,10 @@ packages: dependency: transitive description: name: logger - sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c" url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.1" logging: dependency: transitive description: @@ -929,10 +969,10 @@ packages: dependency: transitive description: name: mockito - sha256: "4546eac99e8967ea91bae633d2ca7698181d008e95fa4627330cf903d573277a" + sha256: "2314cbe9165bcd16106513df9cf3c3224713087f09723b128928dc11a4379f99" url: "https://pub.dev" source: hosted - version: "5.4.6" + version: "5.5.0" mocktail: dependency: "direct dev" description: @@ -1117,14 +1157,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.9.1" - polylabel: - dependency: transitive - description: - name: polylabel - sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" - url: "https://pub.dev" - source: hosted - version: "1.0.1" pool: dependency: transitive description: @@ -1179,21 +1211,21 @@ packages: path: "packages/auth" relative: true source: path - version: "0.0.1" + version: "1.0.3" rasadyar_chicken: dependency: "direct main" description: path: "packages/chicken" relative: true source: path - version: "1.0.1" + version: "1.2.1+2" rasadyar_core: dependency: "direct main" description: path: "packages/core" relative: true source: path - version: "1.0.0+1" + version: "1.2.0+2" rasadyar_inspection: dependency: "direct main" description: @@ -1257,18 +1289,18 @@ packages: dependency: transitive description: name: source_gen - sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + sha256: fc787b1f89ceac9580c3616f899c9a447413cbdac1df071302127764c023a134 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.0" source_helper: dependency: transitive description: name: source_helper - sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + sha256: "4f81479fe5194a622cdd1713fe1ecb683a6e6c85cd8cec8e2e35ee5ab3fdf2a1" url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.6" source_span: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fe55df1..60d2330 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_app description: "A new Flutter project." publish_to: 'none' -version: 1.3.6+4 +version: 1.3.7+5 environment: sdk: ^3.8.1 @@ -34,18 +34,18 @@ dependencies: ##code generation - freezed_annotation: ^3.0.0 + freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^5.0.0 + flutter_lints: ^6.0.0 ##code generation - build_runner: ^2.4.15 - hive_ce_generator: ^1.9.1 - freezed: ^3.0.6 - json_serializable: ^6.9.4 - flutter_gen_runner: ^5.10.0 + build_runner: ^2.6.0 + hive_ce_generator: ^1.9.3 + freezed: ^3.2.0 + json_serializable: ^6.10.0 + flutter_gen_runner: ^5.11.0 change_app_package_name: ^1.5.0 ##test From 659e32dc8edb07357490285401e2e5b3106759b3 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 23 Jul 2025 08:44:14 +0330 Subject: [PATCH 232/256] fix : cancel token --- .../service/app_navigation_observer.dart | 9 ++-- packages/chicken/lib/data/di/chicken_di.dart | 4 +- .../remote/app_interceptor.dart | 41 ++++++++++++------- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/lib/infrastructure/service/app_navigation_observer.dart b/lib/infrastructure/service/app_navigation_observer.dart index 74cec1e..9ad7b38 100644 --- a/lib/infrastructure/service/app_navigation_observer.dart +++ b/lib/infrastructure/service/app_navigation_observer.dart @@ -18,25 +18,24 @@ class CustomNavigationObserver extends NavigatorObserver { _isWorkDone = true; await setupInjection(); } + tLog('CustomNavigationObserver: didPush - $routeName'); } - @override void didReplace({Route? newRoute, Route? oldRoute}) { super.didReplace(newRoute: newRoute, oldRoute: oldRoute); - - + tLog('CustomNavigationObserver: didReplace - ${newRoute?.settings.name}'); } @override void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); - + tLog('CustomNavigationObserver: didPop - ${route.settings.name}'); } @override void didRemove(Route route, Route? previousRoute) { super.didRemove(route, previousRoute); - + tLog('CustomNavigationObserver: didRemove - ${route.settings.name}'); } } diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index 3335a4d..bf68d7b 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -17,7 +17,8 @@ Future setupChickenDI() async { diChicken.registerLazySingleton( () => AppInterceptor( - refreshTokenCallback: () async {}, + //فعلا سامانه مرغ برای رفرش توکن چیزی ندارد + refreshTokenCallback: () async => null, saveTokenCallback: (String newToken) async { await tokenService.saveAccessToken(newToken); }, @@ -25,6 +26,7 @@ Future setupChickenDI() async { await tokenService.deleteTokens(); Get.offAllNamed(AuthPaths.auth, arguments: Module.chicken); }, + authArguments: Module.chicken, ), instanceName: 'chickenInterceptor', ); diff --git a/packages/core/lib/infrastructure/remote/app_interceptor.dart b/packages/core/lib/infrastructure/remote/app_interceptor.dart index 602d34f..8af53d5 100644 --- a/packages/core/lib/infrastructure/remote/app_interceptor.dart +++ b/packages/core/lib/infrastructure/remote/app_interceptor.dart @@ -11,6 +11,7 @@ class AppInterceptor extends Interceptor { final SaveTokenCallback saveTokenCallback; final ClearTokenCallback clearTokenCallback; late final Dio dio; + dynamic authArguments; static Completer? _refreshCompleter; static bool _isRefreshing = false; @@ -18,6 +19,7 @@ class AppInterceptor extends Interceptor { required this.saveTokenCallback, required this.clearTokenCallback, this.refreshTokenCallback, + this.authArguments, }); @override @@ -27,6 +29,10 @@ class AppInterceptor extends Interceptor { final newToken = await _refreshCompleter!.future; if (newToken != null && newToken.isNotEmpty) { options.headers['Authorization'] = 'Bearer $newToken'; + } else { + // اگر توکن جدید وجود نداشت، درخواست را رد کن + handler.reject(DioException(requestOptions: options, type: DioExceptionType.cancel)); + return; } } catch (_) { handler.reject(DioException(requestOptions: options, type: DioExceptionType.cancel)); @@ -44,11 +50,15 @@ class AppInterceptor extends Interceptor { handler.resolve(retryResult); return; } + // اگر رفرش توکن ناموفق بود، درخواست را رد کن + handler.reject(err); + return; } handler.next(err); } Future _handleUnauthorizedError(DioException err) async { + // اگر رفرش در جریان است، منتظر نتیجه‌ی آن بمان if (_isRefreshing && _refreshCompleter != null) { try { final newToken = await _refreshCompleter!.future; @@ -58,24 +68,28 @@ class AppInterceptor extends Interceptor { } } + // فقط یک بار فرآیند رفرش را شروع کن _isRefreshing = true; _refreshCompleter = Completer(); try { - final newToken = await refreshTokenCallback!(); + final newToken = await refreshTokenCallback?.call(); - if (!_refreshCompleter!.isCompleted) _refreshCompleter!.complete(newToken); - - if (newToken != null) { - await saveTokenCallback(newToken); // ✅ ذخیره توکن جدید + if (newToken != null && newToken.isNotEmpty) { + await saveTokenCallback(newToken); // ذخیره توکن جدید + _refreshCompleter!.complete(newToken); return await _retryRequest(err.requestOptions, newToken); } else { - await clearTokenCallback(); // ✅ پاک‌کردن توکن‌های قبلی + await clearTokenCallback(); // پاک کردن توکن‌های قبلی + _refreshCompleter!.complete(null); + _handleRefreshFailure(); return null; } } catch (e) { - if (!_refreshCompleter!.isCompleted) _refreshCompleter!.completeError(e); - await clearTokenCallback(); // ✅ پاک‌کردن توکن در صورت خطا + if (!_refreshCompleter!.isCompleted) { + _refreshCompleter!.completeError(e); + } + await clearTokenCallback(); // پاک کردن توکن در صورت خطا _handleRefreshFailure(); return null; } finally { @@ -92,10 +106,9 @@ class AppInterceptor extends Interceptor { void _handleRefreshFailure() { ApiHandler.cancelAllRequests("Token refresh failed"); - Future.delayed(const Duration(milliseconds: 100), () { - if (Get.currentRoute != '/Auth') { - Get.offAllNamed('/Auth'); - } - }); + + if (Get.currentRoute != '/Auth') { + Get.offAllNamed('/Auth', arguments: authArguments ?? 'Module.chicken'); + } } -} \ No newline at end of file +} From 93294dcfc1cf29e72031a284785a4a7be5da9154 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 23 Jul 2025 08:47:42 +0330 Subject: [PATCH 233/256] chore : update lib --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 60d2330..207376d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: #UI cupertino_icons: ^1.0.8 - flutter_launcher_icons: ^0.14.3 + flutter_launcher_icons: ^0.14.4 #rasadyar packages rasadyar_core: From 297c3659ea724c8815dc76d8a5665057aa0ba704 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 23 Jul 2025 14:41:05 +0330 Subject: [PATCH 234/256] feat : privacyPolicyWidget --- .../kotlin/ir/mnpc/rasadyar/MainActivity.kt | 4 +- lib/data/model/app_info_model.dart | 16 +- lib/data/model/app_info_model.freezed.dart | 377 +++- lib/presentation/pages/splash/logic.dart | 12 +- .../lib/presentation/pages/auth/view.dart | 285 ++- ...change_password_request_model.freezed.dart | 133 +- .../conform_allocation.freezed.dart | 133 +- .../create_steward_free_bar.freezed.dart | 133 +- .../steward_allocation_request.freezed.dart | 133 +- ...steward_free_sale_bar_request.freezed.dart | 133 +- .../submit_kill_house_free_bar.freezed.dart | 133 +- .../submit_steward_allocation.freezed.dart | 133 +- .../allocated_made.freezed.dart | 1043 +++++++++- .../bar_information.freezed.dart | 133 +- ...dashboard_kill_house_free_bar.freezed.dart | 133 +- .../response/guild/guild_model.freezed.dart | 263 ++- .../guild_profile/guild_profile.freezed.dart | 1043 +++++++++- .../imported_loads_model.freezed.dart | 1693 ++++++++++++++++- .../inventory/inventory_model.freezed.dart | 133 +- .../iran_province_city_model.freezed.dart | 133 +- .../kill_house_distribution_info.freezed.dart | 133 +- .../kill_house_free_bar.freezed.dart | 133 +- .../out_province_carcasses_buyer.freezed.dart | 393 +++- .../roles_products.freezed.dart | 263 ++- .../segmentation_model.freezed.dart | 523 ++++- .../steward_free_bar.freezed.dart | 913 ++++++++- .../steward_free_bar_dashboard.freezed.dart | 133 +- .../steward_free_sale_bar.freezed.dart | 523 ++++- .../user_profile/user_profile.freezed.dart | 263 ++- .../waiting_arrival.freezed.dart | 1043 +++++++++- .../lib/presentation/common/app_fonts.dart | 92 +- .../lib/presentation/common/assets.gen.dart | 24 +- .../lib/presentation/common/fonts.gen.dart | 3 +- .../presentation/widget/inputs/r_input.dart | 3 + pubspec.yaml | 2 +- 35 files changed, 10368 insertions(+), 275 deletions(-) diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt index 077f851..dc675dc 100644 --- a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt @@ -28,8 +28,8 @@ class MainActivity : FlutterActivity() { CHANNEL ).setMethodCallHandler { call, result -> if (call.method == "apk_installer") { - val internalFile = File(context.filesDir.parentFile, "app_flutter/app-release.apk") - val externalFile = File(context.getExternalFilesDir(null), "app-release.apk") + val internalFile = File(context.filesDir.parentFile, "app_flutter/rasadyar.apk") + val externalFile = File(context.getExternalFilesDir(null), "rasadyar.apk") internalFile.copyTo(externalFile, overwrite = true) if (!installer.canInstallPackages()) { diff --git a/lib/data/model/app_info_model.dart b/lib/data/model/app_info_model.dart index b564474..e6eb9f9 100644 --- a/lib/data/model/app_info_model.dart +++ b/lib/data/model/app_info_model.dart @@ -5,24 +5,14 @@ part 'app_info_model.g.dart'; @freezed abstract class AppInfoModel with _$AppInfoModel { - const factory AppInfoModel({ - required String key, - required Info info, - required String downloadLink, - }) = _AppInfoModel; + const factory AppInfoModel({String? key, String? download_link, Info? info}) = _AppInfoModel; - factory AppInfoModel.fromJson(Map json) => - _$AppInfoModelFromJson(json); + factory AppInfoModel.fromJson(Map json) => _$AppInfoModelFromJson(json); } @freezed abstract class Info with _$Info { - const factory Info({ - required String version, - required bool required, - required String module, - }) = _Info; + const factory Info({String? version, String? module, bool? required}) = _Info; factory Info.fromJson(Map json) => _$InfoFromJson(json); } - diff --git a/lib/data/model/app_info_model.freezed.dart b/lib/data/model/app_info_model.freezed.dart index 149e987..dc05818 100644 --- a/lib/data/model/app_info_model.freezed.dart +++ b/lib/data/model/app_info_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -16,7 +15,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$AppInfoModel { - String get key; Info get info; String get downloadLink; + String? get key; String? get download_link; Info? get info; /// Create a copy of AppInfoModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +28,16 @@ $AppInfoModelCopyWith get copyWith => _$AppInfoModelCopyWithImpl Object.hash(runtimeType,key,info,downloadLink); +int get hashCode => Object.hash(runtimeType,key,download_link,info); @override String toString() { - return 'AppInfoModel(key: $key, info: $info, downloadLink: $downloadLink)'; + return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)'; } @@ -49,11 +48,11 @@ abstract mixin class $AppInfoModelCopyWith<$Res> { factory $AppInfoModelCopyWith(AppInfoModel value, $Res Function(AppInfoModel) _then) = _$AppInfoModelCopyWithImpl; @useResult $Res call({ - String key, Info info, String downloadLink + String? key, String? download_link, Info? info }); -$InfoCopyWith<$Res> get info; +$InfoCopyWith<$Res>? get info; } /// @nodoc @@ -66,37 +65,170 @@ class _$AppInfoModelCopyWithImpl<$Res> /// Create a copy of AppInfoModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = null,Object? info = null,Object? downloadLink = null,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) { return _then(_self.copyWith( -key: null == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String,info: null == info ? _self.info : info // ignore: cast_nullable_to_non_nullable -as Info,downloadLink: null == downloadLink ? _self.downloadLink : downloadLink // ignore: cast_nullable_to_non_nullable -as String, +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable +as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable +as Info?, )); } /// Create a copy of AppInfoModel /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$InfoCopyWith<$Res> get info { - - return $InfoCopyWith<$Res>(_self.info, (value) { +$InfoCopyWith<$Res>? get info { + if (_self.info == null) { + return null; + } + + return $InfoCopyWith<$Res>(_self.info!, (value) { return _then(_self.copyWith(info: value)); }); } } +/// Adds pattern-matching-related methods to [AppInfoModel]. +extension AppInfoModelPatterns on AppInfoModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _AppInfoModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _AppInfoModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _AppInfoModel value) $default,){ +final _that = this; +switch (_that) { +case _AppInfoModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _AppInfoModel value)? $default,){ +final _that = this; +switch (_that) { +case _AppInfoModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? download_link, Info? info)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _AppInfoModel() when $default != null: +return $default(_that.key,_that.download_link,_that.info);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? download_link, Info? info) $default,) {final _that = this; +switch (_that) { +case _AppInfoModel(): +return $default(_that.key,_that.download_link,_that.info);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? download_link, Info? info)? $default,) {final _that = this; +switch (_that) { +case _AppInfoModel() when $default != null: +return $default(_that.key,_that.download_link,_that.info);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() class _AppInfoModel implements AppInfoModel { - const _AppInfoModel({required this.key, required this.info, required this.downloadLink}); + const _AppInfoModel({this.key, this.download_link, this.info}); factory _AppInfoModel.fromJson(Map json) => _$AppInfoModelFromJson(json); -@override final String key; -@override final Info info; -@override final String downloadLink; +@override final String? key; +@override final String? download_link; +@override final Info? info; /// Create a copy of AppInfoModel /// with the given fields replaced by the non-null parameter values. @@ -111,16 +243,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.info, info) || other.info == info)&&(identical(other.downloadLink, downloadLink) || other.downloadLink == downloadLink)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppInfoModel&&(identical(other.key, key) || other.key == key)&&(identical(other.download_link, download_link) || other.download_link == download_link)&&(identical(other.info, info) || other.info == info)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,info,downloadLink); +int get hashCode => Object.hash(runtimeType,key,download_link,info); @override String toString() { - return 'AppInfoModel(key: $key, info: $info, downloadLink: $downloadLink)'; + return 'AppInfoModel(key: $key, download_link: $download_link, info: $info)'; } @@ -131,11 +263,11 @@ abstract mixin class _$AppInfoModelCopyWith<$Res> implements $AppInfoModelCopyWi factory _$AppInfoModelCopyWith(_AppInfoModel value, $Res Function(_AppInfoModel) _then) = __$AppInfoModelCopyWithImpl; @override @useResult $Res call({ - String key, Info info, String downloadLink + String? key, String? download_link, Info? info }); -@override $InfoCopyWith<$Res> get info; +@override $InfoCopyWith<$Res>? get info; } /// @nodoc @@ -148,12 +280,12 @@ class __$AppInfoModelCopyWithImpl<$Res> /// Create a copy of AppInfoModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = null,Object? info = null,Object? downloadLink = null,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? download_link = freezed,Object? info = freezed,}) { return _then(_AppInfoModel( -key: null == key ? _self.key : key // ignore: cast_nullable_to_non_nullable -as String,info: null == info ? _self.info : info // ignore: cast_nullable_to_non_nullable -as Info,downloadLink: null == downloadLink ? _self.downloadLink : downloadLink // ignore: cast_nullable_to_non_nullable -as String, +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,download_link: freezed == download_link ? _self.download_link : download_link // ignore: cast_nullable_to_non_nullable +as String?,info: freezed == info ? _self.info : info // ignore: cast_nullable_to_non_nullable +as Info?, )); } @@ -161,9 +293,12 @@ as String, /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') -$InfoCopyWith<$Res> get info { - - return $InfoCopyWith<$Res>(_self.info, (value) { +$InfoCopyWith<$Res>? get info { + if (_self.info == null) { + return null; + } + + return $InfoCopyWith<$Res>(_self.info!, (value) { return _then(_self.copyWith(info: value)); }); } @@ -173,7 +308,7 @@ $InfoCopyWith<$Res> get info { /// @nodoc mixin _$Info { - String get version; bool get required; String get module; + String? get version; String? get module; bool? get required; /// Create a copy of Info /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -186,16 +321,16 @@ $InfoCopyWith get copyWith => _$InfoCopyWithImpl(this as Info, _$ide @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.required, required) || other.required == required)&&(identical(other.module, module) || other.module == module)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,version,required,module); +int get hashCode => Object.hash(runtimeType,version,module,required); @override String toString() { - return 'Info(version: $version, required: $required, module: $module)'; + return 'Info(version: $version, module: $module, required: $required)'; } @@ -206,7 +341,7 @@ abstract mixin class $InfoCopyWith<$Res> { factory $InfoCopyWith(Info value, $Res Function(Info) _then) = _$InfoCopyWithImpl; @useResult $Res call({ - String version, bool required, String module + String? version, String? module, bool? required }); @@ -223,28 +358,158 @@ class _$InfoCopyWithImpl<$Res> /// Create a copy of Info /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? version = null,Object? required = null,Object? module = null,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) { return _then(_self.copyWith( -version: null == version ? _self.version : version // ignore: cast_nullable_to_non_nullable -as String,required: null == required ? _self.required : required // ignore: cast_nullable_to_non_nullable -as bool,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable -as String, +version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable +as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable +as bool?, )); } } +/// Adds pattern-matching-related methods to [Info]. +extension InfoPatterns on Info { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Info value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Info() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Info value) $default,){ +final _that = this; +switch (_that) { +case _Info(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Info value)? $default,){ +final _that = this; +switch (_that) { +case _Info() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? version, String? module, bool? required)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Info() when $default != null: +return $default(_that.version,_that.module,_that.required);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? version, String? module, bool? required) $default,) {final _that = this; +switch (_that) { +case _Info(): +return $default(_that.version,_that.module,_that.required);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? version, String? module, bool? required)? $default,) {final _that = this; +switch (_that) { +case _Info() when $default != null: +return $default(_that.version,_that.module,_that.required);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() class _Info implements Info { - const _Info({required this.version, required this.required, required this.module}); + const _Info({this.version, this.module, this.required}); factory _Info.fromJson(Map json) => _$InfoFromJson(json); -@override final String version; -@override final bool required; -@override final String module; +@override final String? version; +@override final String? module; +@override final bool? required; /// Create a copy of Info /// with the given fields replaced by the non-null parameter values. @@ -259,16 +524,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.required, required) || other.required == required)&&(identical(other.module, module) || other.module == module)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Info&&(identical(other.version, version) || other.version == version)&&(identical(other.module, module) || other.module == module)&&(identical(other.required, required) || other.required == required)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,version,required,module); +int get hashCode => Object.hash(runtimeType,version,module,required); @override String toString() { - return 'Info(version: $version, required: $required, module: $module)'; + return 'Info(version: $version, module: $module, required: $required)'; } @@ -279,7 +544,7 @@ abstract mixin class _$InfoCopyWith<$Res> implements $InfoCopyWith<$Res> { factory _$InfoCopyWith(_Info value, $Res Function(_Info) _then) = __$InfoCopyWithImpl; @override @useResult $Res call({ - String version, bool required, String module + String? version, String? module, bool? required }); @@ -296,12 +561,12 @@ class __$InfoCopyWithImpl<$Res> /// Create a copy of Info /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? version = null,Object? required = null,Object? module = null,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? version = freezed,Object? module = freezed,Object? required = freezed,}) { return _then(_Info( -version: null == version ? _self.version : version // ignore: cast_nullable_to_non_nullable -as String,required: null == required ? _self.required : required // ignore: cast_nullable_to_non_nullable -as bool,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable -as String, +version: freezed == version ? _self.version : version // ignore: cast_nullable_to_non_nullable +as String?,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as String?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable +as bool?, )); } diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 695151f..4f94283 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -151,8 +151,8 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { Future.delayed(const Duration(milliseconds: 250), () async { try { - final isUpdateNeeded = await checkVersion(); - if (isUpdateNeeded) return; + /* final isUpdateNeeded = await checkVersion(); + if (isUpdateNeeded) return;*/ final module = tokenService.appModule.value; final target = getTargetPage(module); @@ -178,7 +178,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { appInfoModel = AppInfoModel.fromJson(res.data); - if ((appInfoModel?.info.version.versionNumber ?? 0) > version) { + if ((appInfoModel?.info?.version?.versionNumber ?? 0) > version) { hasUpdated.value = !hasUpdated.value; return true; } @@ -191,7 +191,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { Future fileDownload() async { onUpdateDownload.value = true; final dir = await getApplicationDocumentsDirectory(); - final filePath = "${dir.path}/app-release.apk"; + final filePath = "${dir.path}/rasadyar.apk"; final file = File(filePath); if (await file.exists()) { await file.delete(); @@ -203,7 +203,7 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { while (attempts < retryCount && !success) { try { await _dio.download( - appInfoModel?.downloadLink ?? '', + appInfoModel?.download_link ?? '', filePath, onReceiveProgress: (count, total) { if (total != -1 && total > 0) { @@ -226,8 +226,6 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { if (success) { _updateFilePath.value = filePath; - tLog(filePath); - fLog(_updateFilePath.value); } onUpdateDownload.value = false; diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 1002a4f..80215ad 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -27,28 +27,31 @@ class AuthPage extends GetView { } }, controller.authType), - /* SizedBox(height: 50), + SizedBox(height: 20), RichText( text: TextSpan( children: [ TextSpan( text: 'مطالعه بیانیه ', - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDark, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDark), ), TextSpan( recognizer: TapGestureRecognizer() - ..onTap = () {}, + ..onTap = () { + Get.bottomSheet( + privacyPolicyWidget(), + isScrollControlled: true, + enableDrag: true, + ignoreSafeArea: false, + ); + }, text: 'حریم خصوصی', - style: AppFonts.yekan14.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), ), ], ), ), - SizedBox(height: 18), + /* SizedBox(height: 18), ObxValue((types) { return RichText( @@ -92,110 +95,200 @@ class AuthPage extends GetView { padding: EdgeInsets.symmetric(horizontal: 30, vertical: 50), child: Form( key: controller.formKey, - child: Column( - children: [ - RTextField( - label: 'نام کاربری', - maxLength: 11, - maxLines: 1, - controller: controller.phoneNumberController.value, - keyboardType: TextInputType.number, - initText: controller.phoneNumberController.value.text, - onChanged: (value) async { - controller.phoneNumberController.value.text = value; - controller.phoneNumberController.refresh(); - if (value.length == 11) { - await controller.getUserInfo(value); - } - }, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: Assets.vec.callSvg.svg(width: 12, height: 12), - ), - suffixIcon: - controller.phoneNumberController.value.text.trim().isNotEmpty - ? clearButton(() { - controller.phoneNumberController.value.clear(); - controller.phoneNumberController.refresh(); - }) - : null, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ شماره موبایل را وارد کنید'; - } else if (value.length < 11) { - return '⚠️ شماره موبایل باید 11 رقم باشد'; - } - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), - labelStyle: AppFonts.yekan13, - boxConstraints: const BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - ), - const SizedBox(height: 26), - ObxValue( - (passwordController) => RTextField( - label: 'رمز عبور', - filled: false, - obscure: true, - controller: passwordController.value, - variant: RTextFieldVariant.password, - initText: passwordController.value.text, - onChanged: (value) { - passwordController.refresh(); + child: AutofillGroup( + child: Column( + children: [ + RTextField( + label: 'نام کاربری', + maxLength: 11, + maxLines: 1, + controller: controller.phoneNumberController.value, + keyboardType: TextInputType.number, + initText: controller.phoneNumberController.value.text, + autofillHints: [AutofillHints.username], + onChanged: (value) async { + controller.phoneNumberController.value.text = value; + controller.phoneNumberController.refresh(); + if (value.length == 11) { + await controller.getUserInfo(value); + } }, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), + child: Assets.vec.callSvg.svg(width: 12, height: 12), + ), + suffixIcon: controller.phoneNumberController.value.text.trim().isNotEmpty + ? clearButton(() { + controller.phoneNumberController.value.clear(); + controller.phoneNumberController.refresh(); + }) + : null, validator: (value) { if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; + return '⚠️ شماره موبایل را وارد کنید'; + } else if (value.length < 11) { + return '⚠️ شماره موبایل باید 11 رقم باشد'; } return null; }, style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), + errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), labelStyle: AppFonts.yekan13, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: Assets.vec.keySvg.svg(width: 12, height: 12), - ), boxConstraints: const BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, + maxHeight: 40, + minHeight: 40, + maxWidth: 40, + minWidth: 40, ), ), - controller.passwordController, - ), - SizedBox(height: 26), - CaptchaWidget(), - SizedBox(height: 23), + const SizedBox(height: 26), + ObxValue( + (passwordController) => RTextField( + label: 'رمز عبور', + filled: false, + obscure: true, + controller: passwordController.value, + autofillHints: [AutofillHints.password], + variant: RTextFieldVariant.password, + initText: passwordController.value.text, + onChanged: (value) { + passwordController.refresh(); + }, + validator: (value) { + if (value == null || value.isEmpty) { + return '⚠️ رمز عبور را وارد کنید'; + } + return null; + }, + style: AppFonts.yekan13, + errorStyle: AppFonts.yekan13.copyWith(color: AppColor.redNormal), + labelStyle: AppFonts.yekan13, + prefixIcon: Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), + child: Assets.vec.keySvg.svg(width: 12, height: 12), + ), + boxConstraints: const BoxConstraints( + maxHeight: 34, + minHeight: 34, + maxWidth: 34, + minWidth: 34, + ), + ), + controller.passwordController, + ), + SizedBox(height: 26), + CaptchaWidget(), + SizedBox(height: 23), - Obx(() { - return RElevated( - text: 'ورود', - isLoading: controller.isLoading.value, - onPressed: controller.isDisabled.value - ? null - : () async { - await controller.submitLoginForm2(); - }, - width: Get.width, - height: 48, - ); - }), - ], + Obx(() { + return RElevated( + text: 'ورود', + isLoading: controller.isLoading.value, + onPressed: controller.isDisabled.value + ? null + : () async { + await controller.submitLoginForm2(); + }, + width: Get.width, + height: 48, + ); + }), + ], + ), ), ), ); } + Widget privacyPolicyWidget() { + return BaseBottomSheet( + child: Column( + spacing: 5, + children: [ + Container( + padding: EdgeInsets.all(8.w), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + spacing: 3, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'بيانيه حريم خصوصی', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Text( + 'اطلاعات مربوط به هر شخص، حریم خصوصی وی محسوب می‌شود. حفاظت و حراست از اطلاعات شخصی در سامانه رصد یار، نه تنها موجب حفظ امنیت کاربران می‌شود، بلکه باعث اعتماد بیشتر و مشارکت آنها در فعالیت‌های جاری می‌گردد. هدف از این بیانیه، آگاه ساختن شما درباره ی نوع و نحوه ی استفاده از اطلاعاتی است که در هنگام استفاده از سامانه رصد یار ، از جانب شما دریافت می‌گردد. شرکت هوشمند سازان خود را ملزم به رعایت حریم خصوصی همه شهروندان و کاربران سامانه دانسته و آن دسته از اطلاعات کاربران را که فقط به منظور ارائه خدمات کفایت می‌کند، دریافت کرده و از انتشار آن یا در اختیار قرار دادن آن به دیگران خودداری مینماید.', + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), + ), + ], + ), + ), + Container( + padding: EdgeInsets.all(8.w), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'چگونگی جمع آوری و استفاده از اطلاعات کاربران', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Text( + '''الف: اطلاعاتی که شما خود در اختيار این سامانه قرار می‌دهيد، شامل موارد زيرهستند: +اقلام اطلاعاتی شامل شماره تلفن همراه، تاریخ تولد، کد پستی و کد ملی کاربران را دریافت مینماییم که از این اقلام، صرفا جهت احراز هویت کاربران استفاده خواهد شد. +ب: برخی اطلاعات ديگر که به صورت خودکار از شما دريافت میشود شامل موارد زير می‌باشد: +⦁ دستگاهی که از طریق آن سامانه رصد یار را مشاهده می‌نمایید( تلفن همراه، تبلت، رایانه). +⦁ نام و نسخه سیستم عامل و browser کامپیوتر شما. +⦁ اطلاعات صفحات بازدید شده. +⦁ تعداد بازدیدهای روزانه در درگاه. +⦁ هدف ما از دریافت این اطلاعات استفاده از آنها در تحلیل عملکرد کاربران درگاه می باشد تا بتوانیم در خدمت رسانی بهتر عمل کنیم. +''', + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), + ), + ], + ), + ), + Container( + padding: EdgeInsets.all(8.w), + + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'امنیت اطلاعات', + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), + ), + Text( + 'متعهدیم که امنیت اطلاعات شما را تضمین نماییم و برای جلوگیری از هر نوع دسترسی غیرمجاز و افشای اطلاعات شما از همه شیوه‌‌های لازم استفاده می‌کنیم تا امنیت اطلاعاتی را که به صورت آنلاین گردآوری می‌کنیم، حفظ شود. لازم به ذکر است در سامانه ما، ممکن است به سایت های دیگری لینک شوید، وقتی که شما از طریق این لینک‌ها از سامانه ما خارج می‌شوید، توجه داشته باشید که ما بر دیگر سایت ها کنترل نداریم و سازمان تعهدی بر حفظ حریم شخصی آنان در سایت مقصد نخواهد داشت و مراجعه کنندگان میبایست به بیانیه حریم شخصی آن سایت ها مراجعه نمایند.', + style: AppFonts.yekan14.copyWith(color: AppColor.bgDark, height: 1.8), + ), + ], + ), + ), + ], + ), + ); + } + /* Widget sendCodeForm() { return ObxValue((data) { diff --git a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart index 54ea8e3..b9f8687 100644 --- a/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart +++ b/packages/chicken/lib/data/models/request/change_password/change_password_request_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -77,6 +76,136 @@ as String?, } +/// Adds pattern-matching-related methods to [ChangePasswordRequestModel]. +extension ChangePasswordRequestModelPatterns on ChangePasswordRequestModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ChangePasswordRequestModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ChangePasswordRequestModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ChangePasswordRequestModel value) $default,){ +final _that = this; +switch (_that) { +case _ChangePasswordRequestModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ChangePasswordRequestModel value)? $default,){ +final _that = this; +switch (_that) { +case _ChangePasswordRequestModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? username, String? password)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ChangePasswordRequestModel() when $default != null: +return $default(_that.username,_that.password);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? username, String? password) $default,) {final _that = this; +switch (_that) { +case _ChangePasswordRequestModel(): +return $default(_that.username,_that.password);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? username, String? password)? $default,) {final _that = this; +switch (_that) { +case _ChangePasswordRequestModel() when $default != null: +return $default(_that.username,_that.password);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart index b08cbcb..bfa3fe6 100644 --- a/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart +++ b/packages/chicken/lib/data/models/request/conform_allocation/conform_allocation.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -80,6 +79,136 @@ as int?, } +/// Adds pattern-matching-related methods to [ConformAllocation]. +extension ConformAllocationPatterns on ConformAllocation { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ConformAllocation value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ConformAllocation() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ConformAllocation value) $default,){ +final _that = this; +switch (_that) { +case _ConformAllocation(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ConformAllocation value)? $default,){ +final _that = this; +switch (_that) { +case _ConformAllocation() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ConformAllocation() when $default != null: +return $default(_that.allocation_key,_that.number_of_carcasses,_that.weight_of_carcasses,_that.amount,_that.total_amount);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount) $default,) {final _that = this; +switch (_that) { +case _ConformAllocation(): +return $default(_that.allocation_key,_that.number_of_carcasses,_that.weight_of_carcasses,_that.amount,_that.total_amount);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? allocation_key, int? number_of_carcasses, int? weight_of_carcasses, int? amount, int? total_amount)? $default,) {final _that = this; +switch (_that) { +case _ConformAllocation() when $default != null: +return $default(_that.allocation_key,_that.number_of_carcasses,_that.weight_of_carcasses,_that.amount,_that.total_amount);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart index c584671..19ddf79 100644 --- a/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart +++ b/packages/chicken/lib/data/models/request/create_steward_free_bar/create_steward_free_bar.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -83,6 +82,136 @@ as String?, } +/// Adds pattern-matching-related methods to [CreateStewardFreeBar]. +extension CreateStewardFreeBarPatterns on CreateStewardFreeBar { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _CreateStewardFreeBar value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _CreateStewardFreeBar() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _CreateStewardFreeBar value) $default,){ +final _that = this; +switch (_that) { +case _CreateStewardFreeBar(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _CreateStewardFreeBar value)? $default,){ +final _that = this; +switch (_that) { +case _CreateStewardFreeBar() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? productKey, String? killHouseName, String? killHouseMobile, String? province, String? city, int? weightOfCarcasses, String? date, String? barImage)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _CreateStewardFreeBar() when $default != null: +return $default(_that.productKey,_that.killHouseName,_that.killHouseMobile,_that.province,_that.city,_that.weightOfCarcasses,_that.date,_that.barImage);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? productKey, String? killHouseName, String? killHouseMobile, String? province, String? city, int? weightOfCarcasses, String? date, String? barImage) $default,) {final _that = this; +switch (_that) { +case _CreateStewardFreeBar(): +return $default(_that.productKey,_that.killHouseName,_that.killHouseMobile,_that.province,_that.city,_that.weightOfCarcasses,_that.date,_that.barImage);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? productKey, String? killHouseName, String? killHouseMobile, String? province, String? city, int? weightOfCarcasses, String? date, String? barImage)? $default,) {final _that = this; +switch (_that) { +case _CreateStewardFreeBar() when $default != null: +return $default(_that.productKey,_that.killHouseName,_that.killHouseMobile,_that.province,_that.city,_that.weightOfCarcasses,_that.date,_that.barImage);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart index c19c23e..1ac5810 100644 --- a/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart +++ b/packages/chicken/lib/data/models/request/steward_allocation/steward_allocation_request.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -82,6 +81,136 @@ as int?, } +/// Adds pattern-matching-related methods to [StewardAllocationRequest]. +extension StewardAllocationRequestPatterns on StewardAllocationRequest { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _StewardAllocationRequest value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _StewardAllocationRequest() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _StewardAllocationRequest value) $default,){ +final _that = this; +switch (_that) { +case _StewardAllocationRequest(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _StewardAllocationRequest value)? $default,){ +final _that = this; +switch (_that) { +case _StewardAllocationRequest() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( bool? checkAllocation, String? allocationKey, String? state, int? registrationCode, int? receiverRealNumberOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _StewardAllocationRequest() when $default != null: +return $default(_that.checkAllocation,_that.allocationKey,_that.state,_that.registrationCode,_that.receiverRealNumberOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( bool? checkAllocation, String? allocationKey, String? state, int? registrationCode, int? receiverRealNumberOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses) $default,) {final _that = this; +switch (_that) { +case _StewardAllocationRequest(): +return $default(_that.checkAllocation,_that.allocationKey,_that.state,_that.registrationCode,_that.receiverRealNumberOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( bool? checkAllocation, String? allocationKey, String? state, int? registrationCode, int? receiverRealNumberOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses)? $default,) {final _that = this; +switch (_that) { +case _StewardAllocationRequest() when $default != null: +return $default(_that.checkAllocation,_that.allocationKey,_that.state,_that.registrationCode,_that.receiverRealNumberOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart index f91b780..20c21ba 100644 --- a/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart +++ b/packages/chicken/lib/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -82,6 +81,136 @@ as String?, } +/// Adds pattern-matching-related methods to [StewardFreeSaleBarRequest]. +extension StewardFreeSaleBarRequestPatterns on StewardFreeSaleBarRequest { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _StewardFreeSaleBarRequest value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _StewardFreeSaleBarRequest() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _StewardFreeSaleBarRequest value) $default,){ +final _that = this; +switch (_that) { +case _StewardFreeSaleBarRequest(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _StewardFreeSaleBarRequest value)? $default,){ +final _that = this; +switch (_that) { +case _StewardFreeSaleBarRequest() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? buyerKey, int? numberOfCarcasses, int? weightOfCarcasses, String? date, String? clearanceCode, String? productKey, String? key)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _StewardFreeSaleBarRequest() when $default != null: +return $default(_that.buyerKey,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.date,_that.clearanceCode,_that.productKey,_that.key);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? buyerKey, int? numberOfCarcasses, int? weightOfCarcasses, String? date, String? clearanceCode, String? productKey, String? key) $default,) {final _that = this; +switch (_that) { +case _StewardFreeSaleBarRequest(): +return $default(_that.buyerKey,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.date,_that.clearanceCode,_that.productKey,_that.key);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? buyerKey, int? numberOfCarcasses, int? weightOfCarcasses, String? date, String? clearanceCode, String? productKey, String? key)? $default,) {final _that = this; +switch (_that) { +case _StewardFreeSaleBarRequest() when $default != null: +return $default(_that.buyerKey,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.date,_that.clearanceCode,_that.productKey,_that.key);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart index a770592..7807425 100644 --- a/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart +++ b/packages/chicken/lib/data/models/request/submit_kill_house_free_bar/submit_kill_house_free_bar.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -90,6 +89,136 @@ as String?, } +/// Adds pattern-matching-related methods to [SubmitKillHouseFreeBar]. +extension SubmitKillHouseFreeBarPatterns on SubmitKillHouseFreeBar { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _SubmitKillHouseFreeBar value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _SubmitKillHouseFreeBar() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _SubmitKillHouseFreeBar value) $default,){ +final _that = this; +switch (_that) { +case _SubmitKillHouseFreeBar(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _SubmitKillHouseFreeBar value)? $default,){ +final _that = this; +switch (_that) { +case _SubmitKillHouseFreeBar() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? driverName, String? driverMobile, String? poultryName, String? poultryMobile, String? province, String? city, String? barClearanceCode, String? barImage, String? killerKey, String? date, String? buyType, String? productKey, String? car, String? numberOfCarcasses, String? weightOfCarcasses)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _SubmitKillHouseFreeBar() when $default != null: +return $default(_that.driverName,_that.driverMobile,_that.poultryName,_that.poultryMobile,_that.province,_that.city,_that.barClearanceCode,_that.barImage,_that.killerKey,_that.date,_that.buyType,_that.productKey,_that.car,_that.numberOfCarcasses,_that.weightOfCarcasses);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? driverName, String? driverMobile, String? poultryName, String? poultryMobile, String? province, String? city, String? barClearanceCode, String? barImage, String? killerKey, String? date, String? buyType, String? productKey, String? car, String? numberOfCarcasses, String? weightOfCarcasses) $default,) {final _that = this; +switch (_that) { +case _SubmitKillHouseFreeBar(): +return $default(_that.driverName,_that.driverMobile,_that.poultryName,_that.poultryMobile,_that.province,_that.city,_that.barClearanceCode,_that.barImage,_that.killerKey,_that.date,_that.buyType,_that.productKey,_that.car,_that.numberOfCarcasses,_that.weightOfCarcasses);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? driverName, String? driverMobile, String? poultryName, String? poultryMobile, String? province, String? city, String? barClearanceCode, String? barImage, String? killerKey, String? date, String? buyType, String? productKey, String? car, String? numberOfCarcasses, String? weightOfCarcasses)? $default,) {final _that = this; +switch (_that) { +case _SubmitKillHouseFreeBar() when $default != null: +return $default(_that.driverName,_that.driverMobile,_that.poultryName,_that.poultryMobile,_that.province,_that.city,_that.barClearanceCode,_that.barImage,_that.killerKey,_that.date,_that.buyType,_that.productKey,_that.car,_that.numberOfCarcasses,_that.weightOfCarcasses);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart index 257af6e..0ff2933 100644 --- a/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart +++ b/packages/chicken/lib/data/models/request/submit_steward_allocation/submit_steward_allocation.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -88,6 +87,136 @@ as String?, } +/// Adds pattern-matching-related methods to [SubmitStewardAllocation]. +extension SubmitStewardAllocationPatterns on SubmitStewardAllocation { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _SubmitStewardAllocation value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _SubmitStewardAllocation() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _SubmitStewardAllocation value) $default,){ +final _that = this; +switch (_that) { +case _SubmitStewardAllocation(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _SubmitStewardAllocation value)? $default,){ +final _that = this; +switch (_that) { +case _SubmitStewardAllocation() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? sellerType, String? buyerType, String? guildKey, String? productKey, String? type, String? allocationType, int? numberOfCarcasses, int? weightOfCarcasses, String? sellType, int? amount, int? totalAmount, bool? approvedPriceStatus, String? date)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _SubmitStewardAllocation() when $default != null: +return $default(_that.sellerType,_that.buyerType,_that.guildKey,_that.productKey,_that.type,_that.allocationType,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.sellType,_that.amount,_that.totalAmount,_that.approvedPriceStatus,_that.date);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? sellerType, String? buyerType, String? guildKey, String? productKey, String? type, String? allocationType, int? numberOfCarcasses, int? weightOfCarcasses, String? sellType, int? amount, int? totalAmount, bool? approvedPriceStatus, String? date) $default,) {final _that = this; +switch (_that) { +case _SubmitStewardAllocation(): +return $default(_that.sellerType,_that.buyerType,_that.guildKey,_that.productKey,_that.type,_that.allocationType,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.sellType,_that.amount,_that.totalAmount,_that.approvedPriceStatus,_that.date);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? sellerType, String? buyerType, String? guildKey, String? productKey, String? type, String? allocationType, int? numberOfCarcasses, int? weightOfCarcasses, String? sellType, int? amount, int? totalAmount, bool? approvedPriceStatus, String? date)? $default,) {final _that = this; +switch (_that) { +case _SubmitStewardAllocation() when $default != null: +return $default(_that.sellerType,_that.buyerType,_that.guildKey,_that.productKey,_that.type,_that.allocationType,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.sellType,_that.amount,_that.totalAmount,_that.approvedPriceStatus,_that.date);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart index 5ba358f..1d1e683 100644 --- a/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart +++ b/packages/chicken/lib/data/models/response/allocated_made/allocated_made.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -166,6 +165,136 @@ $StewardCopyWith<$Res>? get toGuilds { } +/// Adds pattern-matching-related methods to [AllocatedMadeModel]. +extension AllocatedMadeModelPatterns on AllocatedMadeModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _AllocatedMadeModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _AllocatedMadeModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _AllocatedMadeModel value) $default,){ +final _that = this; +switch (_that) { +case _AllocatedMadeModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _AllocatedMadeModel value)? $default,){ +final _that = this; +switch (_that) { +case _AllocatedMadeModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, Product? product, dynamic killHouse, dynamic toKillHouse, Steward? steward, dynamic toSteward, dynamic guilds, Steward? toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, int? weightOfCarcasses, int? realWeightOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, String? loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, String? role, String? stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _AllocatedMadeModel() when $default != null: +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, Product? product, dynamic killHouse, dynamic toKillHouse, Steward? steward, dynamic toSteward, dynamic guilds, Steward? toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, int? weightOfCarcasses, int? realWeightOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, String? loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, String? role, String? stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser) $default,) {final _that = this; +switch (_that) { +case _AllocatedMadeModel(): +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, Product? product, dynamic killHouse, dynamic toKillHouse, Steward? steward, dynamic toSteward, dynamic guilds, Steward? toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, int? weightOfCarcasses, int? realWeightOfCarcasses, int? receiverRealWeightOfCarcasses, int? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, String? loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, String? role, String? stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser)? $default,) {final _that = this; +switch (_that) { +case _AllocatedMadeModel() when $default != null: +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -444,6 +573,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Product]. +extension ProductPatterns on Product { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Product value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Product value) $default,){ +final _that = this; +switch (_that) { +case _Product(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Product value)? $default,){ +final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? weightAverage, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that.weightAverage,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? weightAverage, String? name) $default,) {final _that = this; +switch (_that) { +case _Product(): +return $default(_that.weightAverage,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? weightAverage, String? name)? $default,) {final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that.weightAverage,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -703,6 +962,136 @@ $PosStatusCopyWith<$Res>? get getPosStatus { } +/// Adds pattern-matching-related methods to [Steward]. +extension StewardPatterns on Steward { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Steward value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Steward value) $default,){ +final _that = this; +switch (_that) { +case _Steward(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Steward value)? $default,){ +final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, User? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, String? registerarRole, String? registerarFullname, String? registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, String? provinceMessage, String? condition, String? descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, String? reviewerRole, String? reviewerFullname, String? reviewerMobile, String? checkerMessage, bool? finalAccept, bool? temporaryRegistration, String? createdBy, String? modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.userIdForeignKey,_that.addressIdForeignKey,_that.userBankIdForeignKey,_that.walletIdForeignKey,_that.provincialGovernmentIdKey,_that.identityDocuments,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.centersAllocation,_that.killHouseCentersAllocation,_that.allocationLimit,_that.limitationAllocation,_that.registerarRole,_that.registerarFullname,_that.registerarMobile,_that.killHouseRegister,_that.stewardRegister,_that.guildsRoomRegister,_that.posCompanyRegister,_that.provinceAcceptState,_that.provinceMessage,_that.condition,_that.descriptionCondition,_that.stewardActive,_that.stewardAllocationLimit,_that.stewardLimitationAllocation,_that.license,_that.licenseForm,_that.licenseFile,_that.reviewerRole,_that.reviewerFullname,_that.reviewerMobile,_that.checkerMessage,_that.finalAccept,_that.temporaryRegistration,_that.createdBy,_that.modifiedBy,_that.userBankInfo,_that.wallet,_that.cars,_that.userLevel);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, User? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, String? registerarRole, String? registerarFullname, String? registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, String? provinceMessage, String? condition, String? descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, String? reviewerRole, String? reviewerFullname, String? reviewerMobile, String? checkerMessage, bool? finalAccept, bool? temporaryRegistration, String? createdBy, String? modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel) $default,) {final _that = this; +switch (_that) { +case _Steward(): +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.userIdForeignKey,_that.addressIdForeignKey,_that.userBankIdForeignKey,_that.walletIdForeignKey,_that.provincialGovernmentIdKey,_that.identityDocuments,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.centersAllocation,_that.killHouseCentersAllocation,_that.allocationLimit,_that.limitationAllocation,_that.registerarRole,_that.registerarFullname,_that.registerarMobile,_that.killHouseRegister,_that.stewardRegister,_that.guildsRoomRegister,_that.posCompanyRegister,_that.provinceAcceptState,_that.provinceMessage,_that.condition,_that.descriptionCondition,_that.stewardActive,_that.stewardAllocationLimit,_that.stewardLimitationAllocation,_that.license,_that.licenseForm,_that.licenseFile,_that.reviewerRole,_that.reviewerFullname,_that.reviewerMobile,_that.checkerMessage,_that.finalAccept,_that.temporaryRegistration,_that.createdBy,_that.modifiedBy,_that.userBankInfo,_that.wallet,_that.cars,_that.userLevel);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, User? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, String? registerarRole, String? registerarFullname, String? registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, String? provinceMessage, String? condition, String? descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, String? reviewerRole, String? reviewerFullname, String? reviewerMobile, String? checkerMessage, bool? finalAccept, bool? temporaryRegistration, String? createdBy, String? modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel)? $default,) {final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.userIdForeignKey,_that.addressIdForeignKey,_that.userBankIdForeignKey,_that.walletIdForeignKey,_that.provincialGovernmentIdKey,_that.identityDocuments,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.centersAllocation,_that.killHouseCentersAllocation,_that.allocationLimit,_that.limitationAllocation,_that.registerarRole,_that.registerarFullname,_that.registerarMobile,_that.killHouseRegister,_that.stewardRegister,_that.guildsRoomRegister,_that.posCompanyRegister,_that.provinceAcceptState,_that.provinceMessage,_that.condition,_that.descriptionCondition,_that.stewardActive,_that.stewardAllocationLimit,_that.stewardLimitationAllocation,_that.license,_that.licenseForm,_that.licenseFile,_that.reviewerRole,_that.reviewerFullname,_that.reviewerMobile,_that.checkerMessage,_that.finalAccept,_that.temporaryRegistration,_that.createdBy,_that.modifiedBy,_that.userBankInfo,_that.wallet,_that.cars,_that.userLevel);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1069,6 +1458,136 @@ as String?, } +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1239,6 +1758,136 @@ $ProvinceCopyWith<$Res>? get city { } +/// Adds pattern-matching-related methods to [Address]. +extension AddressPatterns on Address { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Address value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Address value) $default,){ +final _that = this; +switch (_that) { +case _Address(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Address value)? $default,){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( Province? province, Province? city, String? address, String? postalCode)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( Province? province, Province? city, String? address, String? postalCode) $default,) {final _that = this; +switch (_that) { +case _Address(): +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( Province? province, Province? city, String? address, String? postalCode)? $default,) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1403,6 +2052,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Province]. +extension ProvincePatterns on Province { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Province value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Province value) $default,){ +final _that = this; +switch (_that) { +case _Province(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Province value)? $default,){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _Province(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1539,6 +2318,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Activity]. +extension ActivityPatterns on Activity { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Activity value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Activity value) $default,){ +final _that = this; +switch (_that) { +case _Activity(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Activity value)? $default,){ +final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? title)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that.key,_that.title);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? title) $default,) {final _that = this; +switch (_that) { +case _Activity(): +return $default(_that.key,_that.title);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? title)? $default,) {final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that.key,_that.title);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1676,6 +2585,136 @@ as bool?, } +/// Adds pattern-matching-related methods to [PosStatus]. +extension PosStatusPatterns on PosStatus { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _PosStatus value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _PosStatus value) $default,){ +final _that = this; +switch (_that) { +case _PosStatus(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _PosStatus value)? $default,){ +final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons) $default,) {final _that = this; +switch (_that) { +case _PosStatus(): +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons)? $default,) {final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart b/packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart index e8b13e8..0741449 100644 --- a/packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart +++ b/packages/chicken/lib/data/models/response/bar_information/bar_information.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -87,6 +86,136 @@ as double?, } +/// Adds pattern-matching-related methods to [BarInformation]. +extension BarInformationPatterns on BarInformation { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _BarInformation value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _BarInformation() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _BarInformation value) $default,){ +final _that = this; +switch (_that) { +case _BarInformation(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _BarInformation value)? $default,){ +final _that = this; +switch (_that) { +case _BarInformation() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? totalBars, int? totalBarsQuantity, double? totalBarsWeight, int? totalEnteredBars, int? totalEnteredBarsQuantity, double? totalEnteredBarsWeight, int? totalNotEnteredBars, int? totalNotEnteredBarsQuantity, double? totalNotEnteredKillHouseRequestsWeight, int? totalRejectedBars, int? totalRejectedBarsQuantity, double? totalRejectedBarsWeight)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _BarInformation() when $default != null: +return $default(_that.totalBars,_that.totalBarsQuantity,_that.totalBarsWeight,_that.totalEnteredBars,_that.totalEnteredBarsQuantity,_that.totalEnteredBarsWeight,_that.totalNotEnteredBars,_that.totalNotEnteredBarsQuantity,_that.totalNotEnteredKillHouseRequestsWeight,_that.totalRejectedBars,_that.totalRejectedBarsQuantity,_that.totalRejectedBarsWeight);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? totalBars, int? totalBarsQuantity, double? totalBarsWeight, int? totalEnteredBars, int? totalEnteredBarsQuantity, double? totalEnteredBarsWeight, int? totalNotEnteredBars, int? totalNotEnteredBarsQuantity, double? totalNotEnteredKillHouseRequestsWeight, int? totalRejectedBars, int? totalRejectedBarsQuantity, double? totalRejectedBarsWeight) $default,) {final _that = this; +switch (_that) { +case _BarInformation(): +return $default(_that.totalBars,_that.totalBarsQuantity,_that.totalBarsWeight,_that.totalEnteredBars,_that.totalEnteredBarsQuantity,_that.totalEnteredBarsWeight,_that.totalNotEnteredBars,_that.totalNotEnteredBarsQuantity,_that.totalNotEnteredKillHouseRequestsWeight,_that.totalRejectedBars,_that.totalRejectedBarsQuantity,_that.totalRejectedBarsWeight);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? totalBars, int? totalBarsQuantity, double? totalBarsWeight, int? totalEnteredBars, int? totalEnteredBarsQuantity, double? totalEnteredBarsWeight, int? totalNotEnteredBars, int? totalNotEnteredBarsQuantity, double? totalNotEnteredKillHouseRequestsWeight, int? totalRejectedBars, int? totalRejectedBarsQuantity, double? totalRejectedBarsWeight)? $default,) {final _that = this; +switch (_that) { +case _BarInformation() when $default != null: +return $default(_that.totalBars,_that.totalBarsQuantity,_that.totalBarsWeight,_that.totalEnteredBars,_that.totalEnteredBarsQuantity,_that.totalEnteredBarsWeight,_that.totalNotEnteredBars,_that.totalNotEnteredBarsQuantity,_that.totalNotEnteredKillHouseRequestsWeight,_that.totalRejectedBars,_that.totalRejectedBarsQuantity,_that.totalRejectedBarsWeight);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart index 99a036a..e86892c 100644 --- a/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart +++ b/packages/chicken/lib/data/models/response/dashboard_kill_house_free_bar/dashboard_kill_house_free_bar.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -80,6 +79,136 @@ as int?, } +/// Adds pattern-matching-related methods to [DashboardKillHouseFreeBar]. +extension DashboardKillHouseFreeBarPatterns on DashboardKillHouseFreeBar { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _DashboardKillHouseFreeBar value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _DashboardKillHouseFreeBar() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _DashboardKillHouseFreeBar value) $default,){ +final _that = this; +switch (_that) { +case _DashboardKillHouseFreeBar(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _DashboardKillHouseFreeBar value)? $default,){ +final _that = this; +switch (_that) { +case _DashboardKillHouseFreeBar() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? totalBars, int? totalBarsQuantity, int? totalBarsLiveWeight, int? totalBarsNumberOfCarcasses, int? totalBarsWeightOfCarcasses)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _DashboardKillHouseFreeBar() when $default != null: +return $default(_that.totalBars,_that.totalBarsQuantity,_that.totalBarsLiveWeight,_that.totalBarsNumberOfCarcasses,_that.totalBarsWeightOfCarcasses);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? totalBars, int? totalBarsQuantity, int? totalBarsLiveWeight, int? totalBarsNumberOfCarcasses, int? totalBarsWeightOfCarcasses) $default,) {final _that = this; +switch (_that) { +case _DashboardKillHouseFreeBar(): +return $default(_that.totalBars,_that.totalBarsQuantity,_that.totalBarsLiveWeight,_that.totalBarsNumberOfCarcasses,_that.totalBarsWeightOfCarcasses);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? totalBars, int? totalBarsQuantity, int? totalBarsLiveWeight, int? totalBarsNumberOfCarcasses, int? totalBarsWeightOfCarcasses)? $default,) {final _that = this; +switch (_that) { +case _DashboardKillHouseFreeBar() when $default != null: +return $default(_that.totalBars,_that.totalBarsQuantity,_that.totalBarsLiveWeight,_that.totalBarsNumberOfCarcasses,_that.totalBarsWeightOfCarcasses);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart b/packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart index 1456502..fae500a 100644 --- a/packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/guild/guild_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -91,6 +90,136 @@ $UserCopyWith<$Res>? get user { } +/// Adds pattern-matching-related methods to [GuildModel]. +extension GuildModelPatterns on GuildModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _GuildModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _GuildModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _GuildModel value) $default,){ +final _that = this; +switch (_that) { +case _GuildModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _GuildModel value)? $default,){ +final _that = this; +switch (_that) { +case _GuildModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? guildsName, bool? steward, User? user)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _GuildModel() when $default != null: +return $default(_that.key,_that.guildsName,_that.steward,_that.user);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? guildsName, bool? steward, User? user) $default,) {final _that = this; +switch (_that) { +case _GuildModel(): +return $default(_that.key,_that.guildsName,_that.steward,_that.user);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? guildsName, bool? steward, User? user)? $default,) {final _that = this; +switch (_that) { +case _GuildModel() when $default != null: +return $default(_that.key,_that.guildsName,_that.steward,_that.user);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -244,6 +373,136 @@ as String?, } +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? mobile, String? city)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.mobile,_that.city);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? mobile, String? city) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.fullname,_that.mobile,_that.city);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? mobile, String? city)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.mobile,_that.city);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart index 12b9656..70b427c 100644 --- a/packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart +++ b/packages/chicken/lib/data/models/response/guild_profile/guild_profile.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -200,6 +199,136 @@ $GetPosStatusCopyWith<$Res>? get get_pos_status { } +/// Adds pattern-matching-related methods to [GuildProfile]. +extension GuildProfilePatterns on GuildProfile { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _GuildProfile value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _GuildProfile() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _GuildProfile value) $default,){ +final _that = this; +switch (_that) { +case _GuildProfile(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _GuildProfile value)? $default,){ +final _that = this; +switch (_that) { +case _GuildProfile() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, User? user, Address? address, GuildAreaActivity? guild_area_activity, GuildTypeActivity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, GetPosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, String? user_id_foreign_key, String? address_id_foreign_key, String? user_bank_id_foreign_key, String? wallet_id_foreign_key, String? provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _GuildProfile() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guild_area_activity,_that.guild_type_activity,_that.kill_house,_that.steward_kill_house,_that.stewards,_that.get_pos_status,_that.key,_that.create_date,_that.modify_date,_that.trash,_that.user_id_foreign_key,_that.address_id_foreign_key,_that.user_bank_id_foreign_key,_that.wallet_id_foreign_key,_that.provincial_government_id_key,_that.identity_documents,_that.active,_that.city_number,_that.city_name,_that.guilds_id,_that.license_number,_that.guilds_name,_that.phone,_that.type_activity,_that.area_activity,_that.province_number,_that.province_name,_that.steward,_that.has_pos,_that.centers_allocation,_that.kill_house_centers_allocation,_that.allocation_limit,_that.limitation_allocation,_that.registerar_role,_that.registerar_fullname,_that.registerar_mobile,_that.kill_house_register,_that.steward_register,_that.guilds_room_register,_that.pos_company_register,_that.province_accept_state,_that.province_message,_that.condition,_that.description_condition,_that.steward_active,_that.steward_allocation_limit,_that.steward_limitation_allocation,_that.license,_that.license_form,_that.license_file,_that.reviewer_role,_that.reviewer_fullname,_that.reviewer_mobile,_that.checker_message,_that.final_accept,_that.temporary_registration,_that.created_by,_that.modified_by,_that.user_bank_info,_that.wallet,_that.cars,_that.user_level);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, User? user, Address? address, GuildAreaActivity? guild_area_activity, GuildTypeActivity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, GetPosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, String? user_id_foreign_key, String? address_id_foreign_key, String? user_bank_id_foreign_key, String? wallet_id_foreign_key, String? provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level) $default,) {final _that = this; +switch (_that) { +case _GuildProfile(): +return $default(_that.id,_that.user,_that.address,_that.guild_area_activity,_that.guild_type_activity,_that.kill_house,_that.steward_kill_house,_that.stewards,_that.get_pos_status,_that.key,_that.create_date,_that.modify_date,_that.trash,_that.user_id_foreign_key,_that.address_id_foreign_key,_that.user_bank_id_foreign_key,_that.wallet_id_foreign_key,_that.provincial_government_id_key,_that.identity_documents,_that.active,_that.city_number,_that.city_name,_that.guilds_id,_that.license_number,_that.guilds_name,_that.phone,_that.type_activity,_that.area_activity,_that.province_number,_that.province_name,_that.steward,_that.has_pos,_that.centers_allocation,_that.kill_house_centers_allocation,_that.allocation_limit,_that.limitation_allocation,_that.registerar_role,_that.registerar_fullname,_that.registerar_mobile,_that.kill_house_register,_that.steward_register,_that.guilds_room_register,_that.pos_company_register,_that.province_accept_state,_that.province_message,_that.condition,_that.description_condition,_that.steward_active,_that.steward_allocation_limit,_that.steward_limitation_allocation,_that.license,_that.license_form,_that.license_file,_that.reviewer_role,_that.reviewer_fullname,_that.reviewer_mobile,_that.checker_message,_that.final_accept,_that.temporary_registration,_that.created_by,_that.modified_by,_that.user_bank_info,_that.wallet,_that.cars,_that.user_level);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, User? user, Address? address, GuildAreaActivity? guild_area_activity, GuildTypeActivity? guild_type_activity, List? kill_house, List? steward_kill_house, List? stewards, GetPosStatus? get_pos_status, String? key, String? create_date, String? modify_date, bool? trash, String? user_id_foreign_key, String? address_id_foreign_key, String? user_bank_id_foreign_key, String? wallet_id_foreign_key, String? provincial_government_id_key, dynamic identity_documents, bool? active, int? city_number, String? city_name, String? guilds_id, String? license_number, String? guilds_name, String? phone, String? type_activity, String? area_activity, int? province_number, String? province_name, bool? steward, bool? has_pos, dynamic centers_allocation, dynamic kill_house_centers_allocation, dynamic allocation_limit, bool? limitation_allocation, String? registerar_role, String? registerar_fullname, String? registerar_mobile, bool? kill_house_register, bool? steward_register, bool? guilds_room_register, bool? pos_company_register, String? province_accept_state, String? province_message, String? condition, String? description_condition, bool? steward_active, dynamic steward_allocation_limit, bool? steward_limitation_allocation, bool? license, dynamic license_form, dynamic license_file, String? reviewer_role, String? reviewer_fullname, String? reviewer_mobile, String? checker_message, bool? final_accept, bool? temporary_registration, String? created_by, String? modified_by, dynamic user_bank_info, int? wallet, List? cars, List? user_level)? $default,) {final _that = this; +switch (_that) { +case _GuildProfile() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guild_area_activity,_that.guild_type_activity,_that.kill_house,_that.steward_kill_house,_that.stewards,_that.get_pos_status,_that.key,_that.create_date,_that.modify_date,_that.trash,_that.user_id_foreign_key,_that.address_id_foreign_key,_that.user_bank_id_foreign_key,_that.wallet_id_foreign_key,_that.provincial_government_id_key,_that.identity_documents,_that.active,_that.city_number,_that.city_name,_that.guilds_id,_that.license_number,_that.guilds_name,_that.phone,_that.type_activity,_that.area_activity,_that.province_number,_that.province_name,_that.steward,_that.has_pos,_that.centers_allocation,_that.kill_house_centers_allocation,_that.allocation_limit,_that.limitation_allocation,_that.registerar_role,_that.registerar_fullname,_that.registerar_mobile,_that.kill_house_register,_that.steward_register,_that.guilds_room_register,_that.pos_company_register,_that.province_accept_state,_that.province_message,_that.condition,_that.description_condition,_that.steward_active,_that.steward_allocation_limit,_that.steward_limitation_allocation,_that.license,_that.license_form,_that.license_file,_that.reviewer_role,_that.reviewer_fullname,_that.reviewer_mobile,_that.checker_message,_that.final_accept,_that.temporary_registration,_that.created_by,_that.modified_by,_that.user_bank_info,_that.wallet,_that.cars,_that.user_level);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -566,6 +695,136 @@ as String?, } +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.first_name,_that.last_name,_that.mobile,_that.national_id,_that.city);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.fullname,_that.first_name,_that.last_name,_that.mobile,_that.national_id,_that.city);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? first_name, String? last_name, String? mobile, String? national_id, String? city)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.first_name,_that.last_name,_that.mobile,_that.national_id,_that.city);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -736,6 +995,136 @@ $CityCopyWith<$Res>? get city { } +/// Adds pattern-matching-related methods to [Address]. +extension AddressPatterns on Address { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Address value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Address value) $default,){ +final _that = this; +switch (_that) { +case _Address(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Address value)? $default,){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( Province? province, City? city, String? address, String? postal_code)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postal_code);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( Province? province, City? city, String? address, String? postal_code) $default,) {final _that = this; +switch (_that) { +case _Address(): +return $default(_that.province,_that.city,_that.address,_that.postal_code);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( Province? province, City? city, String? address, String? postal_code)? $default,) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postal_code);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -900,6 +1289,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Province]. +extension ProvincePatterns on Province { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Province value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Province value) $default,){ +final _that = this; +switch (_that) { +case _Province(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Province value)? $default,){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _Province(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1036,6 +1555,136 @@ as String?, } +/// Adds pattern-matching-related methods to [City]. +extension CityPatterns on City { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _City value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _City value) $default,){ +final _that = this; +switch (_that) { +case _City(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _City value)? $default,){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _City(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1172,6 +1821,136 @@ as String?, } +/// Adds pattern-matching-related methods to [GuildAreaActivity]. +extension GuildAreaActivityPatterns on GuildAreaActivity { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _GuildAreaActivity value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _GuildAreaActivity() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _GuildAreaActivity value) $default,){ +final _that = this; +switch (_that) { +case _GuildAreaActivity(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _GuildAreaActivity value)? $default,){ +final _that = this; +switch (_that) { +case _GuildAreaActivity() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? title)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _GuildAreaActivity() when $default != null: +return $default(_that.key,_that.title);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? title) $default,) {final _that = this; +switch (_that) { +case _GuildAreaActivity(): +return $default(_that.key,_that.title);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? title)? $default,) {final _that = this; +switch (_that) { +case _GuildAreaActivity() when $default != null: +return $default(_that.key,_that.title);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1308,6 +2087,136 @@ as String?, } +/// Adds pattern-matching-related methods to [GuildTypeActivity]. +extension GuildTypeActivityPatterns on GuildTypeActivity { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _GuildTypeActivity value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _GuildTypeActivity() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _GuildTypeActivity value) $default,){ +final _that = this; +switch (_that) { +case _GuildTypeActivity(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _GuildTypeActivity value)? $default,){ +final _that = this; +switch (_that) { +case _GuildTypeActivity() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? title)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _GuildTypeActivity() when $default != null: +return $default(_that.key,_that.title);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? title) $default,) {final _that = this; +switch (_that) { +case _GuildTypeActivity(): +return $default(_that.key,_that.title);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? title)? $default,) {final _that = this; +switch (_that) { +case _GuildTypeActivity() when $default != null: +return $default(_that.key,_that.title);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1445,6 +2354,136 @@ as bool?, } +/// Adds pattern-matching-related methods to [GetPosStatus]. +extension GetPosStatusPatterns on GetPosStatus { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _GetPosStatus value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _GetPosStatus() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _GetPosStatus value) $default,){ +final _that = this; +switch (_that) { +case _GetPosStatus(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _GetPosStatus value)? $default,){ +final _that = this; +switch (_that) { +case _GetPosStatus() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? len_active_sessions, bool? has_pons, bool? has_active_pons)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _GetPosStatus() when $default != null: +return $default(_that.len_active_sessions,_that.has_pons,_that.has_active_pons);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? len_active_sessions, bool? has_pons, bool? has_active_pons) $default,) {final _that = this; +switch (_that) { +case _GetPosStatus(): +return $default(_that.len_active_sessions,_that.has_pons,_that.has_active_pons);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? len_active_sessions, bool? has_pons, bool? has_active_pons)? $default,) {final _that = this; +switch (_that) { +case _GetPosStatus() when $default != null: +return $default(_that.len_active_sessions,_that.has_pons,_that.has_active_pons);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart index 10eda4f..296834a 100644 --- a/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/imported_loads_model/imported_loads_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -166,6 +165,136 @@ $ToStewardCopyWith<$Res>? get toSteward { } +/// Adds pattern-matching-related methods to [ImportedLoadsModel]. +extension ImportedLoadsModelPatterns on ImportedLoadsModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ImportedLoadsModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ImportedLoadsModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ImportedLoadsModel value) $default,){ +final _that = this; +switch (_that) { +case _ImportedLoadsModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ImportedLoadsModel value)? $default,){ +final _that = this; +switch (_that) { +case _ImportedLoadsModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ImportedLoadsModel() when $default != null: +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser) $default,) {final _that = this; +switch (_that) { +case _ImportedLoadsModel(): +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, Product? product, KillHouse? killHouse, dynamic toKillHouse, dynamic steward, ToSteward? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser)? $default,) {final _that = this; +switch (_that) { +case _ImportedLoadsModel() when $default != null: +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -443,6 +572,136 @@ as double?, } +/// Adds pattern-matching-related methods to [Product]. +extension ProductPatterns on Product { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Product value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Product value) $default,){ +final _that = this; +switch (_that) { +case _Product(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Product value)? $default,){ +final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( double? weightAverage)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that.weightAverage);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( double? weightAverage) $default,) {final _that = this; +switch (_that) { +case _Product(): +return $default(_that.weightAverage);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( double? weightAverage)? $default,) {final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that.weightAverage);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -591,6 +850,136 @@ $KillHouseOperatorCopyWith<$Res>? get killHouseOperator { } +/// Adds pattern-matching-related methods to [KillHouse]. +extension KillHousePatterns on KillHouse { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _KillHouse value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _KillHouse() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _KillHouse value) $default,){ +final _that = this; +switch (_that) { +case _KillHouse(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _KillHouse value)? $default,){ +final _that = this; +switch (_that) { +case _KillHouse() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, KillHouseOperator? killHouseOperator, String? name, bool? killer)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _KillHouse() when $default != null: +return $default(_that.key,_that.killHouseOperator,_that.name,_that.killer);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, KillHouseOperator? killHouseOperator, String? name, bool? killer) $default,) {final _that = this; +switch (_that) { +case _KillHouse(): +return $default(_that.key,_that.killHouseOperator,_that.name,_that.killer);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, KillHouseOperator? killHouseOperator, String? name, bool? killer)? $default,) {final _that = this; +switch (_that) { +case _KillHouse() when $default != null: +return $default(_that.key,_that.killHouseOperator,_that.name,_that.killer);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -754,6 +1143,136 @@ $UserCopyWith<$Res>? get user { } +/// Adds pattern-matching-related methods to [KillHouseOperator]. +extension KillHouseOperatorPatterns on KillHouseOperator { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _KillHouseOperator value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _KillHouseOperator() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _KillHouseOperator value) $default,){ +final _that = this; +switch (_that) { +case _KillHouseOperator(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _KillHouseOperator value)? $default,){ +final _that = this; +switch (_that) { +case _KillHouseOperator() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( User? user)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _KillHouseOperator() when $default != null: +return $default(_that.user);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( User? user) $default,) {final _that = this; +switch (_that) { +case _KillHouseOperator(): +return $default(_that.user);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( User? user)? $default,) {final _that = this; +switch (_that) { +case _KillHouseOperator() when $default != null: +return $default(_that.user);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -927,6 +1446,136 @@ $CityCopyWith<$Res>? get city { } +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.baseOrder,_that.mobile,_that.nationalId,_that.nationalCode,_that.key,_that.city,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.fullname,_that.firstName,_that.lastName,_that.baseOrder,_that.mobile,_that.nationalId,_that.nationalCode,_that.key,_that.city,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.baseOrder,_that.mobile,_that.nationalId,_that.nationalCode,_that.key,_that.city,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1120,6 +1769,136 @@ as int?, } +/// Adds pattern-matching-related methods to [City]. +extension CityPatterns on City { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _City value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _City value) $default,){ +final _that = this; +switch (_that) { +case _City(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _City value)? $default,){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.provinceIdForeignKey,_that.cityIdKey,_that.name,_that.productPrice,_that.provinceCenter,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.createdBy,_that.modifiedBy,_that.province);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province) $default,) {final _that = this; +switch (_that) { +case _City(): +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.provinceIdForeignKey,_that.cityIdKey,_that.name,_that.productPrice,_that.provinceCenter,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.createdBy,_that.modifiedBy,_that.province);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, dynamic createdBy, dynamic modifiedBy, int? province)? $default,) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.provinceIdForeignKey,_that.cityIdKey,_that.name,_that.productPrice,_that.provinceCenter,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.createdBy,_that.modifiedBy,_that.province);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1409,6 +2188,136 @@ $PosStatusCopyWith<$Res>? get getPosStatus { } +/// Adds pattern-matching-related methods to [ToSteward]. +extension ToStewardPatterns on ToSteward { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ToSteward value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ToSteward() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ToSteward value) $default,){ +final _that = this; +switch (_that) { +case _ToSteward(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ToSteward value)? $default,){ +final _that = this; +switch (_that) { +case _ToSteward() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, ToStewardUser? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, dynamic phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, dynamic registerarRole, dynamic registerarFullname, dynamic registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, dynamic provinceMessage, dynamic condition, dynamic descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, dynamic reviewerRole, dynamic reviewerFullname, dynamic reviewerMobile, dynamic checkerMessage, bool? finalAccept, bool? temporaryRegistration, dynamic createdBy, dynamic modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ToSteward() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.userIdForeignKey,_that.addressIdForeignKey,_that.userBankIdForeignKey,_that.walletIdForeignKey,_that.provincialGovernmentIdKey,_that.identityDocuments,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.centersAllocation,_that.killHouseCentersAllocation,_that.allocationLimit,_that.limitationAllocation,_that.registerarRole,_that.registerarFullname,_that.registerarMobile,_that.killHouseRegister,_that.stewardRegister,_that.guildsRoomRegister,_that.posCompanyRegister,_that.provinceAcceptState,_that.provinceMessage,_that.condition,_that.descriptionCondition,_that.stewardActive,_that.stewardAllocationLimit,_that.stewardLimitationAllocation,_that.license,_that.licenseForm,_that.licenseFile,_that.reviewerRole,_that.reviewerFullname,_that.reviewerMobile,_that.checkerMessage,_that.finalAccept,_that.temporaryRegistration,_that.createdBy,_that.modifiedBy,_that.userBankInfo,_that.wallet,_that.cars,_that.userLevel);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, ToStewardUser? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, dynamic phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, dynamic registerarRole, dynamic registerarFullname, dynamic registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, dynamic provinceMessage, dynamic condition, dynamic descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, dynamic reviewerRole, dynamic reviewerFullname, dynamic reviewerMobile, dynamic checkerMessage, bool? finalAccept, bool? temporaryRegistration, dynamic createdBy, dynamic modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel) $default,) {final _that = this; +switch (_that) { +case _ToSteward(): +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.userIdForeignKey,_that.addressIdForeignKey,_that.userBankIdForeignKey,_that.walletIdForeignKey,_that.provincialGovernmentIdKey,_that.identityDocuments,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.centersAllocation,_that.killHouseCentersAllocation,_that.allocationLimit,_that.limitationAllocation,_that.registerarRole,_that.registerarFullname,_that.registerarMobile,_that.killHouseRegister,_that.stewardRegister,_that.guildsRoomRegister,_that.posCompanyRegister,_that.provinceAcceptState,_that.provinceMessage,_that.condition,_that.descriptionCondition,_that.stewardActive,_that.stewardAllocationLimit,_that.stewardLimitationAllocation,_that.license,_that.licenseForm,_that.licenseFile,_that.reviewerRole,_that.reviewerFullname,_that.reviewerMobile,_that.checkerMessage,_that.finalAccept,_that.temporaryRegistration,_that.createdBy,_that.modifiedBy,_that.userBankInfo,_that.wallet,_that.cars,_that.userLevel);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, ToStewardUser? user, Address? address, Activity? guildAreaActivity, Activity? guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, PosStatus? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, dynamic userIdForeignKey, dynamic addressIdForeignKey, dynamic userBankIdForeignKey, dynamic walletIdForeignKey, dynamic provincialGovernmentIdKey, dynamic identityDocuments, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, dynamic phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, dynamic centersAllocation, dynamic killHouseCentersAllocation, dynamic allocationLimit, bool? limitationAllocation, dynamic registerarRole, dynamic registerarFullname, dynamic registerarMobile, bool? killHouseRegister, bool? stewardRegister, bool? guildsRoomRegister, bool? posCompanyRegister, String? provinceAcceptState, dynamic provinceMessage, dynamic condition, dynamic descriptionCondition, bool? stewardActive, dynamic stewardAllocationLimit, bool? stewardLimitationAllocation, bool? license, dynamic licenseForm, dynamic licenseFile, dynamic reviewerRole, dynamic reviewerFullname, dynamic reviewerMobile, dynamic checkerMessage, bool? finalAccept, bool? temporaryRegistration, dynamic createdBy, dynamic modifiedBy, dynamic userBankInfo, int? wallet, List? cars, List? userLevel)? $default,) {final _that = this; +switch (_that) { +case _ToSteward() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.userIdForeignKey,_that.addressIdForeignKey,_that.userBankIdForeignKey,_that.walletIdForeignKey,_that.provincialGovernmentIdKey,_that.identityDocuments,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.centersAllocation,_that.killHouseCentersAllocation,_that.allocationLimit,_that.limitationAllocation,_that.registerarRole,_that.registerarFullname,_that.registerarMobile,_that.killHouseRegister,_that.stewardRegister,_that.guildsRoomRegister,_that.posCompanyRegister,_that.provinceAcceptState,_that.provinceMessage,_that.condition,_that.descriptionCondition,_that.stewardActive,_that.stewardAllocationLimit,_that.stewardLimitationAllocation,_that.license,_that.licenseForm,_that.licenseFile,_that.reviewerRole,_that.reviewerFullname,_that.reviewerMobile,_that.checkerMessage,_that.finalAccept,_that.temporaryRegistration,_that.createdBy,_that.modifiedBy,_that.userBankInfo,_that.wallet,_that.cars,_that.userLevel);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1775,6 +2684,136 @@ as String?, } +/// Adds pattern-matching-related methods to [ToStewardUser]. +extension ToStewardUserPatterns on ToStewardUser { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ToStewardUser value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ToStewardUser() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ToStewardUser value) $default,){ +final _that = this; +switch (_that) { +case _ToStewardUser(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ToStewardUser value)? $default,){ +final _that = this; +switch (_that) { +case _ToStewardUser() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ToStewardUser() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city) $default,) {final _that = this; +switch (_that) { +case _ToStewardUser(): +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,) {final _that = this; +switch (_that) { +case _ToStewardUser() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1945,6 +2984,136 @@ $CitySimpleCopyWith<$Res>? get city { } +/// Adds pattern-matching-related methods to [Address]. +extension AddressPatterns on Address { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Address value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Address value) $default,){ +final _that = this; +switch (_that) { +case _Address(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Address value)? $default,){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( Province? province, CitySimple? city, String? address, String? postalCode)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( Province? province, CitySimple? city, String? address, String? postalCode) $default,) {final _that = this; +switch (_that) { +case _Address(): +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( Province? province, CitySimple? city, String? address, String? postalCode)? $default,) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -2109,6 +3278,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Province]. +extension ProvincePatterns on Province { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Province value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Province value) $default,){ +final _that = this; +switch (_that) { +case _Province(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Province value)? $default,){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _Province(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -2245,6 +3544,136 @@ as String?, } +/// Adds pattern-matching-related methods to [CitySimple]. +extension CitySimplePatterns on CitySimple { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _CitySimple value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _CitySimple() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _CitySimple value) $default,){ +final _that = this; +switch (_that) { +case _CitySimple(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _CitySimple value)? $default,){ +final _that = this; +switch (_that) { +case _CitySimple() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _CitySimple() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _CitySimple(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _CitySimple() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -2381,6 +3810,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Activity]. +extension ActivityPatterns on Activity { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Activity value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Activity value) $default,){ +final _that = this; +switch (_that) { +case _Activity(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Activity value)? $default,){ +final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? title)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that.key,_that.title);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? title) $default,) {final _that = this; +switch (_that) { +case _Activity(): +return $default(_that.key,_that.title);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? title)? $default,) {final _that = this; +switch (_that) { +case _Activity() when $default != null: +return $default(_that.key,_that.title);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -2518,6 +4077,136 @@ as bool?, } +/// Adds pattern-matching-related methods to [PosStatus]. +extension PosStatusPatterns on PosStatus { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _PosStatus value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _PosStatus value) $default,){ +final _that = this; +switch (_that) { +case _PosStatus(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _PosStatus value)? $default,){ +final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons) $default,) {final _that = this; +switch (_that) { +case _PosStatus(): +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons)? $default,) {final _that = this; +switch (_that) { +case _PosStatus() when $default != null: +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart b/packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart index bc87570..9c0ac0d 100644 --- a/packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/inventory/inventory_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -118,6 +117,136 @@ as int?, } +/// Adds pattern-matching-related methods to [InventoryModel]. +extension InventoryModelPatterns on InventoryModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _InventoryModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _InventoryModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _InventoryModel value) $default,){ +final _that = this; +switch (_that) { +case _InventoryModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _InventoryModel value)? $default,){ +final _that = this; +switch (_that) { +case _InventoryModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, int? parentProduct, int? killHouse, int? guild)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _InventoryModel() when $default != null: +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.name,_that.provinceGovernmentalCarcassesQuantity,_that.provinceGovernmentalCarcassesWeight,_that.provinceFreeCarcassesQuantity,_that.provinceFreeCarcassesWeight,_that.receiveGovernmentalCarcassesQuantity,_that.receiveGovernmentalCarcassesWeight,_that.receiveFreeCarcassesQuantity,_that.receiveFreeCarcassesWeight,_that.freeBuyingCarcassesQuantity,_that.freeBuyingCarcassesWeight,_that.totalGovernmentalCarcassesQuantity,_that.totalGovernmentalCarcassesWeight,_that.totalFreeBarsCarcassesQuantity,_that.totalFreeBarsCarcassesWeight,_that.weightAverage,_that.totalCarcassesQuantity,_that.totalCarcassesWeight,_that.freezingQuantity,_that.freezingWeight,_that.lossWeight,_that.outProvinceAllocatedQuantity,_that.outProvinceAllocatedWeight,_that.provinceAllocatedQuantity,_that.provinceAllocatedWeight,_that.realAllocatedQuantity,_that.realAllocatedWeight,_that.coldHouseAllocatedWeight,_that.posAllocatedWeight,_that.segmentationWeight,_that.totalRemainQuantity,_that.totalRemainWeight,_that.freePrice,_that.approvedPrice,_that.approvedPriceStatus,_that.parentProduct,_that.killHouse,_that.guild);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, int? parentProduct, int? killHouse, int? guild) $default,) {final _that = this; +switch (_that) { +case _InventoryModel(): +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.name,_that.provinceGovernmentalCarcassesQuantity,_that.provinceGovernmentalCarcassesWeight,_that.provinceFreeCarcassesQuantity,_that.provinceFreeCarcassesWeight,_that.receiveGovernmentalCarcassesQuantity,_that.receiveGovernmentalCarcassesWeight,_that.receiveFreeCarcassesQuantity,_that.receiveFreeCarcassesWeight,_that.freeBuyingCarcassesQuantity,_that.freeBuyingCarcassesWeight,_that.totalGovernmentalCarcassesQuantity,_that.totalGovernmentalCarcassesWeight,_that.totalFreeBarsCarcassesQuantity,_that.totalFreeBarsCarcassesWeight,_that.weightAverage,_that.totalCarcassesQuantity,_that.totalCarcassesWeight,_that.freezingQuantity,_that.freezingWeight,_that.lossWeight,_that.outProvinceAllocatedQuantity,_that.outProvinceAllocatedWeight,_that.provinceAllocatedQuantity,_that.provinceAllocatedWeight,_that.realAllocatedQuantity,_that.realAllocatedWeight,_that.coldHouseAllocatedWeight,_that.posAllocatedWeight,_that.segmentationWeight,_that.totalRemainQuantity,_that.totalRemainWeight,_that.freePrice,_that.approvedPrice,_that.approvedPriceStatus,_that.parentProduct,_that.killHouse,_that.guild);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, int? parentProduct, int? killHouse, int? guild)? $default,) {final _that = this; +switch (_that) { +case _InventoryModel() when $default != null: +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.name,_that.provinceGovernmentalCarcassesQuantity,_that.provinceGovernmentalCarcassesWeight,_that.provinceFreeCarcassesQuantity,_that.provinceFreeCarcassesWeight,_that.receiveGovernmentalCarcassesQuantity,_that.receiveGovernmentalCarcassesWeight,_that.receiveFreeCarcassesQuantity,_that.receiveFreeCarcassesWeight,_that.freeBuyingCarcassesQuantity,_that.freeBuyingCarcassesWeight,_that.totalGovernmentalCarcassesQuantity,_that.totalGovernmentalCarcassesWeight,_that.totalFreeBarsCarcassesQuantity,_that.totalFreeBarsCarcassesWeight,_that.weightAverage,_that.totalCarcassesQuantity,_that.totalCarcassesWeight,_that.freezingQuantity,_that.freezingWeight,_that.lossWeight,_that.outProvinceAllocatedQuantity,_that.outProvinceAllocatedWeight,_that.provinceAllocatedQuantity,_that.provinceAllocatedWeight,_that.realAllocatedQuantity,_that.realAllocatedWeight,_that.coldHouseAllocatedWeight,_that.posAllocatedWeight,_that.segmentationWeight,_that.totalRemainQuantity,_that.totalRemainWeight,_that.freePrice,_that.approvedPrice,_that.approvedPriceStatus,_that.parentProduct,_that.killHouse,_that.guild);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart index d99f6ea..0375bbb 100644 --- a/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/iran_province_city/iran_province_city_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -77,6 +76,136 @@ as String?, } +/// Adds pattern-matching-related methods to [IranProvinceCityModel]. +extension IranProvinceCityModelPatterns on IranProvinceCityModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _IranProvinceCityModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _IranProvinceCityModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _IranProvinceCityModel value) $default,){ +final _that = this; +switch (_that) { +case _IranProvinceCityModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _IranProvinceCityModel value)? $default,){ +final _that = this; +switch (_that) { +case _IranProvinceCityModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _IranProvinceCityModel() when $default != null: +return $default(_that.id,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, String? name) $default,) {final _that = this; +switch (_that) { +case _IranProvinceCityModel(): +return $default(_that.id,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? name)? $default,) {final _that = this; +switch (_that) { +case _IranProvinceCityModel() when $default != null: +return $default(_that.id,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart index cc493ee..ad8d047 100644 --- a/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart +++ b/packages/chicken/lib/data/models/response/kill_house_distribution_info/kill_house_distribution_info.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -77,6 +76,136 @@ as double?, } +/// Adds pattern-matching-related methods to [KillHouseDistributionInfo]. +extension KillHouseDistributionInfoPatterns on KillHouseDistributionInfo { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _KillHouseDistributionInfo value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _KillHouseDistributionInfo() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _KillHouseDistributionInfo value) $default,){ +final _that = this; +switch (_that) { +case _KillHouseDistributionInfo(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _KillHouseDistributionInfo value)? $default,){ +final _that = this; +switch (_that) { +case _KillHouseDistributionInfo() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( double? stewardAllocationsWeight, double? freeSalesWeight)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _KillHouseDistributionInfo() when $default != null: +return $default(_that.stewardAllocationsWeight,_that.freeSalesWeight);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( double? stewardAllocationsWeight, double? freeSalesWeight) $default,) {final _that = this; +switch (_that) { +case _KillHouseDistributionInfo(): +return $default(_that.stewardAllocationsWeight,_that.freeSalesWeight);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( double? stewardAllocationsWeight, double? freeSalesWeight)? $default,) {final _that = this; +switch (_that) { +case _KillHouseDistributionInfo() when $default != null: +return $default(_that.stewardAllocationsWeight,_that.freeSalesWeight);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart index df76f38..f6ae691 100644 --- a/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart +++ b/packages/chicken/lib/data/models/response/kill_house_free_bar/kill_house_free_bar.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -133,6 +132,136 @@ as int?, } +/// Adds pattern-matching-related methods to [KillHouseFreeBar]. +extension KillHouseFreeBarPatterns on KillHouseFreeBar { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _KillHouseFreeBar value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _KillHouseFreeBar() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _KillHouseFreeBar value) $default,){ +final _that = this; +switch (_that) { +case _KillHouseFreeBar(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _KillHouseFreeBar value)? $default,){ +final _that = this; +switch (_that) { +case _KillHouseFreeBar() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, dynamic killHouse, dynamic exclusiveKiller, String? key, String? createDate, String? modifyDate, bool? trash, String? poultryName, String? poultryMobile, String? sellerName, String? sellerMobile, String? province, String? city, String? vetFarmName, String? vetFarmMobile, String? driverName, String? driverMobile, String? car, String? clearanceCode, String? barClearanceCode, int? quantity, int? numberOfCarcasses, int? weightOfCarcasses, int? killHouseVetQuantity, int? killHouseVetWeight, String? killHouseVetState, String? dateOfAcceptReject, dynamic acceptorRejector, int? liveWeight, String? barImage, String? buyType, bool? wareHouse, String? date, int? wage, int? totalWageAmount, int? unionShare, int? unionSharePercent, int? companyShare, int? companySharePercent, int? guildsShare, int? guildsSharePercent, int? cityShare, int? citySharePercent, int? walletShare, int? walletSharePercent, int? otherShare, int? otherSharePercent, bool? archiveWage, int? weightLoss, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? enteredMessage, int? barCode, String? registerType, dynamic createdBy, dynamic modifiedBy, int? product)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _KillHouseFreeBar() when $default != null: +return $default(_that.id,_that.killHouse,_that.exclusiveKiller,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.poultryName,_that.poultryMobile,_that.sellerName,_that.sellerMobile,_that.province,_that.city,_that.vetFarmName,_that.vetFarmMobile,_that.driverName,_that.driverMobile,_that.car,_that.clearanceCode,_that.barClearanceCode,_that.quantity,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.killHouseVetQuantity,_that.killHouseVetWeight,_that.killHouseVetState,_that.dateOfAcceptReject,_that.acceptorRejector,_that.liveWeight,_that.barImage,_that.buyType,_that.wareHouse,_that.date,_that.wage,_that.totalWageAmount,_that.unionShare,_that.unionSharePercent,_that.companyShare,_that.companySharePercent,_that.guildsShare,_that.guildsSharePercent,_that.cityShare,_that.citySharePercent,_that.walletShare,_that.walletSharePercent,_that.otherShare,_that.otherSharePercent,_that.archiveWage,_that.weightLoss,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.enteredMessage,_that.barCode,_that.registerType,_that.createdBy,_that.modifiedBy,_that.product);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, dynamic killHouse, dynamic exclusiveKiller, String? key, String? createDate, String? modifyDate, bool? trash, String? poultryName, String? poultryMobile, String? sellerName, String? sellerMobile, String? province, String? city, String? vetFarmName, String? vetFarmMobile, String? driverName, String? driverMobile, String? car, String? clearanceCode, String? barClearanceCode, int? quantity, int? numberOfCarcasses, int? weightOfCarcasses, int? killHouseVetQuantity, int? killHouseVetWeight, String? killHouseVetState, String? dateOfAcceptReject, dynamic acceptorRejector, int? liveWeight, String? barImage, String? buyType, bool? wareHouse, String? date, int? wage, int? totalWageAmount, int? unionShare, int? unionSharePercent, int? companyShare, int? companySharePercent, int? guildsShare, int? guildsSharePercent, int? cityShare, int? citySharePercent, int? walletShare, int? walletSharePercent, int? otherShare, int? otherSharePercent, bool? archiveWage, int? weightLoss, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? enteredMessage, int? barCode, String? registerType, dynamic createdBy, dynamic modifiedBy, int? product) $default,) {final _that = this; +switch (_that) { +case _KillHouseFreeBar(): +return $default(_that.id,_that.killHouse,_that.exclusiveKiller,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.poultryName,_that.poultryMobile,_that.sellerName,_that.sellerMobile,_that.province,_that.city,_that.vetFarmName,_that.vetFarmMobile,_that.driverName,_that.driverMobile,_that.car,_that.clearanceCode,_that.barClearanceCode,_that.quantity,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.killHouseVetQuantity,_that.killHouseVetWeight,_that.killHouseVetState,_that.dateOfAcceptReject,_that.acceptorRejector,_that.liveWeight,_that.barImage,_that.buyType,_that.wareHouse,_that.date,_that.wage,_that.totalWageAmount,_that.unionShare,_that.unionSharePercent,_that.companyShare,_that.companySharePercent,_that.guildsShare,_that.guildsSharePercent,_that.cityShare,_that.citySharePercent,_that.walletShare,_that.walletSharePercent,_that.otherShare,_that.otherSharePercent,_that.archiveWage,_that.weightLoss,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.enteredMessage,_that.barCode,_that.registerType,_that.createdBy,_that.modifiedBy,_that.product);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, dynamic killHouse, dynamic exclusiveKiller, String? key, String? createDate, String? modifyDate, bool? trash, String? poultryName, String? poultryMobile, String? sellerName, String? sellerMobile, String? province, String? city, String? vetFarmName, String? vetFarmMobile, String? driverName, String? driverMobile, String? car, String? clearanceCode, String? barClearanceCode, int? quantity, int? numberOfCarcasses, int? weightOfCarcasses, int? killHouseVetQuantity, int? killHouseVetWeight, String? killHouseVetState, String? dateOfAcceptReject, dynamic acceptorRejector, int? liveWeight, String? barImage, String? buyType, bool? wareHouse, String? date, int? wage, int? totalWageAmount, int? unionShare, int? unionSharePercent, int? companyShare, int? companySharePercent, int? guildsShare, int? guildsSharePercent, int? cityShare, int? citySharePercent, int? walletShare, int? walletSharePercent, int? otherShare, int? otherSharePercent, bool? archiveWage, int? weightLoss, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, String? enteredMessage, int? barCode, String? registerType, dynamic createdBy, dynamic modifiedBy, int? product)? $default,) {final _that = this; +switch (_that) { +case _KillHouseFreeBar() when $default != null: +return $default(_that.id,_that.killHouse,_that.exclusiveKiller,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.poultryName,_that.poultryMobile,_that.sellerName,_that.sellerMobile,_that.province,_that.city,_that.vetFarmName,_that.vetFarmMobile,_that.driverName,_that.driverMobile,_that.car,_that.clearanceCode,_that.barClearanceCode,_that.quantity,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.killHouseVetQuantity,_that.killHouseVetWeight,_that.killHouseVetState,_that.dateOfAcceptReject,_that.acceptorRejector,_that.liveWeight,_that.barImage,_that.buyType,_that.wareHouse,_that.date,_that.wage,_that.totalWageAmount,_that.unionShare,_that.unionSharePercent,_that.companyShare,_that.companySharePercent,_that.guildsShare,_that.guildsSharePercent,_that.cityShare,_that.citySharePercent,_that.walletShare,_that.walletSharePercent,_that.otherShare,_that.otherSharePercent,_that.archiveWage,_that.weightLoss,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.enteredMessage,_that.barCode,_that.registerType,_that.createdBy,_that.modifiedBy,_that.product);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart index 9019d66..a7d87ec 100644 --- a/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart +++ b/packages/chicken/lib/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -115,6 +114,136 @@ $RequestsInfoCopyWith<$Res>? get requestsInfo { } +/// Adds pattern-matching-related methods to [OutProvinceCarcassesBuyer]. +extension OutProvinceCarcassesBuyerPatterns on OutProvinceCarcassesBuyer { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _OutProvinceCarcassesBuyer value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _OutProvinceCarcassesBuyer() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _OutProvinceCarcassesBuyer value) $default,){ +final _that = this; +switch (_that) { +case _OutProvinceCarcassesBuyer(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _OutProvinceCarcassesBuyer value)? $default,){ +final _that = this; +switch (_that) { +case _OutProvinceCarcassesBuyer() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( Buyer? buyer, RequestsInfo? requestsInfo, String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, String? role, bool? active, String? typeActivity, dynamic killHouse, int? steward)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _OutProvinceCarcassesBuyer() when $default != null: +return $default(_that.buyer,_that.requestsInfo,_that.key,_that.trash,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.role,_that.active,_that.typeActivity,_that.killHouse,_that.steward);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( Buyer? buyer, RequestsInfo? requestsInfo, String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, String? role, bool? active, String? typeActivity, dynamic killHouse, int? steward) $default,) {final _that = this; +switch (_that) { +case _OutProvinceCarcassesBuyer(): +return $default(_that.buyer,_that.requestsInfo,_that.key,_that.trash,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.role,_that.active,_that.typeActivity,_that.killHouse,_that.steward);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( Buyer? buyer, RequestsInfo? requestsInfo, String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, String? role, bool? active, String? typeActivity, dynamic killHouse, int? steward)? $default,) {final _that = this; +switch (_that) { +case _OutProvinceCarcassesBuyer() when $default != null: +return $default(_that.buyer,_that.requestsInfo,_that.key,_that.trash,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.role,_that.active,_that.typeActivity,_that.killHouse,_that.steward);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -312,6 +441,136 @@ as int?, } +/// Adds pattern-matching-related methods to [Buyer]. +extension BuyerPatterns on Buyer { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Buyer value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Buyer value) $default,){ +final _that = this; +switch (_that) { +case _Buyer(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Buyer value)? $default,){ +final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, int? user)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that.key,_that.trash,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.active,_that.user);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, int? user) $default,) {final _that = this; +switch (_that) { +case _Buyer(): +return $default(_that.key,_that.trash,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.active,_that.user);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, bool? trash, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, int? user)? $default,) {final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that.key,_that.trash,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.active,_that.user);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -467,6 +726,136 @@ as double?, } +/// Adds pattern-matching-related methods to [RequestsInfo]. +extension RequestsInfoPatterns on RequestsInfo { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _RequestsInfo value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _RequestsInfo() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _RequestsInfo value) $default,){ +final _that = this; +switch (_that) { +case _RequestsInfo(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _RequestsInfo value)? $default,){ +final _that = this; +switch (_that) { +case _RequestsInfo() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? numberOfRequests, int? totalQuantity, double? totalWeight)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _RequestsInfo() when $default != null: +return $default(_that.numberOfRequests,_that.totalQuantity,_that.totalWeight);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? numberOfRequests, int? totalQuantity, double? totalWeight) $default,) {final _that = this; +switch (_that) { +case _RequestsInfo(): +return $default(_that.numberOfRequests,_that.totalQuantity,_that.totalWeight);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? numberOfRequests, int? totalQuantity, double? totalWeight)? $default,) {final _that = this; +switch (_that) { +case _RequestsInfo() when $default != null: +return $default(_that.numberOfRequests,_that.totalQuantity,_that.totalWeight);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart b/packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart index 308ce7d..714a49d 100644 --- a/packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart +++ b/packages/chicken/lib/data/models/response/roles_products/roles_products.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -76,6 +75,136 @@ as List, } +/// Adds pattern-matching-related methods to [RolesProductsModel]. +extension RolesProductsModelPatterns on RolesProductsModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _RolesProductsModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _RolesProductsModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _RolesProductsModel value) $default,){ +final _that = this; +switch (_that) { +case _RolesProductsModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _RolesProductsModel value)? $default,){ +final _that = this; +switch (_that) { +case _RolesProductsModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( List products)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _RolesProductsModel() when $default != null: +return $default(_that.products);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( List products) $default,) {final _that = this; +switch (_that) { +case _RolesProductsModel(): +return $default(_that.products);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( List products)? $default,) {final _that = this; +switch (_that) { +case _RolesProductsModel() when $default != null: +return $default(_that.products);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -261,6 +390,136 @@ as int?, } +/// Adds pattern-matching-related methods to [ProductModel]. +extension ProductModelPatterns on ProductModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ProductModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ProductModel value) $default,){ +final _that = this; +switch (_that) { +case _ProductModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ProductModel value)? $default,){ +final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? key, String? create_date, String? modify_date, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, dynamic createdBy, dynamic modifiedBy, int? parentProduct, dynamic killHouse, int? guild)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that.id,_that.key,_that.create_date,_that.modify_date,_that.trash,_that.name,_that.provinceGovernmentalCarcassesQuantity,_that.provinceGovernmentalCarcassesWeight,_that.provinceFreeCarcassesQuantity,_that.provinceFreeCarcassesWeight,_that.receiveGovernmentalCarcassesQuantity,_that.receiveGovernmentalCarcassesWeight,_that.receiveFreeCarcassesQuantity,_that.receiveFreeCarcassesWeight,_that.freeBuyingCarcassesQuantity,_that.freeBuyingCarcassesWeight,_that.totalGovernmentalCarcassesQuantity,_that.totalGovernmentalCarcassesWeight,_that.totalFreeBarsCarcassesQuantity,_that.totalFreeBarsCarcassesWeight,_that.weightAverage,_that.totalCarcassesQuantity,_that.totalCarcassesWeight,_that.freezingQuantity,_that.freezingWeight,_that.lossWeight,_that.outProvinceAllocatedQuantity,_that.outProvinceAllocatedWeight,_that.provinceAllocatedQuantity,_that.provinceAllocatedWeight,_that.realAllocatedQuantity,_that.realAllocatedWeight,_that.coldHouseAllocatedWeight,_that.posAllocatedWeight,_that.segmentationWeight,_that.totalRemainQuantity,_that.totalRemainWeight,_that.freePrice,_that.approvedPrice,_that.approvedPriceStatus,_that.createdBy,_that.modifiedBy,_that.parentProduct,_that.killHouse,_that.guild);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, String? key, String? create_date, String? modify_date, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, dynamic createdBy, dynamic modifiedBy, int? parentProduct, dynamic killHouse, int? guild) $default,) {final _that = this; +switch (_that) { +case _ProductModel(): +return $default(_that.id,_that.key,_that.create_date,_that.modify_date,_that.trash,_that.name,_that.provinceGovernmentalCarcassesQuantity,_that.provinceGovernmentalCarcassesWeight,_that.provinceFreeCarcassesQuantity,_that.provinceFreeCarcassesWeight,_that.receiveGovernmentalCarcassesQuantity,_that.receiveGovernmentalCarcassesWeight,_that.receiveFreeCarcassesQuantity,_that.receiveFreeCarcassesWeight,_that.freeBuyingCarcassesQuantity,_that.freeBuyingCarcassesWeight,_that.totalGovernmentalCarcassesQuantity,_that.totalGovernmentalCarcassesWeight,_that.totalFreeBarsCarcassesQuantity,_that.totalFreeBarsCarcassesWeight,_that.weightAverage,_that.totalCarcassesQuantity,_that.totalCarcassesWeight,_that.freezingQuantity,_that.freezingWeight,_that.lossWeight,_that.outProvinceAllocatedQuantity,_that.outProvinceAllocatedWeight,_that.provinceAllocatedQuantity,_that.provinceAllocatedWeight,_that.realAllocatedQuantity,_that.realAllocatedWeight,_that.coldHouseAllocatedWeight,_that.posAllocatedWeight,_that.segmentationWeight,_that.totalRemainQuantity,_that.totalRemainWeight,_that.freePrice,_that.approvedPrice,_that.approvedPriceStatus,_that.createdBy,_that.modifiedBy,_that.parentProduct,_that.killHouse,_that.guild);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? key, String? create_date, String? modify_date, bool? trash, String? name, int? provinceGovernmentalCarcassesQuantity, int? provinceGovernmentalCarcassesWeight, int? provinceFreeCarcassesQuantity, int? provinceFreeCarcassesWeight, int? receiveGovernmentalCarcassesQuantity, int? receiveGovernmentalCarcassesWeight, int? receiveFreeCarcassesQuantity, int? receiveFreeCarcassesWeight, int? freeBuyingCarcassesQuantity, int? freeBuyingCarcassesWeight, int? totalGovernmentalCarcassesQuantity, int? totalGovernmentalCarcassesWeight, int? totalFreeBarsCarcassesQuantity, int? totalFreeBarsCarcassesWeight, double? weightAverage, int? totalCarcassesQuantity, int? totalCarcassesWeight, int? freezingQuantity, int? freezingWeight, int? lossWeight, int? outProvinceAllocatedQuantity, int? outProvinceAllocatedWeight, int? provinceAllocatedQuantity, int? provinceAllocatedWeight, int? realAllocatedQuantity, int? realAllocatedWeight, int? coldHouseAllocatedWeight, int? posAllocatedWeight, int? segmentationWeight, int? totalRemainQuantity, int? totalRemainWeight, int? freePrice, int? approvedPrice, bool? approvedPriceStatus, dynamic createdBy, dynamic modifiedBy, int? parentProduct, dynamic killHouse, int? guild)? $default,) {final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that.id,_that.key,_that.create_date,_that.modify_date,_that.trash,_that.name,_that.provinceGovernmentalCarcassesQuantity,_that.provinceGovernmentalCarcassesWeight,_that.provinceFreeCarcassesQuantity,_that.provinceFreeCarcassesWeight,_that.receiveGovernmentalCarcassesQuantity,_that.receiveGovernmentalCarcassesWeight,_that.receiveFreeCarcassesQuantity,_that.receiveFreeCarcassesWeight,_that.freeBuyingCarcassesQuantity,_that.freeBuyingCarcassesWeight,_that.totalGovernmentalCarcassesQuantity,_that.totalGovernmentalCarcassesWeight,_that.totalFreeBarsCarcassesQuantity,_that.totalFreeBarsCarcassesWeight,_that.weightAverage,_that.totalCarcassesQuantity,_that.totalCarcassesWeight,_that.freezingQuantity,_that.freezingWeight,_that.lossWeight,_that.outProvinceAllocatedQuantity,_that.outProvinceAllocatedWeight,_that.provinceAllocatedQuantity,_that.provinceAllocatedWeight,_that.realAllocatedQuantity,_that.realAllocatedWeight,_that.coldHouseAllocatedWeight,_that.posAllocatedWeight,_that.segmentationWeight,_that.totalRemainQuantity,_that.totalRemainWeight,_that.freePrice,_that.approvedPrice,_that.approvedPriceStatus,_that.createdBy,_that.modifiedBy,_that.parentProduct,_that.killHouse,_that.guild);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index 9de3533..5efe966 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -107,6 +106,136 @@ $ToGuildCopyWith<$Res>? get toGuild { } +/// Adds pattern-matching-related methods to [SegmentationModel]. +extension SegmentationModelPatterns on SegmentationModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _SegmentationModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _SegmentationModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _SegmentationModel value) $default,){ +final _that = this; +switch (_that) { +case _SegmentationModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _SegmentationModel value)? $default,){ +final _that = this; +switch (_that) { +case _SegmentationModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? productKey, String? guildKey, String? result, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _SegmentationModel() when $default != null: +return $default(_that.key,_that.productKey,_that.guildKey,_that.result,_that.weight,_that.buyer,_that.date,_that.toGuild);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? productKey, String? guildKey, String? result, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild) $default,) {final _that = this; +switch (_that) { +case _SegmentationModel(): +return $default(_that.key,_that.productKey,_that.guildKey,_that.result,_that.weight,_that.buyer,_that.date,_that.toGuild);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? productKey, String? guildKey, String? result, int? weight, Buyer? buyer, DateTime? date, ToGuild? toGuild)? $default,) {final _that = this; +switch (_that) { +case _SegmentationModel() when $default != null: +return $default(_that.key,_that.productKey,_that.guildKey,_that.result,_that.weight,_that.buyer,_that.date,_that.toGuild);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -280,6 +409,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Buyer]. +extension BuyerPatterns on Buyer { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Buyer value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Buyer value) $default,){ +final _that = this; +switch (_that) { +case _Buyer(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Buyer value)? $default,){ +final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? mobile, String? shop)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that.fullname,_that.mobile,_that.shop);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? mobile, String? shop) $default,) {final _that = this; +switch (_that) { +case _Buyer(): +return $default(_that.fullname,_that.mobile,_that.shop);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? mobile, String? shop)? $default,) {final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that.fullname,_that.mobile,_that.shop);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -435,6 +694,136 @@ $UserCopyWith<$Res>? get user { } +/// Adds pattern-matching-related methods to [ToGuild]. +extension ToGuildPatterns on ToGuild { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ToGuild value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ToGuild() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ToGuild value) $default,){ +final _that = this; +switch (_that) { +case _ToGuild(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ToGuild value)? $default,){ +final _that = this; +switch (_that) { +case _ToGuild() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? guildsName, String? typeActivity, String? areaActivity, String? guildsId, bool? steward, User? user)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ToGuild() when $default != null: +return $default(_that.key,_that.guildsName,_that.typeActivity,_that.areaActivity,_that.guildsId,_that.steward,_that.user);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? guildsName, String? typeActivity, String? areaActivity, String? guildsId, bool? steward, User? user) $default,) {final _that = this; +switch (_that) { +case _ToGuild(): +return $default(_that.key,_that.guildsName,_that.typeActivity,_that.areaActivity,_that.guildsId,_that.steward,_that.user);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? guildsName, String? typeActivity, String? areaActivity, String? guildsId, bool? steward, User? user)? $default,) {final _that = this; +switch (_that) { +case _ToGuild() when $default != null: +return $default(_that.key,_that.guildsName,_that.typeActivity,_that.areaActivity,_that.guildsId,_that.steward,_that.user);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -597,6 +986,136 @@ as String?, } +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart index 8e11281..0a020c5 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar/steward_free_bar.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -125,6 +124,136 @@ $ProductCopyWith<$Res>? get product { } +/// Adds pattern-matching-related methods to [StewardFreeBar]. +extension StewardFreeBarPatterns on StewardFreeBar { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _StewardFreeBar value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _StewardFreeBar() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _StewardFreeBar value) $default,){ +final _that = this; +switch (_that) { +case _StewardFreeBar(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _StewardFreeBar value)? $default,){ +final _that = this; +switch (_that) { +case _StewardFreeBar() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _StewardFreeBar() when $default != null: +return $default(_that.id,_that.steward,_that.guild,_that.product,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.killHouseName,_that.killHouseMobile,_that.killHouseVetName,_that.killHouseVetMobile,_that.province,_that.city,_that.driverName,_that.driverMobile,_that.car,_that.pelak,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.barImage,_that.date,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy) $default,) {final _that = this; +switch (_that) { +case _StewardFreeBar(): +return $default(_that.id,_that.steward,_that.guild,_that.product,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.killHouseName,_that.killHouseMobile,_that.killHouseVetName,_that.killHouseVetMobile,_that.province,_that.city,_that.driverName,_that.driverMobile,_that.car,_that.pelak,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.barImage,_that.date,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, Steward? steward, dynamic guild, Product? product, String? key, String? createDate, String? modifyDate, bool? trash, String? killHouseName, String? killHouseMobile, String? killHouseVetName, String? killHouseVetMobile, String? province, String? city, String? driverName, String? driverMobile, dynamic car, String? pelak, int? numberOfCarcasses, double? weightOfCarcasses, String? barImage, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy)? $default,) {final _that = this; +switch (_that) { +case _StewardFreeBar() when $default != null: +return $default(_that.id,_that.steward,_that.guild,_that.product,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.killHouseName,_that.killHouseMobile,_that.killHouseVetName,_that.killHouseVetMobile,_that.province,_that.city,_that.driverName,_that.driverMobile,_that.car,_that.pelak,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.barImage,_that.date,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -365,6 +494,136 @@ $AddressCopyWith<$Res>? get address { } +/// Adds pattern-matching-related methods to [Steward]. +extension StewardPatterns on Steward { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Steward value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Steward value) $default,){ +final _that = this; +switch (_that) { +case _Steward(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Steward value)? $default,){ +final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( User? user, String? guildsName, bool? steward, int? allocationLimit, Address? address, String? licenseNumber, String? typeActivity, String? areaActivity, String? guildsId, String? createDate)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that.user,_that.guildsName,_that.steward,_that.allocationLimit,_that.address,_that.licenseNumber,_that.typeActivity,_that.areaActivity,_that.guildsId,_that.createDate);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( User? user, String? guildsName, bool? steward, int? allocationLimit, Address? address, String? licenseNumber, String? typeActivity, String? areaActivity, String? guildsId, String? createDate) $default,) {final _that = this; +switch (_that) { +case _Steward(): +return $default(_that.user,_that.guildsName,_that.steward,_that.allocationLimit,_that.address,_that.licenseNumber,_that.typeActivity,_that.areaActivity,_that.guildsId,_that.createDate);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( User? user, String? guildsName, bool? steward, int? allocationLimit, Address? address, String? licenseNumber, String? typeActivity, String? areaActivity, String? guildsId, String? createDate)? $default,) {final _that = this; +switch (_that) { +case _Steward() when $default != null: +return $default(_that.user,_that.guildsName,_that.steward,_that.allocationLimit,_that.address,_that.licenseNumber,_that.typeActivity,_that.areaActivity,_that.guildsId,_that.createDate);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -568,6 +827,136 @@ $CityCopyWith<$Res>? get city { } +/// Adds pattern-matching-related methods to [User]. +extension UserPatterns on User { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _User value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _User value) $default,){ +final _that = this; +switch (_that) { +case _User(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _User value)? $default,){ +final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.baseOrder,_that.mobile,_that.nationalId,_that.nationalCode,_that.key,_that.city,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress) $default,) {final _that = this; +switch (_that) { +case _User(): +return $default(_that.fullname,_that.firstName,_that.lastName,_that.baseOrder,_that.mobile,_that.nationalId,_that.nationalCode,_that.key,_that.city,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? firstName, String? lastName, int? baseOrder, String? mobile, String? nationalId, String? nationalCode, String? key, City? city, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress)? $default,) {final _that = this; +switch (_that) { +case _User() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.baseOrder,_that.mobile,_that.nationalId,_that.nationalCode,_that.key,_that.city,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -761,6 +1150,136 @@ as int?, } +/// Adds pattern-matching-related methods to [City]. +extension CityPatterns on City { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _City value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _City value) $default,){ +final _that = this; +switch (_that) { +case _City(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _City value)? $default,){ +final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? createdBy, String? modifiedBy, int? province)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.provinceIdForeignKey,_that.cityIdKey,_that.name,_that.productPrice,_that.provinceCenter,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.createdBy,_that.modifiedBy,_that.province);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? createdBy, String? modifiedBy, int? province) $default,) {final _that = this; +switch (_that) { +case _City(): +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.provinceIdForeignKey,_that.cityIdKey,_that.name,_that.productPrice,_that.provinceCenter,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.createdBy,_that.modifiedBy,_that.province);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, String? key, String? createDate, String? modifyDate, bool? trash, int? provinceIdForeignKey, int? cityIdKey, String? name, double? productPrice, bool? provinceCenter, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? createdBy, String? modifiedBy, int? province)? $default,) {final _that = this; +switch (_that) { +case _City() when $default != null: +return $default(_that.id,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.provinceIdForeignKey,_that.cityIdKey,_that.name,_that.productPrice,_that.provinceCenter,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.createdBy,_that.modifiedBy,_that.province);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -953,6 +1472,136 @@ $CityCopyWith<$Res>? get city { } +/// Adds pattern-matching-related methods to [Address]. +extension AddressPatterns on Address { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Address value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Address value) $default,){ +final _that = this; +switch (_that) { +case _Address(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Address value)? $default,){ +final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( Province? province, City? city, String? address, String? postalCode)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( Province? province, City? city, String? address, String? postalCode) $default,) {final _that = this; +switch (_that) { +case _Address(): +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( Province? province, City? city, String? address, String? postalCode)? $default,) {final _that = this; +switch (_that) { +case _Address() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1117,6 +1766,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Province]. +extension ProvincePatterns on Province { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Province value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Province value) $default,){ +final _that = this; +switch (_that) { +case _Province(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Province value)? $default,){ +final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _Province(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _Province() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1253,6 +2032,136 @@ as String?, } +/// Adds pattern-matching-related methods to [Product]. +extension ProductPatterns on Product { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Product value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Product value) $default,){ +final _that = this; +switch (_that) { +case _Product(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Product value)? $default,){ +final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _Product(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _Product() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart index bebb59d..325171f 100644 --- a/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart +++ b/packages/chicken/lib/data/models/response/steward_free_bar_dashboard/steward_free_bar_dashboard.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -79,6 +78,136 @@ as double?, } +/// Adds pattern-matching-related methods to [StewardFreeBarDashboard]. +extension StewardFreeBarDashboardPatterns on StewardFreeBarDashboard { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _StewardFreeBarDashboard value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _StewardFreeBarDashboard() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _StewardFreeBarDashboard value) $default,){ +final _that = this; +switch (_that) { +case _StewardFreeBarDashboard(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _StewardFreeBarDashboard value)? $default,){ +final _that = this; +switch (_that) { +case _StewardFreeBarDashboard() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? product, int? totalBars, double? totalQuantity, double? totalWeight)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _StewardFreeBarDashboard() when $default != null: +return $default(_that.product,_that.totalBars,_that.totalQuantity,_that.totalWeight);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? product, int? totalBars, double? totalQuantity, double? totalWeight) $default,) {final _that = this; +switch (_that) { +case _StewardFreeBarDashboard(): +return $default(_that.product,_that.totalBars,_that.totalQuantity,_that.totalWeight);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? product, int? totalBars, double? totalQuantity, double? totalWeight)? $default,) {final _that = this; +switch (_that) { +case _StewardFreeBarDashboard() when $default != null: +return $default(_that.product,_that.totalBars,_that.totalQuantity,_that.totalWeight);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart index dcc4fe1..de5120a 100644 --- a/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart +++ b/packages/chicken/lib/data/models/response/steward_free_sale_bar/steward_free_sale_bar.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -112,6 +111,136 @@ $BuyerCopyWith<$Res>? get buyer { } +/// Adds pattern-matching-related methods to [StewardFreeSaleBar]. +extension StewardFreeSaleBarPatterns on StewardFreeSaleBar { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _StewardFreeSaleBar value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _StewardFreeSaleBar() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _StewardFreeSaleBar value) $default,){ +final _that = this; +switch (_that) { +case _StewardFreeSaleBar(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _StewardFreeSaleBar value)? $default,){ +final _that = this; +switch (_that) { +case _StewardFreeSaleBar() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, Buyer? buyer, String? key, String? createDate, String? modifyDate, bool? trash, String? buyerName, String? buyerMobile, String? province, String? city, String? driverName, String? driverMobile, String? typeCar, String? pelak, String? clearanceCode, int? numberOfCarcasses, double? weightOfCarcasses, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic steward, dynamic guild, dynamic product)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _StewardFreeSaleBar() when $default != null: +return $default(_that.id,_that.buyer,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.buyerName,_that.buyerMobile,_that.province,_that.city,_that.driverName,_that.driverMobile,_that.typeCar,_that.pelak,_that.clearanceCode,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.date,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.steward,_that.guild,_that.product);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, Buyer? buyer, String? key, String? createDate, String? modifyDate, bool? trash, String? buyerName, String? buyerMobile, String? province, String? city, String? driverName, String? driverMobile, String? typeCar, String? pelak, String? clearanceCode, int? numberOfCarcasses, double? weightOfCarcasses, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic steward, dynamic guild, dynamic product) $default,) {final _that = this; +switch (_that) { +case _StewardFreeSaleBar(): +return $default(_that.id,_that.buyer,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.buyerName,_that.buyerMobile,_that.province,_that.city,_that.driverName,_that.driverMobile,_that.typeCar,_that.pelak,_that.clearanceCode,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.date,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.steward,_that.guild,_that.product);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, Buyer? buyer, String? key, String? createDate, String? modifyDate, bool? trash, String? buyerName, String? buyerMobile, String? province, String? city, String? driverName, String? driverMobile, String? typeCar, String? pelak, String? clearanceCode, int? numberOfCarcasses, double? weightOfCarcasses, String? date, bool? temporaryTrash, bool? temporaryDeleted, String? createdBy, String? modifiedBy, dynamic steward, dynamic guild, dynamic product)? $default,) {final _that = this; +switch (_that) { +case _StewardFreeSaleBar() when $default != null: +return $default(_that.id,_that.buyer,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.buyerName,_that.buyerMobile,_that.province,_that.city,_that.driverName,_that.driverMobile,_that.typeCar,_that.pelak,_that.clearanceCode,_that.numberOfCarcasses,_that.weightOfCarcasses,_that.date,_that.temporaryTrash,_that.temporaryDeleted,_that.createdBy,_that.modifiedBy,_that.steward,_that.guild,_that.product);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -326,6 +455,136 @@ $BuyerStewardCopyWith<$Res>? get steward { } +/// Adds pattern-matching-related methods to [Buyer]. +extension BuyerPatterns on Buyer { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Buyer value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Buyer value) $default,){ +final _that = this; +switch (_that) { +case _Buyer(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Buyer value)? $default,){ +final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, BuyerSteward? steward)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that.key,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.active,_that.steward);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, BuyerSteward? steward) $default,) {final _that = this; +switch (_that) { +case _Buyer(): +return $default(_that.key,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.active,_that.steward);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? fullname, String? firstName, String? lastName, String? mobile, String? unitName, String? city, String? province, bool? active, BuyerSteward? steward)? $default,) {final _that = this; +switch (_that) { +case _Buyer() when $default != null: +return $default(_that.key,_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.unitName,_that.city,_that.province,_that.active,_that.steward);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -505,6 +764,136 @@ $BuyerStewardUserCopyWith<$Res>? get user { } +/// Adds pattern-matching-related methods to [BuyerSteward]. +extension BuyerStewardPatterns on BuyerSteward { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _BuyerSteward value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _BuyerSteward() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _BuyerSteward value) $default,){ +final _that = this; +switch (_that) { +case _BuyerSteward(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _BuyerSteward value)? $default,){ +final _that = this; +switch (_that) { +case _BuyerSteward() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? guildsName, BuyerStewardUser? user, String? typeActivity, String? areaActivity)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _BuyerSteward() when $default != null: +return $default(_that.key,_that.guildsName,_that.user,_that.typeActivity,_that.areaActivity);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? guildsName, BuyerStewardUser? user, String? typeActivity, String? areaActivity) $default,) {final _that = this; +switch (_that) { +case _BuyerSteward(): +return $default(_that.key,_that.guildsName,_that.user,_that.typeActivity,_that.areaActivity);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? guildsName, BuyerStewardUser? user, String? typeActivity, String? areaActivity)? $default,) {final _that = this; +switch (_that) { +case _BuyerSteward() when $default != null: +return $default(_that.key,_that.guildsName,_that.user,_that.typeActivity,_that.areaActivity);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -665,6 +1054,136 @@ as String?, } +/// Adds pattern-matching-related methods to [BuyerStewardUser]. +extension BuyerStewardUserPatterns on BuyerStewardUser { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _BuyerStewardUser value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _BuyerStewardUser() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _BuyerStewardUser value) $default,){ +final _that = this; +switch (_that) { +case _BuyerStewardUser(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _BuyerStewardUser value)? $default,){ +final _that = this; +switch (_that) { +case _BuyerStewardUser() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? provinceName, String? cityName, String? password)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _BuyerStewardUser() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.provinceName,_that.cityName,_that.password);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? provinceName, String? cityName, String? password) $default,) {final _that = this; +switch (_that) { +case _BuyerStewardUser(): +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.provinceName,_that.cityName,_that.password);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? provinceName, String? cityName, String? password)? $default,) {final _that = this; +switch (_that) { +case _BuyerStewardUser() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.provinceName,_that.cityName,_that.password);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart b/packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart index c3b00f0..041158c 100644 --- a/packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart +++ b/packages/chicken/lib/data/models/response/user_profile/user_profile.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -123,6 +122,136 @@ $UserStateCopyWith<$Res>? get state { } +/// Adds pattern-matching-related methods to [UserProfile]. +extension UserProfilePatterns on UserProfile { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _UserProfile value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _UserProfile() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _UserProfile value) $default,){ +final _that = this; +switch (_that) { +case _UserProfile(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _UserProfile value)? $default,){ +final _that = this; +switch (_that) { +case _UserProfile() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( List? role, String? city, String? province, String? key, String? userGateWayId, dynamic userDjangoIdForeignKey, dynamic provinceIdForeignKey, dynamic cityIdForeignKey, dynamic systemUserProfileIdKey, String? fullname, String? firstName, String? lastName, String? nationalCode, String? nationalCodeImage, String? nationalId, String? mobile, String? birthday, String? image, String? password, bool? active, UserState? state, int? baseOrder, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress, String? personType, String? type)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _UserProfile() when $default != null: +return $default(_that.role,_that.city,_that.province,_that.key,_that.userGateWayId,_that.userDjangoIdForeignKey,_that.provinceIdForeignKey,_that.cityIdForeignKey,_that.systemUserProfileIdKey,_that.fullname,_that.firstName,_that.lastName,_that.nationalCode,_that.nationalCodeImage,_that.nationalId,_that.mobile,_that.birthday,_that.image,_that.password,_that.active,_that.state,_that.baseOrder,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress,_that.personType,_that.type);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( List? role, String? city, String? province, String? key, String? userGateWayId, dynamic userDjangoIdForeignKey, dynamic provinceIdForeignKey, dynamic cityIdForeignKey, dynamic systemUserProfileIdKey, String? fullname, String? firstName, String? lastName, String? nationalCode, String? nationalCodeImage, String? nationalId, String? mobile, String? birthday, String? image, String? password, bool? active, UserState? state, int? baseOrder, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress, String? personType, String? type) $default,) {final _that = this; +switch (_that) { +case _UserProfile(): +return $default(_that.role,_that.city,_that.province,_that.key,_that.userGateWayId,_that.userDjangoIdForeignKey,_that.provinceIdForeignKey,_that.cityIdForeignKey,_that.systemUserProfileIdKey,_that.fullname,_that.firstName,_that.lastName,_that.nationalCode,_that.nationalCodeImage,_that.nationalId,_that.mobile,_that.birthday,_that.image,_that.password,_that.active,_that.state,_that.baseOrder,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress,_that.personType,_that.type);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( List? role, String? city, String? province, String? key, String? userGateWayId, dynamic userDjangoIdForeignKey, dynamic provinceIdForeignKey, dynamic cityIdForeignKey, dynamic systemUserProfileIdKey, String? fullname, String? firstName, String? lastName, String? nationalCode, String? nationalCodeImage, String? nationalId, String? mobile, String? birthday, String? image, String? password, bool? active, UserState? state, int? baseOrder, int? cityNumber, String? cityName, int? provinceNumber, String? provinceName, String? unitName, String? unitNationalId, String? unitRegistrationNumber, String? unitEconomicalNumber, String? unitProvince, String? unitCity, String? unitPostalCode, String? unitAddress, String? personType, String? type)? $default,) {final _that = this; +switch (_that) { +case _UserProfile() when $default != null: +return $default(_that.role,_that.city,_that.province,_that.key,_that.userGateWayId,_that.userDjangoIdForeignKey,_that.provinceIdForeignKey,_that.cityIdForeignKey,_that.systemUserProfileIdKey,_that.fullname,_that.firstName,_that.lastName,_that.nationalCode,_that.nationalCodeImage,_that.nationalId,_that.mobile,_that.birthday,_that.image,_that.password,_that.active,_that.state,_that.baseOrder,_that.cityNumber,_that.cityName,_that.provinceNumber,_that.provinceName,_that.unitName,_that.unitNationalId,_that.unitRegistrationNumber,_that.unitEconomicalNumber,_that.unitProvince,_that.unitCity,_that.unitPostalCode,_that.unitAddress,_that.personType,_that.type);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -354,6 +483,136 @@ as String?, } +/// Adds pattern-matching-related methods to [UserState]. +extension UserStatePatterns on UserState { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _UserState value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _UserState() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _UserState value) $default,){ +final _that = this; +switch (_that) { +case _UserState(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _UserState value)? $default,){ +final _that = this; +switch (_that) { +case _UserState() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? city, String? image, String? mobile, String? birthday, String? province, String? lastName, String? firstName, String? nationalId, String? nationalCode)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _UserState() when $default != null: +return $default(_that.city,_that.image,_that.mobile,_that.birthday,_that.province,_that.lastName,_that.firstName,_that.nationalId,_that.nationalCode);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? city, String? image, String? mobile, String? birthday, String? province, String? lastName, String? firstName, String? nationalId, String? nationalCode) $default,) {final _that = this; +switch (_that) { +case _UserState(): +return $default(_that.city,_that.image,_that.mobile,_that.birthday,_that.province,_that.lastName,_that.firstName,_that.nationalId,_that.nationalCode);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? city, String? image, String? mobile, String? birthday, String? province, String? lastName, String? firstName, String? nationalId, String? nationalCode)? $default,) {final _that = this; +switch (_that) { +case _UserState() when $default != null: +return $default(_that.city,_that.image,_that.mobile,_that.birthday,_that.province,_that.lastName,_that.firstName,_that.nationalId,_that.nationalCode);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart index da00458..1cbd066 100644 --- a/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart +++ b/packages/chicken/lib/data/models/response/waiting_arrival/waiting_arrival.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -167,6 +166,136 @@ $StewardModelCopyWith<$Res>? get toSteward { } +/// Adds pattern-matching-related methods to [WaitingArrivalModel]. +extension WaitingArrivalModelPatterns on WaitingArrivalModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _WaitingArrivalModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _WaitingArrivalModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _WaitingArrivalModel value) $default,){ +final _that = this; +switch (_that) { +case _WaitingArrivalModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _WaitingArrivalModel value)? $default,){ +final _that = this; +switch (_that) { +case _WaitingArrivalModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, ProductModel? product, dynamic killHouse, dynamic toKillHouse, StewardModel? steward, StewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, bool? overhead, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _WaitingArrivalModel() when $default != null: +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.overhead,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, ProductModel? product, dynamic killHouse, dynamic toKillHouse, StewardModel? steward, StewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, bool? overhead, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser) $default,) {final _that = this; +switch (_that) { +case _WaitingArrivalModel(): +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.overhead,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, ProductModel? product, dynamic killHouse, dynamic toKillHouse, StewardModel? steward, StewardModel? toSteward, dynamic guilds, dynamic toGuilds, dynamic toColdHouse, int? indexWeight, int? dateTimestamp, int? newState, int? newReceiverState, int? newAllocationState, String? key, String? createDate, String? modifyDate, bool? trash, int? numberOfCarcasses, int? realNumberOfCarcasses, int? receiverRealNumberOfCarcasses, double? weightOfCarcasses, double? realWeightOfCarcasses, double? receiverRealWeightOfCarcasses, double? weightLossOfCarcasses, bool? finalRegistration, String? sellType, String? productName, String? sellerType, String? type, String? saleType, String? allocationType, bool? systemRegistrationCode, int? registrationCode, int? amount, int? totalAmount, int? totalAmountPaid, int? totalAmountRemain, dynamic loggedRegistrationCode, String? state, String? receiverState, String? allocationState, String? date, dynamic role, dynamic stewardTempKey, bool? approvedPriceStatus, bool? calculateStatus, bool? temporaryTrash, bool? temporaryDeleted, bool? overhead, dynamic createdBy, dynamic modifiedBy, dynamic wareHouse, dynamic stewardWareHouse, dynamic car, dynamic dispenser)? $default,) {final _that = this; +switch (_that) { +case _WaitingArrivalModel() when $default != null: +return $default(_that.id,_that.product,_that.killHouse,_that.toKillHouse,_that.steward,_that.toSteward,_that.guilds,_that.toGuilds,_that.toColdHouse,_that.indexWeight,_that.dateTimestamp,_that.newState,_that.newReceiverState,_that.newAllocationState,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.numberOfCarcasses,_that.realNumberOfCarcasses,_that.receiverRealNumberOfCarcasses,_that.weightOfCarcasses,_that.realWeightOfCarcasses,_that.receiverRealWeightOfCarcasses,_that.weightLossOfCarcasses,_that.finalRegistration,_that.sellType,_that.productName,_that.sellerType,_that.type,_that.saleType,_that.allocationType,_that.systemRegistrationCode,_that.registrationCode,_that.amount,_that.totalAmount,_that.totalAmountPaid,_that.totalAmountRemain,_that.loggedRegistrationCode,_that.state,_that.receiverState,_that.allocationState,_that.date,_that.role,_that.stewardTempKey,_that.approvedPriceStatus,_that.calculateStatus,_that.temporaryTrash,_that.temporaryDeleted,_that.overhead,_that.createdBy,_that.modifiedBy,_that.wareHouse,_that.stewardWareHouse,_that.car,_that.dispenser);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -447,6 +576,136 @@ as double?, } +/// Adds pattern-matching-related methods to [ProductModel]. +extension ProductModelPatterns on ProductModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ProductModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ProductModel value) $default,){ +final _that = this; +switch (_that) { +case _ProductModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ProductModel value)? $default,){ +final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? name, double? weightAverage)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that.name,_that.weightAverage);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? name, double? weightAverage) $default,) {final _that = this; +switch (_that) { +case _ProductModel(): +return $default(_that.name,_that.weightAverage);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? name, double? weightAverage)? $default,) {final _that = this; +switch (_that) { +case _ProductModel() when $default != null: +return $default(_that.name,_that.weightAverage);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -652,6 +911,136 @@ $GetPosStatusModelCopyWith<$Res>? get getPosStatus { } +/// Adds pattern-matching-related methods to [StewardModel]. +extension StewardModelPatterns on StewardModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _StewardModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _StewardModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _StewardModel value) $default,){ +final _that = this; +switch (_that) { +case _StewardModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _StewardModel value)? $default,){ +final _that = this; +switch (_that) { +case _StewardModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? id, StewardUserModel? user, AddressModel? address, dynamic guildAreaActivity, dynamic guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, int? allocationLimit, bool? limitationAllocation, String? provinceAcceptState, bool? stewardActive, bool? stewardLimitationAllocation, bool? license, int? wallet, List? cars, List? userLevel)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _StewardModel() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.allocationLimit,_that.limitationAllocation,_that.provinceAcceptState,_that.stewardActive,_that.stewardLimitationAllocation,_that.license,_that.wallet,_that.cars,_that.userLevel);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? id, StewardUserModel? user, AddressModel? address, dynamic guildAreaActivity, dynamic guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, int? allocationLimit, bool? limitationAllocation, String? provinceAcceptState, bool? stewardActive, bool? stewardLimitationAllocation, bool? license, int? wallet, List? cars, List? userLevel) $default,) {final _that = this; +switch (_that) { +case _StewardModel(): +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.allocationLimit,_that.limitationAllocation,_that.provinceAcceptState,_that.stewardActive,_that.stewardLimitationAllocation,_that.license,_that.wallet,_that.cars,_that.userLevel);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? id, StewardUserModel? user, AddressModel? address, dynamic guildAreaActivity, dynamic guildTypeActivity, List? killHouse, List? stewardKillHouse, List? stewards, GetPosStatusModel? getPosStatus, String? key, String? createDate, String? modifyDate, bool? trash, bool? active, int? cityNumber, String? cityName, String? guildsId, String? licenseNumber, String? guildsName, String? phone, String? typeActivity, String? areaActivity, int? provinceNumber, String? provinceName, bool? steward, bool? hasPos, int? allocationLimit, bool? limitationAllocation, String? provinceAcceptState, bool? stewardActive, bool? stewardLimitationAllocation, bool? license, int? wallet, List? cars, List? userLevel)? $default,) {final _that = this; +switch (_that) { +case _StewardModel() when $default != null: +return $default(_that.id,_that.user,_that.address,_that.guildAreaActivity,_that.guildTypeActivity,_that.killHouse,_that.stewardKillHouse,_that.stewards,_that.getPosStatus,_that.key,_that.createDate,_that.modifyDate,_that.trash,_that.active,_that.cityNumber,_that.cityName,_that.guildsId,_that.licenseNumber,_that.guildsName,_that.phone,_that.typeActivity,_that.areaActivity,_that.provinceNumber,_that.provinceName,_that.steward,_that.hasPos,_that.allocationLimit,_that.limitationAllocation,_that.provinceAcceptState,_that.stewardActive,_that.stewardLimitationAllocation,_that.license,_that.wallet,_that.cars,_that.userLevel);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -934,6 +1323,136 @@ as String?, } +/// Adds pattern-matching-related methods to [StewardUserModel]. +extension StewardUserModelPatterns on StewardUserModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _StewardUserModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _StewardUserModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _StewardUserModel value) $default,){ +final _that = this; +switch (_that) { +case _StewardUserModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _StewardUserModel value)? $default,){ +final _that = this; +switch (_that) { +case _StewardUserModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _StewardUserModel() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city) $default,) {final _that = this; +switch (_that) { +case _StewardUserModel(): +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? fullname, String? firstName, String? lastName, String? mobile, String? nationalId, String? city)? $default,) {final _that = this; +switch (_that) { +case _StewardUserModel() when $default != null: +return $default(_that.fullname,_that.firstName,_that.lastName,_that.mobile,_that.nationalId,_that.city);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1104,6 +1623,136 @@ $CityModelCopyWith<$Res>? get city { } +/// Adds pattern-matching-related methods to [AddressModel]. +extension AddressModelPatterns on AddressModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _AddressModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _AddressModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _AddressModel value) $default,){ +final _that = this; +switch (_that) { +case _AddressModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _AddressModel value)? $default,){ +final _that = this; +switch (_that) { +case _AddressModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( ProvinceModel? province, CityModel? city, String? address, String? postalCode)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _AddressModel() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( ProvinceModel? province, CityModel? city, String? address, String? postalCode) $default,) {final _that = this; +switch (_that) { +case _AddressModel(): +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( ProvinceModel? province, CityModel? city, String? address, String? postalCode)? $default,) {final _that = this; +switch (_that) { +case _AddressModel() when $default != null: +return $default(_that.province,_that.city,_that.address,_that.postalCode);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1268,6 +1917,136 @@ as String?, } +/// Adds pattern-matching-related methods to [ProvinceModel]. +extension ProvinceModelPatterns on ProvinceModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _ProvinceModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _ProvinceModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _ProvinceModel value) $default,){ +final _that = this; +switch (_that) { +case _ProvinceModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _ProvinceModel value)? $default,){ +final _that = this; +switch (_that) { +case _ProvinceModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _ProvinceModel() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _ProvinceModel(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _ProvinceModel() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1404,6 +2183,136 @@ as String?, } +/// Adds pattern-matching-related methods to [CityModel]. +extension CityModelPatterns on CityModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _CityModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _CityModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _CityModel value) $default,){ +final _that = this; +switch (_that) { +case _CityModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _CityModel value)? $default,){ +final _that = this; +switch (_that) { +case _CityModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? name)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _CityModel() when $default != null: +return $default(_that.key,_that.name);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? name) $default,) {final _that = this; +switch (_that) { +case _CityModel(): +return $default(_that.key,_that.name);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? name)? $default,) {final _that = this; +switch (_that) { +case _CityModel() when $default != null: +return $default(_that.key,_that.name);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() @@ -1541,6 +2450,136 @@ as bool?, } +/// Adds pattern-matching-related methods to [GetPosStatusModel]. +extension GetPosStatusModelPatterns on GetPosStatusModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _GetPosStatusModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _GetPosStatusModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _GetPosStatusModel value) $default,){ +final _that = this; +switch (_that) { +case _GetPosStatusModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _GetPosStatusModel value)? $default,){ +final _that = this; +switch (_that) { +case _GetPosStatusModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _GetPosStatusModel() when $default != null: +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons) $default,) {final _that = this; +switch (_that) { +case _GetPosStatusModel(): +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int? lenActiveSessions, bool? hasPons, bool? hasActivePons)? $default,) {final _that = this; +switch (_that) { +case _GetPosStatusModel() when $default != null: +return $default(_that.lenActiveSessions,_that.hasPons,_that.hasActivePons);case _: + return null; + +} +} + +} + /// @nodoc @JsonSerializable() diff --git a/packages/core/lib/presentation/common/app_fonts.dart b/packages/core/lib/presentation/common/app_fonts.dart index e7daed0..72c1d45 100644 --- a/packages/core/lib/presentation/common/app_fonts.dart +++ b/packages/core/lib/presentation/common/app_fonts.dart @@ -12,90 +12,90 @@ class AppFonts { static const FontWeight bold = FontWeight.w600; static const double _height = 1.20; - static const TextStyle yekan61 = TextStyle( + static TextStyle yekan61 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 61, + fontSize: 61.sp, height: _height, ); - static const TextStyle yekan49 = TextStyle( + static TextStyle yekan49 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 48, + fontSize: 48.sp, height: _height, ); - static const TextStyle yekan39 = TextStyle( + static TextStyle yekan39 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 39, + fontSize: 39.sp, height: _height, ); - static const TextStyle yekan31 = TextStyle( + static TextStyle yekan31 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 31, + fontSize: 31.sp, height: _height, ); - static const TextStyle yekan25 = TextStyle( + static TextStyle yekan25 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 25, + fontSize: 25.sp, height: _height, ); - static const TextStyle yekan24 = TextStyle( + static TextStyle yekan24 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 24, + fontSize: 24.sp, height: _height, ); - static const TextStyle yekan20 = TextStyle( + static TextStyle yekan20 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 20, + fontSize: 20.sp, height: _height, ); - static const TextStyle yekan18 = TextStyle( + static TextStyle yekan18 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 18, + fontSize: 18.sp, height: _height, ); - static const TextStyle yekan16 = TextStyle( + static TextStyle yekan16 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 16, + fontSize: 16.sp, height: _height, ); - static const TextStyle yekan14 = TextStyle( + static TextStyle yekan14 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 13, + fontSize: 13.sp, height: _height, ); - static const TextStyle yekan13 = TextStyle( + static TextStyle yekan13 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 13, + fontSize: 13.sp, height: _height, ); - static const TextStyle yekan12 = TextStyle( + static TextStyle yekan12 = TextStyle( fontFamily: yekan, fontWeight: regular, - fontSize: 12, + fontSize: 12.sp, height: _height, ); @@ -109,84 +109,84 @@ class AppFonts { ); - static const TextStyle yekan8= TextStyle( + static TextStyle yekan8= TextStyle( // Rounded from 10.24 fontFamily: yekan, fontWeight: regular, - fontSize: 8, + fontSize: 8.sp, height: _height, ); - static const TextStyle yekan61Bold = TextStyle( + static TextStyle yekan61Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 61, + fontSize: 61.sp, height: _height, ); - static const TextStyle yekan49Bold = TextStyle( + static TextStyle yekan49Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 48, + fontSize: 48.sp, height: _height, ); - static const TextStyle yekan39Bold = TextStyle( + static TextStyle yekan39Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 39, + fontSize: 39.sp, height: _height, ); - static const TextStyle yekan31Bold = TextStyle( + static TextStyle yekan31Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 31, + fontSize: 31.sp, height: _height, ); - static const TextStyle yekan25Bold = TextStyle( + static TextStyle yekan25Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 25, + fontSize: 25.sp, height: _height, ); - static const TextStyle yekan24Bold = TextStyle( + static TextStyle yekan24Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 24, + fontSize: 24.sp, height: _height, ); - static const TextStyle yekan20Bold = TextStyle( + static TextStyle yekan20Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 20, + fontSize: 20.sp, height: _height, ); - static const TextStyle yekan16Bold = TextStyle( + static TextStyle yekan16Bold = TextStyle( // Base size bold fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 16, + fontSize: 16.sp, height: _height, ); - static const TextStyle yekan14Bold = TextStyle( + static TextStyle yekan14Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 13, + fontSize: 13.sp, height: _height, ); - static const TextStyle yekan13Bold = TextStyle( + static TextStyle yekan13Bold = TextStyle( fontFamily: yekan, fontWeight: bold, // Use bold weight - fontSize: 13, + fontSize: 13.sp, height: _height, ); diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 1e6f6ef..9eda0b7 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -1,3 +1,5 @@ +// dart format width=120 + /// GENERATED CODE - DO NOT MODIFY BY HAND /// ***************************************************** /// FlutterGen @@ -5,7 +7,7 @@ // coverage:ignore-file // ignore_for_file: type=lint -// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use +// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; @@ -658,12 +660,13 @@ class Assets { } class AssetGenImage { - const AssetGenImage(this._assetName, {this.size, this.flavors = const {}}); + const AssetGenImage(this._assetName, {this.size, this.flavors = const {}, this.animation}); final String _assetName; final Size? size; final Set flavors; + final AssetGenImageAnimation? animation; Image image({ Key? key, @@ -727,6 +730,14 @@ class AssetGenImage { String get keyName => _assetName; } +class AssetGenImageAnimation { + const AssetGenImageAnimation({required this.isAnimation, required this.duration, required this.frames}); + + final bool isAnimation; + final Duration duration; + final int frames; +} + class SvgGenImage { const SvgGenImage(this._assetName, {this.size, this.flavors = const {}}) : _isVecFormat = false; @@ -751,6 +762,7 @@ class SvgGenImage { String? semanticsLabel, bool excludeFromSemantics = false, _svg.SvgTheme? theme, + _svg.ColorMapper? colorMapper, ColorFilter? colorFilter, Clip clipBehavior = Clip.hardEdge, @deprecated Color? color, @@ -761,7 +773,13 @@ class SvgGenImage { if (_isVecFormat) { loader = _vg.AssetBytesLoader(_assetName, assetBundle: bundle, packageName: package); } else { - loader = _svg.SvgAssetLoader(_assetName, assetBundle: bundle, packageName: package, theme: theme); + loader = _svg.SvgAssetLoader( + _assetName, + assetBundle: bundle, + packageName: package, + theme: theme, + colorMapper: colorMapper, + ); } return _svg.SvgPicture( loader, diff --git a/packages/core/lib/presentation/common/fonts.gen.dart b/packages/core/lib/presentation/common/fonts.gen.dart index 66ad118..5e86efd 100644 --- a/packages/core/lib/presentation/common/fonts.gen.dart +++ b/packages/core/lib/presentation/common/fonts.gen.dart @@ -1,3 +1,4 @@ +// dart format width=120 /// GENERATED CODE - DO NOT MODIFY BY HAND /// ***************************************************** /// FlutterGen @@ -5,7 +6,7 @@ // coverage:ignore-file // ignore_for_file: type=lint -// ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use +// ignore_for_file: deprecated_member_use,directives_ordering,implicit_dynamic_list_literal,unnecessary_import class FontFamily { FontFamily._(); diff --git a/packages/core/lib/presentation/widget/inputs/r_input.dart b/packages/core/lib/presentation/widget/inputs/r_input.dart index 3ea8ba0..cc98965 100644 --- a/packages/core/lib/presentation/widget/inputs/r_input.dart +++ b/packages/core/lib/presentation/widget/inputs/r_input.dart @@ -48,6 +48,7 @@ class RTextField extends StatefulWidget { final bool? enableSuggestions; final TextInputAction? textInputAction; final double? height; + final Iterable? autofillHints; const RTextField({ super.key, @@ -71,6 +72,7 @@ class RTextField extends StatefulWidget { this.textInputAction, this.keyboardType, this.focusNode, + this.autofillHints, // ⚙️ Input styling this.textAlign, @@ -219,6 +221,7 @@ class _RTextFieldState extends State { autocorrect: widget.autocorrect ?? true, enableSuggestions: widget.enableSuggestions ?? true, textInputAction: widget.textInputAction, + autofillHints: widget.autofillHints, decoration: InputDecoration( contentPadding: const EdgeInsets.symmetric(horizontal: 16), errorStyle: widget.errorStyle, diff --git a/pubspec.yaml b/pubspec.yaml index 207376d..6d047e1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_app description: "A new Flutter project." publish_to: 'none' -version: 1.3.7+5 +version: 1.3.6+4 environment: sdk: ^3.8.1 From 91e38c7ac14c26b0ea64d8ad44a7b6b495da8cb7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 23 Jul 2025 14:45:01 +0330 Subject: [PATCH 235/256] feat : privacyPolicyWidget --- lib/data/model/app_info_model.g.dart | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/data/model/app_info_model.g.dart b/lib/data/model/app_info_model.g.dart index 3709ee1..90cd6a5 100644 --- a/lib/data/model/app_info_model.g.dart +++ b/lib/data/model/app_info_model.g.dart @@ -8,26 +8,28 @@ part of 'app_info_model.dart'; _AppInfoModel _$AppInfoModelFromJson(Map json) => _AppInfoModel( - key: json['key'] as String, - info: Info.fromJson(json['info'] as Map), - downloadLink: json['downloadLink'] as String, + key: json['key'] as String?, + download_link: json['download_link'] as String?, + info: json['info'] == null + ? null + : Info.fromJson(json['info'] as Map), ); Map _$AppInfoModelToJson(_AppInfoModel instance) => { 'key': instance.key, + 'download_link': instance.download_link, 'info': instance.info, - 'downloadLink': instance.downloadLink, }; _Info _$InfoFromJson(Map json) => _Info( - version: json['version'] as String, - required: json['required'] as bool, - module: json['module'] as String, + version: json['version'] as String?, + module: json['module'] as String?, + required: json['required'] as bool?, ); Map _$InfoToJson(_Info instance) => { 'version': instance.version, - 'required': instance.required, 'module': instance.module, + 'required': instance.required, }; From 2d2bfd3e92e7f7d38e853a4b32be924297394e7f Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 23 Jul 2025 15:55:54 +0330 Subject: [PATCH 236/256] fix : app update with MR.Nima --- lib/presentation/pages/splash/logic.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/presentation/pages/splash/logic.dart b/lib/presentation/pages/splash/logic.dart index 4f94283..4c779be 100644 --- a/lib/presentation/pages/splash/logic.dart +++ b/lib/presentation/pages/splash/logic.dart @@ -151,8 +151,8 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin { Future.delayed(const Duration(milliseconds: 250), () async { try { - /* final isUpdateNeeded = await checkVersion(); - if (isUpdateNeeded) return;*/ + final isUpdateNeeded = await checkVersion(); + if (isUpdateNeeded) return; final module = tokenService.appModule.value; final target = getTargetPage(module); From 42727c7eec06099f7babfefb09f76511c5cdd466 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Thu, 24 Jul 2025 16:57:34 +0330 Subject: [PATCH 237/256] feat : new main page inspection --- assets/icons/app_bar_inspection.svg | 8 + assets/icons/people.svg | 14 + assets/icons/profile2.svg | 10 + assets/icons/shop.svg | 5 + assets/vec/app_bar_inspection.svg.vec | Bin 0 -> 943 bytes assets/vec/people.svg.vec | Bin 0 -> 931 bytes assets/vec/profile2.svg.vec | Bin 0 -> 817 bytes assets/vec/shop.svg.vec | Bin 0 -> 1058 bytes lib/presentation/pages/splash/logic.dart | 3 +- lib/presentation/routes/app_pages.dart | 6 +- .../lib/presentation/pages/auth/logic.dart | 2 +- .../lib/presentation/pages/auth/view.dart | 20 +- .../lib/presentation/pages/root/view.dart | 2 +- .../lib/presentation/common/app_color.dart | 5 + .../lib/presentation/common/assets.gen.dart | 32 + .../widget/app_bar/r_app_bar.dart | 4 +- .../r_bottom_navigation.dart | 25 +- .../lib/presentation/filter/view.dart | 2 +- .../presentation/inspection_map/logic.dart | 151 ++++ .../lib/presentation/inspection_map/view.dart | 650 ++++++++++++++++++ .../lib/presentation/root/logic.dart | 3 +- .../lib/presentation/root/view.dart | 199 ++---- .../lib/presentation/routes/app_pages.dart | 8 +- .../lib/presentation/routes/app_routes.dart | 8 +- .../widget/app_bar/i_app_bar.dart | 87 +++ .../presentation/widget/base_page/logic.dart | 23 + .../presentation/widget/base_page/view.dart | 146 ++++ .../lib/presentation/widget/search.dart | 81 +++ packages/inspection/pubspec.lock | 526 ++++++++++++-- packages/inspection/pubspec.yaml | 2 +- 30 files changed, 1784 insertions(+), 238 deletions(-) create mode 100644 assets/icons/app_bar_inspection.svg create mode 100644 assets/icons/people.svg create mode 100644 assets/icons/profile2.svg create mode 100644 assets/icons/shop.svg create mode 100644 assets/vec/app_bar_inspection.svg.vec create mode 100644 assets/vec/people.svg.vec create mode 100644 assets/vec/profile2.svg.vec create mode 100644 assets/vec/shop.svg.vec create mode 100644 packages/inspection/lib/presentation/inspection_map/logic.dart create mode 100644 packages/inspection/lib/presentation/inspection_map/view.dart create mode 100644 packages/inspection/lib/presentation/widget/app_bar/i_app_bar.dart create mode 100644 packages/inspection/lib/presentation/widget/base_page/logic.dart create mode 100644 packages/inspection/lib/presentation/widget/base_page/view.dart create mode 100644 packages/inspection/lib/presentation/widget/search.dart diff --git a/assets/icons/app_bar_inspection.svg b/assets/icons/app_bar_inspection.svg new file mode 100644 index 0000000..ea72d5f --- /dev/null +++ b/assets/icons/app_bar_inspection.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/people.svg b/assets/icons/people.svg new file mode 100644 index 0000000..9c1edd3 --- /dev/null +++ b/assets/icons/people.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/assets/icons/profile2.svg b/assets/icons/profile2.svg new file mode 100644 index 0000000..a164e84 --- /dev/null +++ b/assets/icons/profile2.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/assets/icons/shop.svg b/assets/icons/shop.svg new file mode 100644 index 0000000..1c5dde5 --- /dev/null +++ b/assets/icons/shop.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/vec/app_bar_inspection.svg.vec b/assets/vec/app_bar_inspection.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..eaa08e343b0ed43cfde2b30f4b666845f6f54749 GIT binary patch literal 943 zcmYL|dq@;f6vpp7Rz+7WFfC_W$RxFh>_r$<`wa#L5#%@VSV zOe!N%Vzb5U;o26i6>hs5g`s7M5f%Os8Mr;H&1uezYj;523y!j%Q)isM;|%bw;B@HZ*&h(8xE#U*CicCGA*Wd1bmra>7k? z=5-_PU=zfnZmhacgV91aazz`K7P)b*)P^!O{;K+P7w9BEi4$1(R4uibiKe6xiVd2U z82((3ogSS>?qq5CKL#WAq^$!{T2iUe>A4Qd?`Z1<>4{k{bhZrWB!5~D)sZ++??L@W z952LC5AC}@BgHg^g{vnZHVQH^^1L8F>08piQ6KM?Yfn1LC|SUpo-(BCW6aPCkoGO8lvoJA8BB1ww;{p!7AY-?4G z#_!_+3*~8z^u)}LN@`t2Jke+Du`ZOkIa5CkIq$kq;%YL8c7xGUxQ+JAD<{15OW?qj3JrecEpy40( CC{->1 literal 0 HcmV?d00001 diff --git a/assets/vec/people.svg.vec b/assets/vec/people.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..acf8c0b541fea71d5fb22db1e21f236676bc72a6 GIT binary patch literal 931 zcmZXTUr5tY6vyvx(=sIxObMrB3V{n6*?N<;`vt)uMyTL}%%U(IEwFr;eGLFu4q-E+pCcHzh8-gD16-*XQ4clA_2Xl5Z^ zgT9jL>guFkh-A{B32|7crK6=c(bgI4M=X+%bH)Me)h6VzsT6P7?z24>3B#6qAmg2* zXlYrK&fqBGox@CLuukq*gq4br(VGLzshTckEaHOIS}%#@Po((0S|8_2>l!pIqb8TN z2c2WLp{<56_tc9f=LlkFJ7B6CS9HS{e}-IFBQu_7$Czzgoh@)#M-&&IXHMUp!h9%7@UtX8gCz1Ll(wt^mpGcb1zw;Z+YS zbq$(6qo$AEFS4-o4!+fG$=3I73_jXW=O*UZPMO`I>SYY^GukQy|%D7`3%4*!t4Yv(+7XB(7mFBZdQW;*|ABdH~m RMlA(h3hLh@V^#{;jQ@2tRxtno literal 0 HcmV?d00001 diff --git a/assets/vec/profile2.svg.vec b/assets/vec/profile2.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..d9f7baa30473dab4d4cebfdf198928ec736f9152 GIT binary patch literal 817 zcmZvbUr19?9LLYSBhdSh)+~wT9wKr^X6Q&lSLZ81D!pt41uaagQJ6WiKkklTv#mzU zCMIbsHJkQe{wadehal~tf>lu9?IEZIJ>*1!Af%w%@7%Gs4*d9>-=A~8zu!6BrqT$L zN*H?%Ve36dn{*Rnx^9se%VD%+S(aqkv_b4ygfsS$EW&@;LS#wWGqQX-&3HJy!ysdB zh`gYvSF}Tzwyr_JWEDJ~?Ql)6hN4v>eruIMEs;;TN|d?A0 zU`|~%*q`h*^3L>tQC~DYg4$F)svYALFGW(H!n~em@R;=*7k-grjEnr;FDe)Hud6px zd;rUzfA2DC*NAtXP3TZhArdab_opi9+7Ysb zDPMtwP}t}zsb@H$X8O$bYhkAUzROa23L9raD6E~rWB)bmca4$$4V+~6(D{!+=iaL*6On_Z332t&VJV z-&iuu3nb6Pz&)}K8KWAtHUHw;A-3|VGshTFD1U&{S5q*p+RUm|MCJtR@50u$IFC%GtI!cSr!_cvTemCNkZbPf%9HtYh zD87WbU?nO<7n{DKk4@U{r@TYxjUJ>tosAhyVKbbGteRitDb={hx~ak-mZ^UR^Y^T`E;~uB=u*dT5$)oS=$g%g)JPv$0 zImF&baQthF7+fWqjq`KPh nEbAsVj_sj&yD4us$~`?azJ&X%#z*?U)}(GjIBe4XV_^OP( call: () => authTmp.login( authRequest: { - "username": phoneNumberController.value.text, + "username": usernameController.value.text, "password": passwordController.value.text, }, ), diff --git a/packages/auth/lib/presentation/pages/auth/view.dart b/packages/auth/lib/presentation/pages/auth/view.dart index 80215ad..60fe93a 100644 --- a/packages/auth/lib/presentation/pages/auth/view.dart +++ b/packages/auth/lib/presentation/pages/auth/view.dart @@ -102,13 +102,13 @@ class AuthPage extends GetView { label: 'نام کاربری', maxLength: 11, maxLines: 1, - controller: controller.phoneNumberController.value, + controller: controller.usernameController.value, keyboardType: TextInputType.number, - initText: controller.phoneNumberController.value.text, + initText: controller.usernameController.value.text, autofillHints: [AutofillHints.username], onChanged: (value) async { - controller.phoneNumberController.value.text = value; - controller.phoneNumberController.refresh(); + controller.usernameController.value.text = value; + controller.usernameController.refresh(); if (value.length == 11) { await controller.getUserInfo(value); } @@ -117,18 +117,18 @@ class AuthPage extends GetView { padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), child: Assets.vec.callSvg.svg(width: 12, height: 12), ), - suffixIcon: controller.phoneNumberController.value.text.trim().isNotEmpty + suffixIcon: controller.usernameController.value.text.trim().isNotEmpty ? clearButton(() { - controller.phoneNumberController.value.clear(); - controller.phoneNumberController.refresh(); + controller.usernameController.value.clear(); + controller.usernameController.refresh(); }) : null, validator: (value) { - if (value == null || value.isEmpty) { + /* if (value == null || value.isEmpty) { return '⚠️ شماره موبایل را وارد کنید'; - } else if (value.length < 11) { + } else if (value.length < 10) { return '⚠️ شماره موبایل باید 11 رقم باشد'; - } + }*/ return null; }, style: AppFonts.yekan13, diff --git a/packages/chicken/lib/presentation/pages/root/view.dart b/packages/chicken/lib/presentation/pages/root/view.dart index 6579a21..cceffb6 100644 --- a/packages/chicken/lib/presentation/pages/root/view.dart +++ b/packages/chicken/lib/presentation/pages/root/view.dart @@ -160,7 +160,7 @@ class RootPage extends GetView { mainAxisAlignment: MainAxisAlignment.center, spacing: 4, children: [ - Assets.icons.cubeScan.svg(width: 30, height: 30), + Assets.icons.cubeScan.svg(width: 30.w, height: 30), Text( 'بارهای امروز', textAlign: TextAlign.right, diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index f676d19..40069d1 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -147,6 +147,9 @@ class AppColor { static const Color redDarkActive = Color(0xFF6a2727); // #6a2727 rgb(106, 39, 39) static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30) static const Color redDarkerText = Color(0xFFD24E4E); // #D34E4E rgba(211, 78, 78, 1) + + static const Color redLight2 = Color(0xFFEDDCE0); // #EDDCE0 rgb(237, 220, 224) + static const Color redLightActive2 = Color(0xFFE0BCC5); // #E0BCC5 rgb(224, 188, 197) //endregion //region --- Teal Colors --- @@ -166,6 +169,8 @@ class AppColor { static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64) static const Color textColor = Color(0xFF5B5B5B); // #083940 rgb(8, 57, 64) static const Color textColorLight = Color(0xFFB2B2B2); + static const Color iconColor = Color(0xFF444444); // #444444 rgb(68, 68, 68) + static const Color borderColor = Color(0xFFC7CFCD); // #C7CFCD rgb(199, 207, 205)` //endregion diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 9eda0b7..44a3854 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -37,6 +37,9 @@ class $AssetsIconsGen { /// File path: assets/icons/add.svg SvgGenImage get add => const SvgGenImage('assets/icons/add.svg'); + /// File path: assets/icons/app_bar_inspection.svg + SvgGenImage get appBarInspection => const SvgGenImage('assets/icons/app_bar_inspection.svg'); + /// File path: assets/icons/arrow_left.svg SvgGenImage get arrowLeft => const SvgGenImage('assets/icons/arrow_left.svg'); @@ -172,12 +175,18 @@ class $AssetsIconsGen { /// File path: assets/icons/pdf_download.svg SvgGenImage get pdfDownload => const SvgGenImage('assets/icons/pdf_download.svg'); + /// File path: assets/icons/people.svg + SvgGenImage get people => const SvgGenImage('assets/icons/people.svg'); + /// File path: assets/icons/picture_frame.svg SvgGenImage get pictureFrame => const SvgGenImage('assets/icons/picture_frame.svg'); /// File path: assets/icons/place_holder.svg SvgGenImage get placeHolder => const SvgGenImage('assets/icons/place_holder.svg'); + /// File path: assets/icons/profile2.svg + SvgGenImage get profile2 => const SvgGenImage('assets/icons/profile2.svg'); + /// File path: assets/icons/profile_circle.svg SvgGenImage get profileCircle => const SvgGenImage('assets/icons/profile_circle.svg'); @@ -205,6 +214,9 @@ class $AssetsIconsGen { /// File path: assets/icons/setting.svg SvgGenImage get setting => const SvgGenImage('assets/icons/setting.svg'); + /// File path: assets/icons/shop.svg + SvgGenImage get shop => const SvgGenImage('assets/icons/shop.svg'); + /// File path: assets/icons/shopping_basket.svg SvgGenImage get shoppingBasket => const SvgGenImage('assets/icons/shopping_basket.svg'); @@ -251,6 +263,7 @@ class $AssetsIconsGen { List get values => [ a3dCubeSquare, add, + appBarInspection, arrowLeft, arrowRight, bgHeaderUserProfile, @@ -296,8 +309,10 @@ class $AssetsIconsGen { messageAdd, outside, pdfDownload, + people, pictureFrame, placeHolder, + profile2, profileCircle, profileUser, receiptDiscount, @@ -307,6 +322,7 @@ class $AssetsIconsGen { search, securityTime, setting, + shop, shoppingBasket, tagLabel, tagUser, @@ -362,6 +378,9 @@ class $AssetsVecGen { /// File path: assets/vec/add.svg.vec SvgGenImage get addSvg => const SvgGenImage.vec('assets/vec/add.svg.vec'); + /// File path: assets/vec/app_bar_inspection.svg.vec + SvgGenImage get appBarInspectionSvg => const SvgGenImage.vec('assets/vec/app_bar_inspection.svg.vec'); + /// File path: assets/vec/arrow_left.svg.vec SvgGenImage get arrowLeftSvg => const SvgGenImage.vec('assets/vec/arrow_left.svg.vec'); @@ -497,12 +516,18 @@ class $AssetsVecGen { /// File path: assets/vec/pdf_download.svg.vec SvgGenImage get pdfDownloadSvg => const SvgGenImage.vec('assets/vec/pdf_download.svg.vec'); + /// File path: assets/vec/people.svg.vec + SvgGenImage get peopleSvg => const SvgGenImage.vec('assets/vec/people.svg.vec'); + /// File path: assets/vec/picture_frame.svg.vec SvgGenImage get pictureFrameSvg => const SvgGenImage.vec('assets/vec/picture_frame.svg.vec'); /// File path: assets/vec/place_holder.svg.vec SvgGenImage get placeHolderSvg => const SvgGenImage.vec('assets/vec/place_holder.svg.vec'); + /// File path: assets/vec/profile2.svg.vec + SvgGenImage get profile2Svg => const SvgGenImage.vec('assets/vec/profile2.svg.vec'); + /// File path: assets/vec/profile_circle.svg.vec SvgGenImage get profileCircleSvg => const SvgGenImage.vec('assets/vec/profile_circle.svg.vec'); @@ -530,6 +555,9 @@ class $AssetsVecGen { /// File path: assets/vec/setting.svg.vec SvgGenImage get settingSvg => const SvgGenImage.vec('assets/vec/setting.svg.vec'); + /// File path: assets/vec/shop.svg.vec + SvgGenImage get shopSvg => const SvgGenImage.vec('assets/vec/shop.svg.vec'); + /// File path: assets/vec/shopping_basket.svg.vec SvgGenImage get shoppingBasketSvg => const SvgGenImage.vec('assets/vec/shopping_basket.svg.vec'); @@ -576,6 +604,7 @@ class $AssetsVecGen { List get values => [ a3dCubeSquareSvg, addSvg, + appBarInspectionSvg, arrowLeftSvg, arrowRightSvg, bgHeaderUserProfileSvg, @@ -621,8 +650,10 @@ class $AssetsVecGen { messageAddSvg, outsideSvg, pdfDownloadSvg, + peopleSvg, pictureFrameSvg, placeHolderSvg, + profile2Svg, profileCircleSvg, profileUserSvg, receiptDiscountSvg, @@ -632,6 +663,7 @@ class $AssetsVecGen { searchSvg, securityTimeSvg, settingSvg, + shopSvg, shoppingBasketSvg, tagLabelSvg, tagUserSvg, diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index d6b921b..e04ebaf 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -53,7 +53,9 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { ) : null, leadingWidth: leadingWidth?.toDouble(), - leading: leading != null ? Padding(padding: const EdgeInsets.only(right: 6), child: leading) : null, + leading: leading != null + ? Padding(padding: const EdgeInsets.only(right: 6), child: leading) + : null, titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, diff --git a/packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart index 0d91e27..d4299bc 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/r_bottom_navigation.dart @@ -2,9 +2,10 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; class RBottomNavigation extends StatefulWidget { - const RBottomNavigation({super.key, required this.items}); + RBottomNavigation({super.key, required this.items,this.mainAxisAlignment}); final List items; + MainAxisAlignment? mainAxisAlignment; @override State createState() => _RBottomNavigationState(); @@ -18,9 +19,15 @@ class _RBottomNavigationState extends State { padding: EdgeInsets.symmetric(horizontal: 11.w, vertical: 18.h), decoration: BoxDecoration( color: AppColor.blueNormal, - borderRadius: const BorderRadius.only(topLeft: Radius.circular(32), topRight: Radius.circular(32)), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(32), + topRight: Radius.circular(32), + ), + ), + child: Row( + mainAxisAlignment: widget.mainAxisAlignment??MainAxisAlignment.spaceBetween, + children: widget.items, ), - child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: widget.items), ); } } @@ -57,10 +64,18 @@ class RBottomNavigationItem extends StatelessWidget { SvgGenImage.vec(icon).svg( width: 40.w, height: 40.h, - colorFilter: ColorFilter.mode(isSelected ? AppColor.blueNormal : Colors.white, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + isSelected ? AppColor.blueNormal : Colors.white, + BlendMode.srcIn, + ), ), SizedBox(height: 5.h), - Text(label, style: AppFonts.yekan10.copyWith(color: isSelected ? AppColor.blueNormal : Colors.white)), + Text( + label, + style: AppFonts.yekan10.copyWith( + color: isSelected ? AppColor.blueNormal : Colors.white, + ), + ), ], ), ), diff --git a/packages/inspection/lib/presentation/filter/view.dart b/packages/inspection/lib/presentation/filter/view.dart index 1508409..6dad128 100644 --- a/packages/inspection/lib/presentation/filter/view.dart +++ b/packages/inspection/lib/presentation/filter/view.dart @@ -11,7 +11,7 @@ class SupervisionFilterPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar.noBack(title: 'نقشه', additionalActions: [_searchButton(), _filterButton()]), + appBar: RAppBar(title: 'نقشه', additionalActions: [_searchButton(), _filterButton()]), body: PopScope( canPop: !controller.bottomSheetManager.isAnyVisible, onPopInvokedWithResult: (didPop, result) { diff --git a/packages/inspection/lib/presentation/inspection_map/logic.dart b/packages/inspection/lib/presentation/inspection_map/logic.dart new file mode 100644 index 0000000..fdd97c7 --- /dev/null +++ b/packages/inspection/lib/presentation/inspection_map/logic.dart @@ -0,0 +1,151 @@ + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/data/utils/marker_generator.dart'; +import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; + +import '../filter/view.dart'; + +class InspectionMapLogic extends GetxController with GetTickerProviderStateMixin { + + final BaseLogic baseLogic = Get.find(); + + Rx currentLocation = LatLng(35.824891, 50.948025).obs; + RxList allMarkers = [].obs; + RxList markers = [].obs; + Timer? _debounceTimer; + RxBool isLoading = false.obs; + + RxInt filterIndex = 0.obs; + RxInt showIndex = 0.obs; + bool showSlideHint = true; + + late Rx slidController; + + Rx mapController = MapController().obs; + late final AnimatedMapController animatedMapController; + + late DraggableBottomSheetController filterBottomSheetController; + late DraggableBottomSheetController selectedLocationBottomSheetController; + late DraggableBottomSheetController detailsLocationBottomSheetController; + late final BottomSheetManager bottomSheetManager; + + Future determineCurrentPosition() async { + isLoading.value = true; + final position = await Geolocator.getCurrentPosition( + locationSettings: AndroidSettings(accuracy: LocationAccuracy.best), + ); + final latLng = LatLng(position.latitude, position.longitude); + + currentLocation.value = latLng; + markers.add(latLng); + animatedMapController.animateTo( + dest: latLng, + zoom: 18, + curve: Curves.easeInOut, + duration: const Duration(seconds: 1), + ); + isLoading.value = false; + } + + void debouncedUpdateVisibleMarkers({required LatLng center}) { + _debounceTimer?.cancel(); + _debounceTimer = Timer(const Duration(milliseconds: 300), () { + final filtered = filterNearbyMarkers({ + 'markers': allMarkers, + 'centerLat': center.latitude, + 'centerLng': center.longitude, + 'radius': 2000.0, + }); + + markers.addAll(filtered); + }); + } + + List filterNearbyMarkers(Map args) { + final List rawMarkers = args['markers']; + final double centerLat = args['centerLat']; + final double centerLng = args['centerLng']; + final double radiusInMeters = args['radius']; + final center = LatLng(centerLat, centerLng); + final distance = Distance(); + + return rawMarkers + .where((marker) => distance(center, marker) <= radiusInMeters) + .toList(); + } + + Future generatedMarkers() async { + final generatedMarkers = await generateLocationsUsingCompute(100000); + allMarkers.value = generatedMarkers; + } + + @override + void onInit() { + super.onInit(); + animatedMapController = AnimatedMapController( + vsync: this, + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOut, + cancelPreviousAnimations: true, + ); + + filterBottomSheetController = DraggableBottomSheetController( + initialHeight: 350, + minHeight: 200, + maxHeight: Get.height * 0.5, + ); + + selectedLocationBottomSheetController = DraggableBottomSheetController( + initialHeight: 200, + minHeight: 100, + maxHeight: 200, + ); + + + detailsLocationBottomSheetController = DraggableBottomSheetController( + initialHeight: Get.height * 0.5, + minHeight: Get.height * 0.37, + maxHeight: Get.height * 0.5, + ); + + slidController = SlidableController(this).obs; + bottomSheetManager = BottomSheetManager({ + filterBottomSheetController: + () => filterWidget(filterIndex: filterIndex, showIndex: showIndex), + selectedLocationBottomSheetController: + () => selectedLocationWidget( + showHint: + selectedLocationBottomSheetController.isVisible.value && + showSlideHint, + sliderController: slidController.value, + trigger: triggerSlidableAnimation, + toggle: selectedLocationBottomSheetController.toggle, + ), + detailsLocationBottomSheetController: () => markerDetailsWidget(), + }); + } + + @override + void onReady() { + super.onReady(); + determineCurrentPosition(); + generatedMarkers(); + } + + Future triggerSlidableAnimation() async { + await Future.delayed(Duration(milliseconds: 200)); + await slidController.value.openEndActionPane(); + await Future.delayed(Duration(milliseconds: 200)); + await slidController.value.close(); + showSlideHint = false; + } + + @override + void onClose() { + slidController.close(); + super.onClose(); + } +} diff --git a/packages/inspection/lib/presentation/inspection_map/view.dart b/packages/inspection/lib/presentation/inspection_map/view.dart new file mode 100644 index 0000000..385af1f --- /dev/null +++ b/packages/inspection/lib/presentation/inspection_map/view.dart @@ -0,0 +1,650 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_inspection/presentation/widget/search.dart'; + +import 'logic.dart'; + +class InspectionMapPage extends GetView { + const InspectionMapPage({super.key}); + + @override + Widget build(BuildContext context) { + return BasePage( + hasSearch: true, + hasFilter: true, + hasBack: false, + + defaultSearch: false, + filteringWidget: filterWidget(showIndex: 3.obs, filterIndex: 5.obs), + onSearchTap: () { + controller.baseLogic.isSearchSelected.value = !controller.baseLogic.isSearchSelected.value; + }, + + widgets: [_buildMap()], + floatingActionButton: _buildGpsButton(), + ); + } + + Widget _buildMap() { + return Expanded( + child: Stack( + fit: StackFit.expand, + children: [ + ObxValue((currentLocation) { + return FlutterMap( + mapController: controller.animatedMapController.mapController, + options: MapOptions( + initialCenter: currentLocation.value, + initialZoom: 18, + onPositionChanged: (camera, hasGesture) { + controller.debouncedUpdateVisibleMarkers(center: camera.center); + }, + ), + children: [ + TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'), + ObxValue((markers) { + return MarkerLayer( + markers: markers + .map( + (e) => markerWidget( + marker: e, + onTap: () { + Get.bottomSheet( + selectedLocationWidget( + showHint: false, + sliderController: controller.slidController.value, + trigger: () {}, + toggle: () {}, + ), + isScrollControlled: true, + enableDrag: true, + backgroundColor: Colors.transparent, + ); + }, + ), + ) + .toList(), + ); + }, controller.markers), + ], + ); + }, controller.currentLocation), + + Positioned( + top: 10, + left: 20, + right: 20, + child: ObxValue((data) { + if (data.value) { + return SearchWidget( + onSearchChanged: (data) { + controller.baseLogic.searchValue.value = data; + }, + ); + } else { + return SizedBox.shrink(); + } + }, controller.baseLogic.isSearchSelected), + ), + ], + ), + ); + } + + Widget _buildGpsButton() { + return ObxValue((data) { + return RFab( + backgroundColor: AppColor.greenNormal, + isLoading: data.value, + icon: Assets.vec.gpsSvg.svg(width: 40.w, height: 40.h), + onPressed: () async => await controller.determineCurrentPosition(), + ); + }, controller.isLoading); + } +} + +Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + return Marker( + point: marker, + child: GestureDetector( + onTap: onTap, + behavior: HitTestBehavior.opaque, + child: SizedBox( + width: 36, + height: 36, + child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30), + ), + ), + ); +} + +Widget filterWidget({required RxInt filterIndex, required RxInt showIndex}) { + return BaseBottomSheet( + height: Get.height * 0.5, + child: Column( + spacing: 16, + children: [ + SizedBox(height: 1), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + spacing: 16, + children: [ + cardWithLabel( + title: 'اصناف', + count: 1234567, + icon: Assets.vec.shopSvg.svg(width: 24.w, height: 24.h), + backgroundColor: AppColor.greenLight, + backgroundBadgeColor: AppColor.greenLightActive, + ), + cardWithLabel( + title: 'دامداران', + count: 1234567, + icon: Assets.vec.peopleSvg.svg(width: 24.w, height: 24.h), + + backgroundColor: AppColor.blueLight, + backgroundBadgeColor: AppColor.blueLightActive, + ), + cardWithLabel( + title: 'مرغداران', + count: 1234567, + icon: Assets.vec.profile2Svg.svg(width: 24.w, height: 24.h), + backgroundColor: AppColor.redLight, + backgroundBadgeColor: AppColor.redLightActive, + ), + ], + ), + + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'فیلتر نمایش', + textAlign: TextAlign.center, + style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), + ), + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + customChip( + isSelected: data.value == 0, + onTap: (data) { + filterIndex.value = data; + }, + index: 0, + title: 'دامداران', + ), + customChip( + isSelected: data.value == 1, + title: 'مرغداران', + onTap: (data) { + filterIndex.value = data; + }, + index: 1, + ), + customChip( + isSelected: data.value == 2, + title: 'اصناف', + onTap: (data) { + filterIndex.value = data; + }, + index: 2, + ), + ], + ); + }, filterIndex), + ], + ), + + Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'نمایش', + textAlign: TextAlign.center, + style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), + ), + ObxValue((data) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + spacing: 8, + children: [ + customChip( + isSelected: data.value == 0, + title: 'نمایش همه', + onTap: (data) { + showIndex.value = data; + }, + index: 0, + ), + customChip( + isSelected: data.value == 1, + title: 'دارای تراکنش', + onTap: (data) { + showIndex.value = data; + }, + index: 1, + ), + customChip( + isSelected: data.value == 2, + title: 'بازرسی شده ها', + onTap: (data) { + showIndex.value = data; + }, + index: 2, + ), + customChip( + isSelected: data.value == 3, + title: 'بازرسی نشده ها', + onTap: (data) { + showIndex.value = data; + }, + index: 3, + ), + customChip( + isSelected: data.value == 4, + title: 'متخلفین', + onTap: (data) { + showIndex.value = data; + }, + index: 4, + ), + ], + ), + ); + }, showIndex), + ], + ), + ], + ), + ); +} + +Widget cardWithLabel({ + required String title, + required int count, + String unit = 'عدد', + required Widget icon, + required Color backgroundColor, + required Color backgroundBadgeColor, +}) { + return SizedBox( + width: 114.w, + height: 115.h, + child: Stack( + clipBehavior: Clip.antiAlias, + alignment: Alignment.topCenter, + children: [ + Positioned( + bottom: 0, + right: 0, + left: 0, + child: Container( + width: 114.w, + height: 91.h, + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.25, color: AppColor.blackLightHover), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 6, + children: [ + Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.textColor)), + Text( + count.separatedByComma, + style: AppFonts.yekan16.copyWith(color: AppColor.textColor), + ), + Text(unit, style: AppFonts.yekan12.copyWith(color: AppColor.textColor)), + ], + ), + ), + ), + Positioned( + top: 5.h, + child: Container( + width: 32.w, + height: 32.h, + padding: EdgeInsets.all(4), + decoration: BoxDecoration( + color: backgroundBadgeColor, + borderRadius: BorderRadius.circular(50), + border: Border.all(color: AppColor.borderColor, width: 0.25), + ), + child: Center(child: icon), + ), + ), + ], + ), + ); +} + +Widget markerDetailsWidget() { + return Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.all(35), + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Column( + spacing: 15, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + spacing: 12, + children: [ + Text( + 'داود خرم پور', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkHover), + ), + Spacer(), + vecWidgetWithOnTap( + child: Assets.vec.mapSvg.svg(), + onTap: () { + Get.toNamed(InspectionRoutes.inspectionLocationDetails); + }, + width: 24, + height: 24, + color: AppColor.blueNormal, + ), + vecWidgetWithOnTap( + child: Assets.vec.messageAddSvg.svg(), + width: 24, + height: 24, + color: AppColor.greenNormal, + onTap: () { + Get.toNamed(InspectionRoutes.inspectionAddSupervision); + }, + ), + + vecWidgetWithOnTap( + child: Assets.vec.securityTimeSvg.svg(), + color: AppColor.warning, + height: 24, + width: 24, + onTap: () {}, + ), + ], + ), + Container( + height: 32, + clipBehavior: Clip.antiAlias, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: ShapeDecoration( + color: AppColor.blueLight, + shape: RoundedRectangleBorder( + side: BorderSide(width: 1, color: AppColor.blueLightHover), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'باقی مانده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'شماره همراه', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '0326598653', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'آخرین فعالیت', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + + Text( + '1409/12/12', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'موجودی', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '5کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + + ...List.generate( + 5, + (index) => Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Text( + 'فروش رفته', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + Text( + '0 کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + ), + ], + ), + ); +} + +Widget customChip({ + bool isSelected = false, + required String title, + required int index, + required Function(int) onTap, +}) { + return GestureDetector( + onTap: () { + onTap.call(index); + }, + child: Container( + height: 32.h, + padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.h), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: AppColor.whiteGreyNormal, + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 1, + color: isSelected ? AppColor.blueNormal : AppColor.blackLightActive, + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + SizedBox( + width: 12.w, + height: 12.h, + child: Transform.scale( + scale: 0.70, + child: Checkbox( + value: isSelected, + side: BorderSide(color: AppColor.whiteDarkHover, width: 1), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + visualDensity: VisualDensity.compact, + overlayColor: WidgetStateProperty.all(AppColor.blueNormal), + fillColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return AppColor.blueNormal; + } else { + return AppColor.whiteGreyNormal; + } + }), + + onChanged: (value) { + onTap.call(index); + }, + ), + ), + ), + SizedBox(width: 8.w), + Text( + title, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: isSelected ? AppColor.blueNormal : AppColor.whiteDarkHover, + ), + ), + ], + ), + ), + ); +} + +Widget selectedLocationWidget({ + required bool showHint, + required SlidableController sliderController, + required VoidCallback trigger, + required VoidCallback toggle, +}) { + if (showHint) { + trigger.call(); + } + return BaseBottomSheet( + height: 150.h, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), + child: Slidable( + key: Key('selectedLocationWidget'), + controller: sliderController, + endActionPane: ActionPane( + motion: StretchMotion(), + children: [ + CustomSlidableAction( + onPressed: (context) { + Get.toNamed(InspectionRoutes.inspectionLocationDetails); + }, + backgroundColor: AppColor.blueNormal, + foregroundColor: Colors.white, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(8), + topRight: Radius.circular(8), + ), + child: Assets.vec.mapSvg.svg(width: 24, height: 24), + ), + CustomSlidableAction( + onPressed: (context) { + Get.toNamed(InspectionRoutes.inspectionAddSupervision); + }, + backgroundColor: AppColor.greenNormal, + padding: EdgeInsets.all(16), + child: Assets.vec.messageAddSvg.svg(), + ), + CustomSlidableAction( + onPressed: (context) {}, + backgroundColor: AppColor.warning, + padding: EdgeInsets.all(16), + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(8), + topLeft: Radius.circular(8), + ), + child: Assets.vec.securityTimeSvg.svg(), + ), + ], + ), + child: GestureDetector( + onTap: toggle, + child: Container( + height: 58, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + ), + ), + ), + ), + ); +} diff --git a/packages/inspection/lib/presentation/root/logic.dart b/packages/inspection/lib/presentation/root/logic.dart index 31bd149..26c3d93 100644 --- a/packages/inspection/lib/presentation/root/logic.dart +++ b/packages/inspection/lib/presentation/root/logic.dart @@ -2,13 +2,14 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart' ; import 'package:rasadyar_inspection/presentation/action/view.dart'; import 'package:rasadyar_inspection/presentation/filter/view.dart'; +import 'package:rasadyar_inspection/presentation/inspection_map/view.dart'; import 'package:rasadyar_inspection/presentation/profile/view.dart'; enum ErrorLocationType { serviceDisabled, permissionDenied, none } class RootLogic extends GetxController { RxInt currentIndex = 0.obs; - List pages = [SupervisionFilterPage(), ActionPage(), ProfilePage()]; + List pages = [InspectionMapPage(), ActionPage(), ProfilePage()]; RxList errorLocationType = RxList(); Stream listenToLocationServiceStatus() { diff --git a/packages/inspection/lib/presentation/root/view.dart b/packages/inspection/lib/presentation/root/view.dart index 2994617..578c5f8 100644 --- a/packages/inspection/lib/presentation/root/view.dart +++ b/packages/inspection/lib/presentation/root/view.dart @@ -8,168 +8,49 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - body: Stack( - children: [ - ObxValue((errorType) { - if (errorType.isNotEmpty) { - if (errorType.contains(ErrorLocationType.serviceDisabled)) { - Future.microtask(() { - Get.defaultDialog( - title: 'خطا', - content: const Text('سرویس مکان‌یابی غیرفعال است'), - cancel: ROutlinedElevated( - text: 'بررسی مجدد', - width: 120, - textStyle: AppFonts.yekan16, - onPressed: () async { - var service = await controller.locationServiceEnabled(); - eLog(service); - if (service) { - controller.errorLocationType.remove( - ErrorLocationType.serviceDisabled, - ); - Get.back(); - } - // Don't call Get.back() if service is still disabled - }, - ), - confirm: RElevated( - text: 'روشن کردن', - textStyle: AppFonts.yekan16, - width: 120, - onPressed: () async { - var res = await Geolocator.openLocationSettings(); - if (res) { - var service = - await controller.locationServiceEnabled(); - if (service) { - controller.errorLocationType.remove( - ErrorLocationType.serviceDisabled, - ); - Get.back(); - } - } - }, - ), + return ObxValue((currentIndex) { + return Scaffold( + body: ObxValue( + (currentIndex) => IndexedStack(index: currentIndex.value, children: controller.pages), + controller.currentIndex, + ), + bottomNavigationBar: RBottomNavigation( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + items: [ + RBottomNavigationItem( + label: 'نقشه', + icon: Assets.vec.mapSvg.path, + isSelected: currentIndex.value == 0, + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); - contentPadding: EdgeInsets.all(8), - onWillPop: () async { - return controller.errorLocationType.isEmpty; - }, - barrierDismissible: false, - ); - }); - } else { - Future.microtask(() { - Get.defaultDialog( - title: 'خطا', - content: const Text( - ' دسترسی به سرویس مکان‌یابی غیرفعال است', - ), - cancel: ROutlinedElevated( - text: 'بررسی مجدد', - width: 120, - textStyle: AppFonts.yekan16, - onPressed: () async { - await controller.checkPermission(); - }, - ), - confirm: RElevated( - text: 'اجازه دادن', - textStyle: AppFonts.yekan16, - width: 120, - onPressed: () async { - var res = await controller.checkPermission( - request: true, - ); - if (res) { - controller.errorLocationType.remove( - ErrorLocationType.permissionDenied, - ); - Get.back(); - } - }, - ), + controller.changePage(0); + }, + ), + RBottomNavigationItem( + label: 'اقدام', + icon: Assets.vec.settingSvg.path, + isSelected: currentIndex.value == 1, + onTap: () { + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); + controller.changePage(1); + }, + ), - contentPadding: EdgeInsets.all(8), - onWillPop: () async { - return controller.errorLocationType.isEmpty; - }, - barrierDismissible: false, - ); - }); - } - } - return const SizedBox.shrink(); - }, controller.errorLocationType), + RBottomNavigationItem( + label: 'پروفایل', + icon: Assets.vec.profileCircleSvg.path, + isSelected: currentIndex.value == 4, + onTap: () { + Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst); + Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst); - ObxValue( - (currentIndex) => IndexedStack( - index: currentIndex.value, - children: controller.pages, + controller.changePage(4); + }, ), - controller.currentIndex, - ), - - ], - ), - bottomNavigationBar: WaveBottomNavigation( - items: [ - WaveBottomNavigationItem(title: 'خانه', icon: Assets.vec.mapSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - )), - WaveBottomNavigationItem( - title: 'عملیات', - icon: Assets.vec.userSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'افزودن', - icon: Assets.vec.addSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'آمار', - icon: Assets.vec.diagramSvg.svg(width: 32,height: 32,colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),), - ), - WaveBottomNavigationItem( - title: 'تماس', - icon: Assets.vec.callSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'مکان ', - icon: Assets.vec.gpsSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - WaveBottomNavigationItem( - title: 'تاریخ', - icon: Assets.vec.calendarSvg.svg( - width: 32, - height: 32, - colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - ], - onPageChanged: (index) { - controller.changePage(index); - }, - ), - ); + ], + ), + ); + }, controller.currentIndex); } } diff --git a/packages/inspection/lib/presentation/routes/app_pages.dart b/packages/inspection/lib/presentation/routes/app_pages.dart index 69ac156..816ae56 100644 --- a/packages/inspection/lib/presentation/routes/app_pages.dart +++ b/packages/inspection/lib/presentation/routes/app_pages.dart @@ -8,6 +8,7 @@ import 'package:rasadyar_inspection/presentation/add_supervision/view.dart'; import 'package:rasadyar_inspection/presentation/display_information/logic.dart'; import 'package:rasadyar_inspection/presentation/display_information/view.dart'; import 'package:rasadyar_inspection/presentation/filter/logic.dart'; +import 'package:rasadyar_inspection/presentation/inspection_map/logic.dart'; import 'package:rasadyar_inspection/presentation/location_details/logic.dart'; import 'package:rasadyar_inspection/presentation/location_details/view.dart'; import 'package:rasadyar_inspection/presentation/profile/logic.dart'; @@ -17,18 +18,21 @@ import 'package:rasadyar_inspection/presentation/registration_of_violation/view. import 'package:rasadyar_inspection/presentation/root/logic.dart'; import 'package:rasadyar_inspection/presentation/root/view.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; +import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; sealed class InspectionPages { InspectionPages._(); static final pages = [ GetPage( - name: InspectionRoutes.inspection, + name: InspectionRoutes.init, page: () => RootPage(), - middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { Get.put(RootLogic()); Get.put(InspectorFilterLogic()); + Get.lazyPut(()=>InspectionMapLogic()); + Get.lazyPut(()=>BaseLogic()); Get.lazyPut(() => LocationDetailsLogic(), fenix: true); Get.lazyPut(() => ActionLogic(), fenix: true); Get.lazyPut(() => ProfileLogic(), fenix: true); diff --git a/packages/inspection/lib/presentation/routes/app_routes.dart b/packages/inspection/lib/presentation/routes/app_routes.dart index beff1e6..97b9549 100644 --- a/packages/inspection/lib/presentation/routes/app_routes.dart +++ b/packages/inspection/lib/presentation/routes/app_routes.dart @@ -1,10 +1,10 @@ sealed class InspectionRoutes { InspectionRoutes._(); - static const inspection = '/supervision'; - static const inspectionAction = '$inspection/action'; - static const inspectionUserProfile = '$inspection/userSettings'; - static const inspectionLocationDetails = '$inspection/locationDetails'; + static const init = '/supervision'; + static const inspectionAction = '$init/action'; + static const inspectionUserProfile = '$init/userSettings'; + static const inspectionLocationDetails = '$init/locationDetails'; static const inspectionAddSupervision = '$inspectionLocationDetails/addSupervision'; static const inspectionAddMobileInspector = '$inspectionLocationDetails/addMobileInspector'; static const inspectionRegistrationOfViolation = '$inspectionAddSupervision/RegistrationOfViolation'; diff --git a/packages/inspection/lib/presentation/widget/app_bar/i_app_bar.dart b/packages/inspection/lib/presentation/widget/app_bar/i_app_bar.dart new file mode 100644 index 0000000..d49c50d --- /dev/null +++ b/packages/inspection/lib/presentation/widget/app_bar/i_app_bar.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; + +RAppBar inspectionAppBar({ + bool hasBack = true, + bool hasFilter = true, + bool hasSearch = true, + bool isBase = false, + VoidCallback? onBackPressed, + GestureTapCallback? onFilterTap, + GestureTapCallback? onSearchTap, +}) { + return RAppBar( + hasBack: isBase == true ? false : hasBack, + onBackPressed: onBackPressed, + leadingWidth: 155, + leading: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, + children: [ + Text('رصدبان', style: AppFonts.yekan16Bold.copyWith(color: Colors.white)), + Assets.vec.appBarInspectionSvg.svg(width: 24, height: 24), + ], + ), + additionalActions: [ + if (!isBase && hasSearch) searchWidget(onSearchTap), + SizedBox(width: 8), + if (!isBase && hasFilter) filterWidget(onFilterTap), + SizedBox(width: 8), + ], + ); +} + +GestureDetector filterWidget(GestureTapCallback? onFilterTap) { + return GestureDetector( + onTap: onFilterTap, + child: Stack( + alignment: Alignment.topRight, + children: [ + Assets.vec.filterOutlineSvg.svg( + width: 20, + height: 20, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Obx(() { + final controller = Get.find(); + return Visibility( + visible: controller.isFilterSelected.value, + child: Container( + width: 8, + height: 8, + decoration: const BoxDecoration(color: Colors.red, shape: BoxShape.circle), + ), + ); + }), + ], + ), + ); +} + +GestureDetector searchWidget(GestureTapCallback? onSearchTap) { + return GestureDetector( + onTap: onSearchTap, + child: Stack( + alignment: Alignment.topRight, + children: [ + Assets.vec.searchSvg.svg( + width: 24, + height: 24, + colorFilter: const ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + Obx(() { + final controller = Get.find(); + return Visibility( + visible: controller.searchValue.value != null, + child: Container( + width: 8, + height: 8, + decoration: const BoxDecoration(color: Colors.red, shape: BoxShape.circle), + ), + ); + }), + ], + ), + ); +} diff --git a/packages/inspection/lib/presentation/widget/base_page/logic.dart b/packages/inspection/lib/presentation/widget/base_page/logic.dart new file mode 100644 index 0000000..dbba195 --- /dev/null +++ b/packages/inspection/lib/presentation/widget/base_page/logic.dart @@ -0,0 +1,23 @@ +import 'package:rasadyar_core/core.dart'; + +class BaseLogic extends GetxController { + final RxBool isFilterSelected = false.obs; + final RxBool isSearchSelected = false.obs; + final RxnString searchValue = RxnString(); + + void setSearchCallback(void Function(String)? onSearchChanged) { + debounce(searchValue, (val) { + if (val != null && val.trim().isNotEmpty) { + onSearchChanged?.call(val); + } + }, time: const Duration(milliseconds: 600)); + } + + void toggleFilter() { + isFilterSelected.value = !isFilterSelected.value; + } + + void toggleSearch() { + isSearchSelected.value = !isSearchSelected.value; + } +} diff --git a/packages/inspection/lib/presentation/widget/base_page/view.dart b/packages/inspection/lib/presentation/widget/base_page/view.dart new file mode 100644 index 0000000..278cb89 --- /dev/null +++ b/packages/inspection/lib/presentation/widget/base_page/view.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/widget/app_bar/i_app_bar.dart'; +import 'package:rasadyar_inspection/presentation/widget/search.dart'; + +import 'logic.dart'; + +class BasePage extends StatefulWidget { + const BasePage({ + super.key, + this.routes, + required this.widgets, + this.routesWidget, + this.floatingActionButtonLocation, + this.floatingActionButton, + this.onSearchChanged, + this.hasBack = true, + this.hasFilter = true, + this.hasSearch = true, + this.isBase = false, + this.defaultSearch = true, + this.onBackPressed, + this.onFilterTap, + this.onSearchTap, + this.filteringWidget, + + }); + + final List? routes; + final Widget? routesWidget; + final bool defaultSearch; + final List widgets; + final FloatingActionButtonLocation? floatingActionButtonLocation; + final Widget? floatingActionButton; + final Widget? filteringWidget; + final void Function(String?)? onSearchChanged; + final bool hasBack; + final bool hasFilter; + final bool hasSearch; + final bool isBase; + final VoidCallback? onBackPressed; + final GestureTapCallback? onFilterTap; + final GestureTapCallback? onSearchTap; + + @override + State createState() => _BasePageState(); +} + +class _BasePageState extends State { + BaseLogic get controller => Get.find(); + Worker? filterWorker; + bool _isBottomSheetOpen = false; + + @override + void initState() { + super.initState(); + /* filterWorker = ever(controller.isFilterSelected, (bool isSelected) { + if (!mounted) return; + + if (isSelected && widget.filteringWidget != null) { + // بررسی اینکه آیا bottomSheet از قبل باز است یا نه + if (_isBottomSheetOpen) { + controller.isFilterSelected.value = false; + return; + } + + // بررسی اینکه آیا route فعلی current است یا نه + if (ModalRoute.of(context)?.isCurrent != true) { + controller.isFilterSelected.value = false; + return; + } + + _isBottomSheetOpen = true; + Get.bottomSheet( + widget.filteringWidget!, + isScrollControlled: true, + isDismissible: true, + enableDrag: true, + ).then((_) { + // تنظیم مقدار به false بعد از بسته شدن bottomSheet + if (mounted) { + _isBottomSheetOpen = false; + controller.isFilterSelected.value = false; + } + }); + } + });*/ + } + + @override + void dispose() { + filterWorker?.dispose(); + super.dispose(); + } + + void _onFilterTap() { + if (widget.hasFilter && widget.filteringWidget != null) { + + final currentRoute = ModalRoute.of(context); + if (currentRoute?.isCurrent != true) { + return; + } + + + Get.bottomSheet( + widget.filteringWidget!, + isScrollControlled: true, + isDismissible: true, + enableDrag: true, + ); + } + } + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) => widget.onBackPressed, + child: Scaffold( + backgroundColor: AppColor.bgLight, + appBar: inspectionAppBar( + hasBack: widget.isBase ? false : widget.hasBack, + onBackPressed: widget.onBackPressed, + hasFilter: widget.hasFilter, + hasSearch: widget.hasSearch, + isBase: widget.isBase, + onFilterTap: widget.hasFilter ? _onFilterTap : null, + onSearchTap: widget.hasSearch ? () => controller.toggleSearch() : null, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!), + if (!widget.isBase && widget.hasSearch && widget.defaultSearch) ...{ + SearchWidget(onSearchChanged: widget.onSearchChanged), + }, + ...widget.widgets, + ], + ), + floatingActionButtonLocation: + widget.floatingActionButtonLocation ?? FloatingActionButtonLocation.startFloat, + floatingActionButton: widget.floatingActionButton, + ), + ); + } +} diff --git a/packages/inspection/lib/presentation/widget/search.dart b/packages/inspection/lib/presentation/widget/search.dart new file mode 100644 index 0000000..9c72439 --- /dev/null +++ b/packages/inspection/lib/presentation/widget/search.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_inspection/presentation/widget/base_page/logic.dart'; + + +class SearchWidget extends StatefulWidget { + const SearchWidget({super.key, this.onSearchChanged}); + + final void Function(String?)? onSearchChanged; + + @override + State createState() => _SearchWidgetState(); +} + +class _SearchWidgetState extends State { + late final BaseLogic controller; + final TextEditingController textEditingController = TextEditingController(); + + @override + void initState() { + super.initState(); + controller = Get.find(); + controller.setSearchCallback(widget.onSearchChanged); + } + + @override + Widget build(BuildContext context) { + return ObxValue((data) { + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + height: data.value ? 40 : 0, + child: Visibility( + visible: data.value, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: RTextField( + height: 40, + borderColor: AppColor.blackLight, + suffixIcon: ObxValue( + (data) => Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: (data.value == null) + ? Assets.vec.searchSvg.svg( + width: 10, + height: 10, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ) + : IconButton( + onPressed: () { + textEditingController.clear(); + controller.searchValue.value = null; + controller.isSearchSelected.value = false; + widget.onSearchChanged?.call(null); + }, + enableFeedback: true, + padding: EdgeInsets.zero, + iconSize: 24, + splashRadius: 50, + icon: Assets.vec.closeCircleSvg.svg( + width: 20, + height: 20, + colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), + ), + ), + ), + controller.searchValue, + ), + hintText: 'جستجو کنید ...', + hintStyle: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), + filledColor: Colors.white, + filled: true, + controller: textEditingController, + onChanged: (val) => controller.searchValue.value = val, + ), + ), + ), + ); + }, controller.isSearchSelected); + } +} diff --git a/packages/inspection/pubspec.lock b/packages/inspection/pubspec.lock index 50a6a53..ac492d9 100644 --- a/packages/inspection/pubspec.lock +++ b/packages/inspection/pubspec.lock @@ -5,18 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f url: "https://pub.dev" source: hosted - version: "82.0.0" + version: "85.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0" + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" url: "https://pub.dev" source: hosted - version: "7.4.5" + version: "7.7.1" + android_intent_plus: + dependency: transitive + description: + name: android_intent_plus + sha256: dfc1fd3a577205ae8f11e990fb4ece8c90cceabbee56fcf48e463ecf0bd6aae3 + url: "https://pub.dev" + source: hosted + version: "5.3.0" archive: dependency: transitive description: @@ -37,10 +45,10 @@ packages: dependency: transitive description: name: asn1lib - sha256: "0511d6be23b007e95105ae023db599aea731df604608978dada7f9faf2637623" + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" url: "https://pub.dev" source: hosted - version: "1.6.4" + version: "1.6.5" async: dependency: transitive description: @@ -49,14 +57,78 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" build: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: "7d95cbbb1526ab5ae977df9b4cc660963b9b27f6d1075c0b34653868911385e4" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "3.0.0" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.dev" + source: hosted + version: "4.0.4" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "38c9c339333a09b090a638849a4c56e70a404c6bdd3b511493addfbc113b60c2" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + build_runner: + dependency: transitive + description: + name: build_runner + sha256: b971d4a1c789eba7be3e6fe6ce5e5b50fd3719e3cb485b3fad6d04358304351d + url: "https://pub.dev" + source: hosted + version: "2.6.0" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: c04e612ca801cd0928ccdb891c263a2b1391cb27940a5ea5afcf9ba894de5d62 + url: "https://pub.dev" + source: hosted + version: "9.2.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "0b1b12a0a549605e5f04476031cd0bc91ead1d7c8e830773a18ee54179b3cb62" + url: "https://pub.dev" + source: hosted + version: "8.11.0" characters: dependency: transitive description: @@ -65,6 +137,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" clock: dependency: transitive description: @@ -73,6 +153,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" collection: dependency: transitive description: @@ -97,6 +185,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" crypto: dependency: transitive description: @@ -121,14 +217,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dart_polylabel2: + dependency: transitive + description: + name: dart_polylabel2 + sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" + url: "https://pub.dev" + source: hosted + version: "1.0.0" dart_style: dependency: transitive description: name: dart_style - sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af" + sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" dartx: dependency: transitive description: @@ -137,6 +241,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + url: "https://pub.dev" + source: hosted + version: "11.5.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" dio: dependency: transitive description: @@ -177,6 +305,38 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" + url: "https://pub.dev" + source: hosted + version: "0.9.4+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" fixnum: dependency: transitive description: @@ -194,18 +354,18 @@ packages: dependency: transitive description: name: flutter_gen_core - sha256: "3eaa2d3d8be58267ac4cd5e215ac965dd23cae0410dc073de2e82e227be32bfc" + sha256: eda54fdc5de08e7eeea663eb8442aafc8660b5a13fda4e0c9e572c64e50195fb url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.0" flutter_gen_runner: dependency: transitive description: name: flutter_gen_runner - sha256: e74b4ead01df3e8f02e73a26ca856759dbbe8cb3fd60941ba9f4005cd0cd19c9 + sha256: "669bf8b7a9b4acbdcb7fcc5e12bf638aca19acedf43341714cbca3bf3a219521" url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.0" flutter_localizations: dependency: transitive description: flutter @@ -215,10 +375,10 @@ packages: dependency: transitive description: name: flutter_map - sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a + sha256: df33e784b09fae857c6261a5521dd42bd4d3342cb6200884bb70730638af5fd5 url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.2.1" flutter_map_animations: dependency: transitive description: @@ -227,6 +387,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + url: "https://pub.dev" + source: hosted + version: "2.0.28" flutter_rating_bar: dependency: transitive description: @@ -235,6 +403,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.1" + flutter_screenutil: + dependency: transitive + description: + name: flutter_screenutil + sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" + url: "https://pub.dev" + source: hosted + version: "5.9.3" flutter_secure_storage: dependency: transitive description: @@ -295,10 +471,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 + sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" flutter_web_plugins: dependency: transitive description: flutter @@ -316,26 +492,42 @@ packages: dependency: transitive description: name: freezed_annotation - sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + geoclue: + dependency: transitive + description: + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" + source: hosted + version: "0.1.1" geolocator: dependency: transitive description: name: geolocator - sha256: ee2212a3df8292ec4c90b91183b8001d3f5a800823c974b570c5f9344ca320dc + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" url: "https://pub.dev" source: hosted - version: "14.0.1" + version: "14.0.2" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: "114072db5d1dce0ec0b36af2697f55c133bc89a2c8dd513e137c0afe59696ed4" + sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a" url: "https://pub.dev" source: hosted - version: "5.0.1+1" + version: "5.0.2" geolocator_apple: dependency: transitive description: @@ -344,6 +536,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.13" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 + url: "https://pub.dev" + source: hosted + version: "0.2.3" geolocator_platform_interface: dependency: transitive description: @@ -392,6 +592,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + gsettings: + dependency: transitive + description: + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" + url: "https://pub.dev" + source: hosted + version: "0.2.8" hashcodes: dependency: transitive description: @@ -420,10 +636,18 @@ packages: dependency: transitive description: name: http - sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + sha256: "85ab0074f9bf2b24625906d8382bbec84d3d6919d285ba9c106b07b65791fb99" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0-beta.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" http_parser: dependency: transitive description: @@ -432,6 +656,78 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + url: "https://pub.dev" + source: hosted + version: "4.5.4" + image_picker: + dependency: transitive + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "6fae381e6af2bbe0365a5e4ce1db3959462fa0c4d234facf070746024bb80c8d" + url: "https://pub.dev" + source: hosted + version: "0.8.12+24" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.dev" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" image_size_getter: dependency: transitive description: @@ -448,6 +744,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" isolate_channel: dependency: transitive description: @@ -492,10 +796,10 @@ packages: dependency: transitive description: name: logger - sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c" url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.1" logging: dependency: transitive description: @@ -504,6 +808,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + lottie: + dependency: transitive + description: + name: lottie + sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 + url: "https://pub.dev" + source: hosted + version: "3.3.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -544,6 +864,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" + url: "https://pub.dev" + source: hosted + version: "8.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" + url: "https://pub.dev" + source: hosted + version: "3.2.0" path: dependency: transitive description: @@ -612,10 +948,10 @@ packages: dependency: transitive description: name: permission_handler - sha256: "2d070d8684b68efb580a5997eb62f675e8a885ef0be6e754fb9ef489c177470f" + sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 url: "https://pub.dev" source: hosted - version: "12.0.0+1" + version: "12.0.1" permission_handler_android: dependency: transitive description: @@ -696,22 +1032,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.9.1" - polylabel: + pool: dependency: transitive description: - name: polylabel - sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.5.1" posix: dependency: transitive description: name: posix - sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.0.3" pretty_dio_logger: dependency: transitive description: @@ -736,20 +1072,28 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" rasadyar_auth: dependency: "direct main" description: path: "../auth" relative: true source: path - version: "0.0.1" + version: "1.0.3" rasadyar_core: dependency: "direct main" description: path: "../core" relative: true source: path - version: "1.0.0+1" + version: "1.2.0+2" rxdart: dependency: transitive description: @@ -762,10 +1106,34 @@ packages: dependency: transitive description: name: shamsi_date - sha256: b6c79ff34ddfb1e9e4761347f18e30afdd7d16cc3db77defd5a40e2d93894c51 + sha256: "0383fddc9bce91e9e08de0c909faf93c3ab3a0e532abd271fb0dcf5d0617487b" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + shimmer: + dependency: transitive + description: + name: shimmer + sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" + url: "https://pub.dev" + source: hosted + version: "3.0.0" sky_engine: dependency: transitive description: flutter @@ -787,6 +1155,30 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" string_scanner: dependency: transitive description: @@ -803,6 +1195,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + url: "https://pub.dev" + source: hosted + version: "0.7.7" time: dependency: transitive description: @@ -811,6 +1211,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.5" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" typed_data: dependency: transitive description: @@ -839,10 +1247,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 url: "https://pub.dev" source: hosted - version: "1.1.18" + version: "1.1.19" vector_graphics_codec: dependency: transitive description: @@ -871,10 +1279,10 @@ packages: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" web: dependency: transitive description: @@ -883,14 +1291,38 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" win32: dependency: transitive description: name: win32 - sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" url: "https://pub.dev" source: hosted - version: "5.13.0" + version: "5.14.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" wkt_parser: dependency: transitive description: @@ -925,4 +1357,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.8.1 <4.0.0" - flutter: ">=3.27.0" + flutter: ">=3.29.0" diff --git a/packages/inspection/pubspec.yaml b/packages/inspection/pubspec.yaml index 2af4c35..a4ab581 100644 --- a/packages/inspection/pubspec.yaml +++ b/packages/inspection/pubspec.yaml @@ -1,7 +1,7 @@ name: rasadyar_inspection description: "inspection module for rasadyar" publish_to: 'none' -version: 1.0.1 +version: 1.2.0 environment: sdk: ^3.8.1 From 8a4d55f6e9a1897949c90b28b92d3fa34fe9b53b Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 26 Jul 2025 08:06:30 +0330 Subject: [PATCH 238/256] fix: map loading --- .../lib/presentation/inspection_map/view.dart | 72 +++++- .../widget/list_item/list_item.dart | 242 ++++++++++++++++++ 2 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 packages/inspection/lib/presentation/widget/list_item/list_item.dart diff --git a/packages/inspection/lib/presentation/inspection_map/view.dart b/packages/inspection/lib/presentation/inspection_map/view.dart index 385af1f..f287f66 100644 --- a/packages/inspection/lib/presentation/inspection_map/view.dart +++ b/packages/inspection/lib/presentation/inspection_map/view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_inspection/presentation/widget/list_item/list_item.dart'; import 'package:rasadyar_inspection/presentation/widget/search.dart'; import 'logic.dart'; @@ -43,7 +44,10 @@ class InspectionMapPage extends GetView { }, ), children: [ - TileLayer(urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'), + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'ir.mnpc.rasadyar', + ), ObxValue((markers) { return MarkerLayer( markers: markers @@ -648,3 +652,69 @@ Widget selectedLocationWidget({ ), ); } + +Widget selectedLocationWidget2({ + required bool showHint, + required SlidableController sliderController, + required VoidCallback trigger, + required VoidCallback toggle, +}) { + if (showHint) { + trigger.call(); + } + return BaseBottomSheet( + height: 150.h, + child: ListItem( + index: 0, + child:Container( + height: 58, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLightHover), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Text( + 'داود خرم مهری پور', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + 'گوشت و مرغ', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Column( + children: [ + Text( + 'باقی مانده', + style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), + ), + Text( + '0 کیلوگرم', + style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), + ), + ], + ), + Assets.vec.scanBarcodeSvg.svg(), + ], + ), + ) , + secondChild: Container( + height: 350.h, + color: Colors.redAccent, + ), + labelColor: Colors.blue, + labelIcon: Assets.vec.mapSvg.path, + onTap: () { + + }, + selected: true, + ), + ); +} diff --git a/packages/inspection/lib/presentation/widget/list_item/list_item.dart b/packages/inspection/lib/presentation/widget/list_item/list_item.dart new file mode 100644 index 0000000..fd65df6 --- /dev/null +++ b/packages/inspection/lib/presentation/widget/list_item/list_item.dart @@ -0,0 +1,242 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class ListItem extends StatelessWidget { + const ListItem({ + super.key, + required this.index, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + required this.onTap, + required this.selected, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final int index; + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedSize( + duration: Duration(milliseconds: 300), + child: Container( + width: Get.width - 30, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + Expanded( + child: AnimatedCrossFade( + alignment: Alignment.center, + firstChild: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 12, 14, 12), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: selected + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + ), + Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + colorFilter: ColorFilter.mode(labelColor, BlendMode.srcIn), + ), + ), + ), + ], + ), + ), + ), + + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class ListItem2 extends StatelessWidget { + const ListItem2({ + super.key, + required this.index, + required this.child, + required this.secondChild, + required this.labelColor, + required this.labelIcon, + required this.onTap, + required this.selected, + this.labelIconColor = AppColor.mediumGreyDarkHover, + }); + + final int index; + final Widget child; + final Widget secondChild; + final Color labelColor; + final String labelIcon; + final Color? labelIconColor; + final VoidCallback onTap; + final bool selected; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + width: Get.width, + margin: const EdgeInsets.fromLTRB(0, 0, 10, 0), + decoration: BoxDecoration( + color: labelColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.lightGreyNormalHover), + ), + child: AnimatedSize( + duration: Duration(milliseconds: 400), + alignment: Alignment.center, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.centerRight, + children: [ + AnimatedCrossFade( + firstChild: Row( + children: [ + Expanded( + child: Container( + height: 75, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.zero, + bottomRight: Radius.circular(8), + topLeft: Radius.zero, + topRight: Radius.circular(8), + ), + ), + clipBehavior: Clip.antiAlias, + child: child, + ), + ), + Container( + width: 20, + child: Center( + child: SvgGenImage.vec(labelIcon).svg( + width: 16.w, + height: 16.h, + //TODO + colorFilter: ColorFilter.mode( + labelIconColor ?? AppColor.mediumGreyDarkActive, + BlendMode.srcIn, + ), + ), + ), + ), + ], + ), + secondChild: Container( + padding: EdgeInsets.fromLTRB(8, 8, 12, 12), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: secondChild, + ), + crossFadeState: selected ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: Duration(milliseconds: 300), + ), + + Positioned( + right: -12, + child: Container( + width: index < 999 ? 24 : null, + height: index < 999 ? 24 : null, + padding: EdgeInsets.all(2), + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(4), + border: Border.all(width: 0.50, color: AppColor.greenDarkActive), + ), + alignment: Alignment.center, + child: Text( + (index + 1).toString(), + style: AppFonts.yekan12.copyWith(color: Colors.black), + ), + ), + ), + ], + ), + ), + ), + ); + } +} From ad456d5855b2bab467ae7b061c7bc931aa6149b7 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 26 Jul 2025 09:36:07 +0330 Subject: [PATCH 239/256] feat : new map page item onTap location --- assets/icons/cow.svg | 6 + assets/vec/cow.svg.vec | Bin 0 -> 2101 bytes .../pages/buy_in_province_all/view.dart | 2 +- .../pages/buy_in_province_waiting/view.dart | 2 +- .../pages/buy_out_of_province/view.dart | 2 +- .../lib/presentation/pages/profile/view.dart | 2 +- .../pages/sales_in_province/view.dart | 1 - .../pages/sales_out_of_province/view.dart | 1 - .../sales_out_of_province_buyers/view.dart | 2 +- .../view.dart | 2 +- .../presentation/pages/segmentation/view.dart | 2 +- .../lib/presentation/common/assets.gen.dart | 8 + .../bottom_sheet/base_bottom_sheet.dart | 2 +- .../presentation/widget/buttons/elevated.dart | 36 ++- .../widget/buttons/outline_elevated.dart | 4 +- .../presentation/widget/list_row_item.dart | 0 .../core/lib/presentation/widget/widget.dart | 1 + .../presentation/inspection_map/logic.dart | 1 + .../lib/presentation/inspection_map/view.dart | 258 +++++++++++++----- .../widget/list_item/list_item.dart | 101 +++++++ 20 files changed, 335 insertions(+), 98 deletions(-) create mode 100644 assets/icons/cow.svg create mode 100644 assets/vec/cow.svg.vec rename packages/{chicken => core}/lib/presentation/widget/list_row_item.dart (100%) diff --git a/assets/icons/cow.svg b/assets/icons/cow.svg new file mode 100644 index 0000000..ad8320d --- /dev/null +++ b/assets/icons/cow.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/vec/cow.svg.vec b/assets/vec/cow.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..a459c949cc9821d0e86da9992b1b72927c7b3bfe GIT binary patch literal 2101 zcmY*adstM*6~DU+B0g|I2q+*CF(ArQG$6?QCd4nw(

  • yp2JxCA&{!=A8-tP~~ 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≫> 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